在實際業務中,我們經常會遇到一些滲透測試項目由于處于企業內網,因此不得不把白帽子們集合起來塞進小黑屋實地測試。
本文基于Openwrt,通過Openvpn橋接本地網絡與遠程目標內網,實現layer 3的內網訪問,文章重點不是如何進行內網滲透,而是如何授權完全不會內網滲透的白帽子遠程進入內網搞滲透測試。
192.168.35.0/24
0.0.0.0
+--------------------------+
| | +-----------------------------------------------------------------------------+
| | | |
| Private subnet | | |
| | | Open Internet |
| | | |
| | | |
| | | |
| 10.8.0.29 | | 10.8.0.1 10.8.0.* |
| +------------------+ | +--------------------+ +----------------+ |
| | | | 192.168.35.0/24 | | | 192.168.35.0/24 | | |
| | Target | <------------------------> Openvpn Server <--------------------------> Attacker | |
| | | | | | | | | |
| +------------------+ vpn tunnel | +--------------------+ vpn tunnel +----------------+ |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | +-----------------------------------------------------------------------------+
+--------------------------+
首先我們利用Openvpn的隧道來穿透企業內網,這一點對于企業自身的網絡工程師而言比較輕松,只要放行一條tcp連接(或者udp)用于構建vpn隧道就可以了,如果企業內網本身就沒有封殺到外網的出站連接,那就更簡單了
之后滲透測試人員各自與Openvpn外網主控服務器建立連接,橋接本地和遠程內網網絡,之后所有的內網訪問都會通過Openvpn server轉發進企業內網,與實際連入企業內網效果相同,而其他網段的連接則不受影響
首先要安裝Openvpn
apt install openvpn
之后我們要建立自己的pki
#我們可以用Openvpn自帶的easy-rsa來生成(不建議用軟件源中的老版本easy-rsa)
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
#請自行修改vars
cp vars.example vars
#初始化pki
./easyrsa init-pki
#注意,不要一次性復制粘貼多行命令,因為會要求輸入ca密碼
./easyrsa build-ca
#生成server端無需密碼的req
./easyrsa gen-req server nopass
#和ca簽約
./easyrsa sign server server
#生成diffie-hellman交換
./easyrsa gen-dh
#以下不必在ca端執行,可以讓相關人員自己生成,然后在ca端import-req,這里偷懶直接自己搞了
#生成內網穿透目標的req并簽約
./easyrsa gen-req target nopass
./easyrsa sign client target
#生成滲透測試人員的req并簽約
./easyrsa gen-req client1 nopass
./easyrsa sign client client1
Openvpn server端配置文件: server.ovpn
#端口,不解釋
port 1194
#TCP還是UDP
proto udp
#TUN還是TAP
dev tun
#改成我們剛生成的證書和key
ca /root/easy-rsa/easyrsa3/pki/ca.crt
cert /root/easy-rsa/easyrsa3/pki/issued/server.crt
key /root/easy-rsa/easyrsa3/pki/private/server.key
#我們生成的diffie-hellman參數
dh /etc/openvpn/easyrsa3/pki/dh.pem
#Openvpn使用的網段
server 10.8.0.0 255.255.255.0
#記住之前分配過的ip
ifconfig-pool-persist ipp.txt
#通知客戶端把內網網段路由到server上
push "route 192.168.35.0 255.255.255.0"
#客戶端的獨立profile
client-config-dir ccd
#通知server自己來處理內網網段路由
route 192.168.35.0 255.255.255.0
#點對點通信(在隧道上)
client-to-client
#保持連接
keepalive 10 120
#壓縮
comp-lzo
#避免重啟時導致各種tun上的手動設置丟失
persist-key
persist-tun
#log
status openvpn-status.log
#詳細程度
verb 3
這里要注意兩件事情,第一件是不可以使用duplicate-cn來偷懶,必須給每人簽約一套認證,第二件是要保證要轉發的內網網段必須不和本地網段沖突,不然自己到Openvpn server的流量都沒法走了
建立配置中提到的配置文件夾: ccd
mkdir ccd
然后新建target的配置: target
iroute 192.168.35.0 255.255.255.0
ifconfig-push 10.8.0.29 10.8.0.1
這個iroute和之前route的區別是,iroute通知server把內網流量轉發到target這臺client上,而我們為了方便設置給target這個client分配個固定ip
然后運行Openvpn就好了
openvpn --config server.ovpn
其實就是一個和server端相對應的client配置文件: client1.ovpn
#客戶端
client
#TUN還是TAP
dev tun
#TCP還是UDP
proto udp
#服務器公網ip和端口
remote 250.250.250.250 1194
#無限重試
resolv-retry infinite
nobind
#避免重啟后手動配置消失
persist-key
persist-tun
#對應之前生成的client證書還有私鑰
ca /root/easy-rsa/easyrsa3/pki/ca.crt
cert /root/easy-rsa/easyrsa3/pki/issued/client1.crt
key /root/easy-rsa/easyrsa3/pki/private/client1.key
#壓縮
comp-lzo
verb 3
這里要注意的是生成的req一定要記得去server那個對應的ca簽約,另外不可以多個client用一個key
然后運行openvpn就好了
openvpn --config client1.ovpn
內網target的openvpn配置文件和正常client的配置文件是相同的,只要把key和crt替換成target自己的就可以
但是需要加一條轉發,保證通過隧道訪問內網的連接可以正確到達內網后再被通過隧道轉發回去
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o br-lan -j MASQUERADE
這里假設我們要遠程橋接的內網在br-lan接口可達,這里的例子是Openwrt的一個內部網絡的interface,如果用的是臺式機,可能是eth0之類的,如果是要映射路由器自己本身所在的內網,可以改成wan口(注意配置firewall)
如果用的是Openwrt路由器,這時需要先把默認drop的forward規則改成accept,不然會不停的報錯反饋 port unreachable
然后運行openvpn就好了
openvpn --config target.ovpn
我們可以把target部署在一個Openwrt路由器上,把target部署的全部步驟徹底自動化,簡化成只需要給路由器配置網絡即可
自動化配置的文件如下:
#target用到的各種認證文件
$(CP) $(PKG_BUILD_DIR)/conf/ca.crt $(1)/etc/openvpn
$(CP) $(PKG_BUILD_DIR)/conf/target.crt $(1)/etc/openvpn
$(CP) $(PKG_BUILD_DIR)/conf/target.key $(1)/etc/openvpn
#target的配置文件
$(CP) $(PKG_BUILD_DIR)/conf/target.ovpn $(1)/etc/openvpn
#Openwrt系統的openvpn服務配置(用于指定target配置文件路徑)
$(CP) $(PKG_BUILD_DIR)/conf/openvpn $(1)/etc/config
#把forward改成accept
$(CP) $(PKG_BUILD_DIR)/conf/firewall $(1)/etc/config
#改出我們想要的192.168.35.0/24內網網段
$(CP) $(PKG_BUILD_DIR)/conf/network $(1)/etc/config
#添加iptables轉發隧道至內網,然后再轉發響應從隧道回去
$(CP) $(PKG_BUILD_DIR)/conf/firewall.user $(1)/etc
于是當這臺路由器被配置好網絡后,就會連接Openvpn server,并把指定的內網開放給連接Openvpn server的滲透測試人員們
下圖為client1測試mtr 192.168.35.154
連接192.168.35.0/24內網中設備的路由情況,成功通過10.8.0.29連接到了內網設備
我把整個自動部署的配置打成了個Openwrt的package,大家可以到github上下載示例(替換成自己的key和crt)
https://github.com/lxj616/wooyunwifi_ofdoom
kali官方給出的single server與single agent模式配置介紹: https://www.offensive-security.com/kali-linux/kali-rolling-iso-of-doom/
binkybear 給出的利用openvpn-as來做的multi-client形式的教程(在Nethunter上實現的agent),由于openvpn-as是商業版的(免費授權最多兩個連接,限制太多),因此我決定在Openwrt上基于原版openvpn來做: https://github.com/offensive-security/kali-nethunter/issues/421
最后聲明一下,這個功能不包含在WooyunWifi里面,公開的代碼完全不依賴WooyunWifi,也不包含任何WooyunWifi的代碼,對于普通的Openwrt路由器,只需要安裝openvpn即可,請在合法的范圍內使用本文中所提到的技術,不要在未經同意的情況下把路由器放進別人內網,也不要把Openvpn server部署到國外免得違背某些奇怪的政策……