本文总结Windows系统应急响应的基本思路与技巧...
0x00 开始运行
运行程序
运行命令
计算机管理
compmgmt.msc
设备管理器
devmgmt.msc
事件查看器
eventvwr.msc
组策略编辑器
gpedit.msc
本地安全策略
secpol.msc
本地用户和组
lusrmgr.msc
服务
services.msc
共享文件夹
fsmgmt.msc
证书管理控制台
certmgr.msc
任务管理器
taskmgr
任务计划
control schedtasks
注册表编辑器
regedit
系统信息
msinfo32
系统配置
msconfig
管理工具
control admintools
组件服务
dcomcnfg
文件签名验证
sigverif
性能监视器
perfmon
远程桌面连接
mstsc
系统文件检查工具
sfc
程序和功能
appwiz.cpl
网络连接
ncpa.cpl
系统属性
sysdm.cpl
Windows防火墙
firewall.cpl
0x01 系统排查 1. 系统信息 1 2 3 4 5 6 7 8 9 10 11 msinfo32 #查看系统信息 systeminfo | findstr /B /C:"OS Name" /C:"OS Version" wmic qfe # 补丁更新信息 wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% # 体系架构 wmic logicaldisk get caption || fsutil fsinfo drives # 查看驱动信息 wmic logicaldisk get caption,description,providername Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ft Name,Root
2. 用户账号 系统被入侵后,需排查攻击者是否新建账户、激活系统默认账户、建立隐藏账户(账户名称最后加$)等
排查方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 (1) 命令行查看 echo %USERNAME% || whoami # 获取当前用户名 net user # 列举所有用户,无法查看隐藏账户 whoami /all Get-LocalUser | ft Name,Enabled,LastLogon Get-ChildItem C:\Users -Force | select Name net user username # 获取用户详细信息 net user admin net user %USERNAME% net localgroup # 枚举本地用户组 Get-LocalGroup | ft Name whoami /priv # 查看用户权限 whoami /groups net localgroup administrators # 查看用户组详细信息 Get-LocalGroupMember Administrators | ft Name, PrincipalSource Get-LocalGroupMember Administrateurs | ft Name, PrincipalSource nltest /DCLIST:DomainName # 枚举域控用户 nltest /DCNAME:DomainName nltest /DSGETDC:DomainName (2) 图形界面查看 a. CMD输入compmgmt.msc(计算机管理) -> 本地用户和组 -> 用户 //可查看隐藏账户 b. 命令行输入lusrmgr.msc,查看用户信息 (3) wmic 命令 > wmic useraccount get name,SID //可查看隐藏账户
3. 启动项 病毒后门等常用启动项来实现持久化驻留,检查服务器是否有异常的启动项
排查方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 (1) 任务管理器查看 命令行中输入taskmgr命令,任务管理器 -> 启动 (2) 通过注册表查看 单击【开始】>【运行】,输入regedit,打开注册表,查看开机启动项是否正常,关注以下注册表项 a. HKEY_CURRENT_USER\software\micorsoft\windows\currentversion\run b. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run c. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce 检查右侧是否有启动异常的项目 (3) 通过组策略查看 命令行运行gpedit.msc,计算机配置 -> Windows设置 —> 脚本(启动/关机)
4. 计划任务 命令查看
1 2 3 4 5 6 7 schtasks /query /fo LIST 2>nul | findstr TaskName schtasks /query /fo LIST /v > schtasks.txt; cat schtask.txt | grep "SYSTEM\|Task To Run" | grep -B 1 SYSTEM Get-ScheduledTask | where {$_.TaskPath -notlike "\Microsoft*"} | ft TaskName,TaskPath,State Get-ScheduledTask //powershell查看
界面查看
1 2 3 # 计算机管理 CMD输入compmgmt.msc【计算机管理】 > 【系统工具】> 【任务计划程序】> 【任务计划程序库】
5. 自启功服务 查看命令
1 2 3 4 5 6 wmic startup get caption,command reg query HKLM\Software\Microsoft\Windows\CurrentVersion\R reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run reg query HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce dir "C:\Documents and Settings\All Users\Start Menu\Programs\Startup" dir "C:\Documents and Settings\%username%\Start Menu\Programs\Startup"
检查方法: 单击【开始】>【运行】,输入services.msc,查看服务状态和启动类型,检查是否有异常服务
0x02 进程排查 1. 排查思路 1 2 3 > netstat -ano | findstr "ESTABLISHED" //查看目前的网络连接,定位可疑的ESTABLISHED > tasklist | findstr "PID" //根据netstat定位出的pid,再通过tasklist命令排查进程
2. 常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 (1) tasklist命令 a. 查看端口对应的PID: netstat -ano | findstr "port" b. 查看进程对应的PID:tasklist | findstr "PID" c. 显示进程与服务对应关系:tasklist /svc d. 查看加载DLL的进程:tasklist /m | more e. 查看特定DLL的调用情况:tasklist /m DLL名称 (2) wmic命令 a. wmic process list full /format:csv //以csv格式显示进程所有信息 b. wmic process get name,parentprocessid,processid,commandline /format:csv //以csv格式显示进程特定列 c. wmic process where process=[pid] get parentprocessid //以pid的值为条件获取其父进程pid d. wmic process where processid=[pid] delete //删除指定pid的进程 e. wmic process where name="trojan.exe" call terminate //删除指定进程名的进程 (3) PowerShell PowerShell可查看存在守护进程的进程,查询时调用Wmi对象 > Get-WmiObject Win32_Process | select Name,ProcessId,ParentProcessId,Path,CommandLine //查看进程名、进程id,父进程id、进程路径、进程命令行等信息
3. system服务进程 1 2 3 4 5 net start wmic service list brief tasklist /SVC tasklist /v /fi "username eq system"
0x03 网络排查 1. 网卡信息 1 2 3 4 5 ipconfig /all # 查看网络网卡、ip、DNS信息 Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address Get-DnsClientServerAddress -AddressFamily IPv4 | ft
2. 路由表信息 1 2 3 route print Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex
3. ARP信息 1 2 3 arp -A Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,LinkLayerAddress,State
4. 连接信息
5. 网络共享信息 1 2 net share powershell Find-DomainShare -ComputerDomain domain.local
6. SNMP配置信息 1 2 3 reg query HKLM\SYSTEM\CurrentControlSet\Services\SNMP /s Get-ChildItem -path HKLM:\SYSTEM\CurrentControlSet\Services\SNMP -Recurse
0x04 文件排查 1. 敏感目录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 (1) 各个盘下temp目录 恶意程序运行时投放出的文件(释放子体)多存放于路径相对固定的临时目录 (2) 用户Recent文件 Recent文件主要存储最近运行文件的快捷方式,可分析最近运行的文件来排查可疑文件 【开始】>【运行】,输入【%UserProfile%\Recent】,分析Recent文件 (3) 预读取文件夹 Prefetch为预读取文件夹,用于存放系统已访问过的文件预读取信息,扩展名为pf 【开始】>【运行】,输入【%SystemRoot%\Prefetch\】,排查Prefetch文件夹 (4) Amcache.hve文件 可查询应用程序的执行路径、上次执行的时间以及SHA1值 【开始】>【运行】,输入【%SystemRoot%\appcompat\Programs\】,排查Amcache.hve文件夹
2. 时间点查找 入侵事件发生后,需优先确认时间发生的时间点,排查时间点前后的文件变动情况
排查技巧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 (1) forfiles命令 FORFILES [/P pathname] [/M searchmask] [/S] [/C command] [/D [+ | -] {yyyy/MM/dd | dd}] 描述: 选择一个文件(或一组文件)并在那个文件上 执行一个命令。这有助于批处理作业。 参数列表: /P pathname 表示开始搜索的路径。默认文件夹是当前工作的 目录 (.)。 /M searchmask 根据搜索掩码搜索文件。默认搜索掩码是 '*'。 /S 指导 forfiles 递归到子目录。像 "DIR /S"。 /C command 表示为每个文件执行的命令。命令字符串应该 用双引号括起来。 默认命令是 "cmd /c echo @file"。下列变量 可以用在命令字符串中: @file - 返回文件名。 @fname - 返回不带扩展名的文件名。 @ext - 只返回文件的扩展名。 @path - 返回文件的完整路径。 @relpath - 返回文件的相对路径。 @isdir - 如果文件类型是目录,返回 "TRUE"; 如果是文件,返回 "FALSE"。 @fsize - 以字节为单位返回文件大小。 @fdate - 返回文件上一次修改的日期。 @ftime - 返回文件上一次修改的时间。 要在命令行包括特殊字符,字符请以 0xHH 形式使用十六进制代码(例如,0x09 为 tab)。 内部 CMD.exe 命令前面应以 "cmd /c" 开始。 /D date 选择文件,其上一次修改日期大于或等于 (+), 或者小于或等于 (-) 用 "yyyy/MM/dd" 格式指定的日期; 或选择文件,其上一次修改日期大于或等于 (+) 当前日期加 "dd" 天,或者小于或等于 (-) 当前 日期减 "dd" 天。有效的 "dd" 天数可以是 0 - 32768 范围内的任何数字。如果没有指定, "+" 被当作默认符号。 /? 显示此帮助消息。
0x05 日志分析 1. 日志简介 Windows主要有以下三类日志文件:应用程序日志、系统日志和安全日志
系统日志
1 2 3 记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等 默认位置:%SystemRoot%\System32\Winevt\Logs\System.evtx
安全日志
1 2 3 记录系统的安全审计事件,包含各种类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件。默认设置下,安全性日志是关闭的,管理员可以使用组策略来启动安全性日志,或者在注册表中设置审核策略 默认位置:%SystemRoot%\System32\Winevt\Logs\Security.evtx
应用日志
1 2 3 包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误。如果某个应用程序出现崩溃情况,可以从程序事件日志中找到相应的记录 默认位置:%SystemRoot%\System32\Winevt\Logs\Application.evtx
2. 日志事件ID 对于Windows事件日志分析,不同的EVENT ID代表了不同的意义,摘录一些常见的安全事件的说明
事件ID
说明
4624
登录成功
4625
登录失败
4634
注销成功
4647
用户启动的注销
4672
使用超级用户(如管理员)进行登录
4720
创建用户
每个成功登录的事件都会标记一个登录类型,不同登录类型代表不同的方式:
登录类型
描述
说明
2
交互式登录(Interactive)
用户在本地进行登录
3
网络(Network)
最常见的情况就是连接到共享文件夹或共享打印机时
4
批处理(Batch)
通常表明某计划任务启动
5
服务(Service)
每种服务都被配置在某个特定的用户账号下运行
7
解锁(Unlock)
屏保解锁
8
网络明文(NetworkCleartext)
登录的密码在网络上是通过明文传输的,如FTP
9
新凭证(NewCredentials)
使用带/Netonly参数的RUNAS命令运行一个程序
10
远程交互,(RemoteInteractive)
通过终端服务、远程桌面或远程协助访问计算机
11
缓存交互(CachedInteractive)
以一个域用户登录而又没有域控制器可用
3. 日志分析技巧 事件查看器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 (1) 利用eventlog事件来查看系统账号登录情况 a. 在"开始"菜单上,依次指向"所有程序"、"管理工具",然后单击"事件查看器"; b. 在事件查看器中,单击"安全",查看安全日志; c. 在安全日志右侧操作中,点击"筛选当前日志",输入事件ID进行筛选。 4624 -- 登录成功 4625 -- 登录失败 4634 -- 注销成功 4647 -- 用户启动的注销 4672 -- 使用超级用户(如管理员)进行登录 (2) 利用eventlog事件来查看计算机开关机的记录 a. 在"开始"菜单上,依次指向"所有程序"、"管理工具",然后单击"事件查看器"; b. 在事件查看器中,单击"系统",查看系统日志; c. 在系统日志右侧操作中,点击"筛选当前日志",输入事件ID进行筛选 6006 -- 服务已启动,开机 6005 -- 服务已停止,关机 6009 -- 按ctrl、alt、delete键(非正常)关机
Log Parser
Log Parser是微软公司出品的日志分析工具,功能强大,使用简单,可以分析基于文本的日志文件、XML 文件、CSV(逗号分隔符)文件,以及操作系统的事件日志、注册表、文件系统、Active Directory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 (1) 基本查询语法 Logparser.exe -i:EVT -o:DATAGRID "SELECT * FROM c:\xx.evtx" (2) 查询登录成功的事件 a. 登录成功的所有事件 LogParser.exe -i:EVT -o:DATAGRID "SELECT * FROM c:\Security.evtx where EventID=4624" b. 指定登录时间范围的事件 LogParser.exe -i:EVT -o:DATAGRID "SELECT * FROM c:\Security.evtx where TimeGenerated>'2018-06-19 23:32:11' and TimeGenerated<'2018-06-20 23:34:00' and EventID=4624" c. 提取登录成功的用户名和IP LogParser.exe -i:EVT -o:DATAGRID "SELECT EXTRACT_TOKEN(Message,13,' ') as EventType,TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as Username,EXTRACT_TOKEN(Message,38,' ') as Loginip FROM c:\Security.evtx where EventID=4624" (3) 查询登录失败的事件 a. 登录失败的所有事件 LogParser.exe -i:EVT -o:DATAGRID "SELECT * FROM c:\Security.evtx where EventID=4625" b. 提取登录失败用户名进行聚合统计 LogParser.exe -i:EVT "SELECT EXTRACT_TOKEN(Message,13,' ') as EventType,EXTRACT_TOKEN(Message,19,' ') as user,count(EXTRACT_TOKEN(Message,19,' ')) as Times,EXTRACT_TOKEN(Message,39,' ') as Loginip FROM c:\Security.evtx where EventID=4625 GROUP BY Message" (4) 系统历史开关机记录 LogParser.exe -i:EVT -o:DATAGRID "SELECT TimeGenerated,EventID,Message FROM c:\System.evtx where EventID=6005 or EventID=6006"
4. 历史命令查看 1 2 3 4 5 6 7 8 9 type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt type C:\Users\swissky\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt cat (Get-PSReadlineOption).HistorySavePath cat (Get-PSReadlineOption).HistorySavePath | sls passw
0x05 工具集合 1. 工具箱 Sysinternals Suite : 微软发布的一套强大的免费工具程序集,共包括将近70个windows工具
2. 监控分析
3. 日志分析
4. 病毒查杀
5. Webshell查杀
6. 勒索软件解密