雙網卡+mitmproxy+iptables搭建SSL中間人(支持非HTTPS協議)


“想要解決一個問題,最根本方法的就是了解這一切是如何工作的,而不是玄學。”

                                  ——ASCII0X03

最近學習發現現在很多現成的安卓SSL中間人工具和教程都只針對HTTPS流量,比如注冊為安卓VPN的Packetcapture,以及設置http代理來抓包的Fiddler。他們對於分析http流量都很好,但是遇到局域網通信或者非HTTPS流量如MQTT,就無能為力了。因此,特利用雙網卡和mitmproxy神器(叫做神器是有原因的,這應該是做中間人最好的工具了,可滿足各種需求)搭建了一個支持SSL上的MQTT協議的中間人環境,基本框架如下圖。

注意,此方案選用倆網卡自己當網關是基於如下考慮:手機設置代理的方法不是所有app的所有流量都會使用,ARP欺騙不穩定,並且有的設備自己做AP熱點根本就不轉發任何其他流量。當然,還是需要Xpose或者重打包來繞過App上的SSL pinning。鄙人認為最好的方法還是在安卓端寫一個類似於Packetcapture的VPN軟件配合Xpose Hook並支持各種端口的協議(不太好的一個參考:https://blog.csdn.net/XXOOYC/article/details/78223242),奈何太菜不懂安卓,哪位達人有興趣可以git 來一發。

一、基礎知識

1.mitmdump基礎

參考:https://docs.mitmproxy.org/stable/concepts-modes/#transparent-proxy

由於我們不想只監聽HTTP流量,因此需要使用mitmproxy的“透明”(Transparent Proxy)模式,即從網絡層轉發至代理,監聽IP層以上的所有流量。基本原理如下圖所示,在router層面(使用iptables)將數據包重定向到mitmproxy,然后中間人代理會嗅探並自動轉發。注意:代理會將源IP地址修改為本機NAT不應該在代理之前做,因為會讓代理無法判斷真正的目的地址,第三張圖是錯誤的示例

 

2.iptables基礎

參考系列教程:http://www.zsythink.net/archives/1199

尤其是其中的這張圖,畫的非常好,這里轉載過來備用,侵刪。

 

3.安卓校驗SSL實現

安卓如何實現https可以參考:https://www.v2ex.com/t/309553

繞過安卓App的SSl可參考:https://blog.netspi.com/four-ways-bypass-android-ssl-verification-certificate-pinning/

 對於安卓上的SSL pinning,不一定要使用Frida,也可以使用Xpose的Just trust me模塊來Hook SSLContext.init函數,給一個空的TrustManager,但是,校驗的順序是先校驗證書,再校驗域名,即setHostnameVerifier。通常這個函數是不用我們處理的,因為mitmproxy已經自動的生成對方服務器的hostname來構建中間人證書,但是個別情況下我們還是需要找到並且Hook掉這個App自己的HostnameVerifier類,比如App連接設備的WiFi並且校驗SSL證書是不是和WiFi的名字相同。

 

4. 繞過IOS的SSL pinning

非常好的一篇參考:https://blog.netspi.com/four-ways-to-bypass-ios-ssl-verification-and-certificate-pinning/

其中推薦了一個搞IOS和MAC OS的人的工具SSL Kill Switch(暫時還沒試,但是似乎非常靠譜):https://github.com/nabla-c0d3/ssl-kill-switch2

 

ps:通過閱讀這些國外的帖子,雖然不同平台有不同平台專門的搞法,但是感覺搞安全分析務必要學習一下Frida了,這是一個更通用的動態hook工具,以后應該會用得到。

 

二、方案說明

基本的中間人搭建參考:https://medium.com/@viveks3th/turning-your-raspberry-pi-into-a-rogue-wifi-router-for-hacking-46d4941bbca9

iptables規則如下(eth0是外網):

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT

sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 443 -j REDIRECT --to-port 8080

其中-m是指定擴展模塊“state”,只允許相關的包從外網轉發到內網;但是物聯網設備和app通信往往包含相互發現等過程,因此可以根據需要轉發其他類型的流量,如本次需要轉發特殊的UDP流量。

 

我的方案

1.wlan1接入具有外網的熱點或者按需接入設備建立的配網熱點。記錄下需要和App通信的ip地址,以方便轉發udp流量。

2. wlan0建立熱點,並讓手機接入。可參考https://blog.csdn.net/gsls200808/article/details/39370597

主要有這么幾步:

(1)安裝配置hostapd

注意,在運行前需要讓系統自帶的網絡管理器取消對wifi的管理:nmcli nm wifi off(或者嘗試nmcli radio wifi off)。但是,有時候會出現lsusb能看到無線網卡,ifconfig看不到的情況,有可能是驅動出了問題(但是lsmod沒看出問題),我的解決方案是打開系統自動管理nmcli radio wifi on,然后重啟電腦重新插網卡就恢復正常了。求高人解惑,避免重啟。

(2)安裝配置DHCP服務器

(3)設置iptables轉發

#########################################################################
# File Name: setup_wifi_ap.sh
# Author: ascii0x03
# mail:
# Created Time: 2018年01月22日 星期一 15時28分50秒
#########################################################################
#!/bin/bash
#
/etc/init.d/hostapd stop
service isc-dhcp-server stop
/etc/init.d/isc-dhcp-server stop
ifconfig wlan0 down

vim /etc/hostapd/hostapd.conf
vim /etc/dhcp/dhcpd.conf
#設置網卡wlan的IP和子網,要跟dhcpd.conf網關一致
ifconfig wlan0 192.168.201.1 netmask 255.255.255.0 up
sleep 1
rfkill unblock wifi
sleep 1
hostapd -B /etc/hostapd/hostapd.conf
#initctl reload-configuration
service isc-dhcp-server start
#/etc/init.d/isc-dhcp-server start

#iptables轉發上網
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -F
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -L 
View Code

 

3.設置轉發規則,例如將App的UDP等數據通過DNAT轉發至設備,設備也DNAT至App,因為IoT經常使用這些UDP廣播來進行設備發現。(看情況而定)

4.設置轉發規則,將想要監聽的tcp端口轉發至mitmproxy。(看情況)

5.在wlan1設置NAT規則進行轉發(在出口位置肯定在mitmproxy之后)

 1 #########################################################################
 2 # File Name: mitm_config.sh
 3 # Author: ascii0x03
 4 # mail: 
 5 # Created Time: 2017年12月06日 星期三 16時24分37秒
 6 #########################################################################
 7 #!/bin/bash
 8 #首先,建立好AP為wlan0,並且開啟dhcp服務器分配ip,之后運行如下腳本即可。
 9 sysctl -w net.ipv4.ip_forward=1
10 sysctl -w net.ipv6.conf.all.forwarding=1
11 sysctl -w net.ipv4.conf.all.send_redirects=0
12 
13 iptables -F
14 iptables -t nat -F
15 iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
16 iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT
17 
18 #UDP for discovering device in wlan
19 iptables -t nat -A PREROUTING -i wlan0 -p udp -m udp --dport 5678 -j DNAT --to-destination 192.168.1.101
20 iptables -t nat -A PREROUTING -i wlan1 -p udp -m udp --sport 5678 -j DNAT --to-destination 192.168.201.156
21 
22 iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
23 iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
24 #MQTTS
25 iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 8883 -j REDIRECT --to-ports 8080
26 
27 #all
28 #iptables -t nat -A PREROUTING -i wlan0 -p tcp -j REDIRECT --to-ports 8080
29 
30 iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
31 
32 iptables -S
33 iptables -t nat -S
34 #存放ssl密鑰的位置
35 export MITMPROXY_SSLKEYLOGFILE=~/IoT/keylog
36 
37 #mitmdump -T -v --cert *=~/iRobot/irobot_cert.pem   --insecure -tcp -w 11111
38 mitmdump -T -v --insecure --raw-tcp -w 11111
View Code

 

三、重要補充

0. 需要一個在Linux下支持AP模式的網卡和驅動

這里推薦TP-Link的TL-WN722N。lsusb可以看到識別出來的型號。需要添加個源到/etc/apt/sources.listdeb http://httpredir.debian.org/debian/ jessie main contrib non-free,然后再安裝: apt-get update && apt-get install firmware-athreos

 參考:https://wiki.debian.org/ath9k_htc

1.連接未加密WiFi

iw dev wlan1 connect Roomba-3147C60040239620

2.連接加密WiFi

wpa_supplicant -i wlan1 -c ./wifi.conf

wifi.config的內容參考如下

network={
    ssid="NIPC"
    psk="11111111"
    #psk=e68b3b7ddb0aba50c582753dfbe33cc372b080eb0d11fcaa6b096ec466f82343
}

 

3.連接后請求獲得IP地址

dhclient wlan1

4.斷開WiFI連接

iw dev wlan1 disconnect

5.開啟建立的熱點:

hostapd -B /etc/hostapd/hostapd.conf

6. 關閉熱點:直接kill掉hostapd進程

7. 查看網卡的無線狀態和ip狀態(注意ifconfig看不到無線網卡但是iwconfig可以看到,ifconfig wlan0 up開啟后就好了)

iwconfig

ifconfig

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM