亞馬遜AWS IoT使用MQTTS(在TLS上的MQTT)來提供物聯網設備與雲平臺直接的通訊功能。出於安全考慮,建議給每一個設備配備了證書來認證,同時,設備也要安裝亞馬遜的根證書;這樣,在使用8883端口創建TLS鏈接時,客戶端SDK既對AWS進行驗證,同時AWS IoT也對設備的證書進行驗證。由此,便對中間人攻擊帶來了較高的要求,下面記錄一下這幾天的爬坑經理。html
總體方案相似於這個:https://wiki.dequis.org/notes/facebook/python
用Host-Only模式的virtual box虛擬機當受害者,用iptables使其能夠上網,並在虛擬網卡vboxnet0上搭建mitmproxy來嗅探。git
VBox虛擬機(安裝SDK) ====> VBoxnet0網絡接口(搭建mitmproxy)======>eth0(公網訪問AWS)github
用到的工具:windows
Kali Linux瀏覽器
Virtual Box安全
mitmproxy服務器
wireshark網絡
dnsmasqapp
iptables
openssl
註冊AWS比較麻煩,還須要可支付美圓的信用卡,不過由於擔憂被扣費刷爆,我隨便baidu了一個填上。可是,因爲扣費1USD不成功,致使下一步驗證碼老是過不去,因此填真實的信用卡比較靠譜。(奇怪的是,我靜置1天后莫名其妙經過了;期間AWS發郵件說由於虛假信息要封號,我靠三寸不爛之舌經過了驗證。)以後就是根據AWS的說明下載並試用SDK,特別值得一提的是,他提供了一個嚮導,直接註冊設備生成證書和對應平臺SDK,很是方便,我選用了生成的Linux Python SDK來實驗。
請參考網上其餘教程。特別說明,必定要apt-get update ,apt-get upgrade ,apt-get dist-upgrade 升級到最新,而且reboot,到最新的內核版本安裝,不然各類Linux headers和內核版本對應不上產生的問題。
https://www.virtualbox.org/manual/ch06.html#network_hostonly
使用host-only聯網可參考:https://unix.stackexchange.com/questions/383791/virtualbox-host-only-with-internet
注意,virtual box修改網絡模式的時候要關掉虛擬機!(在windows上用慣了VMare注意一下)
開始打算直接使用NAT,而後在host主機上(宿主機)搭建中間人代理mitmproxy,然而不知爲什麼一直抓不到包,而且不像VMare能夠看到虛擬網絡接口,故使用host-only配合iptables
https://media.readthedocs.org/pdf/mitmproxy/latest/mitmproxy.pdf
iptables教程:http://www.cnblogs.com/haven/archive/2012/09/27/2705859.html
(經常使用-t指定表,-S顯示設置的規則,-F對該表的規則進行刪除)
開啓ipv4轉發 sysctl -w net.ipv4.ip_forward=1
我設置的規則:(eth0外網鏈接,vboxnet0是host上的虛擬接口)
首先兩個網絡接口能夠互相轉發
iptables -A FORWARD -i eth0 -o vboxnet0 -j ACCEPT
iptables -A FORWARD -i vboxnet0 -o eth0 -j ACCEPT
設置中間人代理以及NAT:
iptables -t nat -A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 8883 -j REDIRECT --to-ports 8080 //8883端口是mqtts
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE //在eth0設置nat改變原地址
最後,記得將虛擬機的默認路由修改成主機上的虛擬網卡vboxnet0的地址192.168.56.1,這樣iptables的-i vboxnet0纔會起做用。DNS能夠設置爲8.8.8.8。
注意,這裏將mitmproxy搭建在vboxnet0,開始我選擇搭建在eth0,可是不知爲什麼一直抓不到包。
http://docs.mitmproxy.org/en/stable/certinstall.html#the-mitmproxy-certificate-authority
首先讓客戶端SDK信任mitmproxy的證書,可是,AWS提供的證書和mitmproxy提供的證書在格式上不一樣,不能僅僅替換證書文件,還須要轉換,在執行腳本時-r參數替換爲mitmproxy的證書文件。
openssl x509 -in mitmproxy-ca-cert.pem -inform PEM -out foo.crt //更改證書格式
python aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e axxxxxx9x.iot.us-east-2.amazonaws.com -r foo.crt -c 0000.cert.pem -k 0000.private.key
客戶端設備的證書也要通過轉換才能提供給mitmproxy,否則服務器會斷開鏈接。
格式轉換參考:https://stackoverflow.com/questions/28712088/unable-to-load-certificate-6300error0906d06cpem-routinespem-read-biono-star
使用客戶端證書:http://docs.mitmproxy.org/en/stable/certinstall.html#using-a-client-side-certificate (文檔有個坑,這裏其實不能單純指定文件夾,最好指定證書文件,官網文檔沒及時更新)
填坑:https://github.com/mitmproxy/mitmproxy/pull/494/commits/ff6bfba4a6a1c440018c4873d9edeb64da0f8e7f (這裏說明了客戶端證書怎麼用,若指定文件夾要求文件名和訪問域名一致)
openssl rsa -in 0000.private.key -out unprotected.0000.private.key
cat unprotected.0000.private.key 0000.cert.pem > mitm_0000.cert.pem
特別注意,這裏不明緣由客戶端SDK和mitmproxy都會檢測到域名不匹配(安全問題?),須要特別處理。SDK我選擇註釋掉了出錯的那一行/usr/local/lib/python2.7/dist-packages/AWSIoTPythonSDK/core/protocol/paho/client.py的800行左右的self._tls_match_hostname();mitmproxy使用--insecure參數,屆時會顯示警告,可是不會斷開鏈接。
192.168.56.2:52369: Certificate Verification Error for 52.15.111.27:8883: hostname 'no-hostname' doesn't match either of u'*.iot.us-east-2.amazonaws.com', u'iot.us-east-2.amazonaws.com'
192.168.56.2:52369: Ignoring server verification error, continuing with connection。
http://docs.mitmproxy.org/en/stable/dev/sslkeylogfile.html
設置環境變量讓mitmproxy記錄下ssl的密鑰:
export SSLKEYLOGFILE=~/IoT/keylog (會影響瀏覽器 ,最好選用下面這個環境變量)
export MITMPROXY_SSLKEYLOGFILE=~/IoT/keylog
1)運行代理:
mitmdump -T --insecure --client-certs ~/IoT/connect_device_package/mitm_0000.cert.pem --host --raw-tcp -w 11111
-v能夠顯示詳細信息。
必定要設置--raw-tcp,不然代理會由於mqtt不是標準的http協議而出錯。(重要補充:最好是設置成-tcp,由於-raw-tcp會讓mitmdump自動推斷協議。奇怪的是,抓取rachio這個app的http2協議時,要設置--raw-tcp纔不會致使app崩潰。到時候你們多試一試吧)
2)打開wireshark並設置過濾條件爲ssl && tcp.port==8883
3)運行sdk腳本:
python aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e axxxxxx9x.iot.us-east-2.amazonaws.com -r foo.crt -c 0000.cert.pem -k 0000.private.key
4)將密鑰導入wireshark便可解密出mqtts消息:
編輯——首選想——protocals——ssl—— (Pre)-Master-Secret log filename
,選擇記錄下的密鑰。
By Ascii0x03,歡迎轉載,請註明出處,謝謝。
http://www.cnblogs.com/ascii0x03/p/7798072.html
2017-11-07