写在前面的话

在前几天,我有幸参加了ToorConCTF(https://twitter.com/toorconctf),而在参加此次盛会的过程中我第一次在Python中发现了序列化漏洞。在我们的比赛过程中,有两个挑战中涉及到了能够接受序列化对象的Python库,而我们通过研究发现,这些Python库中存在的安全漏洞将有可能导致远程代码执行(RCE)。

由于我发现网上关于这方面的参考资料非常散乱,查找起来也非常的困难,因此我打算在这篇文章中与大家分享我的发现、漏洞利用代码和相应的解决方案。在这篇文章中,我将会给大家介绍如何利用PyYAML(一个Python YAML库)和Python Pickle库中的反序列化漏洞。

背景内容

在开始本文的主要内容之前,有一些非常重要的基础知识是大家应该要提前知晓的。如果你不是很了解反序列化漏洞的话,下面这段解释应该可以让你对该漏洞有一些基本的认识了。来自Fox Glove Security公司的@breenmachine是这样解释反序列化漏洞的:

“反序列化漏洞单指一种漏洞类型,绝大多数的编程语言都给用户提供了某种内置方法来将应用程序数据输出到本地磁盘或通过网络进行传输(流数据)。将应用程序数据转换成其他格式以符合传输条件的过程我们称之为序列化,而将序列化数据转变回可读数据的过程我们称之为反序列化。当开发人员所编写的代码能够接受用户提供的序列化数据并在程序中对数据进行反序列化处理时,漏洞便有可能会产生。根据不同编程语言的特性,这种漏洞将有可能导致各种各样的严重后果,但其中最有意思的就是本文将要讨论的远程代码执行问题了。”

PyYAML反序列化漏洞+远程代码执行

在我们的第一个挑战中,我们遇到了一个Web页面,这个页面中包含一个YAML文档上传表格。在Google上搜索了一些关于YAML文档的内容之后,我制作了一个YAML文件(下文会给出),然后将其通过Web页面的表单进行了上传,并对表单的上传功能进行了分析和测试。

HTTP请求

正如上面这段代码所示,文档已被我成功上传,但提示信息只告诉了我们上传的文件是否为一个有效的YAML文档。这就让我有些无所适从了...但是在对响应信息进行了进一步的分析之后,我注意到了后台服务器正在运行的是gunicorn/19.7.1。

在网上快速搜索了一些关于gunicorn的内容之后,我发现它是一个Python Web服务器,而这也就意味着负责处理YAML文档的解析器应该是一个Python库。因此,我又上网搜索了一些关于Python YAML漏洞的内容,并且还发现了一些介绍PyYAML反序列化漏洞的技术文章。在对这些文章进行了归纳总结之后,我得到了如下所示的专门针对PyYAML反序列化漏洞的漏洞利用代码:

接下来就要进入漏洞利用阶段了,但是我们目前还是跟盲人摸象一样得一步一步慢慢摸索。我们首先利用BurpSuite尝试向文档内容中注入Payload,然后再将该文档上传。

HTTP请求

正如上面这段代码所示,Payload能够正常工作,这也就意味着我们能够在目标服务器上实现远程代码执行了!接下来,我们要做的就是读取flag.txt了...

但是在研究了一下之后,我迅速发现了上述方法中存在的一个限制因素:即它只能运行一种命令,例如ls和whoami等等。这也就意味着,我们之前的这种方法是无法读取到flag的。接下来我还发现,os.system(Python调用)同样能够实现远程代码执行,而且它还可以运行多个命令。但是在进行了尝试之后,我发现这种方法根本就行不通,因为服务器端返回的结果是“0”,而且我也无法查看到我的命令输出结果。因此我们又不得不想办法寻找更好的解决方案了,我的同事@n0j发现,如果命令成功运行的话,os.system["command_here"]将只会返回退出代码"0",而由于Python处理子进程执行的特殊方式,我们也无法查看到命令输出结果。因此,我尝试注入了如下所示的命令来读取flag:

HTTP请求

在经过了大量测试之后,我们终于拿到了这一挑战的flag,然后得到了250分。

远程Apache服务器日志

Python Pickle反序列化漏洞

在下一个CTF挑战中,我们拿到了一台连接至ganon.39586ebba722e94b.ctf.land:8000的主机。在与该主机进行了首次连接之后,我们没有得到什么有用的输出,所以我决定用随机字符和HTTP请求来对该主机的开放端口进行模糊测试,看看能不能得到一些有价值的东西。我进行了大量尝试之后,一个单引号字符触发了如下所示的错误信息:

其中最引人注意的错误信息就是(S"Unpickler instance has no attribute 'persistent_load'",于是我马上用Google搜索关于该错误信息的内容,原来这段错误提示跟一个名叫“Pickle”的Python序列化库有关。

接下来的思路就很清晰了,这个漏洞跟其他的Python反序列化漏洞非常相似,我们应该可以使用类似的方法来拿到这一次挑战的flag。接下来,我用Google搜索了关于“Python Pickle反序列化漏洞利用”的内容,然后发现了如下所示的漏洞利用代码。在对代码进行了简单修改之后,我便得到了一份能够正常工作的漏洞利用代码。它可以向目标服务器发送Pickle序列化对象,而我就可以在该对象中注入任何我想要运行的控制命令了。

漏洞利用代码

漏洞利用PoC

让我惊讶的是,这份漏洞利用代码不仅能够正常工作,而且我还可以直接在Apache日志中查看到flag的内容!

远程Apache服务器日志

总结

以上就是本文章的全部内容了,我们给大家介绍了两个Python反序列化漏洞样本,而我们可以利用这种漏洞来在远程主机/应用程序中实现远程代码执行(RCE)。我个人对CTF比赛非常感兴趣,在比赛的过程中我不仅能找到很多乐趣,而且还可以学到很多东西,但是出于时间和其他方面的考虑,我不可能将所有的精力都放在CTF上,但我建议大家有机会的话多参加一些这样的夺旗比赛。

附录

我们的团队名叫“SavageSubmarine”,我们再次比赛中的最终排名为第七名。

本文由 安全客 翻译,作者:WisFree

python pickle反序列化漏洞_渗透测试 - 黑客技术 | 【技术分享】记CTF比赛中发现的Python反序列化漏洞_吾爱漏洞...相关推荐

  1. php定时执行代码漏洞_在CTF比赛中发现的PHP远程代码执行0day漏洞

    众所周知,CTF比赛都是人为构造漏洞环境,人为制造安全漏洞,供安全从爱好者研究,好磨练和增强自己的安全技能. 参加CTF比赛,通常你需要明白出题人的想法,按照出题人的意图来解开谜题. 但是,就像所有的 ...

  2. php网站后门漏洞检测 渗透测试木马解决

    很多想做渗透测试的朋友都想了解关于PHP后门漏洞的安全测试重点方法,以及该如何预防被中php后门,本节由我们的Sine安全高级渗透工程师进行全面的讲解,来让大家更好的理解和了解php代码的安全检测,让 ...

  3. MSF(Metasploit)渗透测试---黑客工具使用指南

    Metasploit 简介 Metasploit 框架 渗透测试者的困扰:在众多相同类型的工具,丌知道如何选择.认为需要掌插数百个工具软件,上千个命令参数,实在记丌住.新出现的漏洞 POC/EXP 有 ...

  4. kail利用msf工具对MS12-020漏洞进行渗透测试

    kail利用msf工具对MS12-020漏洞进行渗透测试 MS12-020全称Microsoft Windows远程桌面协议RDP远程代码执行漏洞 kail利用msf工具对MS12-020漏洞进行渗透 ...

  5. 针对HFS 2.3漏洞进行渗透测试提权(HFS:HttpFileServer)

    利用Metasploit对HFS 2.3渗透攻击提权 针对HFS 2.3漏洞进行渗透测试提权(HFS:HttpFileServer) msf6 > search hfs Matching Mod ...

  6. python3库黑客_想知道黑客为什么首先Python吗?看看这些渗透测试工具和库

    前言你知道现在为什么许多黑客都首先选择Python吗,因为快呀,具有许多强大的渗透测试工具和强大的库支持,开发又快又好,优点多多.如果你喜欢漏洞研究,喜欢渗透测试,逆向工程等等,强烈建议学学Pytho ...

  7. termux使用教程python手机_渗透测试|利用手机攻击电脑(Termux终端初体验)

    至少我们曾经在一起过. 来自:一言 介绍 Termux是一个Android下一个高级的终端模拟器,开源且不需要root,支持apt管理软件包,十分方便安装软件包,完美支持Python,PHP,Ruby ...

  8. 如何查找APP漏洞并渗透测试 解决网站被黑客攻击

    APP渗透测试目前包含了Android端+IOS端的漏洞检测与安全测试,前段时间某金融客户的APP被黑客恶意攻击,导致APP里的用户数据包括平台里的账号,密码,手机号,姓名都被信息泄露,通过老客户的介 ...

  9. 渗透测试初学者_渗透测试许可证:面向初学者的道德黑客课程

    渗透测试初学者 A penetration test is an authorized cyberattack on a computer system, performed to evaluate ...

  10. linux shell rman删除归档_我们一起学一学渗透测试——黑客应该掌握的Linux基础

    点击上方「蓝字」关注我们 各位新老朋友们: 大家好,我是菜鸟小白.欢迎大家关注"菜鸟小白的学习分享"公众号,菜鸟小白作为一名软件测试工程师,会定期给大家分享一些测试基础知识.测试环 ...

最新文章

  1. 一篇文章告诉你标准化和归一化的区别?
  2. switch能使用的数据类型有6种
  3. 视频监控为校园安全插上“隐形的翅膀”
  4. python 调用linux命令-Python Linux系统管理之Python中执行外部命令
  5. STEAM教育风口正劲,如何培养STEAM思维?
  6. 详解Java多线程编程中LockSupport类的线程阻塞用法
  7. 如何评价 IBM 收购 Blue Box 集团
  8. Python二叉树的三种深度优先遍历
  9. 策略模式思想及示例代码(Strategy)
  10. SLAM会议笔记(一)LOAM
  11. Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 prometheus 监控
  12. 中止执行后超过2年_10年后超过美国!汪涛:中国GDP将达到28万亿美元
  13. 【UML】UML基础教程(总三篇文章)
  14. 基于微信小程序的小区防疫监管小程序-计算机毕业设计源码+LW文档
  15. 《编程珠玑》---笔记。浏览此文,一窥此书。
  16. 【linux】du命令
  17. 计算机怎么配置IP地址,如何设置电脑IP地址?
  18. 吴伯凡-认知方法论-我的休息
  19. cydia未能找到使用主机名的服务器,cydia未找到主机服务器
  20. vivo x60pro刷机鸿蒙,vivo X60 Pro:两个好消息,两个坏消息

热门文章

  1. karto探秘之open_karto 第一章 --- 数据结构与类的初始化
  2. CVPR 新规严禁审稿期间公开宣传论文,可发 arXiv,LeCun:疯了吧!
  3. tensorflow实现残差网络(mnist数据集)
  4. slz-servlet的引入
  5. react 属性与状态 学习笔记
  6. WPF学习之页间导航与页间数据传递
  7. 【LeetCode】【数组】题号:*303,区域和检索
  8. 从零基础入门Tensorflow2.0 ----九、44.1 keras 保存模型、参数
  9. 《剑指offer》面试题46、47、49
  10. Python地理数据处理相关模块的安装方法