freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

pocsuite3 101之体育老师已上线
2021-12-20 08:52:48
所属地 广东省

pocsuite3 101之体育老师已上线

第一次使用,看了一下官网的wiki,着实没整明白。使用上倒是和nmap -h一样。但要生成自己的poc,分享给404的pocsuite3呢?只好从头出发来看看,它到底咋了,如何写poc。

因此本文的出发点是,我发现了一个CMS的漏洞利用,需要自己编写一个poc并将整个验证的过程整明白。

慢,才叫真正的快。凡是本文给出的参考链接,您都需要用心阅读并尽量去理解它说的意思,您可以花一个星期,一个月的时间,每天看一点。而不是把它一直记在脑子里。没意义,您背得下一时,背不了一世,不要怕答不上来。重在瞬时的理解。

对于应付面试,杀招是做个脑图,这需要您在面试前准备半个月将几大块常见场景的知识点罗列一下,每个关键点名字都给它点到为止(对于细节控的,您还需要罗列具体函数,命令,甚至参数:比如lsof,ps aux查文件内容查进程等)

本文的价值性在于把可以工程化的poc给工程化(听君一席话如同一席话)。用余大的话就是,能用工具咱就别手动。

发生了什么?

  • 查看第一个POC

图片.png

import re

from pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, VUL_TYPE

class DemoPOC(POCBase):
  • python类 DemoPOC函数? POCBase?

先解决前置知识

  • import 导入 re 模块

关于python模块前置知识:https://www.runoob.com/python3/python3-module.html
python官网模块前置知识:https://docs.python.org/3/tutorial/modules.html 优先读官网的

纳尼,导入re 模块作甚?后面说。现在我也不知道去哪里,要干嘛,去做什么。

那么问题来了,我怎么知道我要用哪个函数,它在哪个模块。我用什么函数,什么模块?这是一个玄学问题。但值得注意的是,同名自定义函数:比如 ohmyga(),它在 abc模块有,在def模块里也存在。

我们要观察的是,这个函数到底在哪个模块,如何定义,都写了一些什么代码?至于看不看得懂,可以请体育老师来帮忙练练,但事情本身是这个事儿。走。观察一下。

完成前置知识以后,之后了模块是自定义的一些函数来方便使用。那么以下语法糖,说的是
from fibo import fib, fib2 我要导入fib与fib2函数使用,它们来自于fibo文件(模块)

官网的体育老师帮我们解决了这个认知。它没有一把梭的导入,而是使用到什么函数就指定导入了什么函数。
来自于包的概念,因为使用了语法点号。路由为:pocsuite3.api
图片.png

看看 A.B 的包路由在哪里。
图片.png

  • 里面有啥?

图片.png

关于__pycache__前置知识:python解释器字节码是运行后自动生成的 https://www.cnblogs.com/sowhat1412/p/12734227.html

而__init__.py 它是与包路由有关的文件,pocsuite3.api 路由到这个目录下就需要它的存在,将这里的目录看成是包,而不是仅仅作为目录。此外,它还有一些初始化的设置。我们打开发现,很多函数都导入了。
图片.png

再往下设置了一个 __all__变量,值的字符串都与导入的函数名有关联。这个列表和前面那个指定导入哪些函数是一样的意思。
如果模块更新或者发生了变更,就需要更新这里的值来引入新的函数来使用。
有了这个列表的定义就可以不需要 from pocsuite3.api import * 一把梭的导入,像个石头人一样,见人就R,很鲁莽。
图片.png

有清单,一目了然,优雅。
图片.png

  • 哎呀,稀里哗啦了一大堆没用的冷知识(电脑嗡嗡响)以后,终于来到了这里。它咋了?

图片.png

  • 语法糖,定义类,class

让我们有请体育老师:https://docs.python.org/3/tutorial/classes.html#a-first-look-at-classes
不要拿我写的东西来问我啊,我又退给了体育老师。不答题,不背,不记忆。我为什么这样?只有这样,才能保持愉悦和心理负担轻装上阵,才能保持终身学习,没有一切心理负担。

上班不是上班,而是体验生活;工作不叫工作,而是知识服务。我们服务的是知识,这个认知很重要,而不是我偷偷的将过期的牛奶和果汁冲进星巴克的杯中,再卖给客人。也不是挖一个洞给他。

体育老师指出上图中的类定义为继承类定义:
等等,why?这涉及到路由一个函数时使用的方便,当一个函数在类定义中不存在时,它还会去基类中寻找它。都没有时就报错咯。

class DemoPOC(POCBase):
......

图片.png

  • 基类POCBase在哪?

我们找到了指向它的路由,在这里。
图片.png

跟着路由找到了它的基类,我们还发现了23行存在一个定义__init__???
请出体育老师:https://www.cnblogs.com/kaituorensheng/p/5693677.html 哦,实例化时会调用它。
图片.png

  • 再往下走,来到poc的验证函数定义的地方def _verify(): 注意函数的下划线,它又是什么暗示?意有所指还是想多了?

体育老师请出场:https://www.cnblogs.com/lijunjiang2015/p/7802410.html 下划线指访问控制的。私有

图片.png

是这里的私有属性或者方法吗?只要不是其他意有所指,管它是公的还是母的。

图片.png

转了一圈,大致的都看明白了,下课。

这个poc验证了什么?它准确吗?

我们需要先对漏洞有所了解,才能判断它准不准。

在这之前,有请体育老师:https://blog.csdn.net/nex1less/article/details/102783999

整个poc的核心在这里。这个poc不是完整的,因为是点到为止。需要我们进行修改再验证。基于体育老师的讲解,我们还需要将filename,修改成 file:///etc/passwd 来验证它到底存不存在,还是误报。(比如验证文件系统中的任意文件读取)读一个web.xml多少有点心慌慌,还有个文件系统读取范围呢?看看web目录之外的可否读取。

但它是poc,因此../ 也是 payload 中的目录穿越,您还可以再 ../../ 试试别的。毕竟这个洞不是自己发现的,基于测试来确认。
图片.png

  • 我们将注意力放在第36行。

requests.post()函数出现。再回到那个玄学问题上面。如果换成了其他函数出现时,我如何知道我要导入什么模块,我要使用什么函数?
不仅仅是这个函数,因为这个函数本身给出了绝对路径的路由。

如果您诞生这样的心理问题,是因为您不够“油”。。让我们想象一下生活场景:我怎么知道我要去哪里吃早餐,我要吃什么? 是一样的心理问题或者说生活经验。

解决掉这个心理问题的良策不是解决问题的本身,因为您无法给任何人解答他应该去哪里吃早餐并吃什么。但是,您可以分享自己的故事以自己的案例来给别人一些参考性的建议。他观察到你的行为,方法以后就会发现,哦,原来问题不应该如此问。我应该先要到一个地图,这样一来我就已经提前知道了有哪些店,店里有哪些早餐,接着我就知道了应该导入哪个模块并使用哪个函数了。

  • 如果我们什么都不知道

这需要遍历每一个模块去看看所有的函数,如同逛街一样,这样才能知道或者选择,啊,我要买这个东西。

import re 首先我们看看导入的这个模块,它直接在官网体育老师那里可以找到解释。
它用于使用正则,并给出了源码地址:https://github.com/python/cpython/blob/3.10/Lib/re.py

图片.png

  • 这里需要注意的是官方提供的标准库和第三方的包索引

https://docs.python.org/3/library/index.html

import re 直接在标准库中被找到,因此它一定是标准库的优先级最高,而不是出现在包索引中的同名包,如果官方够谨慎的话,应该禁止第三方包的同名出现。毕竟,我叫刘德华,你也叫刘德华,人家会误以为全是明星的。
图片.png

  • 遗憾的是我们无法从函数本身反过来找到它在哪个模块里面
    想象一下也正常,您可以从明星中找到刘德华,但无法从刘德华反过来找到他就是明星。
    因此,我们要么遍历被导入的模块中的函数。要么走捷径,因为是家喻户晓的http服务,我们可以搜到别人的技术帖子。看看他们在使用requests.post时,导入了什么模块。

这是标准库的搜索结果,但是它的标准库叫做urllib,这个细微的差距导致它们是两个完全不同的东西。为什么是requests而非urllib?因为requests包更易用:https://blog.csdn.net/qq_40023098/article/details/88753495

图片.png

  • 第三方库

https://pypi.org/search/?q=import+requests&o=
我们定位到,在第三方库中,存在requests包。
图片.png

并取证到一致的语法:
图片.png

如果您从源码中一直路由下去也会找到:
图片.png

您发现了没有。如果我们能找到模块就能拿到“菜谱”,点菜时就有很明确的意图。
虽然无法解决,我怎么知道我要使用什么函数以及包含什么模块与第三方的包。但我们解决掉了,自己遍历每一个包并查看里面的API,从而得到一个威胁情报或者安全开发的第一手研究的对象。

最起码,您开始意识到了。如果长久沉淀于此,工作量在这里。

  • 查看 requests 第三方包所提供的API

https://pypi.org/project/requests/
https://docs.python-requests.org/en/latest/user/quickstart/

API的示例与说明不仅解决了如何“开发”,还解决掉了什么叫威胁 API。试想一下,将所有的第三方已经被证实过的威胁包或者查阅包中的API自己发现的威胁调用统计起来,就从第三方包函数调用的角度,拿到与取证了一份API安全的关联词,清单,规则之类的东东。

to C:是给甲方交付漏洞;to B:是给工程化软件交付“新鲜血液”(poc)让它继续“自动”下去

不管是to C还是to B都需要依赖web安全,渗透等安全知识。

既然找到了体育老师在哪里,就能在未来遇到函数时直接搜。
比如这里的 r.text 获取响应的内容:
图片.png

图片.png

  • 关于正则语法和re标准库的体育老师

https://docs.python.org/3/howto/regex.html#regex-howto
https://docs.python.org/3/library/re.html

第39行: 在响应包中寻找标签对里所有的内容并赋值给m
图片.png

图片.png

第41行:m.group()[:limitSize]
可能是我变“油”了,[:limitSize]不是语法本身,就是其他语法拼凑过来的组合拳,比如数组?
图片.png

https://www.cnblogs.com/erichuo/p/7909180.html
匹配所有,并给result来提取文件信息(fileinfo)与内容(content),[:limitSize]数组空间。
图片.png

剩下的就不说了。再看看最后一个函数调用:
图片.png

跟着路由找下去:
图片.png

我们找到了这个函数的定义,大致意思是将DemoPOC的返回值进行一些后续处理,因为poc验证之后需要有一些后续结果之类的其他互动或者其他命令的交互。
图片.png

照猫画虎

要从头自己写是写不好的,但可以模仿和填充。每一个poc模块都看看,寻找可以照猫画虎的直接模仿与篡改。
图片.png

如果情况比较复杂,您可能需要考虑自己使用原生的第三方包并自己添加导入模块与API来重构它。
比如,您需要提交form表单先登录再发送payload,如果没有实例的话就凉凉,只能从第三方包中寻找API的解释,自己慢慢调试和观察结果是不是按照预期来执行。

比如我登录之后获取的cookie是不是在发送payload时想要包含进去发送的值,您总得调试并确认。
https://docs.python-requests.org/en/latest/ 第三方包 API手册。
图片.png

比如登录表单,可能需要用到这个:
图片.png

感谢师傅们很有耐心的阅读到了这里。

感谢404团队的开源精神将安全土壤变得有温度。

感谢这个我热爱的世界。

# web安全 # Pocsuite3
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者