神刀安全网

[译]Facebook是如何进行安全性渗透测试的

原文: how I hacked Facebook and found someones backdoor script

译者:杰微刊兼职翻译张迪

前言

对于一个pentester(渗透)来说,我对服务器端漏洞的喜欢超过对客户端漏洞的喜欢。为什么呢?原因是,服务器漏洞是掌控服务器和直接获取系统SHELL(通常指提供用户使用界面的软件)权限的一种很酷的方式。

当然,在一个完美的渗透测试过程中,服务器端的漏洞和客户端的漏洞都是必不可少的。有时候,为了更优雅地接管服务器,也需要攻击一些客户端漏洞。但说到寻找漏洞,我更倾向于在最开始就寻找服务器端的漏洞。

随着Facebook在全球范围内越来越受欢迎,我对Facebook安全性的测试就越来越感兴趣。很幸运,在2012年,Facebook发布了Bug Bounty Program(Bug赏金计划),这个活动激发了我的兴趣,决定去进行一次尝试。

从pentester的视角来看,我倾向于从侦察开始,并做一些研究。首先,我要确定公司在互联网上有多大的“领土”,然后……试图找到一个入口进去,例如:

1、我能通过谷歌黑客发现什么呢?

2、使用多少B级的IP地址?多少C级的IP地址?

3、域名查询服务?反向域名查询服务?

4、使用什么样的域名?内部域名是什么?然后继续列举子域。

5、它们的最先的技术和设备供应商是什么?

6、违反Github or Pastebin上的什么数据?

7、等等。

当然,Bug赏金对发射随机攻击是没有限制的。通过比较你在Bug赏金设定的可行行为范围内发现的东西,重叠的部分将会成为值得一试的部分。

在这里,我想解释一下一些大公司在渗透测试过程中常见的安全问题,请看下面的举例。

1、对于很多企业来说,“Network Boundary”(网络边界)是很难维护的一部分。随着公司规模的逐渐扩大,公司会有成千上万的路由器、服务器和计算机用于处理MIS(管理信息系统),那么想建立完善的保护机制是不可能的。只能使用一般规则来防御安全攻击,但一个成功的攻击只需要利用一个小小的弱点就可以了。这就是为什么幸运之神总是眷顾攻击者:对“border”的一个脆弱服务器进行攻击,是足以拿到进入内部网络的通票的!

2、缺乏“Networking Equipment”(网络设备)的保护意识。大多数的网络设备不提供精致的SHELL控制,并且只能配置在用户界面。通常情况下,这些设备的保护是建立在网络层。然而,用户可能不会注意到这些设备会被0-Day 或者1-Day的攻击连累。

3、人身安全:现在我们已经目睹了“Breached Database”(数据库泄露))的出现(在中国又叫做“Social Engineering Database”(社会工程数据库)),这些泄露的数据有时会使渗透难度非常低。只要连接到被破坏的数据库,找到一个带有VPN访问权限的用户凭证……然后大功告成了!你就可以进行渗透内部网络。当数据破坏的范围是很巨大的时候尤其如此,关键人物的密码可以在泄露的数据中被发现。如果发生这种情况,那么受害者公司的安全将毫无保证。

毫无疑问,在寻找Facebook的漏洞时,我沿用了我之前用过的渗透测试的思路。当我在做一些侦察和研究时,我不仅看了Facebook自己的域名,而且也尝试了反向域名查询服务。令我惊讶的是,我发现了一个有趣的域名:

[译]Facebook是如何进行安全性渗透测试的

TFBNW看上去是代表“TheFacebook Network”的意思。然后我通过公共数据发现了以下服务器:

[译]Facebook是如何进行安全性渗透测试的

哇。当我访问vpn.tfbnw.net时,会出现Juniper的SSL VPN登录界面。但它的版本似乎是很新的,没有漏洞可以直接被利用……然而,它开始了以下的故事。

TFBNW看起来像是Facebook一个内部的域名。让我们试着列举vpn.tfbnw.net C类IP,会发现一些有趣的服务器,例如:

1、邮件服务器的Outlook Web App

2、F5 BigIP SSL VPN

3、Cisco ASASSL VPN

4、Oracle电子商务

5、MobileIronMDM

从这些服务器的信息来看,我认为这些C类IP对于Facebook来说是比较重要的。现在,整个故事正式从这里开始。

漏洞的发现

我发现这些C类IP之间有一个专用的服务器。

[译]Facebook是如何进行安全性渗透测试的

↑ files.fb.com的登录界面。

根据LOGO and Footer来判断,这似乎是Accellion的安全文件传输(简称FTA)。

FTA是一款可以使安全文件传输、在线文件共享和同步成为可能的产品。此外,FTA还可以整合包括广告、LDAP和Kerberos的单点登录机制。企业版还支持SSL VPN服务。

看到这个,我做的第一件事就是在互联网上寻找已公布的漏洞利用。最近的一次是HD穆尔发现并在Rapid7报告上公之于众的。

Accellion File Transfer Appliance Vulnerabilities (CVE-2015-2856, CVE-2015-2857)

这个漏洞是否可以利用要通过“/tws/getStatus”泄露的版本信息来判断。当时我发现files.fb.com的版本已经从有缺陷v0.18更新到了v0.20。但从报告中提到的源代码碎片中,我觉得,如果我继续查看,使用这样的代码风格,FTA中应该还会有安全问题。因此,我开始寻找FTA产品的0-day漏洞!

其实,从黑盒测试,我没有发现任何可能存在的漏洞,我不得不尝试白盒测试。从一些资源中收集了FTA以前版本的源代码之后,我终于可以继续我的研究!

FTA产品

1、网页端接口主要由 Perl 以及 PHP 构成

2、PHP 原始码皆经过 IonCube 加密

3、在背后跑了许多 Perl 的 Daemon

首先,我尝试着解密 IonCude 的加密。为了防止自己的产品被黑客修订,许多网络设备会将产品的原始码进行加密。不过好在 FTA 上的 IonCude 版本没到最新,可以使用已有的工具解密。不过我还要修复一下细节部份,否则这些细节会让我很凌乱……

经过简单的原始码审查后,我发现, Rapid7好找的弱点应该都被别人找到了。

而需要触发的漏洞又不怎么好发现,只好认真点往深层一点的地方挖掘!

最后,我终于发现了 Rapid7的漏洞,其中包括:

1、跨站点脚本x 3

2、预授权的SQL注入导致远程代码执行

3、已知密钥导致远程代码执行

4、本地权限提升x 2

除了要汇报给Facebook的安全团队的漏洞,其他的漏洞被制作成报告提交给了Accellion的支持团队,以供他们参考。供应商补丁之后,我也把这些送到CERT / CC,他们会为这些漏洞分配4 cf。

1、CVE-2016-2350

2、CVE-2016-2351

3、CVE-2016-2352

4、CVE-2016-2353

更多的细节将会在有充分的披露政策后公布!

[译]Facebook是如何进行安全性渗透测试的

↑利用预授权的SQL注入Write Webshell。

成功控制服务器之后,首先要检查的就是现有的服务器环境是不是对你有利。尽量在服务器上停留的时间长一点,你要熟悉环境、限制、日志,等等,并且努力不被发现。

以下列举了服务器上的一些限制:

1、防火墙出站连接无法连接,包括TCP、UDP、端口53、80和443;

2、远程日志服务器;

3、auditd日志启用。

虽然出站连接无法使用,但是ICMP Tunnel看起来是可以工作的。然而,这只是一个Bug Bounty Program,我们可以通过网站管理权限轻松地控制服务器。

有什么奇怪的吗?

当为向Facebook报告而收集漏洞细节和证据时,我在网络日志上发现一些奇怪的事情。

首先,我在“/var/opt/apache/php_error_log”上发现一些奇怪的PHP错误信息。这些错误信息似乎是由在线修改代码引起的?

[译]Facebook是如何进行安全性渗透测试的

↑ PHP错误日志

我跟踪了PHP错误信息中的路径,最终发现是以前的“游客”留下的可疑的WebShell文件。

[译]Facebook是如何进行安全性渗透测试的

↑Facebook服务器上的网站管理权限

该文件的内容如下:

sshpass

[译]Facebook是如何进行安全性渗透测试的

bN3d10Aw.php

[译]Facebook是如何进行安全性渗透测试的

uploader.php

[译]Facebook是如何进行安全性渗透测试的

d.php

[译]Facebook是如何进行安全性渗透测试的

sclient_user_class_standard.inc

[译]Facebook是如何进行安全性渗透测试的

最初的几个例子是典型的PHPone-line backdoor(一句话后门木马)。有一个例外的是: “sclient_user_class_standard.inc”。

在include_once中“sclient_user_class_standard.inc.orig”是原来的PHP应用程序的密码验证。黑客在log GET、POST,和COOKIE值之间创建了一个Proxy(代理证书),与此同时,一些重要的工作也正在进行中。

简单总结一下,黑客在凭证页面创建了一个代理证书,去记录Facebook员工的凭证。这些被记录的登录密码就存储在web目录上,以便黑客每隔一段时间使用WGET一次。

[译]Facebook是如何进行安全性渗透测试的

↑登录密码

从这些信息中我们可以看到,这里除了有登录凭据还有来自FTA的信件请求文件内容,而这些登录凭据会定期轮换(这个后面会提到,那个没有什么价值)。

我当时就发现了这些,大约有300个登录凭据的日期在2月1日至7日范围内,从2月1日起,大多是 “@fb.com ” 和 “@Facebook.com ”。看到这个,我想这是一个相当严重的安全事件。在FTA,用户有两种登录的主要方式。

1、普通用户注册:他们的password hash会被储存到数据库,再用SHA256+SALT散列加密;

2、Facebook的所有员工(@fb.com)都使用LDAP,并且已被AD Server认证。

我相信这些记录凭证是真实的密。我猜想,他们可以访问一些服务,如OWA邮件,VPN高级渗透……

此外,这个黑客可能有点粗心。

1、后门的参数是通过GET的方式通过传递的,其足迹可以很容易地从Web日志上被识别出来;

2、当黑客发出指令,他没有考虑到STDERR,在Web日志上留下了许多错误指令信消息,这简直是直播了黑客的操作过程。

从access.log上来看,黑客每隔几天就会清除一次他登录的所有凭据。

[译]Facebook是如何进行安全性渗透测试的

包装文件

[译]Facebook是如何进行安全性渗透测试的

列举内部网络架构

[译]Facebook是如何进行安全性渗透测试的

使用ShellScript扫描内部网络,但忘了重新定向STDERR。

[译]Facebook是如何进行安全性渗透测试的

尝试连接内部LDAP服务器

[译]Facebook是如何进行安全性渗透测试的

试图访问内部服务器

(看起来像OWA邮件,可以被直接访问……)

[译]Facebook是如何进行安全性渗透测试的

试图盗取SSL私钥

[译]Facebook是如何进行安全性渗透测试的

检查浏览器后,files.fb.com的SSL证书是*.fb.com……

[译]Facebook是如何进行安全性渗透测试的

后记

收集到了充分的证据之后,他们立即向Facebook的安全团队做了汇报。此外,漏洞细节的伴随日志、截图和时间表也发送了。

同时,从服务器上的日志来看,有两个时期系统明显是被黑客操作的,一个时间段是在七月初,另一个时间段是在九月中旬。

7月份那一次看起来像是一次服务器“dorking”,9月份那一次看起来更恶意。除了服务器“dorking”了,键盘记录也被实现了。对于这两个黑客是什么身份?他们是同一个人吗?我和你猜想的一样。

七月事件发生在cve-2015-2857漏洞公告之前。无论它是1-day开发入侵,还是未知的0-day入侵,那就是额外的问题了。

到这里故事就结束了,一般来说,这是一个相当有趣的经历。

很感谢这次事件,它启发我写一些关于渗透文章。

最后,我要感谢BugBounty和宽容的Facebook安全团队,因为有他们我才可以完全地写下这一事件。

时间表

1、2016/02/05 20:05 向Facebook安全团队提供漏洞细节表

2、2016/02/05 20:08 收到自动回复

3、2016/02/06 05:21 提供弱点报告给 Accellion 技术窗口。

4、2016/02/06 07:42收到 Thomas 的回复,调查正在进行中。

5、2016/02/13 07:43 收到 Reginaldo 的回复,告知我Bug Bounty的奖金是$10000 USD。

6、2016/02/13 询问我在撰写这篇博客的时候是否有任何要注意的地方?

7、2016/02/13 询问此漏洞被认为是 RCE 还是 SQL Injection。

8、2016/02/18 收到 Reginaldo 的回复,告知正在取证调查中,请不要再调查结束之前公布博客。

9、2016/02/24 收到 Hai 的回复,告知奖金将会于三月发放。

10、2016/04/20 收到 Reginaldo 的回复,告知调查已完成。

————好久不见的分隔线————

杰微刊旨在分享优质的内容。

我们水平有限,但理想高远。

也同样期待有理想的您对这个世界的贡献。

欢迎任何目的的联系。

欢迎关注我们

[译]Facebook是如何进行安全性渗透测试的

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » [译]Facebook是如何进行安全性渗透测试的

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址