2013年10月28日,我联系了Linkedin的安然团队,并会在近期发布修复补丁来解决下面的标题问题。这个修复法度合用于随机生成ID的styling法则,同下面介绍的基于class的styling有所辨别。
我其实不是CSS专家,所以或许有其他技能可以绕过这个限制和删除内容(乃至只是隐躲或笼盖它)————假定你知道,请email通知我!我将继续与Linkedin的安然团队合作来修复任何我们能找到的BUG。而用户需要寄望的是世上没有完美的解决方案,即便在邮件中你所看到的这些数据也不克不及明白证实发送人的合法性。
我还要感激Linkedin的安然团队,他们快速且有效地措置了这些标题问题。
有关“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账户看起来像如许:
经由过程反对该建设文件,我们可以获得用于登录到Linkedin的IMAP(imap.intro.Linkedin.com)和SMTP(smtp.intro.Linkedin.com)办事的用户名和暗码。用户名是base64编码的字符串,暗码是一个32个字符的hash。
这里有一个图揭示这是若何工作的:
此刻,我们已有了这邮件账户利用的用户名和暗码,让我们抓取第一个电子邮件,看看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 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
事实证实,Linkedin注进了相当多的内容到你的电子邮件中往。根基的布局看起来像如许:
User specified CSS (if any)
/*BEGIN RAPPORTIVE*/
Injected Linkedin Intro CSS
/*END RAPPORTIVE*/
Injected Linkedin Intro HTML Content
Original Message
你可以在这里找到完全的电子邮件(一些链接和一些未被删掉落的东西)。此刻我们知道Linkedin对该email做了些甚么了吧,让我们再看看若何利用它来让我们的垂钓邮件看起来是合法的。
设置钓饵
就像设置一个棍骗性的网站一样,我们可以简单地复制Linkedin所供给的现有CSS和HTML布局,并按照我们的需要来利用它。起首我们想要做的是找到除往Intro现稀有据的编制。我们可以把现有Intro块的CSS设置为display:none;。很不幸的是, Linkedin明显也想到了这一点,因为CSS凡是是插进到head标签后面,他们相当细心地为display,height等设置了!important关头词,以进步指定样式法则的利用优先权。
但仍然不敷详实,假定我们看CSS,可以发现到其法则合用于#rapportive.iphone元素。假定我们细心不雅察,就会发现,其实我们想要隐躲的HTML有一个完全的规范#rapportive.rapportive.topbar.iphone。是以,我们可以简单地设置以下样式的隐躲:
#rapportive.rapportive.topbar.iphone {
display:none !important;
}
就是这么简单。
此刻,我们已删除现有的Intro数据,我们可以自由注进我们本身的数据了。要做到这一点,我们可以复制Linkedin供给的现有HTML。若要确保我们的数据不会被我们之前的CSS隐躲,我们可以简单地从root中删除topbar类,因为它不会影响样式。最后我们想要做的是断根Linkedin在本来信息上设置的边距,和把实际数据本身改成任何我们想要的数据。别的,我复制了一些CSS和HTML,点窜了主动生成的Id。这将确保我们的模板始终一致。
“垂钓”往啦
为达讲授目标,我已成立了一个根基的PoC模板。若要利用它,你只需拜候你要棍骗的那小我的Linkedin建设文件,填写所需的CSS信息。抱负环境下,将来可改进成主动擦除此信息并查抄确保Intro数据只在移动设备上显示等。此刻,它是根基可用的,让我们看看假定我对Linkedin本来显示的信息实施棍骗会是如何。(谅解一下,这不是IOS7————我没有见过IOS7系统会有这么多标题问题):
这就是当我打开Intro选项时所看到的具体信息(它们是可以自定义的,我让它们揭示了一下我确切节制了其内容):
明显,这是一个不具歹意的例子。当然,要添加歹意文件、要求敏感信息,也一样很简单。
最后的设法
当然Linkedin Intro概况上看起来很有效————只是利用它的话,风险太高了。作为一个社会工程师,我希看我的方针是利用Intro。Linkedin Intro的利用,为用户营建了一种子虚的安然感,这使得我和广大年夜社工人员的工作便捷良多。