跳转至

远控后门

木马后门处置流程.drawio

0x00 固定证据

在发生任何安全事件时,确定安全事件真实存在以后,第一步都建议固定证据,固定证据一般有以下几种类型,受害单位可以根据实际需求选择

  • 系统快照 - 一般云环境比较方便这么做
  • 磁盘取证
  • 针对性取证 - 例如日志文件、网络信息、数据库等
  • 内存取证

系统快照

这种主要是云环境或虚拟化环境比较方便,目前似乎这类方式取证出来的内容都会丢失内存信息,属于是关机-快照-导出

虚拟机软件似乎支持例如暂停、冻结等功能,具体根据实际情况决定

磁盘取证

磁盘取证有很多工具可以考虑

  • dd
  • FTK Imager

针对性取证

这部分推荐我们自己的 NOPTrace-Collector

https://github.com/Just-Hack-For-Fun/NOPTrace-Collector

我们还推出了一套数字取证和应急响应规范,可以根据此规范自己开发取证程序

https://github.com/Just-Hack-For-Fun/OpenForensicRules

内存取证

  • DumpIt
  • FTK Imager

取证后,对证据进行分析时,需要先单独复制一份,保持所有安全人员分析的基础是相同的

0x01 确定 ioc 信息

远控后门一般不会由服务器 CPU 或内存等占用过高告警而发现,大多数情况都是安全设备告警,可能是流量设备,可能是主机安全设备

流量设备告警通常可以得到的信息如下

  • 异常域名
  • 外连IP
  • 外联端口
  • 事件时间

主机安全设备告警通常可以得到的信息如下

  • 恶意文件位置
  • 恶意文件动作

0x02 主机安全:直接定位文件

主机安全程序的详细描述信息十分重要,至少可以知道本次是否执行成功,不过即使执行失败,我们还是需要尝试根据文件位置查找进程

图形化工具中可以直接通过搜索框进行搜索关键字

image-20231226174801681

更好方式是通过搜索文件句柄

image-20231226180623689

image-20231226181511879

image-20231226181536634

image-20231226181705913

handle 程序

https://download.sysinternals.com/files/SysinternalsSuite.zip

这是Sysinternals Suite中的一个方便的命令行实用程序,可显示哪些文件由哪些进程打开等

可以通过下面的链接单独下载 handle

https://download.sysinternals.com/files/Handle.zip

image-20231226180203356

image-20231226180449899

通过查询文件占用情况,如果发现存在异常进程,可以获取到进程的 pid

0x03 流量检测: 域名、IP、端口

如果域名没有采用 cdn 或者有稳定的 ip ,很好办了

1. netstat

netstat -ano | findstr "ip/端口"

image-20231226205204562

netstat 这个命令结果和标题栏对应关系没有 Sysinternals Suite 中其他工具那么好,但是还是能看出 pid 的位置

2. Powershell

Get-NetTCPConnection
Get-NetUDPEndpoint

image-20231226205702032

image-20231226205721663

3. 图形化工具

image-20231226210251647

image-20231226210327951

如果域名采用了 cdn ,且端口号比较大众化,可以考虑 DNS缓存和诱骗的方式

4. DNS 缓存

1) cmd
ipconfig /displaydns

image-20231226210747689

2) Powershell
Get-DnsClientCache

image-20231226210854053

3) wmic
wmic path Win32_PerfFormattedData_DNS_DNSCache get *

5. 地址诱骗

  • 找一个内网或公网固定IP主机(诱捕主机),监听恶意域名采用对应的端口
  • 在受害主机上监控受害主机与我们的诱捕主机之间网络连接,若有链接,记录进程id、文件位置等信息
  • 通过修改 host 文件,将恶意域名解析到我们的诱捕主机上
  • 等待受害主机上的监控返回结果

这种方法可以有效解决域名采用了 cdn 找不到IP以及进程的问题

修改 host 文件方式如下

以恶意域名 du.testjj.com 为例

通过修改 C:\Windows\System32\drivers\etc\hostsdu.testjj.com 解析IP修改为 123.123.123.123

image-20231229223253408

直接修改 hosts 无法保存,可以先保存到桌面,之后拖进去覆盖原来的 hosts 文件

image-20231229223535911

image-20231229223444440

image-20231229223637083

监控脚本如下

@echo off 

:loop
if exist "%USERPROFILE%/Desktop/bat_result.txt" (
    echo "find it!!!"
    timeout /T 5 /NOBREAK
    goto loop
) else (
for /f "tokens=5" %%a in ('netstat /ano ^| findstr 123.123.123.123') do (
wmic process where processid=%%a get name,executablepath,processid,CommandLine >> %USERPROFILE%/Desktop/bat_result.txt
)

timeout /T 1 /NOBREAK
)


goto loop

6. 内存搜索关键字

将已获取的域名、IP等作为关键字,使用僵尸网络查杀工具在内存中进行搜索

image-20240306165856571

image-20240306165934460

成功发现恶意程序

具体使用方法见 小技巧 -> 0x03 内存中搜索字符串

0x04 寻找恶意样本

经过以上步骤,已经确定了恶意进程的 pid, 接下来我们通过 pid 找到恶意文件位置以及恶意文件启动时的参数

1. 任务管理器

任务管理器默认情况显示的列里没有文件位置以及启动参数,可以通过调整显示列来显示

image-20231225172617635

image-20231225172656696

勾选路径名称命令行

image-20231225172817154

至于其他与任务管理器类似的程序也是一样的逻辑

2. Powershell

将以下内容保存为 Powershell 脚本 file.ps1 ,之后在 Powershell 终端中执行就可以了

$maliciousPid = <恶意进程的PID>
$process = Get-WmiObject -Class Win32_Process -Filter "ProcessId = $maliciousPid"
$processName = $process.Name
$processPath = $process.ExecutablePath
$commandLine = $process.CommandLine

Write-Host "进程名称:" -NoNewline -ForegroundColor Green
Write-Host $processName
Write-Host "进程文件位置:" -NoNewline -ForegroundColor Green
Write-Host $processPath
Write-Host "命令行参数:" -NoNewline -ForegroundColor Green
Write-Host $commandLine

image-20231225171527215

当然,也可以变成一行

$maliciousPid=<恶意进程的PID>; $process=Get-WmiObject -Class Win32_Process -Filter "ProcessId = $maliciousPid"; $processName=$process.Name; $processPath=$process.ExecutablePath; $commandLine=$process.CommandLine; Write-Host "进程名称:" -NoNewline -ForegroundColor Green; Write-Host $processName; Write-Host "进程文件位置:" -NoNewline -ForegroundColor Green; Write-Host $processPath; Write-Host "命令行参数:" -NoNewline -ForegroundColor Green; Write-Host $commandLine

image-20231225181436160

3. wmic

wmic process where ProcessId=<恶意进程的PID> get Name, ExecutablePath, CommandLine /format:list

image-20231225180130132

4. Process Explorer

image-20231225173052589

image-20231225173135213

当然,在 Process Explorer 中还可以在选中异常进程后,右键 Properties 看该进程的详细信息

image-20231225173338699

image-20231225173423336

5. Process Hacker

image-20231225173649123

image-20231225174141769

也可以通过右键的方式来查看

image-20231225174751172

6. System Informer

image-20231225175357702

image-20231225175451848

也可以通过右键进行查看

image-20231225175646395

7. OpenArk

https://openark.blackint3.com/

https://github.com/BlackINT3/OpenArk

OpenArk 也是一款集成性的安全排查工具,用于对抗 Rootkit

image-20240306172736997

可以查看属性

image-20240306172832361

0x05 确定进程启动时间

这一步骤的主要意义在于对比进程启动时间与恶意文件的相关时间,确定在进程启动后,该文件是否修改过。

根据上述信息简单判断一下启动该异常进程的文件是否为我们找到的文件

1. Powershell

# 代码版
$maliciousPid = <恶意进程的PID>
$process = Get-Process -Id $maliciousPid
$startTime = $process.StartTime
Write-Host "进程启动时间:" -NoNewline
Write-Host $startTime

image-20231225182054811

# 压缩成一条命令
$maliciousPid=<恶意进程的PID>; $startTime=(Get-Process -Id $maliciousPid).StartTime; Write-Host "进程启动时间:" -NoNewline; Write-Host $startTime

image-20231225182308527

2. wmic

wmic process where ProcessId=<进程PID> get ProcessId, CreationDate

image-20231225182742005

wmic 的显示格式不是很友好,但是依旧可读,而且更详细

3. Process Explorer

image-20231225183132434

image-20231225183212325

当然还是可以通过右键属性的方式查看

image-20231225183356512

4. Process Hacker

image-20231225183541441

image-20231225183641350

image-20231225183734567

5. System Informer

image-20231225183839410

image-20231225183938654

image-20231225184006494

6. OpenArk

image-20240306173628097

image-20240306173659134

7. 获取异常文件的时间信息

文件浏览器

image-20231225184432453

Process Explorer

image-20231225184929040

image-20231225184957562

0x06 处理异常进程

1. 恶意文件样本采样

在 Windows 上这个就简单多了,可以直接通过网络或者 U 盘等介质进行取样

2. 威胁分析

既然有了恶意样本,可以通过人工或在线平台进行分析

3. 寻找病毒分析报告

4. 进程查杀

我们不仅可以杀死进程及进程树,还可以让进程暂停(suspend)或者进程重启

进程查杀是一个危险操作,所以可以考虑先暂停,看看是否符合预期,再决定是否杀死进程

需要注意的是,即使暂停了进程,该进程的网络连接不见得会断,一般情况下无法发送和接收数据

1) 暂停进程

【资源监视器】

image-20231225193714014

image-20231225193812404

进程暂停后,ping 的动作随即暂停

image-20231225193912250

进程处于暂停状态时,可以恢复进程执行,也可以直接结束掉进程或进程树,我们尝试恢复

image-20231225194049209

被暂停掉的进程继续执行,暂停和恢复前 pid 不会发生变化

通过暂停以及恢复,我们基本可以确定要被处理的进程是否为该进程,当然,如果有必要的话才这么做

PsSuspend

https://learn.microsoft.com/zh-cn/sysinternals/downloads/pssuspend

https://download.sysinternals.com/files/PSTools.zip

暂停进程

pssuspend.exe <进程id>

image-20231225200048625

恢复进程

pssuspend.exe -r <进程id>

image-20231225200123427

其他图形化工具基本上都是右键,点击选择就可以了

image-20231225200430381

image-20231225200513961

image-20231225200630188

2) 杀死进程

taskkill

taskkill /F /PID <进程ID>

image-20231225201050318

Powershell

Stop-Process -Id <进程ID> -Force

image-20231225201206388

wmic

wmic process where ProcessId=<进程ID> call Terminate

image-20231225201319035

pskill

https://download.sysinternals.com/files/PSTools.zip

pskill64.exe <进程ID>

image-20231225201603342

【资源监视器】

image-20231225201751993

其他图形化工具也是类似的使用方法

image-20231225201922303

image-20231225201956994

image-20231225202028668

3) 杀死进程树

如果恶意进程所在的整个进程树都是恶意的,那就需要杀死整个进程树,在某个进程上杀死进程树就是杀死由该进程起的所有子孙进程

杀死进程已经是危险操作了,杀死进程树更要谨慎

查看进程树

这件事自带的工具并不直观,需要借助第三方工具

Process Explorer

image-20231226155009301

image-20231226155146737

可以看到, PING.EXE 进程的父进程为 cmd.exe pid3252 , 再上一层父进程为 explorer.exe pid3140

如果此时在 PING.EXE 上右键,杀死进程和杀死进程树是没有大区别的,因为 PING.EXE 并没有子进程,但是如果在上一层 cmd.exe 上杀死进程树,那么 cmd.exe (pid: 3252) 以及其子进程 conhost.exePING.exe 也会被杀死

尝试在 PING.EXE 右键杀死进程树

image-20231226160725542

image-20231226160751369

可以看到,其实只有 PING.EXE (pid: 6656) 自己被杀死了

我们再启动 PING.EXE ,尝试在 conhost.exe (pid: 5240) 进程右键杀死进程树

image-20231226161631318

image-20231226161659659

虽然 cmd 的黑框框消失了,但是 PING.EXE 还在继续运行,如果仅在 cmd.exe (pid: 5272) 上右键,仅杀死进程

image-20231226162803459

PING.EXE 进程还是会继续运行下去

接下来尝试"赶尽杀绝"

尝试重新起一个 cmd 并且执行 PING.EXE ,在 cmd 进程上右键杀死进程组

image-20231226163020713

image-20231226163048664

这回由该cmd.exe (pid: 5500) 其的进程以及子进程都被杀死了

Process Hacker

Process Hacker 以进程树形式显示的话,没有找到相关选项,可能默认就是吧,如果你的不是,可以通过以下方法实现

image-20231226163546813

点击 Name 标题栏三次,其实就是我们之前排序,第三次正好是取消排序,之后就会以进程树的形式显示

剩下的使用方法和 Process Explorer 一样了

System Informer

基本与 Process Hacker 一样

image-20231226164132638

这里需要提一点,可以看到,在 PING.EXE 上右键时,结束进程树的按钮是灰色的,这些小细节应该就是 System InformerProcess Hacker 相比进步的地方吧,所以现在比较建议用新工具,当然前提是你测试过没有蓝屏这种严重 bug

4) 杀死线程

这是一个更加危险的操作,可能对操作系统的稳定性产生影响,尤其是在你手抖的时候

System Informer

image-20231226173430762

通过右键 -> 属性(Properties) -> Threads 就可以看到该进程具体的线程信息了

在线程上右键就可以选择 Terminate 来杀死线程

image-20231226173831344

image-20231226173913660

可以看到,杀死 PING.exe 进程中的一个线程后, 原本的 ping 命令卡死了,不再输出 ping 命令的信息,但是并没有退出(结束进程),进程依旧活着,而且剩余两个线程也没有退出

过了几秒

image-20231226174219961

整个进程死掉了

Process Explorer会提示下载一个其他程序,但是不下载也能显示,System informer 没有这个提示

0x07 删除恶意文件

1. 确定文件占用情况

图形化工具中可以直接通过搜索框进行搜索关键字

image-20231226174801681

更好方式是通过搜索文件句柄

image-20231226180623689

image-20231226181511879

image-20231226181536634

image-20231226181705913

handle 程序

https://download.sysinternals.com/files/SysinternalsSuite.zip

这是Sysinternals Suite中的一个方便的命令行实用程序,可显示哪些文件由哪些进程打开等

可以通过下面的链接单独下载 handle

https://download.sysinternals.com/files/Handle.zip

image-20231226180203356

image-20231226180449899

若发现存在其他进程占用恶意文件,可能也是恶意进程,可以考虑按照之前的方法处理

2. 查询注册表

部分恶意程序可能对注册表进行了修改,内容包含恶意程序的名字,这里需要在注册表中搜索一下

Win + r 打开运行框,输入 regedit,回车

image-20231226182535864

image-20231226182628065

image-20231226182723862

这样就可以进行全局搜索了

即使搜索到了,也不要着急删除或修改,跟各方确定好,这很重要

3. 删除恶意文件

直接图形化删除或者通过下面的命令

# cmd
del xxx
# Powershell
Remove-Item -Path xxx

0x08 善后阶段

直接查看善后阶段即可,主要为定损以及针对性排查处理,目的是解决潜在的受害服务器

0x09 常规安全检查阶段

直接根据常规安全检查章节进行安全检查即可,目的是找出当前系统中存在的隐藏后门等