天天看點

Linkedin Intro的釣魚研究

2013年10月28日,我聯系了Linkedin的安全團隊,并會在近期釋出修複更新檔來解決下面的問題。這個修複程式适用于随機生成ID的styling規則,同下面介紹的基于class的styling有所差別。

我并不是CSS專家,是以或許有其他技巧可以繞過這個限制和删除内容(甚至隻是隐藏或覆寫它)————如果你知道,請

email

通知我!我将繼續與Linkedin的安全團隊合作來修複任何我們能找到的BUG。而使用者需要注意的是世上沒有完美的解決方案,即便在郵件中你所看到的這些資料也不能明确證明發送人的合法性。

我還要感謝Linkedin的安全團隊,他們快速且有效地處理了這些問題。

Linkedin Intro的釣魚研究

有關“Intro”

10月23日,Linkedin推出一個名為"

Intro

"的應用程式。程式的運作條件很簡單:允許iPhone使用者看到本機Mail App裡發件人的詳細資訊。這跟iPhone Mail App的

Rapportive

差不多,這兩個app在本質上一樣(且由相同的人所開發)。

然而,在看Intro最初的介紹中,有一個地方引起了我的注意:

David說Crosswise很想和你合作。這是垃圾郵件,還是真實郵件?

通過Intro,您可以立即看到David長什麼樣子,他在哪兒,他是幹什麼的。你可以看到,他是Crosswise的首席執行官。這是真正的交易。

這就像Linkedin說“我們放了一個鎖住的照片在你的email裡,是以你知道它肯定是安全的”這種情況一樣。Linkedin簡單地給使用者一種虛假的安全感。在這篇文章中,我們将一起來看一看Linkedin在使用者的郵件中到底是怎樣做的,以及我們如何僞造這一資訊,完全控制Intro所展現給使用者的資訊。

Linkedin會對你的Email做些什麼

為了更好地觀察Intro的行為,目前我正對其進行更深入的分析研究,并很快就會釋出。而現在我們隻是看看Intro工作的基礎知識,看看它具體是如何對使用者email進行操作的。

Intro首先擷取一個OAuth通路令牌來管理你的電子郵件。因為Google應用的OAuth協定支援Gmail的IMAP和SMTP,是以它們無需驗證你的郵箱密碼就可獲得授權。然後Linkedin就可以通路你的email并在你的iPhone上安裝一個安全配置檔案,該安全配置檔案的最顯著特點就是,它會安裝一個新的email賬戶指向Linkedin的IMAP和SMTP伺服器。我不曉得如何從iPhone自身恢複email賬戶密碼,但通過代理攔截發送到iPhone的配置檔案,我們可以看到這個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>[email protected]</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)服務的使用者名和密碼。使用者名是base64編碼的字元串,密碼是一個32個字元的hash。

Linkedin Intro的釣魚研究

現在,我們已經有了這郵件賬戶使用的使用者名和密碼,讓我們抓取第一個電子郵件,看看Linkedin的IMAP代理注入了什麼内容。我們可以使用OpenSSL來做到這一點哦。

# 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 [email protected] 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

事實證明,Linkedin注入了相當多的内容到你的電子郵件中去。基本的結構看起來像這樣:

<!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>

你可以在

這裡

找到完整的電子郵件(一些連結和一些未被删掉的東西)。現在我們知道Linkedin對該email做了些什麼了吧,讓我們再看看如何使用它來讓我們的釣魚郵件看起來是合法的。

設定誘餌

就像設定一個欺騙性的網站一樣,我們可以簡單地複制Linkedin所提供的現有CSS和HTML結構,并根據我們的需要來使用它。首先我們想要做的是找到除去Intro現有資料的方法。我們可以把現有Intro塊的CSS設定為display:none;。很不幸的是, Linkedin顯然也想到了這一點,由于CSS通常是插入到head标簽後面,他們相當細心地為display,height等設定了!important關鍵詞,以提高指定樣式規則的應用優先權。

但仍然不夠細緻,如果我們看CSS,可以發現到其規則适用于#rapportive.iphone元素。如果我們仔細觀察,就會發現,其實我們想要隐藏的HTML有一個完整的規範#rapportive.rapportive.topbar.iphone。是以,我們可以簡單地設定以下樣式的隐藏:

<style type="text/css">

    #rapportive.rapportive.topbar.iphone {

        display:none !important;

    }

</style>

就是這麼簡單。

現在,我們已經删除了現有的Intro資料,我們可以自由注入我們自己的資料了。要做到這一點,我們可以複制Linkedin提供的現有HTML。若要確定我們的資料不會被我們之前的CSS隐藏,我們可以簡單地從root中删除topbar類,因為它不會影響樣式。最後我們想要做的是清除Linkedin在原來資訊上設定的邊距,以及把實際資料本身改成任何我們想要的資料。此外,我複制了一些CSS和HTML,修改了自動生成的Id。這将確定我們的模闆始終一緻。

“釣魚”去啦

為達教學目的,我已經建立了一個基本的PoC模闆。若要使用它,你隻需通路你要欺騙的那個人的Linkedin配置檔案,填寫所需的CSS資訊。理想情況下,将來可改進成自動擦除此資訊并檢查確定Intro資料隻在移動裝置上顯示等。現在,它是基本可用的,讓我們看看如果我對Linkedin原來顯示的資訊實行欺騙會是怎樣。(諒解一下,這不是IOS7————我沒有見過IOS7系統會有這麼多問題):

Linkedin Intro的釣魚研究

這就是當我打開Intro選項時所看到的詳細資訊(它們是可以自定義的,我讓它們展示了一下我确實控制了其内容):

Linkedin Intro的釣魚研究

顯然,這是一個不具惡意的例子。當然,要添加惡意檔案、請求敏感資訊,也同樣很簡單。

最後的想法

雖然Linkedin Intro表面上看起來很有用————隻是使用它的話,風險太高了。作為一個社會工程師,我希望我的目标是使用Intro。Linkedin Intro的使用,為使用者營造了一種虛假的安全感,這使得我和廣大社勞工員的工作便捷許多。

繼續閱讀