文章总结: 本文记录了一次挖矿恶意软件的应急处置全过程,从SSH爆破入侵到挖矿程序部署与隐藏,再到系统排查与清除。攻击者通过德国IP成功爆破SSH后创建root权限用户并部署挖矿程序,该程序使用xmrig挖取门罗币,并通过劫持readdir函数隐藏自身进程。文章详细介绍了排查方法、恶意软件组件分析及矿池信息,为类似安全事件提供了实用参考。
综合评分: 90
文章分类: 应急响应,恶意软件,漏洞分析,实战经验,安全运营
一次真实应急处置复盘
原创
云晞科技Sec
云晞科技Sec
2025年12月9日 19:18
YunSee团队招新
论你是刚踏入 CTF 世界的新秀,还是正在钻研某一方向的硬核选手,这里都是你的主场!魔丸交流群聚集了来自 Misc、Web、Crypto、RE、Pwn、区块链等方向的师傅,大家日常互相答疑、分享思路、组队冲榜,一起提升技术水平。
为了进一步壮大团队实力,我们现面向全网招募密码学、AI 安全、逆向方向的师傅 加入交流。只要你愿意分享、热爱探索、喜欢和同好一起“碰撞火花”,我们都热烈欢迎!
招新要求:
- 具有 CTF 比赛经验者优先,且在相关赛事中取得优异成绩者将予以重点考虑;
- 持有 CISP-PTE 证书者优先;
- 报名 MISC 或 Web 方向的同学需同时具备不少于两个 CTF 方向的基础或实战经验。
当然,我们也十分欢迎愿意一起交流、组队打 CTF 的师傅加入我们的“魔丸”交流群,在这里共同探讨技术、相互学习进步。
联系方式:
- 简历发邮箱:[email protected]
- 魔丸交流群:1034296865
时间线
八月五日17点52分23秒,德国 ip192.109.206.11爆破 ssh成功,登录 root
八月五日 17点53分22秒,攻击者通过 root 创建用户 titu,权限为 root (该用户作用目前不明确);通过 root 添加挖矿程序,路径为 /dev/shm/syswatchd (后来发现路径并不固定,每次启动服务都会将原程 序重命名移动到另一路径),通过 root 创建系统服务 mem-tracker.service ,该服务于八月九日凌晨启动挖矿程序,同时 cpu 占用爆满
八月九日 2点2分左右,紧急关机
八月九日 8点33分左右,开始排查
八月九日 10点32分左右,排查出挖矿服务并停止服务
复现排查过程
启动服务器,发现cpu占用很快爆满,使用 top命令和 ps命令无法查询
查看定时任务 crontab -l
查看正在运行的系统服务
systemctl list-units –type=service –all | grep -iE “(enable|running)”
查看 ssh 记录 sudo grep “sshd” /var/log/auth.log | grep -iE “accepted|failed” ,发现192.109.206.11 在八月五日爆破 ssh 成功,同时发现八月七日 192.109.206.173 也进行了爆破,但爆破失败,二者均为德国ip。
使用 ss -tunap 查看是否有外连
发现本地 192.168.5.203:44278 连接到了 5.223.46.169:443 ,使用 Shodan 查询,该 ip 位于新加坡,服务器开启了 22 和 443 两个端口,猜测这是矿池ip
查看 /proc/net/tcp ,最后一条即为可疑外连,inode 为 105723841
使用ss -tpne | grep
发现来自服务 /system.slice/mem-tracker.service
查看服务状态,发现目标进程为 /usr/bin/udeb 和 /tmp/syswatchd
停止服务,cpu 占用降低至正常
异常进程排查结束
挖矿进程分析
syswatchd
ida 查看字符串,发现 xmrig ,这是一个用于挖取门罗币的 开源 CPU 挖矿程序。
尝试直接运行该程序,会由于缺少配置文件而无法运行(文件名和路径不固定)
udeb
直接运行该文件,cpu占用爆满 程序没有加壳,主要功能根据函数名即可推断
Dropper
发现字符串
http://dudiito.dev/iu/tools.tar 和 /usr/local/lib/libsimplesshd.so
发现从 http://dudiito.dev/iu/tools.tar 下载了一个tools.tar 压缩包,
以及一个路径 /usr/local/lib/mslog 但是无法直接访问该链接下载文件
注意到路径 /usr/local/lib/mslog 发现里面正是tool.tar 包含三个文件
Loader
其中,udeb 和 rcu_scheb 分别为 main_addToLdPreload() 中加载/usr/bin/udeb 和 挖矿程序,另一个 .so 文件在函数
函数main_checkAndLaunchMiner(string locBig)
检查挖矿程序是否启动,如果没有启动
那么执行 main_prepareAndLaunchMiner(string locBig)
函数 main_prepareAndLaunchMiner(string locBig) 准备好一系列变量,最后调用函数 main_launchMinerWithRandomName(string locBig)
main_launchMinerWithRandomName(string locBig) 将挖矿程序复制到随即路径后,启动程序
libsimplesshd.so
在 tool.tar 中额外发现了该文件在字符串中发现如下内容
跟进,该函数作用为判断程序名是否在过滤列表中
在函数列表发现 readdir 和 readdir64
readdir()是libc中的函数,作用为读取目录,获取目录下所有文件和inode。
这里将该函数劫持,跳过了processes_to_filter中的文件名,导致processes_to_filter中文件名不会被读取到,从而在top、ps中隐藏了挖矿程序
钱包、矿池分析
前面已经提到,挖矿程序运行需要配置文件,或者在启动时传参,但是通过find命令无法找到配置文件,在udeb启动挖矿程序时中也没有查到参数,猜测参数是直接硬编码到挖矿程序中。
尝试使用strings命令,得到了三个矿池链接
直接执行strings logobserverx 丨grep -A 200 ‘config.json’
"api": {
"id": null, "worker-id": null
},
"http": {
"enabled": false, "host": "127.0.0.1",
"port": 0,
"access-token": null, "restricted": true
},
"autosave": true, "background": true, "colors": true, "title": true,
"randomx": {
"init": -1,
"init-avx2": -1,
"mode": "auto", "1gb-pages": false, "rdmsr": true,
"wrmsr": true, "cache_qos": false, "numa": true,
"scratchpad_prefetch_mode": 1
},
"cpu": {
"enabled": true, "huge-pages": true,
"huge-pages-jit": false,
"hw-aes": null, "priority": null, "memory-pool": false, "yield": true,
"max-threads-hint": 100, "asm": true,
"argon2-impl": null, "cn/0": false,
"cn-lite/0": false
},
"opencl": {
"enabled": false, "cache": true, "loader": null, "platform": "AMD", "adl": true,
"cn/0": false, "cn-lite/0": false
},
"cuda": {
"enabled": false, "loader": null, "nvml": true,
"cn/0": false, "cn-lite/0": false
},
"donate-level": 0,
"donate-over-proxy": 0, "log-file": null,
"pools": [
{
"algo": null,
"coin": null,
"url": "pool.dudiito.dev:443", "user": "NEW_ADDRESSS",
"pass": "x",
"rig-id": null, "nicehash": true, "keepalive": true, "enabled": true, "tls": false,
"tls-fingerprint": null, "daemon": false, "socks5": null,
"self-select": null, "submit-to-origin": false
},
"algo": null,
"coin": null,
"url": "5.223.46.169:443",
"user": "IP-failover",
"pass": "x",
"rig-id": null, "nicehash": true, "keepalive": true, "enabled": true, "tls": false,
"tls-fingerprint": null, "daemon": false, "socks5": null,
"self-select": null, "submit-to-origin": false
},
"algo": "rx/0", "coin": null,
"url": "hk.salvium.gfwroute.com:1230", "user":
"SaLvsARaV7D9s3XNreiozaTBLLsJdan6KXCKsCbN1ojtW9ABgKsJtzkgCiQB8e5DkXfqQCPBCatXae4d
bJN2ngPvDqTUd2pFyXJ",
"pass": "failSalv",
"rig-id": null, "nicehash": false, "keepalive": true, "enabled": true, "tls": false,
"tls-fingerprint": null, "daemon": false, "socks5": null,
"self-select": null,
"submit-to-origin": false
},
"algo": "rx/0", "coin": null,
"url": "pool.supportxmr.com:3333", "user":
"48wb18tbiori5prH9ad5dbH9UN963XTKhabnUgYJtvzy7LRcAHiP1dA9xHSdwLczGCc7ahsZBx5JxXLM kHrzP5fQPXkkXJk",
"pass": "fail3333",
"rig-id": null, "nicehash": false, "keepalive": true, "enabled": true, "tls": false,
"tls-fingerprint": null, "daemon": false, "socks5": null,
"self-select": null,
"submit-to-origin": false
},
"algo": "rx/0", "coin": null,
"url": "pool.supportxmr.com:7777", "user":
"48wb18tbiori5prH9ad5dbH9UN963XTKhabnUgYJtvzy7LRcAHiP1dA9xHSdwLczGCc7ahsZBx5JxXLM
kHrzP5fQPXkkXJk",
"pass": "fail7777",
"rig-id": null, "nicehash": false, "keepalive": true, "enabled": true, "tls": false,
"tls-fingerprint": null, "daemon": false, "socks5": null,
"self-select": null,
"submit-to-origin": false
},
"algo": "rx/0", "coin": null,
"url": "fr-zephyr.miningocean.org:5462",
"user": "ZEPHYR2ysT7Qebc8QLknZo5VyaQDdRHeF7dn7M6d8ra1FUsGpZ1ZpeCKun9XLptPmGCZZCAUjP81qKcY tER3GTUagU15H7btCPa2D",
"pass": "fr-fail",
"rig-id": null, "nicehash": false, "keepalive": true, "enabled": true, "tls": false,
"tls-fingerprint": null, "daemon": false, "socks5": null,
"self-select": null, "submit-to-origin": false
}
],
"print-time": 60,
"health-print-time": 60, "dmi": true,
"retries": 500000,
"retry-pause": 10, "syslog": false, "tls": {
"enabled": false, "protocols": null, "cert": null, "cert_key": null, "ciphers": null, "ciphersuites": null, "dhparam": null
},
"user-agent": null, "verbose": 0,
"watch": true,
"pause-on-battery": false, "pause-on-active": false
矿池 1
地址:pool.dudiito.dev:443
user:NEW_ADDRESSS
矿池 2
地址:5.223.46.169:443
user:IP-failover
矿池 3
地址:hk.salvium.gfwroute.com:1230
钱包(XMR/门罗币): SaLvsARaV7D9s3XNreiozaTBLLsJdan6KXCKsCbN1ojtW9ABgKsJtzkgCiQB8e5DkXfqQCPBCat Xae4dbJN2ngPvDqTUd2pFyXJ
矿池 4 / 5(同一组配置)
地址:pool.supportxmr.com
端口:3333
端口:7777
user(Zephyr 钱包地址 / 也出现在矿池 6): ZEPHYR2ysT7Qebc8QLknZo5VyaQDdRHeF7dn7M6d8ra1FUsGpZ1ZpeCKun9XLptPmGCZZCAUjP81qKcY tER3GTUagU15H7btCPa2D
pass:fr-fail
rig-id:null
nicehash:false
keepalive:true
enabled:true
tls:false
tls-fingerprint:null
daemon:false
socks5:null
self-select:null
submit-to-origin:false
其他全局参数(你这段里出现的):
print-time:60
health-print-time:60
dmi:true
retries:500000
retry-pause:10
syslog:false
tls.enabled:false
user-agent:null
verbose:0
watch:true
pause-on-battery:false
pause-on-active:false
钱包(XMR/门罗币): 48wb18tbiori5prH9ad5dbH9UN963XTKhabnUgYJtvzy7LRcAHiP1dA9xHSdwLczGCc7ahsZBx5 JxXLMkHrzP5fQPXkkXJk
矿池 6
地址:fr-zephyr.miningocean.org:5462
钱包(Zephyr): ZEPHYR2ysT7Qebc8QLknZo5VyaQDdRHeF7dn7M6d8ra1FUsGpZ1ZpeCKun9XLptPmGCZZCAUjP8 1qKcYtER3GTUagU15H7btCPa2D
加入我们
分享、在看与点赞
环境已打包OVF,进群即可免费获取
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:云晞科技Sec 云晞科技Sec《一次真实应急处置复盘》