前言
hw已经进入尾声,但是不能够掉以轻心,这里给大家分享下windows环境下入侵检查的流程。
检查概述
由于⽆法站在攻击者视⻆审视其做过哪些攻击⾏为,因此标准化的检查内容可以规避⾮标准化的⻛险。
例如操作系统虽然没有异常登录⽇志,但如果不检查操作系统⽤户即会存在遗漏从⽽产⽣⻛险,同时也可规避上次检查 ab 内容,本次检查 bc 内容的⾮标准化⻛险。因此⽆论每个⼈的标准是否统⼀,取⻓补短逐渐完善⾃⼰的标准化是建议进⾏的。
windows 操作系统⼊侵检查流程图如下所示:
可通过监测告警、⽇常巡检等主动机制发现存在的异常事件,如果没有主动发现,则只能在安全事件发⽣后被动发现 以下说明在被⼊侵后对可能存在的异常现象进⾏检查安全事件发⽣后被动发现。以下说明在被⼊侵后对可能存在的异常现象进⾏检查。
现象检查发现的异常程序不可直接删除,应先验证异常进程是否存在⾃我守护机制,否则安全事件⽆法得到根除。
已监听端口
已监听端⼝并⾮⼀个独⽴的对象,⽽是和进程相关联,进程如果需要对外提供访问接⼝,则必须通过监听端⼝的⽅式对外开放,常⽤于在内⽹中部署正向后⻔程序。
注意点:
1 在操作系统初始化正常运⾏后,建议记录已监听端⼝的基线值,供⽇常巡检使⽤;
2 受操作系统、关键路径中的⽹络层访问控制影响。
例如检查已监听端⼝是否存在异常。则运⾏ cmd 命令⾏,使⽤ netstat -ano | findstr LIST命令检查已监听端⼝。
示例:
点击【开始菜单】,搜索框中输⼊【cmd】,右键点击【cmd.exe】程序,选择【以管理员身份运⾏】。
使⽤ netstat -ano | findstr LIST 命令检查已监听端⼝。含义如下:
1 左 1 列,程序协议;
2 左 2 列,本地监听地址和端⼝;
3 左 3 列,外部地址(留空);
4 左 4 列,状态为监听;
5 左 5 列,程序 pid。
可根据已知程序不会监听的端⼝进⾏判断是否存在异常,并根据该链接的 pid 进⾏深⼊分析。
已建立连接
已建⽴连接分为⼊站连接和出站连接,⼊站意为访问操作系统本地的⽅向,出站意为操作系统访问外部的⽅向。
注意点:
1 受操作系统、关键路径中的⽹络层访问限制影响;
2 服务端如存在主动外联则需要重点检查。
例如检查已建⽴连接是否存在异常。则使⽤ netstat -ano | findstr EST 命令检查已建⽴连接。
查询结果,可根据⾮常规连接判断是否存在异常,并根据该链接的 pid 进⾏深⼊分析:
系统进程
cpu 资源被占满、异常的已监听端⼝、异常的已建⽴连接在深⼊分析时都会检查系统进程。
注意点:不建议使⽤任务管理器进⾏系统进程检查,因为可供分析的维度较少,且容易被进程名欺骗,操作系统允许相同名称但不同执⾏路径的进程同时存在。
例如检查系统进程是否存在异常,使⽤以下命令获取系统进程详细信息。
wmic process get
caption,commandline,creationDate,executablepath,handle,handleCount > c:\porcess.txt
示例:
在 cmd 命令⾏中复制以上命令并回⻋执⾏。
打开 C:\process.txt,可看到 6 列内容,含义如下所示:
1 caption:进程名;
2 commandline:进程名、程序执⾏路径、进程执⾏参数;
3 creationDate:进程启动时间(格式为:年⽉⽇时分秒);
4 executablepath:程序执⾏路径;
5 handle:进程 pid;
6 handleCount:该进程的⽗进程 pid。
可根据进程名、进程执⾏参数、进程启动时间、程序执⾏路径判断是否存在异常,并根据异常点进⾏深⼊分析。
如通过现象检查发现异常程序,则可以通过停⽌运⾏该进程的⽅式,判断其是否会重新启动。
计划任务
计划任务可以将任何脚本或程序定时启动。如被⿊客利⽤则会充当恶意程序的守护机制。
注意点:不建议使⽤图形化任务计划程序进⾏检查,因为数量、层级较多不⽅便检查。
检查任务计划是否存在异常的⽅法:
1 使⽤ schtasks /query /fo LIST /v >c:\schtasks.txt 命令获取任务计划;
2 使⽤正则 (Folder|TaskName|Status|Author|Task To Run|Scheduled Task State|Start Time|Start Date)(.*) 过滤任务计划关键字段;
3 使⽤正则 Start Date(.*) 和 Start Date$0\n 分割不同任务计划。
自启动项
⾃启动项可在系统启动时⾃动运⾏相关程序,恶意程序的第⼆个⾃启机制。
注意点:不建议使⽤图形化 msconfig ⼯具进⾏检查,因为名称、路径较⻓则不⽅便取证。
使⽤以下命令将⾃启动项导出检查。
reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
c:\autorun.reg
环境变量
环境变量⽤于将系统路径变量化,如被⿊客利⽤则会以最⾼权限运⾏恶意程序,例如将环境变量 %systemroot% 变更为其他路径,同时建⽴ system32 ⽂件夹并将恶意程序通过服务启动。
注意点:环境变量 %systemroot% 修改后需进⾏恢复,否则系统⽆法正常重启。
使⽤ set 命令将环境变量导出检查。
系统服务
服务可在系统启动时⾃动运⾏相关程序或启动后延迟运⾏相关程序,是恶意程序的第三个⾃启机制。
注意点:不建议使⽤图形化 services.msc 程序进⾏检查,因为数量、层级较多不⽅便检查。
1 使⽤命令将服务配置⽂件导出检查;
2 过滤包含 Description、ImagePath、ServiceDll 的字段;
3 过滤包含 (.*)(\.dll|\.exe)(.*) 的字段;
4 删除 Description REG_SZ,Description
REG_EXPAND_SZ,ImagePath
REG_EXPAND_SZ,ServiceDll
REG_EXPAND_SZ ⽆关字符
5 将 / Processid(.*) 替换为空;
6 将,-(.*) 替换为空;
7 将 @替换为空;
8 根据环境变量检查结果对 %systemroot%,%windir% 进⾏替换;
9 将 ^[a-z]*\.dll\n 替换为空;
10 排序、统⼀⼩写和去重后进⾏服务检查。
用户登录
⽤户登录可在系统启动登录、注销登录时⾃动运⾏相关程序,是恶意程序的第四个⾃启机制。
注意点:操作系统中有两处配置⽂件可⽤于在登录时启动相关程序。
使⽤命令将⽤户登录配置⽂件导出检查。
复制以下命令:
reg query HKEY_CURRENT_USER\Environment /v UserInitMprLogonScript >c:\userlogin.txt
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit >> c:\userlogin.txt
在命令⾏中粘贴将⽤户登录配置⽂件导出检查。
svchost&dll劫持
svchost.exe 主要作⽤是将动态链接库 (后缀为. dll 的⽂件) 以服务的⽅式运⾏。svchost.exe对系统的正常运⾏⾮常重要 是不能被结束的 通过服务 dll 均可劫持注⼊到程序中启动。
注意点:
1 在⼊侵检查⽅向,更倾向于将 svchost.exe 作为⼀个单独的持久化检查项⽬,⽽⾮系统服务,因为检查⽅法完全不同;
2 同时 svchost.exe 不作为常规检查项,⼀般根据【现象检查】的结果寻找恶意程序。存在异常监听端⼝,pid 指向 svchost.exe 程序,需检查是否存在异常。通过第三⽅⼯具 ProcessExplorer(简称 pe)检查 svchost.exe 程序。
实例:
通过检查已监听端⼝,发现 “异常” 监听,pid 指向 800。
打开任务管理器,发现 pid 800 是 svchost.exe 程序,由于该程序的特性,需使⽤第三⽅⼯具 pe 进⾏检查。
通过 pe ⼯具可发现 pid 800 是由服务启动,根据启动路径可发现该程序是由正常路径启动,但程序是否被替换未知,启动的服务是 netsvcs,该服务下挂 12 个⼦服务。
在 pe 中双击该程序,点击【tcp/ip】,可发现 49154 端⼝是服务 schedule 监听。
点击【services】,可发现 schedule 服务启动的动态链接库绝对路径是
c:\windows\systemc32\schedsvc.dll,从⽽发现 49154 端⼝是哪个程序正在监听。
通过点击【view handles】可显示该程序所调⽤的 clsid。
如存在启动、点击某个程序后恶意进程重新启动的情况,则可以对 com 劫持进⾏检查。
通过点击【view dlls】可显示该程序所调⽤的 dll ⽂件。
通过排序可直观的看到是否存在 dll 劫持。
账号检查
操作系统的账户和密码主要⽤于本地或远程登录。属于⿊客持久化后⻔的⼀种⽅式。
注意点:
1 恶意账号可能已隐藏,或通过克隆的⽅式复制管理员账户,需要通过注册表进⾏检查;
2 作为主管单位对下辖单位进⾏攻击溯源时,可通过 mimikatz ⼯具检查是否存在弱⼝令,所有⼝述证据均不可信。
检查账户是否存在异常:⽅法如下所示:
1 调整注册表权限将账户导出检查;
2 使⽤ net 命令将账户导出检查。
日志检查
操作系统⽇志中记录着攻击成功前和攻击后的相关痕迹。
注意点:⽇志默认记录 20Mb,达到最⼤值时优先覆盖旧事件,同时⽹络安全法要求⽇志⾄少保存 6 个⽉以上。
将安全⽇志和系统⽇志导出检查。
操作系统安全⽇志和系统⽇志默认存储路径:
%SystemRoot%\System32\Winevt\Logs\System.evtx
%SystemRoot%\System32\Winevt\Logs\Security.evtx
安全⽇志典型分析⽅法:⼤量事件 id 4625 后第⼀次 4624,则为操作系统密码暴⼒破解成功。其中源 ip 可能为空,则需要软硬件资产管理系统⽀持,定位源⼯作站的名称,即主机名,特定情况下 windows 可通过 ping 主机名携带 - 4 参数返回 ipv4 地址。或通过不对互联⽹映射操作系统远程桌⾯管理端⼝以及使⽤堡垒机进⾏管理可规避操作系统密码暴⼒破解攻击。
系统⽇志典型分析⽅法:id 为 7036 是服务启动 / 关闭的系统事件,在异常时间启动的服务需要重点检查,例如 wmi 服务。
文件落地
恶意程序保存在硬盘的⽂件系统中,例如后⻔程序,后⻔程序属于⾮授权的远程管理通道,⿊客可通过该通道未授权管理被⼊侵的主机,以及随后⻔⽂件同时⽣成的其他恶意程序。
注意点:⽂件落地不单独进⾏⼿⼯检查,⼀般根据【现象检查】或【持久化检查】的结果在硬盘中寻找恶意程序,否则⼯作量会过⼤及质量较差,常规恶意程序检查建议通过操作系统杀毒软件进⾏。
例如在 1999 年 01 ⽉ 01 ⽇发现异常程序对其相关处置后,检查当天是否⽣成其他异常内容。
1 在 %temp% ⽬录下创建并修改 test.txt ⽂件的创建时间为 1999 年 01 ⽉ 01 ⽇ 00 点 00分 00 秒,修改时间为 1999 年 01 ⽉ 02 ⽇ 00 点 00 分 00 秒、访问时间为 1999 年 01 ⽉03 ⽇ 00 点 00 分 00 秒;
2 通过 everything ⼯具进⾏检查。
示例 1:
修改⽂件时间 bat 脚本内容如下所示:
ChangeDate.bat
@echo off
powershell.exe -command "ls'%temp%\test.txt'| foreach-object {$_.CreationTime
='01/01/1999 00:00:00'; $_.LastWriteTime ='01/02/1999 00:00:00'; $_.LastAccessTime='01/03/1999 00:00:00'}"
pause
#CreationTime 创建时间
#LastWriteTime 修改时间
#LastAccessTime 访问时间
修改后各项时间如下所示:
无文件落地
wmi 全称 windows 管理规范,其提供⼤量 api 接⼝供程序调⽤;同时也是恶意程序⽆⽂件落地的关键所在,⿊客将恶意载荷存储于 wmi 中,并通过持久化机制在内存中通过 powershell直接调⽤存储于 wmi 中的恶意载荷,从⽽实现⽆⽂件落地。
注意点:
1 可以将 Windows Management Instrumentation 服务关闭,并将其作为⼀个基线对象定期检查是否被恶意开启。因为 wbemtest.exe 或 powershell 均是通过该服务调⽤【wmiclass】【对象】【属性】中的【值】;
2 当服务关闭时,wbemtest.exe 可打开 wmi 测试器,但⽆法连接命名空间,powershell 可正常运⾏,但不会执⾏ wmiclass 中的载荷;
3 ⽆⽂件落地不单独进⾏⼿⼯检查,⼀般根据【现象检查】或【持久化检查】的结果在wmiclass 中寻找恶意载荷,否则⼯作量会过⼤及质量较差,常规恶意程序检查建议通过操作系统杀毒软件进⾏。
检查 wmiclass 是否存在异常:
1 搭建⽆⽂件落地场景;
2 对⽆⽂件落地场景进⾏检查。
对以下字符串进⾏ base64 编码:
start powershell "ping 114.114.114.114 -t"
不能使⽤⽹⻚版 base64 编码⼯具进⾏编码,因为编码⽅式不同会导致 powershell ⽆法识别,上述命令通过⽹⻚版 base64 ⼯具编码后再通过 powershell 识别,其结果如下所示:
因此可通过以下 powershell ⼯具将其 base64 编码。将命令复制到【$string】中,当存在【$】【"】符号时需要使⽤【`】进⾏转义,多⾏内容可直接回⻋。
ps_string_base64.ps1
$string = "start powershell `"ping 114.114.114.114 -t`""
$bytes = [System.Text.Encoding]::Unicode.GetBytes($string)
$encoded = [Convert]::ToBase64String($bytes)
echo $encoded
当前⽬录下打开 cmd 执⾏ powershell -executionpolicy bypass -file ps_string_base64.ps1
即可获得 base64 后的字符串。
打开 poershell 输⼊以下命令(可以将以下内容 base64 编码化,从 cc 主控端拉取执⾏,执⾏完毕即从内存中释放,这可能也是在被⼊侵主机中没有发现此类样本的原因),以下命令通过 powershell 调⽤. net 的⽅法将 base64 字符串写⼊ wmiclass 同时执⾏。
#要连接的 wmi 命名空间及类对象
$SaveClass = [System.Management.ManagementClass]
('root\default:StdRegProv')
#添加对象属性 (名称,类型,⾮数组)
$SaveClass.Properties.Add('ping',[System.Management.CimType]::String,$False)
#修改 i 属性的值为 b 64 字符串
#修改 ping 属性的值为 base64 字符串
$SaveClass.SetPropertyValue('ping','cwB0AGEAcgB0ACAAcABvAHcAZQByAHMAaABlAGwAbAAgACIAcABpAG4AZwAgADEAMQA0AC4AMQAxADQALgAxADEANAAuADEAMQA0ACAALQB0ACIA')
#保存
$SaveClass.Put()
#查询 ping 属性的值
$SaveClass.GetPropertyValue('ping')
#取载荷执⾏后退出
set ping ([WmiClass]'root\default:StdRegProv').Properties['ping'].Value;powershell -E $ping;exit
.net 帮助⽂档参考链接如下所示:
https://docs.microsoft.com/zh-
cn/dotnet/api/system.management.managementbaseobject.setpropertyvalue?
view=dotnet-plat-ext-5.0#System_Management_ManagementBaseObject_SetPropertyValue_System_String_System_Object_
通过此类⽅法可发现存储于 wmiclass 中的载荷已被执⾏,但却不⻅其⽗进程,严重影响到溯源的逻辑性,即⽆法根据痕迹溯源该程序如何启动,只能通过经验判断可能的⾃我守护机制。
如持久化机制未被发现,则⽆法根除,因此在【现象检查】伊始即强调,在未确认是否存在⾃我守护机制前,不可先⾏删除异常程序。逆向思维考虑:如结束进程后频繁⾃启动,则⼀定存在⾃我守护机制
以下命令可在前台运⾏时将载荷带⼊后台运⾏,诸如任务计划运⾏的程序默认在后台运⾏:
start powershell -NoP -NonI -W Hidden "ping 114.114.114.114 -t"
防火墙
windows 操作防⽕墙配置着允许 / 拒绝通⾏的⼊站 / 出站规则。可根据防⽕墙配置判断该主机在同⽹段内的可攻击⾯积。
注意点:检查配置前应先检查防⽕墙是否已启⽤。
检查操作系统防⽕墙是否存在异常:
1 通过 netsh 命令将防⽕墙状态导出检查;
2 通过 netsh 命令将防⽕墙所有⼊站、出站规则导出检查;
示例 1:
复制以下命令在 cmd 中执⾏。
netsh firewall show state > c:\yanlian\firewall-state.txt
netsh advfirewall firewall show rule name=all dir=in > c:\firewall-in.txt
netsh advfirewall firewall show rule name=all dir=out > c:\firewall-out.txt
【操作模式】为【禁⽤】意为防⽕墙已关闭,即已监听的端⼝同⽹段所有主机均可访问。
【操作模式】的启⽤和禁⽤随⽹卡的⽹络位置变更⽽变更。
例如⽹卡的⽹络位置是【家庭⽹络】或【⼯作⽹络】,则匹配家庭或⼯作 (专⽤) ⽹络位置防⽕墙的状态。或⽹卡的⽹络位置是【公⽤⽹络】,则匹配公⽤⽹络位置防⽕墙的状态。
杀毒软件
杀毒软件可⽤于防护恶意程序的存储、运⾏等恶意⾏为,作为主管单位对下辖单位进⾏攻击溯源时需进⾏检查。
注意点:
1 应检查杀毒软件的安装时间;
2 应检查杀毒软件的补丁更新情况;
3 应检查杀毒软件的特征库是否最新;
4 应检查杀毒软件最近的杀毒记录;
应检查杀毒软件的⽩名单。
加下方wx,拉你一起进群学习
往期推荐
ETW的攻与防
SEH异常之编译器原理探究
初探UAF漏洞
什么?你还不会webshell免杀?(三)
初探栈溢出
windows环境下的自保护探究
记一次内部红队渗透——定位张三
对抗无落地的shellcode注入