“想要解決一個問題,最根本方法的就是了解這一切是如何工作的,而不是玄學。”
——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
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
三、重要補充
0. 需要一個在Linux下支持AP模式的網卡和驅動
這里推薦TP-Link的TL-WN722N。lsusb可以看到識別出來的型號。需要添加個源到/etc/apt/sources.list:deb 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