渗透代理的原理与工具介绍

文章的内容是对于代理内网的介绍与工具的使用
正向、反向代理工具的典型案例介绍

1.代理介绍

1.1 代理简介

代理,又叫做网络代理,是一个特殊的网络服务。是允许一个客户端以非直接连接的方式去访问服务端。一些网关,路由器等都具备代理服务的功能。一般,认为代理服务器可以极可能的保障网络终端的设备安全,防止攻击。当然在内网中我们也可以代理出内网的流量(利用代理工具)进行访问。在本地可以对内网进行一个渗透。准确的来讲,代理是一个动态转发并映射端口的结果。这种结果能帮我们有限的去隐藏身份,不受IP限制的封锁。

1.2 正向代理

是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

正向代理类似一个跳板机,代理访问外部资源

比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了

正向

我们在获得外网服务器的一定权限后发现这台服务器可以直接或者间接的访问内网 ,此时渗透测试进入后渗透阶段,一般情况下,内网中的其他机器是不允许来自外网机器的访问的。这时候,我们可以将这台外网服务器设置成为代理,使得我们自己的攻击机可以直接访问与操作内网中其他机器。

按照代理协议在TCP/IP协议栈中所处的位置,可以将正向代理分为HTTP代理和socks代理。HTTP代理技术要求所有代理流量按照HTTP协议进行传输,使用socks代理技术则可以在直接在网络层传输代理数据包。HTTP代理工作在应用层,socks代理工作在网络层,所以socks代理技术比HTTP代理快很多。

作用:

1
2
3
4
5
1.突破访问限制:通过代理服务器,可以突破自身IP访问限制,访问国外网站,教育网等。

2.提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。

3.隐藏客户端真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。
1.3 反向代理

反向代理是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务 器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向

作用:

1
2
3
4
5
6
7
1.隐藏服务器真实IP:使用反向代理,可以对客户端隐藏服务器的IP地址。

2.负载均衡:反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同 的真实服务器上。

3.提高访问速度:反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务, 提高访问速度。

4.提供安全保障:反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。
1.4 代理类别
  • HTTP代理
  • SOCKS代理
  • FTP代理
  • Telnet代理
  • SSL代理
1.5 Socks代理

什么是Socks协议?

1
2
3
4
5
6
7
中文意思:防火墙安全会话转换协议,工作在OSI参考模型的第5层(会话层)。因为Socks介于传输层与表示层之间,使用TCP协议传输数据,不提供ICMP协议的传输。

它是一种可以穿透防火墙的协议,很多场景都会用到。

目前支持SOCKS4和SOCKS5两个版本:
SOCKS4支持TELNET、FTP、HTTP等TCP协议;
SOCKS5支持TCP与UDP,并支持安全认证方案。

2.Frp反向代理

2.1 Frp简介

Frp 是一个可用于内网穿透的高性能的反向代理应用,支持TCP、UDP协议,为HTTP和HTTPS应用协议提供了额外的能力,且尝试性支持了点对点穿透。frp 采用go语言开发。更多的人使用 frp 是为了进行反向代理,满足通过公网服务器访问处于内网的服务,如访问内网web服务,远程ssh内网服务器,远程控制内网NAS等,实现类似花生壳、ngrok等功能。而对于内网渗透来讲,这种功能恰好能够满足我们进行内网渗透的流量转发。FRP最大的一个特点是使用SOCKS代理,而SOCKS是加密通信的,类似于做了一个加密的隧道,可以把外网的流量,通过加密隧道穿透到内网。

2.2 Frp实现原理

Frp 主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。隐藏用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

2.3 为什么使用Frp

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

1
2
3
4
5
6
7
客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
代理组间的负载均衡。
端口复用,多个服务通过同一个服务端端口暴露。
多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
服务端和客户端 UI 页面。
2.4 Frp使用

搭建一个完整的frp服务链,我们需要

  1. VPS一台(也可以是具有公网IP的实体机)
  2. 访问目标设备(就是你最终要访问的设备)
  3. 简单的Linux基础(会用cp等几个简单命令即可)

首先,我们需要将FRP的服务端部署到公网VPS上,然后在我们拿下的那台内网主机上部署FRP的客户端,FRP在github上有多种版本,有些是有配置文件的,这样的话就需要在客户端和服务器端分别配置两个文件,客户端的文件分别是frpc文件和frpc.ini文件;服务器端的文件分别是frps文件和frps.ini文件。

常用命令:

(1) 启动frp客户端

1
2
Linux:     ./frpc -c ./frpc.ini
Windows: frpc.exe -c frpc.ini

(2) 后台启动frp客户端

1
Linux:   nohup ./frpc -c ./frpc.ini &

(3) 启动frp服务器端

1
2
Linux:    ./frps -c ./frps.ini
Windows: frps.exe -c frps.ini

(4) 后台启动frp服务器端

1
Linux:   nohub ./frps -c ./frps.ini &

(5) 控制台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wget https://github.com/fatedier/frp/releases/download/v0.9.3/frp_0.34.1_linux_386.tar.gz 
tar xzf frp_0.34.1_linux_386.tar.gz
mv frp_0.34.1_linux_386 frp
cd frp
vi frp.ini

[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443

如果没有必要,端口均可使用默认值,token、user和password项请自行设置。

1
2
3
4
5
6
7
8
9
10
11
“bind_port”       表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。

“dashboard_port” 是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问

x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。

“token” 是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。

“dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。

“vhost_http_port”和“vhost_https_port”用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。

frp

(1) 完整的服务器端配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[common] 是必需的[common]

ipv6的文本地址或主机名必须括在方括号中# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80" bind_addr = 0.0.0.0 bind_port = 7000

udp nat 穿透端口bind_udp_port = 7001

用于 kcp 协议 的 udp 端口,可以与 "bind_port" 相同
如果此项不配置, 服务端的 kcp 将不会启用 kcp_bind_port = 7000

指定代理将侦听哪个地址,默认值与 bind_addr 相同# proxy_bind_addr = 127.0.0.1

如果要支持虚拟主机,必须设置用于侦听的 http 端口(非必需项)
提示:http端口和https端口可以与 bind_port 相同vhost_http_port = 80 vhost_https_port = 443

虚拟 http 服务器的响应头超时时间(秒),默认值为60s# vhost_http_timeout = 60

设置 dashboard_addr 和 dashboard_port 用于查看 frps 仪表盘
dashboard_addr 默认值与 bind_addr 相同
只有 dashboard_port 被设定,仪表盘才能生效dashboard_addr = 0.0.0.0 dashboard_port = 7500
设置仪表盘用户密码,用于基础认证保护,默认为 admin/admindashboard_user = admin dashboard_pwd = admin

认证 tokentoken = 12345678

心跳配置, 不建议对默认值进行修改
heartbeat_timeout 默认值为 90
heartbeat_timeout = 90

允许 frpc(客户端) 绑定的端口,不设置的情况下没有限制allow_ports = 2000-3000,3001,3003,4000-50000
如果超过最大值,每个代理中的 pool_count 将更改为 max_pool_countmax_pool_count = 5

每个客户端可以使用最大端口数,默认值为0,表示没有限制max_ports_per_client = 0

是否使用 tcp 流多路复用,默认值为 truetcp_mux = true

仪表板资产目录(仅用于 debug 模式下)# assets_dir = ./static# 控制台或真实日志文件路径,如./frps.loglog_file = ./frps.log
日志级别,分为trace(跟踪)、debug(调试)、info(信息)、warn(警告)、error(错误) log_level = info
最大日志记录天数log_max_days = 3

(2) 完整的客户端配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[common] 是必需的[common]

ipv6的文本地址或主机名必须括在方括号中# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80" server_addr = 0.0.0.0 server_port = 7000

认证 token
token = 12345678

设置能够通过 http api 控制客户端操作的管理地址admin_addr = 127.0.0.1 admin_port = 7400 admin_user = admin admin_pwd = admin

将提前建立连接,默认值为 0pool_count = 5

是否使用 tcp 流多路复用,默认值为 true,必需与服务端相同tcp_mux = true

在此处设置用户名后,代理名称将设置为 {用户名}.{代理名}user = your_name

决定第一次登录失败时是否退出程序,否则继续重新登录到 frps# 默认为 truelogin_fail_exit = true

用于连接到服务器的通信协议# 目前支持 tcp/kcp/websocket, 默认 tcpprotocol = tcp

如果 tls_enable 为 true, frpc 将会通过 tls 连接 frpstls_enable = true

指定 DNS 服务器# dns_server = 8.8.8.8

代理名, 使用 ',' 分隔# 默认为空, 表示全部代理

心跳配置, 不建议对默认值进行修改# heartbeat_interval 默认为 10 heartbeat_timeout 默认为 90# heartbeat_interval = 30# heartbeat_timeout = 90

'ssh' 是一个特殊代理名称[ssh]# 协议 tcp | udp | http | https | stcp | xtcp, 默认 tcptype = tcplocal_ip = 127.0.0.1local_port = 22

是否加密, 默认为 falseuse_encryption = false
是否压缩use_compression = false

服务端端口remote_port = 6001

frps 将为同一组中的代理进行负载平衡连接group = test_group
组应该有相同的组密钥group_key = 123456

控制台或真实日志文件路径,如./frps.loglog_file = ./frpc.log
日志级别,分为trace(跟踪)、debug(调试)、info(信息)、warn(警告)、error(错误)log_level = info
最大日志记录天数log_max_days = 3

3.Nero reGeorg 正向代理

3.1 Nero reGeorg 简介

Nero reGeorg 内网穿透工具,是应用层的HTTP隧道,传输内容经过变形 base64 加密,伪装成 base64 编码,避免特征检测、提高传输内容保密性。

Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,目的是:

  • 提高 tunnel 连接安全性
  • 提高可用性,避免特征检测
  • 提高传输内容保密性
  • 应对更多的网络环境场景
3.2 Nero reGeorg 原理

reGeorg主要是把内网服务器的端口通过 http/https 隧道转发到本机,形成一个隧道。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持 aspx、php 或 jsp 这些 web 程序中的一种。

reGeorg由服务端和客户端两部分组成。服务端有php、aspx、asph、jsp、node.js等多个版本,客户端则由python编写。其工作原理可简单描述为python客户端在本地监听一个端口,提供socks服务,并将数据通过http/https协议发送到服务端上,并从服务端上用socket实现转发。

3.3 Nero reGeorg 应用场景与功能

如果我们获取到了一个webshell,但是这台主机无法访问外网(就是不出网),如果我们想内网渗透,那就要利用到regeorg通过HTTP隧道建立socks5通信,

HTTP端口复用,是正向的HTTP隧道socks5代理。

功能

  • 传输内容经过变形 base64 加密,伪装成 base64 编码
  • 直接请求响应可定制化 (如伪装的404页面)
  • HTTP Headers 的指令随机生成,避免特征检测
  • HTTP Headers 可定制化
  • 自定义 HTTP 响应码
  • 多 URL 随机请求
  • 服务端 DNS 解析
  • 兼容 python2 / python3
  • 服务端环境的高兼容性
  • (仅 php) 参考 pivotnacci 实现单 Session 创建多 TCP 连接,应对部分负载均衡场景
  • aspx/ashx/jsp/jspx 已不再依赖 Session,可在无 Cookie 等恶劣环境正常运行
  • (非 php) 支持内网转发,应对负载均衡环境
3.4 Nero reGeorg 使用

常用命令:

(1)生成webshell

设置密码生成 tunnel.(aspx|ashx|jsp|jspx|php) 并上传到WEB服务器

1
2
3
4
5
6
7
8
9
10
$ python neoreg.py generate -k password

[+] Create neoreg server files:
=> neoreg_servers/tunnel.jspx
=> neoreg_servers/tunnel_compatibility.jspx
=> neoreg_servers/tunnel.php
=> neoreg_servers/tunnel.ashx
=> neoreg_servers/tunnel.aspx
=> neoreg_servers/tunnel.jsp
=> neoreg_servers/tunnel_compatibility.jsp

(2)上传webshell

(3)Neoreg连接webshell

使用 neoreg.py 连接 WEB 服务器,在本地建立 socks5 代理

1
2
3
4
5
6
7
$ python3 neoreg.py -k password -u http://xx/tunnel.php
+------------------------------------------------------------------------+
Log Level set to [DEBUG]
Starting socks server [127.0.0.1:1080]
Tunnel at:
http://xx/tunnel.php
+------------------------------------------------------------------------+

注意,如果你的工具,如 nmap 不支持 socks5 代理设置,请使用 proxychains等工具。

高级方法使用

  1. 支持生成的服务端,默认直接请求响应指定的页面内容 (如伪装的 404 页面)
1
2
$ python neoreg.py generate -k <you_password> --file 404.html --httpcode 404
$ python neoreg.py -k <you_password> -u <server_url> --skip
  1. 如服务端 WEB,需要设置代理才能访问
1
$ python neoreg.py -k <you_password> -u <server_url> --proxy socks5://10.1.1.1:8080
  1. 如需 Authorization 认证和定制的 Header 或 Cookie
1
$ python neoreg.py -k <you_password> -u <server_url> -H 'Authorization: cm9vdDppcyB0d2VsdmU=' --cookie "key=value;key2=value2"
  1. 需要分散请求,可上传到多个路径上,如内存马
1
$ python neoreg.py -k <you_password> -u <url_1> -u <url_2> -u <url_3> ...
  1. 开启内网转发,应对负载均衡
1
$ python neoreg.py -k <you_password> -u <url> -r <redirect_url>
  1. 使用端口转发功能,非启动 socks5 服务 ( 127.0.0.1:1080 -> ip:port )
1
$ python neoreg.py -k <you_password> -u <url> -t <ip:port>

谢谢大家的观赏文章!
------ 本文结束感谢您的阅读 ------