50 / 52 安全检测、响应与重构

第 50 课:应急响应与清理思路

# 第 50 课:应急响应与清理思路

免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。

本课讲企业发现类似远控行为后的处置流程。重点是先控制风险、保全证据、确认影响范围,再清理异常项和恢复系统。新手最容易犯的错误是看到可疑文件就立刻删除,这可能破坏关键证据,也可能漏掉持久化、驱动、插件缓存和账号风险。 第 50 课:应急响应与清理思路(配图)

# 1. 处置原则

原则 说明
先隔离再清理 防止继续外联和横向移
先保全再删除 保留进程、网络、文件、注册表、日
先确认范 不只看单台主机,也看账号和内网连
先处理高危能 驱动、注入、凭据读取优先级最
清理后要验证 确认没有回连、没有自启动、没有异常账号活

# 2. 需要保全哪些证。

2. 需要保全哪些证。(配图)

类型 需要记
进程 进程树、命令行、路径、签名、哈
网络 连接目的地、端口、协议、字节数、时
文件 插件文件、临DLL、驱动文件、缓存文本
注册 Run 项、插件缓存、驱动服务项、异常配
服务任务 新建服务、计划任务、启动类
账号 登录来源、异常会话、口令或 Cookie 风险
内存 可疑进程内存、RWX 私有页、线程入口

依赖说明: 应急排查会遇到多个依赖痕迹:HPSocket 风格的长连接和心跳,JPEG/zlib/x264 造成的图像或视频流,SQLite/OpenSSL/DPAPI 形成的凭据读取链,驱动服务和设备对象形成的内核痕迹。处置时不要只删除一个可疑文件,要把这些依赖产生的日志、文件、注册表和网络证据一起保全。

# 3. 主机排查地图

3. 主机排查地图(配图)

排查时建议按下面顺序走:

  1. 查网络连接:是否有长连接、心跳、小包周期、异常内网连接?

  2. 查进程树:可疑进程是谁启动的,是否有子进程或远程线程?

  3. 查插件落点:是否DLL、注册表二进制缓存或临时文件?

  4. 查持久化:Run 项、启动目录、计划任务、服务?

  5. 查驱动:是否创建 SERVICE_KERNEL_DRIVER 服务?

  6. 查账号风险:是否读取过浏览器凭据、Cookie。

# 4. 网络连接证据

源码中的心跳和包结构能帮助我们识别连接特征。

// 源码位置:主插件\HPSocket\TcpSocket.cpp,约179-195 BYTE Token = TOKEN_HEARTBEAT;
while (pThis->m_bIsRunning)
{
    Sleep(10);
    pThis->Send(&Token, 1);

    if (timeGetTime() - pThis->activetime > 60000)
    {
        pThis->Disconnect();
    }

    // 防御分析:处置时应保全连接目的地、连接持续时间    // 心跳周期和连接前后的本机行为}
1
2
3
4
5
6
7
8
9
10
11
12

网络侧要查:

项目 说明
目的 IP/域名 是否未知、动DNS、异常内网地址
端口 是否非业务端口
周期 是否有稳定心
流量方向 是否有数据外
横向访问 是否访问多个内网服务

# 5. 插件缓存和注册表证据

登录模块会接收插件数据,并写入注册表二进制值。处置时不能只看磁盘 DLL,也要看注册表中的大块二进制数据。

// 源码位置:主插件\登录模块\登录模块\LoginManager.cpp,约314-366 case COMMAND_SENDLL:
{
    DllSendData* temp = new DllSendData;
    ::memcpy(temp, lpBuffer + 1, sizeof(DllSendData));

    BYTE* pPluginDllShellcodeData = new BYTE[temp->dllDataSize];
    ::memcpy(
        pPluginDllShellcodeData,
        lpBuffer + 1 + sizeof(DllSendData),
        temp->dllDataSize);

    ::RegSetValueEx(
        hKey,
        DllName,
        0,
        REG_BINARY,
        (unsigned char*)writeregeditbuffer,
        writeregeditsize);

    // 防御分析:应保全注册表键路径、值名、数据大小、哈希    // 首次写入时间和写入进程}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 6. 持久化证。

启动管理模块支持 Run 项、启动目录、计划任务和服务。处置时要逐项排查,不能只删除一个启动项就结束。

// 源码位置:主插件\启动管理\启动管理\StartupManager.cpp,约176-191 void CStartupManager::SendStartupStatus()
{
    StartupInfo si = { 0 };

    ::GetModuleFileName(NULL, si.szAppPath, MAX_PATH);

    si.enableAdminPrivileg = IsUserAnAdmin();
    si.enableRegistryStartup = IsStartupItemExistsInRegistry();
    si.enableFolderStartup = IsStartupItemExistsInStartupFolder();
    si.enableScheduledTaskStartup = IsScheduledTaskExists();
    si.enableServiceStartup = IsServiceExists();

    si.cmd = COMMAND_STARTUP_STATUS_RESPONSE;

    // 防御分析:这些状态字段可以反向变成处置检查项    // Run 项、启动目录、计划任务、服务都要确认}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 7. 驱动和内核风。

驱动插件会写出 kernelquick.sys,并创建 kernelquick 驱动服务。发现这类迹象时,优先级要高于普通用户态插件。

// 源码位置:主插件\驱动插件\驱动插件\KernrlManager.cpp,约188-215 SC_HANDLE hSCMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hService = CreateService(
    hSCMgr,
    TEXT("kernelquick"),
    TEXT("kernelquick"),
    SERVICE_ALL_ACCESS,
    SERVICE_KERNEL_DRIVER,
    SERVICE_DEMAND_START,
    SERVICE_ERROR_IGNORE,
    szPath,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL);

StartService(hService, 0, NULL);

// 防御分析:保全驱动文件、服务项、签名状态、加载日志和设备访问记录// 清理驱动前应确认内核状态,避免破坏现场?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 8. 凭据和账号风。

解密数据模块会访问浏览器数据库、Local State DPAPI。只要发现这类行为,就要按账号可能暴露处理,而不是只清理主机文件。

// 源码位置:主插件\解密数据\解密数据\GetBrowserInfo.cpp,约441-465 DATA_BLOB dataIn = { (DWORD)encryptedKeyLength - 5, (BYTE*)(encryptedKey + 5) };

if (!CryptUnprotectData(&dataIn, NULL, NULL, NULL, NULL, 0, pDatab))
{
    return false;
}

// 防御分析:非浏览器进程调DPAPI 处理浏览器密钥后// 应检查账号登录、Cookie、Token、邮箱、VPN、云平台等风险?

1
2
3
4
5
6
7
8
9

8. 凭据和账号风。(配图)

账号侧处置:

动作 说明
冻结高危会话 特别VPN、云平台、邮箱、管理后
轮换口令 优先处理管理员和高权限账
吊销 Token 浏览Cookie、API Token、持久登录状态
检查异常登 看来IP、设备、时间、地理位
启用 MFA 对高价值账号强制多因素认证

# 9. 清理顺序

清理建议按风险从高到低处理:

顺序 动作
1 隔离主机,阻断外联和横向访问
2 保全进程、网络、文件、注册表、日
3 停止可疑进程和服
4 处理驱动服务和设备对象
5 删除持久化项和插件缓
6 清理临时文件、落DLL、异常配
7 轮换账号、吊销会话、检查横向访
8 恢复网络并持续观

注意:实际企业环境中,驱动和系统文件清理应由具备权限的响应人员执行,并遵循内部流程。

# 10. 现场记录字段

应急处置最怕“知道有问题,但证据说不清”。建议把每台主机的处置记录写成下面这种结构

字段 示例写法
主机信息 主机名、IP、资产编号、业务系统、责任人
发现时间 告警时间、人工确认时间、隔离时
可疑进程 路径、PID、父进程、签名、哈希、命令行
网络连接 目的 IP、端口、协议、连接时长、字节数
插件证据 注册表键、值名、数据大小、疑似插件名、哈
持久化证 Run 项、启动目录、计划任务、服务、驱动服
隐私和账号风 是否访问浏览器数据库、DPAPI、音视频设备
横向风险 是否访问内网服务、多端口、多主机
已执行动 隔离、保全、停止进程、账号轮换、恢复验

分场景处理时,优先级可以这样落地

场景 立即动作 后续验证
发现凭据读取 隔离主机,轮换高权限账号,吊销登录 检查异常登录、VPN、邮箱、云平台
发现驱动服务 保全驱动文件和服务项,升级为高危事件 验证驱动未加载、设备对象不存在
发现代理映射 阻断外联和东西向访问 检查内网目标访问日
发现屏幕/音频采集 保全进程和网络,核对用户授权 检查是否有合法工单和可见提

# 11. 事件时间线模。

应急报告里最有价值的不是“我们处理了”,而是能说清楚事件从发现到恢复经历了什么。建议使用下面这种时间线

时间 事件 证据来源 责任 当前状态
09:12 EDR 发现可疑长连 EDR 网络事件、进程树 SOC 值班 已确
09:20 主机从办公网隔离 NAC/防火墙变更记 运维 已完
09:35 导出进程、网络、注册表证据 现场保全 响应人员 已完
10:10 发现插件注册表缓 HKCU\Console\0/1 导出 响应人员 已保
10:40 确认是否有凭据读 文件访问、DPAPI、浏览器目录 身份安全 待确
11:30 清理持久化和异常服务 服务、计划任务、Run 终端运维 已完
次日 11:30 24 小时无异常回 EDR/NDR/防火 SOC 验证

# 12. 证据包目录模。

证据包要方便复盘和交接。建议不要把所有文件堆到一个目录,而是按证据类型归档。

IR-主机YYYYMMDD/
  00-readme.md                  # 处置摘要、主机信息、时间线
  01-process/                   # 进程树、命令行、模块列  02-network/                   # 连接、DNS、防火墙、NDR 证据
  03-files/                     # 可疑文件、哈希、签名信  04-registry/                  # Run 项、Console 缓存、服务项导出
  05-services-tasks/            # 服务、驱动、计划任  06-accounts/                  # 异常登录、会话、Token 处置记录
  07-memory/                    # 内存摘要、RWX 页、线程入  08-cleanup-validation/        # 清理动作、验证截图、规则命?

1
2
3
4
5
6
7
目录 最低要求
01-process 进程树、父子关系、命令行、签名、哈
02-network 目的 IP、端口、协议、开结束时间、字节数
03-files 可疑 EXE/DLL/SYS 路径、哈希、签名、创建时
04-registry 可疑键路径、值名、类型、数据大小、导出文本
06-accounts 已冻结账号、已轮换账号、已吊销 Token、异常登录证
08-cleanup-validation 清理前后对比4/48 小时复查结果

# 13. 影响范围确认。

清理单台主机前,要先确认影响范围。否则很容易出现“这台清干净了,其他主机还在回连”的问题

维度 要确认的问题 数据
主机范围 是否还有同哈希、同路径、同服务名、同注册表 EDR、资产平台、文件哈希库
网络范围 是否还有同目IP/端口/域名的连 NDR、防火墙、代理日
账号范围 是否有同账号多地登录、异常设备、异Token IAM、VPN、邮箱、云平台
内网范围 是否访问过服务器区、数据库、管理端口 防火墙、流量日志、服务器日志
插件范围 是否存在同名 DLL、_bin、注册表二进制缓 主机排查、注册表导出
驱动范围 是否有同名 .sys、驱动服务、设备对象 Windows 事件、EDR、服务列表

# 14. 清理验证。

清理完成后要验证,不要只看“文件不存在”。建议至少做三轮:清理后立即4 小时8 小时

验证 立即 24 小时 48 小时
可疑进程不存
可疑外联无新
HKCU\Console\0/1 异常缓存已清
Run 项、启动目录、计划任务、服务无异常
驱动服务和设备对象无异常
浏览器凭据访问链无新
相关账号已轮换口令或吊销会话
EDR/NDR 规则无再次命

# 15. 恢复与加固闭。

15. 恢复与加固闭。(配图)

阶段 目标
移除异常 清理进程、文件、注册表、服务、任
补齐补丁 修复入口漏洞和弱口令
收紧权限 限制本地管理员、服务创建、驱动加
网络分段 限制工作站访问高敏感服务
规则上线 把本次特征沉淀成检测规则
复盘改进 更新基线、资产标签、响应流

# 16. 应急处置要

处置 是否完成
已隔离主机并记录隔离时间
已导出进程树和网络连
已保存可疑文件哈希和路径
已检Run 项、启动目录、计划任务、服
已检查驱动服务和设备对象
已检查插件注册表缓存
已确认是否读取浏览器凭据、Cookie
已轮换高风险账号口令
已检查同网段横向连接
已验证主机恢复后无异常回

# 17. 合法练习:

  1. 根据本课内容,设计一份“疑似远控主机处置记录表”?

  2. 写出发现 kernelquick 驱动服务后应保全6 类信息?

  3. 说明为什么发现浏览器凭据读取后,必须处理账号风险?

  4. 设计一条恢复验证规则:清理24 小时内无异常外联、无新增持久化项、无异常账号登录?

  5. 按本课证据包目录模板,为一台疑似主机设计最小证据包结构。

安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。

上次更新: 2026/07/14, 19:37:40

社区交流

讨论与留言

前往 GitHub Issues →

本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。

最近更新
第 1 课:专栏导论与安全边界
07-01
第 3 课:安装编译与调试环境
07-01
第 4 课:第三方库下载、编译与依赖管理
07-01
更多文章>