第 50 课:应急响应与清理思路
# 第 50 课:应急响应与清理思路
免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。
本课讲企业发现类似远控行为后的处置流程。重点是先控制风险、保全证据、确认影响范围,再清理异常项和恢复系统。新手最容易犯的错误是看到可疑文件就立刻删除,这可能破坏关键证据,也可能漏掉持久化、驱动、插件缓存和账号风险。

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

| 类型 | 需要记 |
|---|---|
| 进程 | 进程树、命令行、路径、签名、哈 |
| 网络 | 连接目的地、端口、协议、字节数、时 |
| 文件 | 插件文件、临DLL、驱动文件、缓存文本 |
| 注册 | Run 项、插件缓存、驱动服务项、异常配 |
| 服务任务 | 新建服务、计划任务、启动类 |
| 账号 | 登录来源、异常会话、口令或 Cookie 风险 |
| 内存 | 可疑进程内存、RWX 私有页、线程入口 |
依赖说明: 应急排查会遇到多个依赖痕迹:HPSocket 风格的长连接和心跳,JPEG/zlib/x264 造成的图像或视频流,SQLite/OpenSSL/DPAPI 形成的凭据读取链,驱动服务和设备对象形成的内核痕迹。处置时不要只删除一个可疑文件,要把这些依赖产生的日志、文件、注册表和网络证据一起保全。
# 3. 主机排查地图

排查时建议按下面顺序走:
查网络连接:是否有长连接、心跳、小包周期、异常内网连接?
查进程树:可疑进程是谁启动的,是否有子进程或远程线程?
查插件落点:是否DLL、注册表二进制缓存或临时文件?
查持久化:Run 项、启动目录、计划任务、服务?
查驱动:是否创建
SERVICE_KERNEL_DRIVER服务?查账号风险:是否读取过浏览器凭据、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();
}
// 防御分析:处置时应保全连接目的地、连接持续时间 // 心跳周期和连接前后的本机行为}
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);
// 防御分析:应保全注册表键路径、值名、数据大小、哈希 // 首次写入时间和写入进程}
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 项、启动目录、计划任务、服务都要确认}
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);
// 防御分析:保全驱动文件、服务项、签名状态、加载日志和设备访问记录// 清理驱动前应确认内核状态,避免破坏现场?
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、云平台等风险?
2
3
4
5
6
7
8
9

账号侧处置:
| 动作 | 说明 |
|---|---|
| 冻结高危会话 | 特别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/ # 清理动作、验证截图、规则命?
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. 恢复与加固闭。

| 阶段 | 目标 |
|---|---|
| 移除异常 | 清理进程、文件、注册表、服务、任 |
| 补齐补丁 | 修复入口漏洞和弱口令 |
| 收紧权限 | 限制本地管理员、服务创建、驱动加 |
| 网络分段 | 限制工作站访问高敏感服务 |
| 规则上线 | 把本次特征沉淀成检测规则 |
| 复盘改进 | 更新基线、资产标签、响应流 |
# 16. 应急处置要
| 处置 | 是否完成 |
|---|---|
| 已隔离主机并记录隔离时间 | |
| 已导出进程树和网络连 | |
| 已保存可疑文件哈希和路径 | |
| 已检Run 项、启动目录、计划任务、服 | |
| 已检查驱动服务和设备对象 | |
| 已检查插件注册表缓存 | |
| 已确认是否读取浏览器凭据、Cookie | |
| 已轮换高风险账号口令 | |
| 已检查同网段横向连接 | |
| 已验证主机恢复后无异常回 |
# 17. 合法练习:
根据本课内容,设计一份“疑似远控主机处置记录表”?
写出发现
kernelquick驱动服务后应保全6 类信息?说明为什么发现浏览器凭据读取后,必须处理账号风险?
设计一条恢复验证规则:清理24 小时内无异常外联、无新增持久化项、无异常账号登录?
按本课证据包目录模板,为一台疑似主机设计最小证据包结构。
安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。
本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。
社区交流
讨论与留言