Windows应急溯源
我非常赞同曾经看到的一句话,一旦你能够确定本次安全事件的类型,猜测出攻击者或者恶意代码的攻击思路,然后去验证排查这些猜想,就会加速你的分析过程。在做应急溯源的过程中,很多时候通过一两点线索,拼凑攻击者链条的画像,用下文提到的排查方法,去补充证据来证明自己的猜想。(正如打游戏要预判敌人走位,应急也要预判攻击者的行为)当然受限于自己知识的局限性还是很可能误判的,在应急中误判又是特别致命的,可能一个误操作就会为客户带来不可估量的损失。所以我个人认为现场溯源应急至少要3个人以上,互相弥补吧。
系统基本信息
系统信息概述
1 | systeminfo |
详细信息
1 | msinfo32 |
显示本地计算机硬件资源、组件、软件环境;正在运行的任务,服务、驱动、加载模块、启动程序
- 正在运行的任务
- 服务
- 驱动程序
- 加载的模块
- 启动程序
系统账号(用户信息)
预判攻击者利用账号的可能性:
- 直接建立新账号(可能和系统常用名类似)
- 激活系统中默认账号(这个账号存在很久不经常使用)
- 创建隐藏账号(账户名后
$
)
命令行
1 | net user |
查看具体账号的详细信息,username
为具体用户名
1 | net user username |
图形界面
1 | lusrmgr.msc |
win+r
–> compmgmt.msc(计算机管理窗口) –> 本地用户和组 –> 用户
注册表
win+r
–>regedit(注册表编辑器) –> HKEY_LOCAL_MACHINE –> SAM
启动继承,方框✔;F5刷新后查看用户信息。
克隆账号
计算机\HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
F值和000001F4
相同即为克隆账户
wmic
1 | wmic useraccount get name,sid |
启动项
系统配置
1 | msconfig |
在系统配置对话框中选择启动选项卡
注册表
注册表是操作是操作系统中重要的数据库,很多病毒通过注册表来实现持久化驻留。
注册表含义:
(1)HKEY_CLASSES_ROOT(HKCR)
确保资源管理器中执行时打开正确的程序
(2)HKEY_CURRENT_USER(HKCU)
当前登录系统的用户配置
(3)HKEY_LOCAL_MACHINE(HKLM)
计算机硬件特定信息
(4)HKEY_USERS(HKU)
所有用户配置文件的配置信息
(5)HKEY_CURRENT_CONFIG(HCU)
存储有关系统当前配置信息
Autoruns
https://www.sysgeek.cn/autoruns/
任务计划
cmd下执行命令compmgmt.msc
(计算机管理窗口) –> 任务计划程序
powershell执行Get-ScheduledTask
返回路径,名称,状态
命令行下执行schtasks
1 | 文件夹: \Microsoft\XblGameSave |
获取任务计划必须是本地Administrators组的
进程排查
主要目的:找到恶意进程的PID、程序路径、PPID、程序加载的DLL。
taskmgr
添加命令行和映射路径名称
tasklist
在cmd执行tasklist
映像名称,PID 会话名,会话,内存使用
tasklist /svc
映像名称–PID–服务 #进程和服务的对应关系
tasklist /m | more
映像名称–PID–模块 #加载DLL的恶意进程
tasklist /m ntdll.dll
查看指定模块的进程(如ntdll.dll)
fi
过滤器
eq
等于
ne
不等于
gt
大于
lt
小于
ge
大于等于
le
小于等于
tasklist /svc /fi 'PID eq 7440'
#PID为7440的进程
netstat 网络信息查询
1.通过netstat定位有网络连接的PID
1 | netstat -ano | findstr "ESTABLISHED" |
LISTENING:监听状态
ESTABLISHED:建立连接
CLOSE_WAIT:对方主动关闭连接,或网络异常导致连接中断
2.通过tasklist对PID程序定位
1 | tasklist|findstr "12308" |
netstat -anb
#快速定位端口对应程序(需要管理员权限)
或者使用TCPView
powershell排查确认子父进程之间的关系
1 | Get-WmiObject Win32_Process | select name,processid,parentprocessid,path |
1 | Get-WmiObject Win32_Process |
获取进程的所有信息
wmic process
1 | wmic process get name,processid,parentprocessid /format:csv |
结束恶意进程
1 | wmic process where processid=[PID] delete |
procexp
重点检查没有厂商名字、没有 签名验证信息、没有描述信息、CPU 或内存资源占用长时间过高的进程的进程。检查可疑进程的属主、路径是否合法。
进程颜色
- 浅蓝色: 和Process Explorer属于同一个用户的进程。
- 粉红色: 服务进程,通常会包含一个或多个Windows服务。
- 黄色: .NET进程。
- 深灰色: 挂起的进程。
- 紫色: 标识包含压缩或者加密的可执行代码的进程。一些病毒软件经常会利用这种方式绕过杀毒软件。
- 红色: 刚刚退出的进程。
显示选项
1.显示进程当前的权限,是系统用户权限还是网络管理员权限还是普通管理员权限(User Name)
2.显示进程的文件路径(Image Path)
3.显示进程是64位进程还是32位的(Image Type)
4.显示进程当前所在的Session ID(session)
5.显示进程命令行参数(Command Line)
显示当前进程的GDI
对象个数,内核对象个数,线程个数。
GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。
显示当前进程所加载的DLL
选择View - Lower Pane View - DLLs
通过这种方式可以观察,我们的进程是否被其他程序注入DLL
,了解当前进程使用了那些编程技术。
我们可以修改DLL的选项卡让其显示更多的内容,比如DLL基地址,DLL内存相关信息等
显示当前进程所占用的系统资源句柄
我们查看当前进程所占用的资源句柄表,分析进程的逻辑:如图下图SunloginClient.exe
进程创建了一个Event事件,并且占用一个Log文件,可以检查自己的程序是否有内核句柄泄露。
操控进程以及显示进程的内部信息
操控进程,杀掉进程、重启进程、挂起进程等
显示进程的内部信息
查看线程信息(还可以查当前进程环境变量、进程网络连接情况等)
搜索功能
有时候我们删除某个文件或文件夹的时候,会提示被某个服务占用,无法删除,这个时候,就可以使用搜索功能知道它被谁占用了,比如shell.20200608-082337.log文件被SunloginClient.exe占用了
DLL搜索
当你在磁盘上发现一个恶意的DLL,并且想知道是否有运行进程使用了这个DLL时,可以使用Find => find Handle on DLL 功能。
一些常见的DLL:
Ntdll.dll
:如果一个可执行文件载入了这个文件,这意味着作者企图使用那些不是正常提供给windows程序使用的函数。如隐藏功能和操作进程等任务会使用这个接口。Wsock32.dll
和Ws32.dll
:这个两个是联网DLL,访问其中任一个DLL的程序非常可能连接网络,或是执行网络相关的任务。Wininet.dll
:这个DLL包含了更高层次的网络函数,实现了如FTP、HTTP和NTP等协议。
服务排查
win+r services.msc
文件痕迹排查
三个方向:
敏感路径
时间点
文件特征–代码关键字,关键函数,文件权限
敏感目录
1.temp(tmp)相关目录
因为临时路径相对统一
1 | C:\Windows\Temp |
2.排查下载记录,浏览器访问记录
3.查看用户Recent文件
Recent存储最近运行文件的快捷方式
存储位置如下
1 | C:\Documents and Settings\Administrator\Recent |
先要开启隐藏文件夹
更改所有者
4.预读取文件查看
Prefetch,预读取文件,存放系统已经访问过的预读取文件信息,扩展名pf
运行对话框输入%SystemRoot%\Prefetch
打开C:\Windows\Prefetch
查看工具 winprefetchview
https://www.nirsoft.net/utils/win_prefetch_view.html
Amcache.hve,查询应用程序的执行路径,上次执行时间以及SHA1值
win+r –> %SystemRoot%\appcompat\Programs
打开打开Amcache.hev
文件夹。
解析方式
https://github.com/williballenthin/python-registry/blob/master/samples/amcache.py
时间点
forfiles
特殊时间内新增的文件
1 | forfiles /m *exe /d +2021/5/15 /s /p c:\ /c "cmd /c echo @path @fdate @ftime" 2> null |
特殊时间内修改的文件
判断创建时间,修改时间,访问时间是否存在逻辑问题
文件特征
webshell检测
日志排查
威胁情报
powershell获取hash
Get-FileHash 文件路径 -Algorithm 校验的Hash值类型| Format-List
如果需要校验的文件路径比较复杂,例如路径中包含空格、括号等特殊符号,则需要在路径前后加上英文双引号。
Windows PowerShell命令可以校验的Hash值类型包括:SHA1、SHA256、SHA384、SHA512、MACTripleDES、MD5、RIPEMD160,暂不支持校验CRC32值。
如果不带-Algorithm参数,也就是不指明验证的Hash值类型,那么默认验证的就是SHA256值
1 | Get-FileHash C:\Windows\notepad.exe -Algorithm MD5| Format-List |
综合工具
PcHunter
火绒剑