關(guān)于Linkedin-Intro的釣魚研究
2013年10月28日,我聯(lián)系了Linkedin的安全團(tuán)隊(duì),并會(huì)在近期發(fā)布修復(fù)補(bǔ)丁來解決下面的問題。這個(gè)修復(fù)程序適用于隨機(jī)生成ID的styling規(guī)則,同下面介紹的基于class的styling有所區(qū)別。
我并不是CSS專家,所以或許有其他技巧可以繞過這個(gè)限制和刪除內(nèi)容(甚至只是隱藏或覆蓋它)————如果你知道,請(qǐng)email通知我!我將繼續(xù)與Linkedin的安全團(tuán)隊(duì)合作來修復(fù)任何我們能找到的BUG。而用戶需要注意的是世上沒有完美的解決方案,即便在郵件中你所看到的這些數(shù)據(jù)也不能明確證明發(fā)送人的合法性。
我還要感謝Linkedin的安全團(tuán)隊(duì),他們快速且有效地處理了這些問題。
有關(guān)“Intro”
10月23日,Linkedin推出一個(gè)名為"Intro"的應(yīng)用程序。程序的運(yùn)行條件很簡單:允許iPhone用戶看到本機(jī)Mail App里發(fā)件人的詳細(xì)信息。這跟iPhone Mail App的Rapportive差不多,這兩個(gè)app在本質(zhì)上一樣(且由相同的人所開發(fā))。
然而,在看Intro最初的介紹中,有一個(gè)地方引起了我的注意:
“David說Crosswise很想和你合作。這是垃圾郵件,還是真實(shí)郵件?
通過Intro,您可以立即看到David長什么樣子,他在哪兒,他是干什么的。你可以看到,他是Crosswise的首席執(zhí)行官。這是真正的交易。”
這就像Linkedin說“我們放了一個(gè)鎖住的照片在你的email里,所以你知道它肯定是安全的”這種情況一樣。Linkedin簡單地給用戶一種虛假的安全感。在這篇文章中,我們將一起來看一看Linkedin在用戶的郵件中到底是怎樣做的,以及我們?nèi)绾蝹卧爝@一信息,完全控制Intro所展現(xiàn)給用戶的信息。
Linkedin會(huì)對(duì)你的Email做些什么
為了更好地觀察Intro的行為,目前我正對(duì)其進(jìn)行更深入的分析研究,并很快就會(huì)發(fā)布。而現(xiàn)在我們只是看看Intro工作的基礎(chǔ)知識(shí),看看它具體是如何對(duì)用戶email進(jìn)行操作的。
Intro首先獲取一個(gè)OAuth訪問令牌來管理你的電子郵件。因?yàn)镚oogle應(yīng)用的OAuth協(xié)議支持Gmail的IMAP和SMTP,所以它們無需驗(yàn)證你的郵箱密碼就可獲得授權(quán)。然后Linkedin就可以訪問你的email并在你的iPhone上安裝一個(gè)安全配置文件,該安全配置文件的最顯著特點(diǎn)就是,它會(huì)安裝一個(gè)新的email賬戶指向Linkedin的IMAP和SMTP服務(wù)器。我不曉得如何從iPhone自身恢復(fù)email賬戶密碼,但通過代理攔截發(fā)送到iPhone的配置文件,我們可以看到這個(gè)email賬戶看起來像這樣:
- <dict>
- <key>PayloadDisplayName</key><string>Email Settings</string>
- <key>PayloadType</key><string>com.apple.mail.managed</string>
- <key>PayloadVersion</key><integer>1</integer>
- <key>PayloadUUID</key><string>[redacted]</string>
- <key>PayloadIdentifier</key><string>com.rapportive.iphone.settings.email.[redacted]</string>
- <key>EmailAccountName</key><string>Test Account</string>
- <key>EmailAccountType</key><string>EmailTypeIMAP</string>
- <key>EmailAddress</key><string>Linkedin.intro.test@gmail.com</string>
- <key>EmailAccountDescription</key><string>Gmail +Intro</string>
- <key>IncomingMailServerAuthentication</key><string>EmailAuthPassword</string>
- <key>IncomingMailServerHostName</key><string>imap.intro.Linkedin.com</string>
- <key>IncomingMailServerPortNumber</key><integer>143</integer>
- <key>IncomingMailServerUseSSL</key><true/>
- <key>IncomingMailServerUsername</key><string>[username_redacted]</string>
- <key>IncomingPassword</key><string>[password_redacted]</string>
- <key>OutgoingPasswordSameAsIncomingPassword</key><true/>
- <key>OutgoingMailServerAuthentication</key><string>EmailAuthPassword</string>
- <key>OutgoingMailServerHostName</key><string>smtp.intro.Linkedin.com</string>
- <key>OutgoingMailServerPortNumber</key><integer>587</integer>
- <key>OutgoingMailServerUseSSL</key><true/>
- <key>OutgoingMailServerUsername</key><string>Gmail+Intro ?[username_redacted]</string>
- <key>OutgoingPassword</key><string>[password_redacted]</string>
- </dict>
通過攔截該配置文件,我們可以得到用于登錄到Linkedin的IMAP(imap.intro.Linkedin.com)和SMTP(smtp.intro.Linkedin.com)服務(wù)的用戶名和密碼。用戶名是base64編碼的字符串,密碼是一個(gè)32個(gè)字符的hash。
這里有一個(gè)圖展示這是如何工作的:

現(xiàn)在,我們已經(jīng)有了這郵件賬戶使用的用戶名和密碼,讓我們抓取第一個(gè)電子郵件,看看Linkedin的IMAP代理注入了什么內(nèi)容。我們可以使用OpenSSL來做到這一點(diǎn)哦。
- # openssl s_client -connect imap.intro.Linkedin.com:143 -starttls imap -crlf -quiet
- depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
- verify error:num=19:self signed certificate in certificate chain
- verify return:0
- . OK More capabilities after LOGIN
- a LOGIN username_redacted password_redacted
- * CAPABILITY IMAP4rev1 IDLE NAMESPACE ID CHILDREN UIDPLUS COMPRESS=DEFLATE
- A OK Linkedin.intro.test@gmail.com Test Account authenticated (Success)
- b SELECT INBOX
- * FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
- * OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)] Flags permitted.
- * OK [UIDVALIDITY 1] UIDs valid.
- * 4 EXISTS
- * 0 RECENT
- * OK [UIDNEXT 5] Predicted next UID.
- * OK [HIGHESTMODSEQ 1049]
- b OK [READ-WRITE] INBOX selected. (Success)
- c FETCH 4 BODY[]
- * 4 FETCH (FLAGS (\Seen) BODY[] {36510}
- email_content_here
事實(shí)證明,Linkedin注入了相當(dāng)多的內(nèi)容到你的電子郵件中去。基本的結(jié)構(gòu)看起來像這樣:
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- User specified CSS (if any)
- <style type="text/css">
- /*BEGIN RAPPORTIVE*/
- Injected Linkedin Intro CSS
- /*END RAPPORTIVE*/
- </style>
- </head>
- <body>
- <!--BEGIN RAPPORTIVE-->
- Injected Linkedin Intro HTML Content
- <!--END RAPPORTIVE-->
- Original Message
- </body>
- </html>
你可以在這里找到完整的電子郵件(一些鏈接和一些未被刪掉的東西)。現(xiàn)在我們知道Linkedin對(duì)該email做了些什么了吧,讓我們?cè)倏纯慈绾问褂盟鼇碜屛覀兊尼烎~郵件看起來是合法的。
設(shè)置誘餌
就像設(shè)置一個(gè)欺騙性的網(wǎng)站一樣,我們可以簡單地復(fù)制Linkedin所提供的現(xiàn)有CSS和HTML結(jié)構(gòu),并根據(jù)我們的需要來使用它。首先我們想要做的是找到除去Intro現(xiàn)有數(shù)據(jù)的方法。我們可以把現(xiàn)有Intro塊的CSS設(shè)置為display:none;。很不幸的是, Linkedin顯然也想到了這一點(diǎn),由于CSS通常是插入到head標(biāo)簽后面,他們相當(dāng)細(xì)心地為display,height等設(shè)置了!important關(guān)鍵詞,以提高指定樣式規(guī)則的應(yīng)用優(yōu)先權(quán)。
但仍然不夠細(xì)致,如果我們看CSS,可以發(fā)現(xiàn)到其規(guī)則適用于#rapportive.iphone元素。如果我們仔細(xì)觀察,就會(huì)發(fā)現(xiàn),其實(shí)我們想要隱藏的HTML有一個(gè)完整的規(guī)范#rapportive.rapportive.topbar.iphone。因此,我們可以簡單地設(shè)置以下樣式的隱藏:
- <style type="text/css">
- #rapportive.rapportive.topbar.iphone {
- display:none !important;
- }
- </style>
就是這么簡單。
現(xiàn)在,我們已經(jīng)刪除了現(xiàn)有的Intro數(shù)據(jù),我們可以自由注入我們自己的數(shù)據(jù)了。要做到這一點(diǎn),我們可以復(fù)制Linkedin提供的現(xiàn)有HTML。若要確保我們的數(shù)據(jù)不會(huì)被我們之前的CSS隱藏,我們可以簡單地從root中刪除topbar類,因?yàn)樗粫?huì)影響樣式。最后我們想要做的是清除Linkedin在原來信息上設(shè)置的邊距,以及把實(shí)際數(shù)據(jù)本身改成任何我們想要的數(shù)據(jù)。此外,我復(fù)制了一些CSS和HTML,修改了自動(dòng)生成的Id。這將確保我們的模板始終一致。
“釣魚”去啦
為達(dá)教學(xué)目的,我已經(jīng)建立了一個(gè)基本的PoC模板。若要使用它,你只需訪問你要欺騙的那個(gè)人的Linkedin配置文件,填寫所需的CSS信息。理想情況下,將來可改進(jìn)成自動(dòng)擦除此信息并檢查確保Intro數(shù)據(jù)只在移動(dòng)設(shè)備上顯示等。現(xiàn)在,它是基本可用的,讓我們看看如果我對(duì)Linkedin原來顯示的信息實(shí)行欺騙會(huì)是怎樣。(諒解一下,這不是IOS7————我沒有見過IOS7系統(tǒng)會(huì)有這么多問題):

這就是當(dāng)我打開Intro選項(xiàng)時(shí)所看到的詳細(xì)信息(它們是可以自定義的,我讓它們展示了一下我確實(shí)控制了其內(nèi)容):

顯然,這是一個(gè)不具惡意的例子。當(dāng)然,要添加惡意文件、請(qǐng)求敏感信息,也同樣很簡單。
最后的想法
雖然Linkedin Intro表面上看起來很有用————只是使用它的話,風(fēng)險(xiǎn)太高了。作為一個(gè)社會(huì)工程師,我希望我的目標(biāo)是使用Intro。Linkedin Intro的使用,為用戶營造了一種虛假的安全感,這使得我和廣大社工人員的工作便捷許多。
本文來自Jordan的博文《Phishing With Linkedin's Intro》
原文地址:http://jordan-wright.github.io/blog/2013/10/26/phishing-with-linkedins-intro/