Back

有关内网流量转发的一些方案

简单记录下目前学习到的内网流量转发的一些方案

测试环境

环境是用vulntarget系列靶场的B搭建(半个),用windows物理机模拟了真实环境下的vps

  • vps(迫真):windows11,ip为192.168.111.1
  • 攻击机:kali-2024,ip为192.168.111.132
  • 外网靶机:centos7,外网ip为192.168.111.135,内网ip为10.0.20.30
  • 内网靶机:windows10,内网ip为10.0.20.66

背景:攻击机已通过外网靶机的web漏洞成功getshell,但外网靶机通过双网卡将内网和外网隔离,因此攻击机无法直接访问内网的windows10主机

frp

首先是frp,简单、高效的内网穿透工具:github仓库地址官方中文文档地址

自v0.52.0版本起,ini格式的配置文件已弃用,历经几代版本后配置文件的语法也有了些许改变,但网上的大部分教程却仍停留在之前的版本,加之官方文档对插件的使用举例没那么清晰,配置时花了好一番功夫

frp存在服务端和客户端,典型的C/S架构,我们需要在vps与外网靶机上分别部署服务端与客户端(针对不同的操作系统需要使用不同的版本的可执行文件)
下载并解压后有四个文件
frps与frps.toml(服务端可执行文件与配置文件),frpc与frpc.toml(客户端可执行文件与配置文件)

现在根据fscan内网扫描的结果,得知内网主机10.0.20.66的8080端口存在http服务,且开放了3306端口,需要通过配置frp服务端与客户端使我们能够在外网探测到这两个端口

服务端配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#bindAddr = 0.0.0.0         #服务端监听地址,默认为0.0.0.0
bindPort = 7000         #服务端的监听端口
vhostHTTPPort = 8081        #HTTP类型代理监听的端口,启用后才能支持HTTP类型的代理

webServer.addr = "0.0.0.0"      #服务端后台管理页面的地址
webServer.port = 7500         #服务端后台管理页面的端口

#后台管理的用户名密码(可选)
#webServer.user = "admin"
#webServer.password = "admin"

命令frps.exe -c ./frps.toml启动服务端,可通过127.0.0.1:7500访问管理后台

将对应的客户端可执行文件与配置文件上传至目标外网靶机

配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
serverAddr = "192.168.111.1"         #连接服务端的地址
serverPort = 7000            #连接服务端的端口

[[proxies]]
name = "web"
type = "http"           #协议类型,这里使用http
localIp = "10.0.20.66"       #需要暴露服务的主机的ip
localPort = 8080            #需要暴露服务的端口
customDomains = ["192.168.111.1"]       #这里直接用服务端的地址即可,若要同时转发多个http服务,可设置自定义域名

[[proxies]]
name = "mysql"
type = "tcp"
localIP = "10.0.20.66"
localPort = 3306
remotePort = 13306          #表示在服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口

以上配置文件实现了将内网主机10.0.20.66的8080端口转发到vps的8081端口,3306端口转发到13306端口

chmod +x frpc给可执行权限,./frpc -c ./frpc.toml启动客户端

这时后台就能看到连接情况

访问192.168.111.1:8081,即可访问到内网主机10.0.20.66:8080下的web服务

mysql服务同理,这里用nmap测试下(没有通过用户验证,因此无法直接与mysql建立连接)

但这种配置方式仍十分麻烦,内网主机每开放一个服务,都需要在配置文件中多写几行,vps上又需要多开几个端口用于转发流量,显然不够优雅,所以现在请出我们的socks5插件

有关socks5协议的了解请移步 理解socks5协议的工作过程和协议细节,这里就不过多介绍了

socks5代理的优点:可将整台主机的流量都进行转发,不需要给每个开放的服务分别配置;
缺点:不支持icmp协议,会对某些信息收集手段造成限制(如nmap的扫端口,默认使用的是ping包)

服务端配置文件不变,以下是客户端配置文件:

1
2
3
4
5
6
7
8
9
serverAddr = "192.168.111.1"
serverPort = 7000

[[proxies]]
name = "socks5"
type = "tcp"
remotePort = 5555       #表示在服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口
[proxies.plugin]
type = "socks5"         #使用socks5插件

启动后可以看到socks5代理已经跑起来了

现在只需要在攻击机配置代理服务器即可直接访问内网的服务,可用浏览器插件SwitchyOmega、FoxyProxy或windows下的Proxifier、Linux下的Proxychains进行配置

Proxifier配置

配置代理服务器(我这里用主机模拟的vps,真实情况下地址换成自己的vps地址即可)

配置代理规则,选择刚刚配置的代理服务器即可,且需要在目标主机中选择我们要访问的ip段

现在就可以直接访问内网靶机的服务了,mysql服务同理

Proxychains配置

kali自带了proxychains4工具,可直接配置
修改/etc/proxychains4.conf配置文件,在底部添加socks5 192.168.111.1 5555

之后在需要走代理的命令前都加上proxychainsproxychains4即可
因为使用的socks5协议,不支持icmp,因此无法用ping来测试,照例用nmap来测试下:

这些功能只是frp能够实现的冰山一角,更多高阶玩法请移步官方中文文档

EarthWorm

译为蚯蚓,简称ew,github仓库地址(第三方)官方文档地址
一套便携式的网络穿透工具,具有socks5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透

ew使用起来比frp要方便许多,可惜的是由于影响恶劣而停止了更新

用法在官方文档与README中写的十分详细,在此就简单测试一下

1.当目标网络边界存在公网ip且可监听任意端口时,使用正向的socks5服务器:

将对应处理器架构与操作系统的可执行文件上传至目标外网靶机,并执行

1
./ew -s ssocksd -l 5555     #开启5555端口上的socks代理

开启监听后,和之前一样在攻击机上设置socks代理服务器,由于是正向代理,因此代理服务器即为目标外网靶机的地址,这里仍用kali与nmap进行测试

2.当目标网络边界不存在公网ip时,可通过反弹方式创建socks5代理:

在vps上执行ew:

1
./ew.exe -s rcsocks -l 7777 -e 8888     #在vps上添加转接隧道,将7777收到的代理请求转交给反连8888端口的主机

在目标靶机上执行:

1
./ew -s rssocks -d 192.168.111.1 -e 8888     #反连vps

连接上后会在vps下回显:

接着和之前的操作一致,配置socks5代理服务器并测试

ew还可以应对多层内网的环境,不过这篇只是为了记录学到的内网流量转发手段而记,就不展开写了(毕竟官方文档写的一清二楚,在此赘述并无意义)

除了这两个工具之外,还有许多不同的内网流量转发工具,等日后接触了再来此记录

Licensed under CC BY-NC-SA 4.0