因此无论每个人的标准是否统一,取长补短逐渐完善自己的标准化是建议进行的。
windows操作系统入侵检查流程图如下所示:
1.1 已监听端口
已监听端口并非一个独立的对象,而是和进程相关联,进程如果需要对外提供访问接口,则必须通过监听端口的方式对外开放,常用于在内网中部署正向后门程序。
注意点:
1 在操作系统初始化正常运行后,建议记录已监听端口的基线值,供日常巡检使用;
2 受操作系统、关键路径中的网络层访问控制影响。
例如检查已监听端口是否存在异常。则运行cmd命令行,使用netstat -ano | findstr LIST命令检查已监听端口。
示例:
点击【开始菜单】,搜索框中输入【cmd】,右键点击【cmd.exe】程序,选择【以管理员身份运行】。
2 左2列,本地监听地址和端口;
3 左3列,外部地址(留空);
4 左4列,状态为监听;
5 左5列,程序pid。
可根据已知程序不会监听的端口进行判断是否存在异常,并根据该链接的pid进行深入分析。
注意点:
1 受操作系统、关键路径中的网络层访问限制影响;
2 服务端如存在主动外联则需要重点检查。
例如检查已建立连接是否存在异常。则使用netstat -ano | findstr EST命令检查已建立连接。
示例:
查询结果,可根据非常规连接判断是否存在异常,并根据该链接的pid进行深入分析:
注意点:不建议使用任务管理器进行系统进程检查,因为可供分析的维度较少,且容易被进程名欺骗,操作系统允许相同名称但不同执行路径的进程同时存在。
例如检查系统进程是否存在异常,使用以下命令获取系统进程详细信息。
wmic process get
caption,commandline,creationDate,executablepath,handle,handleCount > c:\yanlian\porcess.txt
示例:
在cmd命令行中复制以上命令并回车执行。
2 commandline:进程名、程序执行路径、进程执行参数;
3 creationDate:进程启动时间(格式为:年月日时分秒);
4 executablepath:程序执行路径;
5 handle:进程pid;
6 handleCount:该进程的父进程pid。
可根据进程名、进程执行参数、进程启动时间、程序执行路径判断是否存在异常,并根据异常点进行深入分析。
任务计划可以将任何脚本或程序定时启动。如被黑客利用则会充当恶意程序的守护机制。
注意点:不建议使用图形化任务计划程序进行检查,因为数量、层级较多不方便检查。
检查任务计划是否存在异常的方法:
1 使用schtasks /query /fo LIST /v
>c:\yanlian\schtasks.txt命令获取任务计划;
2 使用正则(Folder|TaskName|Status|Author|Task To Run|Scheduled Task State|Start Time|Start Date)(.*)过滤任务计划关键字段;
3 使用正则Start Date(.*)和Start Date$0\n分割不同任务计划。
示例1:
导出任务计划,提示错误。
(Folder|TaskName|Status|Author|Task To
Run|Scheduled Task State|Start Time|Start Date)(.*)
将正则表达式复制到搜索框中,点击【find all】,再【ctrl+c】复制匹配到的内容。
复制以下正则表达式。
Start Date(.*)
Start Date$0\n
按【ctrl+h】将以上正则进行粘贴并替换所有。
注意点:不建议使用图形化msconfig工具进行检查,因为名称、路径较长则不方便取证。
使用以下命令将自启动项导出检查。
reg export
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\yanlian\autorun.reg
示例:
输入命令将自启动项配置文件导出。
注意点:环境变量%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 排序、统一小写和去重后进行服务检查。
示例1:
选择一条命令将服务配置文件导出。
reg query
“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services” /s > c:\yanlian\service_001.txt
reg query
“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services” /s > c:\yanlian\service_set.txt
2 ControlSet002:最后一次成功启动的服务配置信息;
3 CurrentControlSet:系统运行时的服务配置信息;
4 系统启动时,从ControlSet001复制到CurrentControlSet中;
5 系统运行时,修改的都是CurrentControlSet中的信息;
6 系统重启时,从CurrentControlSet复制到ControlSet001中;
7 系统正常启动时,从ControlSet001、CurrentControlSet复制到ControlSet002;
8 开机选择“最近一次正确配置”时,从ControlSet002复制到CurrentControlSet中。
服务配置说明:
1 ImagePath:服务所启动程序的路径;
2 Parametes\servicedll:程序调用的真实dll文件路径;
3 Start:0/boot,1/system,2/自动,3/手动,4/禁用;
4 DelayedAutostart:1/延迟启动;
5 Type:程序类型。
示例2:
输入以下正则表达式进行内容过滤。
(Description|ImagePath|ServiceDll\ )(.*)
点击【.*】启用正则匹配,输入正则表达式,点击【find all】后复制。
(.*)(\.dll|\.exe)(.*)
点击【find all】后复制。
Description REG_SZ
Description REG_EXPAND_SZ
ImagePath REG_EXPAND_SZ
ServiceDll REG_EXPAND_SZ
替换方法为在【find】框中粘贴,【replace】框中内容为空,点击【replace all】进行替换。
/Processid(.*)
替换方法为在【find】框中粘贴,【replace】框中内容为空,点击【replace all】进行替换。
,-(.*)
替换方法为在【find】框中粘贴,【replace】框中内容为空,点击【replace all】进行替换。
@
替换方法为在【find】框中粘贴,【replace】框中内容为空,点击【replace all】进行替换。
%systemroot% c:\windows
%windir% c:\windows
替换方法为在【find】框中粘贴,【replace】框中内容为空,点击【replace all】进行替换。
^[a-z]*\.dll\n
替换方法为在【find】框中粘贴,【replace】框中内容为空,点击【replace all】进行替换。
注意点:操作系统中有两处配置文件可用于在登录时启动相关程序。
使用命令将用户登录配置文件导出检查。
示例1:
复制以下命令:
reg query HKEY_CURRENT_USER\Environment
/v UserInitMprLogonScript >
c:\yanlian\userlogin.txt
reg query
“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon” /v Userinit >> c:\yanlian\userlogin.txt
在命令行中粘贴将用户登录配置文件导出检查。
注意点:
1 在入侵检查方向,更倾向于将svchost.exe作为一个单独的持久化检查项目,而非系统服务,因为检查方法完全不同;
2 同时svchost.exe不作为常规检查项,一般根据【现象检查】的结果寻找恶意程序。
存在异常监听端口,pid指向svchost.exe程序,需检查是否存在异常。通过第三方工具ProcessExplorer(简称pe)检查svchost.exe程序。
示例:
通过检查已监听端口,发现“异常”监听,pid指向800。
注意点:
1 恶意账号可能已隐藏,或通过克隆的方式复制管理员账户,需要通过注册表进行检查;
2 作为主管单位对下辖单位进行攻击溯源时,可通过mimikatz工具检查是否存在弱口令,所有口述证据均不可信。
检查账户是否存在异常:方法如下所示:
1 调整注册表权限将账户导出检查;
2 使用net命令将账户导出检查。
示例1:
在cmd命令行中输入regedit打开注册表。
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users c:\yanlian\user.reg
在命令行中粘贴将账户配置文件导出检查。
例如YunWei$是3ee。可在以下注册表中检查其F值和V值
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EE
其中F为权限值,如将administrator的F值复制给guest,并启用免密码登录,则会形成克隆账户的隐藏现象,V为密码值。
net user > c:\yanlian\user.txt
net localgroup administrators >> c:\yanlian\user.txt
在cmd命令行中粘贴将账户导出,注意>意为覆盖写入,>>意为追加写入。
注意点:日志默认记录20Mb,达到最大值时优先覆盖旧事件,同时网络安全法要求日志至少保存6个月以上。
将安全日志和系统日志导出检查。
示例:
操作系统安全日志和系统日志默认存储路径:
%SystemRoot%\System32\Winevt\Logs\System.evtx
%SystemRoot%\System32\Winevt\Logs\Security.evtx
使用以下命令将日志导出。
1.2 文件落地
恶意程序保存在硬盘的文件系统中,例如后门程序,后门程序属于非授权的远程管理通道,黑客可通过该通道未授权管理被入侵的主机,以及随后门文件同时生成的其他恶意程序。
注意点:文件落地不单独进行手工检查,一般根据【现象检查】或【持久化检查】的结果在硬盘中寻找恶意程序,否则工作量会过大及质量较差,常规恶意程序检查建议通过操作系统杀毒软件进行。
例如在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 对无文件落地场景进行检查。
示例1:
对以下字符串进行base64编码:
start powershell “ping 114.114.114.114 -t”
不能使用网页版base64编码工具进行编码,因为编码方式不同会导致powershell无法识别,上述命令通过网页版base64工具编码后再通过powershell识别,其结果如下所示:
$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后的字符串。
$SaveClass
= [System.Management.ManagementClass]
(‘root\default:StdRegProv’)
#添加对象属性(名称,类型,非数组)
$SaveClass.Properties.Add(‘ping’,[System.Management.CimType]::String,$False)
#修改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中的载荷已被执行,但却不见其父进程,严重影响到溯源的逻辑性,即无法根据痕迹溯源该程序如何启动,只能通过经验判断可能的自我守护机制。
如持久化机制未被发现,则无法根除,因此在【现象检查】伊始即强调,在未确认是否存在自我守护机制前,不可先行删除异常程序。逆向思维考虑:如结束进程后频繁自启动,则一定存在自我守护机制。
示例2:
根据pe检查结果无法判断该进程的父进程,即无法确认该进程如何启动,仔细检查任务计划时发现异常:
$string =
“cwBlAHQAIABwAGkAbgBnACAAKABbAFcAbQBpAEMAbABhAHMAcwBdACcAcgBvAG8AdABcAGQAZQBmAGEAdQBsAHQAOgBzAHQAZAByAGUAZwBwAHIAbwB2ACcAKQAuAFAAcgBvAHAAZQByAHQAaQBlAHMAWwAnAHAAaQBuAGcAJwBdAC4AVgBhAGwAdQBlADsAcABvAHcAZQByAHMAaABlAGwAbAAgAC0ARQAgACQAcABpAG4AZwA7AGUAeABpAHQA”
$bytes =
[System.Convert]::FromBase64String($string);
$decoded =
[System.Text.Encoding]::Unicode.GetString($bytes);
echo $decoded
当前目录下打开cmd执行powershell -executionpolicy bypass -file ps_base64_string.ps1即可发现解码后的内容。
= [System.Management.ManagementClass]
(‘root\default:StdRegProv’)
$SaveClass.GetPropertyValue(‘ping’)’
检查结果如下所示:
注意点:检查配置前应先检查防火墙是否已启用。
检查操作系统防火墙是否存在异常:
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:\yanlian\firewall-in.txt
netsh advfirewall firewall show rule name=all dir=out > c:\yanlian\firewall-out.txt
【操作模式】为【禁用】意为防火墙已关闭,即已监听的端口同网段所有主机均可访问。
(已启用|本地端口|操作)(.*)
操作$1\n
杀毒软件可用于防护恶意程序的存储、运行等恶意行为,作为主管单位对下辖单位进行攻击溯源时需进行检查。
注意点:
1 应检查杀毒软件的安装时间;
2 应检查杀毒软件的补丁更新情况;
3 应检查杀毒软件的特征库是否最新;
4 应检查杀毒软件最近的杀毒记录;
应检查杀毒软件的白名单。