From 4763bff91b54e876b7c2529e8f3ce9d64debef66 Mon Sep 17 00:00:00 2001 From: Tian Qiao Date: Thu, 26 Aug 2021 11:48:07 +0800 Subject: [PATCH 1/5] fix(): check_requires() can not handle dependent version correctly --- pocsuite3/lib/core/register.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/pocsuite3/lib/core/register.py b/pocsuite3/lib/core/register.py index eec8f1a3..860a8f83 100644 --- a/pocsuite3/lib/core/register.py +++ b/pocsuite3/lib/core/register.py @@ -1,7 +1,7 @@ +import re import importlib.machinery import importlib.util from importlib.abc import Loader - from pocsuite3.lib.core.common import ( multiple_replace, get_filename, get_md5, is_pocsuite3_poc, get_poc_requires, get_poc_name) @@ -43,22 +43,21 @@ def check_requires(data): requires = [i.strip().strip('"').strip("'") for i in requires.split(',')] if requires else [''] if requires[0]: poc_name = get_poc_name(data) - info_msg = 'PoC script "{0}" requires "{1}" to be installed'.format(poc_name, ','.join(requires)) + info_msg = 'PoC script "{0}" requires "{1}" to be installed'.format(poc_name, ', '.join(requires)) logger.info(info_msg) try: for r in requires: - if ":" in r: - rows = r.split(":") - if len(rows) == 2: - r, module = rows - else: - module = rows[-1] - r = ''.join(rows[:-1]) - __import__(module) - else: - __import__(r) + r = r.replace(' ', '') + install_name, import_name = (r.split(':') + [''])[0:2] + t = re.split('>|<|=', install_name) + if len(t) > 1: + install_name = t[0] + if not import_name: + import_name = install_name + m = __import__(import_name) + logger.info(f'{install_name}=={m.__version__} has been installed') except ImportError: - err_msg = 'try install with "python -m pip install {0}"'.format(r) + err_msg = f'{install_name} not found, try install with "python -m pip install {install_name}"' logger.error(err_msg) raise SystemExit @@ -70,7 +69,7 @@ def exec_module(self, module): try: exec(obj, module.__dict__) except Exception as err: - logger.error("Poc: '{}' exec arise error: {} ".format(filename,err)) + logger.error("Poc: '{}' exec arise error: {} ".format(filename, err)) def load_file_to_module(file_path, module_name=None): From 1b0fadc5a8ee86b7848aea4efc4eae0e9f31843b Mon Sep 17 00:00:00 2001 From: Tian Qiao Date: Thu, 26 Aug 2021 15:09:25 +0800 Subject: [PATCH 2/5] fix(): add exception handling --- pocsuite3/lib/core/option.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pocsuite3/lib/core/option.py b/pocsuite3/lib/core/option.py index e3b4ec29..b11b633e 100644 --- a/pocsuite3/lib/core/option.py +++ b/pocsuite3/lib/core/option.py @@ -697,6 +697,8 @@ def _init_target_from_poc_dork(): target_source = i break # fetch target from target source, add it to kb.targets + if not target_source: + continue conf.dork = poc_class.dork[target_source] plugin_name = f'target_from_{target_source}' importlib.import_module(f'pocsuite3.plugins.{plugin_name}') From e4f20023fe50d56b84b849dcd1cc2f0beace974a Mon Sep 17 00:00:00 2001 From: Tian Qiao Date: Thu, 26 Aug 2021 15:09:44 +0800 Subject: [PATCH 3/5] chore(): update docs --- README.md | 10 +-- docs/CODING.md | 191 +++++++++++++++++++++++++------------------------ docs/USAGE.md | 56 ++++++++------- 3 files changed, 135 insertions(+), 122 deletions(-) diff --git a/README.md b/README.md index af88f35b..6c9a7685 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ Usage of pocsuite for attacking targets without prior mutual consent is illegal. pocsuite is for security testing purposes only ## 法律免责声明 -未经事先双方同意,使用pocsuite攻击目标是非法的。 -pocsuite仅用于安全测试目的 +未经事先双方同意,使用 pocsuite 攻击目标是非法的。 +pocsuite 仅用于安全测试目的 ## Overview @@ -18,8 +18,8 @@ It comes with a powerful proof-of-concept engine, many powerful features for the ## Features * PoC scripts can running with `attack`,`verify`, `shell` mode in different way * Plugin ecosystem -* Dynamic loading PoC script from any where (local file, redis , database, Seebug ...) -* Load multi-target from any where (CIDR, local file, redis , database, Zoomeye, Shodan ...) +* Dynamic loading PoC script from any where (local file, redis, database, Seebug ...) +* Load multi-target from any where (CIDR, local file, redis, database, Zoomeye, Shodan ...) * Results can be easily exported * Dynamic patch and hook requests * Both command line tool and python package import to use @@ -74,7 +74,7 @@ $ pip3 install -r requirements.txt ``` -The latest version of this software is available from: http://pocsuite.org +The latest version of this software is available at: http://pocsuite.org ## Documentation diff --git a/docs/CODING.md b/docs/CODING.md index 8b398995..0fe67377 100644 --- a/docs/CODING.md +++ b/docs/CODING.md @@ -1,4 +1,4 @@ -pocsuite3 开发文档 及 PoC 编写规范及要求说明 +pocsuite3 开发文档及 PoC 编写规范及要求说明 --- * [概述](#overview) * [插件 编写规范](#write_plugin) @@ -27,13 +27,14 @@ pocsuite3 开发文档 及 PoC 编写规范及要求说明 ### 概述
- 本文档为 Pocsuite3 插件及 PoC 脚本编写规范及要求说明,包含了插件 PoC 脚本编写的步骤以及相关 API 的一些说明。一个优秀的 PoC 离不开反复的调试、测试,在阅读本文档前,请先阅读 [《Pocsuite 使用文档》](./USAGE.md)。或参考https://paper.seebug.org/904/ 查看pocsuite3的一些新特性。 + 本文档为 Pocsuite3 插件及 PoC 脚本编写规范及要求说明,包含了插件、PoC 脚本编写的步骤以及相关 API 的一些说明。一个优秀的 PoC 离不开反复的调试、测试,在阅读本文档前,请先阅读 [《Pocsuite 使用文档》](./USAGE.md)。或参考 https://paper.seebug.org/904/ 查看 pocsuite3 的一些新特性。 -### 插件 编写规范
-pocsuite3 共有三种类型的插件,定义在 `pocsuite3.lib.core.enums.PLUGIN_TYPE` 中. +### 插件编写规范
+pocsuite3 共有三种类型的插件,定义在 `pocsuite3.lib.core.enums.PLUGIN_TYPE` 中。 #### TARGETS 类型插件
-TARGETS 类型插件 用来自定义在系统初始化时候 加载检测目标的功能,例如从redis 或 数据库加载 targets +TARGETS 类型插件用来自定义在系统初始化时候加载检测目标的功能,例如从 redis 或数据库加载 targets + ```python from pocsuite3.api import PluginBase from pocsuite3.api import PLUGIN_TYPE @@ -44,7 +45,7 @@ class TargetPluginDemo(PluginBase): category = PLUGIN_TYPE.TARGETS def init(self): - targets = ['www.a.com', 'www.b.com'] # load from redis, database ... + targets = ['www.a.com', 'www.b.com'] # load from redis, database ... count = 0 for target in targets: if self.add_target(target): @@ -58,7 +59,8 @@ register_plugin(TargetPluginDemo) ``` #### POCS 类型插件
-POCS 类型插件 用来自定义在系统初始化时候 加载PoC 脚本的功能,例如从redis 或 数据库加载 PoC脚本代码 +POCS 类型插件用来自定义在系统初始化时候加载 PoC 脚本的功能,例如从 redis 或数据库加载 PoC 脚本代码 + ```python from pocsuite3.api import PluginBase from pocsuite3.api import PLUGIN_TYPE @@ -69,7 +71,7 @@ class TargetPluginDemo(PluginBase): category = PLUGIN_TYPE.POCS def init(self): - pocs = [POC_CODE_1, POC_CODE_2] # load PoC code from redis, database ... + pocs = [POC_CODE_1, POC_CODE_2] # load PoC code from redis, database ... count = 0 for poc in pocs: if poc and self.add_poc(poc): @@ -83,7 +85,8 @@ register_plugin(TargetPluginDemo) ``` #### RESULTS 类型插件
-RESULTS 类型插件 用来自定义检测结果的导出,例如导出 html 报表等 +RESULTS 类型插件用来自定义检测结果的导出,例如导出 html 报表等 + ```python from pocsuite3.api import PluginBase from pocsuite3.api import PLUGIN_TYPE @@ -112,20 +115,20 @@ register_plugin(HtmlReport) ``` -若需要`实时的`保存结果,需要在申明`handle`来处理,可参考https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/plugins/file_record.py的写法。 +若需要实时的保存结果,需要在申明 `handle` 来处理,可参考 https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/plugins/file_record.py 的写法。 ### PoC 编写规范
-#### PoC python脚本编写步骤
+#### PoC python 脚本编写步骤
-本小节介绍 PoC python脚本编写 +本小节介绍 PoC python 脚本编写 -pocsuite3 仅支持 Python3.x,如若编写 Python3 格式的 PoC,需要开发者具备一定的 Python3 基础 +pocsuite3 仅支持 Python 3.x,如若编写 Python3 格式的 PoC,需要开发者具备一定的 Python3 基础 -1. 首先新建一个`.py`文件,文件名应当符合 [《PoC 命名规范》](#namedstandard) +1. 首先新建一个 `.py` 文件,文件名应当符合 [《PoC 命名规范》](#namedstandard) -2. 编写 PoC 实现类`DemoPOC`,继承自`PoCBase`类. +2. 编写 PoC 实现类 `DemoPOC`,继承自 `PoCBase` 类. ```python from pocsuite3.api import Output, POCBase, register_poc, requests, logger @@ -137,26 +140,26 @@ from pocsuite3.lib.utils import random_str ... ``` -3. 填写 PoC 信息字段,**要求认真填写所有基本信息字段** +3. 填写 PoC 信息字段,**要求认真填写所有基本信息字段** ```python - vulID = '1571' # ssvid ID 如果是提交漏洞的同时提交 PoC,则写成 0 - version = '1' #默认为1 - author = 'seebug' # PoC作者的大名 - vulDate = '2014-10-16' #漏洞公开的时间,不知道就写今天 - createDate = '2014-10-16'# 编写 PoC 的日期 - updateDate = '2014-10-16'# PoC 更新的时间,默认和编写时间一样 - references = ['https://www.sektioneins.de/en/blog/14-10-15-drupal-sql-injection-vulnerability.html']# 漏洞地址来源,0day不用写 - name = 'Drupal 7.x /includes/database/database.inc SQL注入漏洞 PoC'# PoC 名称 - appPowerLink = 'https://www.drupal.org/'# 漏洞厂商主页地址 - appName = 'Drupal'# 漏洞应用名称 - appVersion = '7.x'# 漏洞影响版本 - vulType = 'SQL Injection'#漏洞类型,类型参考见 漏洞类型规范表 + vulID = '1571' # ssvid ID 如果是提交漏洞的同时提交 PoC,则写成 0 + version = '1' # 默认为1 + author = 'seebug' # PoC 作者的大名 + vulDate = '2014-10-16' # 漏洞公开的时间,不知道就写今天 + createDate = '2014-10-16' # 编写 PoC 的日期 + updateDate = '2014-10-16' # PoC 更新的时间,默认和编写时间一样 + references = ['https://www.sektioneins.de/en/blog/14-10-15-drupal-sql-injection-vulnerability.html'] # 漏洞地址来源,0day 不用写 + name = 'Drupal 7.x /includes/database/database.inc SQL注入漏洞 PoC' # PoC 名称 + appPowerLink = 'https://www.drupal.org/' # 漏洞厂商主页地址 + appName = 'Drupal' # 漏洞应用名称 + appVersion = '7.x' # 漏洞影响版本 + vulType = 'SQL Injection' # 漏洞类型,类型参考见漏洞类型规范表 desc = ''' Drupal 在处理 IN 语句时,展开数组时 key 带入 SQL 语句导致 SQL 注入, 可以添加管理员、造成信息泄露。 ''' # 漏洞简要描述 - samples = []# 测试样列,就是用 PoC 测试成功的网站 - install_requires = [] # PoC 第三方模块依赖,请尽量不要使用第三方模块,必要时请参考《PoC第三方模块依赖说明》填写 + samples = [] # 测试样列,就是用 PoC 测试成功的网站 + install_requires = [] # PoC 第三方模块依赖,请尽量不要使用第三方模块,必要时请参考《PoC第三方模块依赖说明》填写 pocDesc = ''' poc的用法描述 ''' ``` @@ -166,7 +169,7 @@ from pocsuite3.lib.utils import random_str def _verify(self): output = Output(self) # 验证代码 - if result: # result是返回结果 + if result: # result是返回结果 output.success(result) else: output.fail('target is not vulnerable') @@ -175,7 +178,7 @@ from pocsuite3.lib.utils import random_str 5. 编写攻击模式 -攻击模式可以对目标进行 getshell,查询管理员帐号密码等操作.定义它的方法与检测模式类似 +攻击模式可以对目标进行 getshell,查询管理员帐号密码等操作,定义它的方法与检测模式类似 ```python def _attack(self): output = Output(self) @@ -183,20 +186,20 @@ def _attack(self): # 攻击代码 ``` -和验证模式一样,攻击成功后需要把攻击得到结果赋值给 result 变量 +和验证模式一样,攻击成功后需要把攻击得到结果赋值给 result 变量 -**注意:如果该 PoC 没有攻击模式,可以在 \_attack()函数下加入一句 return self.\_verify() 这样你就无需再写 \_attack 函数了。** +**注意:如果该 PoC 没有攻击模式,可以在 \_attack() 函数下加入一句 return self.\_verify() 这样你就无需再写 \_attack 函数了。** 6. 编写shell模式 [**new**] -pocsuite3 在 shell 模式 会默认监听`6666`端口, 编写对应的攻击代码,让目标执行反向连接 运行pocsuite3 系统IP的 `6666`端口即可得到一个shell +pocsuite3 在 shell 模式会默认监听 `6666` 端口,编写对应的攻击代码,让目标执行反向连接运行 pocsuite3 系统 IP 的 `6666` 端口即可得到一个 shell ```python def _shell(self): cmd = REVERSE_PAYLOAD.BASH.format(get_listener_ip(), get_listener_port()) # 攻击代码 execute cmd ``` -shell模式下,只能运行单个PoC脚本,控制台会进入shell交互模式执行命令及输出 +shell 模式下,只能运行单个 PoC 脚本,控制台会进入 shell 交互模式执行命令及输出 7. 结果返回 @@ -216,7 +219,7 @@ shell模式下,只能运行单个PoC脚本,控制台会进入shell交互模 } ``` -output 为 Pocsuite 标准输出API,如果要输出调用成功信息则使用 `output.success(result)`,如果要输出调用失败则 `output.fail()`,系统自动捕获异常,不需要PoC里处理捕获,如果PoC里使用try...except 来捕获异常,可通过`output.error('Error Message')`来传递异常内容,建议直接使用模板中的parse_output通用结果处理函数对_verify和_attack结果进行处理。 +output 为 Pocsuite 标准输出 API,如果要输出调用成功信息则使用 `output.success(result)`,如果要输出调用失败则 `output.fail()`,系统自动捕获异常,不需要 PoC 里处理捕获,如果 PoC 里使用 try...except 来捕获异常,可通过`output.error('Error Message')` 来传递异常内容,建议直接使用模板中的 parse_output 通用结果处理函数对 _verify 和 _attack 结果进行处理。 ``` def _verify(self, verify=True): result = {} @@ -233,18 +236,19 @@ def parse_output(self, result): return output ``` -8. 注册PoC实现类 +8. 注册 PoC 实现类 -在类的外部调用register_poc()方法注册PoC类 +在类的外部调用 register_poc() 方法注册 PoC 类 ``` class DemoPOC(POCBase): - #POC内部代码 + # POC内部代码 -#注册 DemoPOC 类 +# 注册 DemoPOC 类 register_poc(DemoPOC) ``` -#### 可自定义参数的POC
-如果你需要编写一个可以交互参数的poc文件(例如有的poc脚本需要填写登录信息,或者任意命令执行时执行任意命令),那么可以在poc文件中声明一个`_options`方法。一个简单的例子如下 + +#### 可自定义参数的 PoC
+如果你需要编写一个可以交互参数的 PoC 文件(例如有的 PoC 脚本需要填写登录信息,或者任意命令执行时执行任意命令),那么可以在 PoC 文件中声明一个 `_options` 方法。一个简单的例子如下: ```python from collections import OrderedDict @@ -302,17 +306,17 @@ class DemoPOC(POCBase): register_poc(DemoPOC) ``` -它可以使你在`console`或者`cli`模式下调用。 +它可以使你在 `console` 或者 `cli` 模式下调用。 -- 在console模式下,pocsuite3模仿了msf的操作模式,你只需要使用`set`命令来设置相应的参数,然后`run`或者`check`来执行(`attack`和`shell`命令也可以)。 -- 在cli模式下,如上面例子所示,定义了`username`和`password`两个字段,你可以在参数后面加上`--username test --password test`来调用执行,需要注意的是,如果你的参数中包含了空格,用双引号`"`来包裹它。 +- 在 console 模式下,pocsuite3 模仿了 msf 的操作模式,你只需要使用 `set` 命令来设置相应的参数,然后 `run` 或者 `check` 来执行(`attack` 和 `shell` 命令也可以)。 +- 在 cli 模式下,如上面例子所示,定义了 `username` 和 `password` 两个字段,你可以在参数后面加上 `--username test --password test` 来调用执行,需要注意的是,如果你的参数中包含了空格,用双引号 `"` 来包裹它。 ##### 自定义字段 -像其他工具一样,如果你想使用自定义的字段,将它定义到`_options`方法中,然后返回一个数组。如果在poc文件中想调用自定义字段,需要提前引入 +像其他工具一样,如果你想使用自定义的字段,将它定义到 `_options` 方法中,然后返回一个数组。如果在 PoC 文件中想调用自定义字段,需要提前引入: ```python -from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,OptFloat,OptItems +from pocsuite3.api import OptString, OptDict, OptIP, OptPort, OptBool, OptInteger, OptFloat, OptItems ``` | 字段类型 | 字段描述 | 参数解释 | 相关例子 | @@ -326,19 +330,20 @@ from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,Opt | OptFloat | 接收浮点数类型参数 | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | | OptItems | 接收list类型参数 | default:传入一个默认值
selectd:默认选择
descript:字段描述,默认为空
require:是否必须,默认False | | -需要注意的是,`console`模式支持所有的参数类型,`cli`模式除了`OptDict`、`OptBool`、`OptItems`类型外都支持。 +需要注意的是,`console` 模式支持所有的参数类型,`cli` 模式除了`OptDict`、`OptBool`、`OptItems` 类型外都支持。 + #### PoC 编写注意事项
-1. 要求在编写PoC的时候,尽量的不要使用第三方模块,如果在无法避免的情况下,请认真填写install_requires 字段,填写格式参考《PoC第三方模块依赖说明》。 -2. 要求编写PoC的时候,尽量的使用Pocsuite 已经封装的API提供的方法,避免自己重复造轮子,对于一些通用方法可以加入到API,具体参考《通用API列表》。 -3. 如果PoC需要包含远程文件等,统一使用Pocsuite 远程调用文件,具体可以参考[《Pocsuite 远程调用文件列表》](#inclue_files),不要引入第三方文件,如果缺少对应文件,联系管理员添加。 -4. 要求每个PoC在编写的时候,尽可能的不要要求输入参数,这样定制化过高,不利于PoC的批量化调度执行,尽可能的PoC内部实现参数的构造,至少应该设置默认值,如某个PoC需要指定用户id,那么应该允许使用extar_param传入id,也应该没有传入该参数的时候自动设置默认值,不应该影响PoC的正常运行与验证。 -5. 要求每个PoC在输出结果的时候,尽可能的在不破坏的同时输出取证信息,如输出进程列表,具体参考[《PoC 结果返回规范》](#resultstandard)。 -6. 要求认真填写PoC信息字段,其中vulID请填写Seebug上的漏洞ID(不包含SSV-)。 -7. 为了防止误报产生以及避免被关键词被WAF等作为检测特征,要求验证结果判断的时候输出随机的字符串(可以调用API中的`random_str`方法),而不用采用固定字符串。 +1. 要求在编写 PoC 的时候,尽量的不要使用第三方模块,如果在无法避免的情况下,请认真填写 install_requires 字段,填写格式参考《PoC 第三方模块依赖说明》。 +2. 要求编写 PoC 的时候,尽量的使用 Pocsuite 已经封装的 API 提供的方法,避免自己重复造轮子,对于一些通用方法可以加入到 API,具体参考《通用 API 列表》。 +3. 如果 PoC 需要包含远程文件等,统一使用 Pocsuite 远程调用文件,具体可以参考[《Pocsuite 远程调用文件列表》](#inclue_files),不要引入第三方文件,如果缺少对应文件,联系管理员添加。 +4. 要求每个 PoC 在编写的时候,尽可能的不要要求输入参数,这样定制化过高,不利于 PoC 的批量化调度执行,尽可能的 PoC 内部实现参数的构造,至少应该设置默认值,如某个 PoC 需要指定用户id,那么应该允许使用 extar_param 传入 id,也应该没有传入该参数的时候自动设置默认值,不应该影响 PoC 的正常运行与验证。 +5. 要求每个 PoC 在输出结果的时候,尽可能的在不破坏的同时输出取证信息,如输出进程列表,具体参考[《PoC 结果返回规范》](#resultstandard)。 +6. 要求认真填写 PoC 信息字段,其中 vulID 请填写 Seebug 上的漏洞 ID(不包含 SSV-)。 +7. 为了防止误报产生以及避免被关键词被 WAF 等作为检测特征,要求验证结果判断的时候输出随机的字符串(可以调用 API 中的`random_str`方法),而不用采用固定字符串。 比如: ``` -检测 SQL 注入时, +检测 SQL 注入时: token = random_str() payload = 'select md5(%s)' % token ... @@ -346,7 +351,8 @@ from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,Opt if hashlib.new('md5', token).hexdigest() in content: result['VerifyInfo'] = {} result['VerifyInfo']['URL'] = self.url + payload -检测 XSS 漏洞时, + +检测 XSS 漏洞时: token = random_str() payload = 'alert("%s")' % token ... @@ -354,7 +360,8 @@ from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,Opt if hashlib.new('md5', token).hexdigest() in content: result['VerifyInfo'] = {} result['VerifyInfo']['URL'] = self.url + payload -检测 PHP 文件上传是否成功, + +检测 PHP 文件上传是否成功: token = random_str() payload = '' % token @@ -365,14 +372,14 @@ from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,Opt result['VerifyInfo']['URL'] = self.url+payload ``` -8. 任意文件如果需要知道网站路径才能读取文件的话,可以读取系统文件进行验证,要写 Windows 版和 Linux 版两个版本。 -9. 检测模式下,上传的文件一定要删掉。 +8. 任意文件如果需要知道网站路径才能读取文件的话,可以读取系统文件进行验证,要写 Windows 版和 Linux 版两个版本。 +9. 检测模式下,上传的文件一定要删掉。 10. 程序可以通过某些方法获取表前缀,just do it;若不行,保持默认表前缀。 -11. PoC 编写好后,务必进行测试,测试规则为:5个不受漏洞的网站,确保 PoC 攻击不成功;5个受漏洞影响的网站,确保 PoC 攻击成功 +11. PoC 编写好后,务必进行测试,测试规则为:5 个不受漏洞的网站,确保 PoC 攻击不成功;5个受漏洞影响的网站,确保 PoC 攻击成功 -#### Pocsuite 远程调用文件列表
-部分 PoC 需要采用包含远程文件的形式,要求基于 Pocsuite 的 PoC 统一调用统一文件(如需引用未在以下文件列表内文件,请联系s1@seebug.org或者直接提交 issue)。 -统一URL调用路径:`http://pocsuite.org/include_files/`,如 `http://pocsuite.org/include_files/xxe_verify.xml` +#### Pocsuite3 远程调用文件列表
+部分 PoC 需要采用包含远程文件的形式,要求基于 Pocsuite3 的 PoC 统一调用统一文件(如需引用未在以下文件列表内文件,请联系 s1@seebug.org 或者直接提交 issue)。 +统一 URL 调用路径:`http://pocsuite.org/include_files/`,如 `http://pocsuite.org/include_files/xxe_verify.xml` **文件列表** @@ -385,7 +392,7 @@ from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,Opt |xxe_verify.xml|XXE 验证文件| -#### 通用API列表
+#### 通用 API 列表
在编写 PoC 的时候,相关方法请尽量调用通用的已封装的 API **通用方法**
@@ -404,26 +411,26 @@ from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,Opt **参数调用**
-* self.headers 用来获取 http 请求头, 可以通过 --cookie, --referer, --user-agent, --headers 来修改和增加需要的部分 -* self.params 用来获取 --extra-params 赋值的变量, Pocsuite 会自动转化成字典格式, 未赋值时为空字典 -* self.url 用来获取 -u / --url 赋值的 URL, 如果之前赋值是 baidu.com 这样没有协议的格式时, Pocsuite 会自动转换成 http:// baidu.com +* self.headers 用来获取 http 请求头, 可以通过 --cookie, --referer, --user-agent, --headers 来修改和增加需要的部分 +* self.params 用来获取 --extra-params 赋值的变量,Pocsuite 会自动转化成字典格式,未赋值时为空字典 +* self.url 用来获取 -u / --url 赋值的 URL,如果之前赋值是 baidu.com 这样没有协议的格式时, Pocsuite 会自动转换成 http:// baidu.com -##### ShellCode生成支持 +##### ShellCode 生成支持 -在一些特殊的Linux和Windows环境下,想得到反弹shell条件比较困难。为此我们制作了用于在Windows/Linux x86 x64环境下的用于反弹的shellcode,并制作了接口支持,你在只需要拥有命令执行权限下便可以自动将shellcode写入到目标机器以及执行反弹shell命令。Demo Poc:https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/pocs/thinkphp_rce2.py +在一些特殊的 Linux 和 Windows 环境下,想得到反弹 shell 条件比较困难。为此我们制作了用于在 Windows/Linux x86 x64 环境下的用于反弹的 shellcode,并制作了接口支持,你在只需要拥有命令执行权限下便可以自动将 shellcode 写入到目标机器以及执行反弹 shell 命令。Demo Poc:https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/pocs/thinkphp_rce2.py ```python from pocsuite3.api import generate_shellcode_list -_list = generate_shellcode_list(listener_ip=get_listener_ip(),listener_port=get_listener_port(),os_target=OS.LINUX,os_target_arch=OS_ARCH.X86) +_list = generate_shellcode_list(listener_ip=get_listener_ip(), listener_port=get_listener_port(), os_target=OS.LINUX, os_target_arch=OS_ARCH.X86) ``` -将生成一长串执行指令,执行这些指令便可以反弹出一个shell。 +将生成一长串执行指令,执行这些指令便可以反弹出一个 shell。 -##### HTTP服务内置 +##### HTTP 服务内置 -对于一些需要第三方HTTP服务才能验证的漏洞,Pocsuite3也提供对应的API,支持在本地开启一个HTTP服务方便进行验证。 +对于一些需要第三方 HTTP 服务才能验证的漏洞,Pocsuite3 也提供对应的API,支持在本地开启一个 HTTP 服务方便进行验证。 -可查看测试用例:https://github.com/knownsec/pocsuite3/blob/master/tests/test_httpserver.py +可查看测试用例:https://github.com/knownsec/pocsuite3/blob/master/tests/test_httpserver.py #### PoC 代码示例
@@ -630,9 +637,6 @@ register_poc(DemoPOC) ``` - - - ### pocsuite3 集成调用
pocsuite3 api 提供了集成调用` pocsuite3` 的全部功能函数,可参见测试用例 `tests/test_import_pocsuite_execute.py`。典型的集成调用方法如下: @@ -659,28 +663,29 @@ def run_pocsuite(): ### PoC 规范说明
#### PoC 编号说明
-PoC 编号ID 与漏洞 ID 一致. +PoC 编号 ID 与漏洞 ID 一致. -示例, 漏洞库中的漏洞统一采用“SSV-xxx”编号的方式, 则 PoC 编号为 xxx +示例,漏洞库中的漏洞统一采用 “SSV-xxx” 编号的方式,则 PoC 编号为 xxx #### PoC 命名规范
-PoC 命名分成3个部分组成漏洞应用名_版本号_漏洞类型名称 然后把文件名称中的所有字母改成小写,所有的符号改成_. -文件名不能有特殊字符和大写字母 最后出来的文件名应该像这样 +PoC 命名分成3个部分组成漏洞应用名_版本号_漏洞类型名称 然后把文件名称中的所有字母改成小写,所有的符号改成 `_` +文件名不能有特殊字符和大写字母,最后出来的文件名应该像这样: ``` _1847_seeyon_3_1_login_info_disclosure.py ``` #### PoC 第三方模块依赖说明
-PoC 编写的时候要求尽量不要使用第三方模块,如果必要使用,请在 PoC 的基础信息部分,增加 install_requires 字段,按照以下格式填写依赖的模块名。 +PoC 编写的时候要求尽量不要使用第三方模块,如果必要使用,请在 PoC 的基础信息部分,增加 install_requires 字段,按照以下格式填写依赖的模块名: ``` -install_requires =[str_item_,str_item,…] # 整个字段的值为list,每个项为一个依赖模块 +install_requires =[str_item_, str_item, …] # 整个字段的值为 list,每个项为一个依赖模块 ``` -str_item 格式:模块名==版本号,模块名为pip install 安装时的模块名(请不要填写 import 的模块名) +str_item 格式:模块名==版本号,模块名为 pip install 安装时的模块名(请不要填写 import 的模块名) + +如果遇到安装时模块名与调用时的不一致情况,用 `:` 分割开,例如常见的加密算法库 `pycryptodome`,但是调用是以 `from Crypto.Cipher import AES`,此时就需要如下填写: -如果遇到安装时模块名与调用时的不一致情况,用`:`分割开,例如常见的加密算法库`pycryptodome`,但是调用是以`from Crypto.Cipher import AES`,此时就需要如下填写 ```python install_requires = ['pycryptodome:Crypto'] ``` @@ -688,24 +693,24 @@ install_requires = ['pycryptodome:Crypto'] #### PoC 结果返回规范
-result 为PoC返回的结果数据类型, result返回值要求返回完整的一项, 暂不符合result字段的情况, 放入extra字段中, 此步骤必须尽可能的保证运行者能够根据信息 复现/理解 漏洞, 若果步骤复杂, 在取证信息中说明. 例如: +result 为 PoC 返回的结果数据类型,result 返回值要求返回完整的一项,暂不符合 result 字段的情况,放入 extra 字段中,此步骤必须尽可能的保证运行者能够根据信息 复现/理解 漏洞,若果步骤复杂,在取证信息中说明。例如: ```python - #返回数据库管理员密码 + # 返回数据库管理员密码 result['DBInfo']['Password']='xxxxx' - #返回 Webshell 地址 + # 返回 Webshell 地址 result['ShellInfo']['URL'] = 'xxxxx' - #返回网站管理员用户名 + # 返回网站管理员用户名 result['AdminInfo']['Username']='xxxxx' ``` **extra 字段说明**
-extra字段为通用结果字段的补充字段,如果需要返回的内容中不属于通用结果字段,那么可以使用extra字段进行赋值。extra字段为dict格式,可自定义key进行赋值,如 +extra 字段为通用结果字段的补充字段,如果需要返回的内容中不属于通用结果字段,那么可以使用 extra 字段进行赋值。extra 字段为 dict 格式,可自定义 key 进行赋值,如: ``` result['extra' ]['field'] = 'aa' ``` -**特殊字段:** evidence,针对结果中返回取证信息,定义字段名只允许为evidence,并且只能存储于extar字段,即 +**特殊字段:** evidence,针对结果中返回取证信息,定义字段名只允许为 evidence,并且只能存储于 extar 字段,即: ``` result['extra' ]['evidence'] = 'aa' ``` diff --git a/docs/USAGE.md b/docs/USAGE.md index 4fa78b9f..d2464765 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -1,16 +1,16 @@ # Usage -- **pocsuite**: a cool and hackable commane line program +- **pocsuite**: a cool and hackable command line program ## pocsuite -Enter into `pocsuite` directory, execute `python cli.py`. It supports double mode: +It supports three modes: - ```verify``` - ```attack``` - ```shell``` -You can also use ```python cli.py -h``` for more details. +You can also use ```pocsuite -h``` for more details. ``` usage: pocsuite [options] @@ -67,16 +67,17 @@ Account: fofa user --fofa-token FOFA_TOKEN fofa token + --quake-token QUAKE_TOKEN + quake token --censys-uid CENSYS_UID Censys uid --censys-secret CENSYS_SECRET Censys secret Modules: - Modules(Seebug、Zoomeye、CEye、Fofa Listener) options + Modules(Seebug、Zoomeye、CEye、Fofa、Quake Listener) options --dork DORK Zoomeye dork used for search. - --dork-b64 Whether dork is in base64 format --dork-zoomeye DORK_ZOOMEYE Zoomeye dork used for search. --dork-shodan DORK_SHODAN @@ -85,6 +86,8 @@ Modules: Censys dork used for search. --dork-fofa DORK_FOFA Fofa dork used for search. + --dork-quake DORK_QUAKE + Quake 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 @@ -96,7 +99,7 @@ Modules: --lport CONNECT_BACK_PORT Connect back port for target PoC in shell mode --comparison Compare popular web search engines - --pcap capture package in verify mode + --dork-b64 Whether dork is in base64 format Optimization: Optimization options @@ -108,14 +111,19 @@ Optimization: --batch BATCH Automatically choose defaut choice without asking. --requires Check install_requires --quiet Activate quiet mode, working without logger. - --rule Export rules, default export reqeust and response. - --rule-req Only export request rule. - --rule-filename Specify the name of the export rule file. --ppt Hiden sensitive information when published to the network + --pcap use scapy capture flow + --rule export rules, default export reqeust and response + --rule-req only export request rule + --rule-filename RULE_FILENAME + Specify the name of the export rule file Poc options: definition options for PoC + + --options Show all definition options + ``` **-f, --file URLFILE** @@ -123,10 +131,10 @@ Poc options: Scan multiple targets given in a textual file ``` -$ python cli.py -r tests/poc_example.py -f url.txt --verify +$ pocsuite -r pocs/poc_example.py -f url.txt --verify ``` -> Attack batch processing mode only need to replace the ```--verify``` as ``` --attack```. +> Attack batch processing mode only need to replace the ```--verify``` to ``` --attack```. **-r POCFILE** @@ -134,7 +142,7 @@ POCFILE can be a file or Seebug SSVID. pocsuite plugin can load poc codes from a ``` -$ python cli.py -r ssvid-97343 -u http://www.example.com --shell +$ pocsuite -r ssvid-97343 -u http://www.example.com --shell ``` **--verify** @@ -142,7 +150,7 @@ $ python cli.py -r ssvid-97343 -u http://www.example.com --shell Run poc with verify mode. PoC(s) will be only used for a vulnerability scanning. ``` -$ python cli.py -r pocs/poc_example.py -u http://www.example.com/ --verify +$ pocsuite -r pocs/poc_example.py -u http://www.example.com/ --verify ``` **--attack** @@ -150,7 +158,7 @@ $ python cli.py -r pocs/poc_example.py -u http://www.example.com/ --verify Run poc with attack mode, PoC(s) will be exploitable, and it may allow hackers/researchers break into labs. ``` -$ python cli.py -r pocs/poc_example.py -u http://www.example.com/ --attack +$ pocsuite -r pocs/poc_example.py -u http://www.example.com/ --attack ``` **--shell** @@ -158,7 +166,7 @@ $ python cli.py -r pocs/poc_example.py -u http://www.example.com/ --attack Run poc with shell mode, PoC will be exploitable, when PoC shellcode successfully executed, pocsuite3 will drop into interactive shell. ``` -$ python cli.py -r pocs/poc_example.py -u http://www.example.com/ --shell +$ pocsuite -r pocs/poc_example.py -u http://www.example.com/ --shell ``` **--threads THREADS** @@ -166,7 +174,7 @@ $ python cli.py -r pocs/poc_example.py -u http://www.example.com/ --shell Using multiple threads, the default number of threads is 1 ``` -$ python cli.py -r tests/ -f url.txt --verify --threads 10 +$ pocsuite -r pocs/poc_example.py -f url.txt --verify --threads 10 ``` **--dork DORK** @@ -177,7 +185,7 @@ Search redis server with ```port:6379``` and ```redis``` keyword. ``` -$ python cli.py --dork 'port:6379' --vul-keyword 'redis' --max-page 2 +$ pocsuite --dork 'port:6379' --vul-keyword 'redis' --max-page 2 ``` **--dork-shodan DORK** @@ -187,7 +195,7 @@ $ python cli.py --dork 'port:6379' --vul-keyword 'redis' --max-page 2 Search libssh server with `libssh` keyword. ``` - python3 cli.py -r pocs/libssh_auth_bypass.py --dork-shodan libssh --thread 10 + pocsuite -r pocs/libssh_auth_bypass.py --dork-shodan libssh --thread 10 ``` **--dork-fofa DORK** @@ -198,7 +206,7 @@ $ python cli.py --dork 'port:6379' --vul-keyword 'redis' --max-page 2 ``` - $ python3 cli.py -r pocs/check_http_status.py --dork-fofa 'body="thinkphp"' --search-type web --thread 10 + $ pocsuite -r pocs/check_http_status.py --dork-fofa 'body="thinkphp"' --search-type web --thread 10 ``` **--dork-quake DORK** @@ -209,7 +217,7 @@ $ python cli.py --dork 'port:6379' --vul-keyword 'redis' --max-page 2 ``` - $ python3 cli.py -r pocs/check_http_status.py --dork-quake 'app:"ThinkPHP"' --thread 10 + $ pocsuite -r pocs/check_http_status.py --dork-quake 'app:"ThinkPHP"' --thread 10 ``` **--dork-b64** @@ -218,7 +226,7 @@ $ python cli.py --dork 'port:6379' --vul-keyword 'redis' --max-page 2 ``` -$ python cli.py --dork cG9ydDo2Mzc5 --vul-keyword 'redis' --max-page 2 --dork-b64 +$ pocsuite --dork cG9ydDo2Mzc5 --vul-keyword 'redis' --max-page 2 --dork-b64 ``` **--rule** @@ -227,14 +235,14 @@ $ python cli.py --dork cG9ydDo2Mzc5 --vul-keyword 'redis' --max-page 2 --dork-b6 Use the --pocs-path parameter to set the directory where the poc needs to be ruled ``` -$ python cli.py --rule +$ pocsuite --rule ``` **--rule-req** In some cases, we may only need the request rule, --rule-req only export request rule. ``` -$ python cli.py --rule-req +$ pocsuite --rule-req ``` If you have good ideas, please show them on your way. @@ -267,4 +275,4 @@ cli mode console mode poc-console -``` \ No newline at end of file +``` From e398976121bb221ccc69c94ba291887a6c79ab11 Mon Sep 17 00:00:00 2001 From: Tian Qiao Date: Thu, 26 Aug 2021 15:15:56 +0800 Subject: [PATCH 4/5] chore(): update docs --- docs/CODING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/CODING.md b/docs/CODING.md index 0fe67377..9e20b691 100644 --- a/docs/CODING.md +++ b/docs/CODING.md @@ -372,10 +372,10 @@ from pocsuite3.api import OptString, OptDict, OptIP, OptPort, OptBool, OptIntege result['VerifyInfo']['URL'] = self.url+payload ``` -8. 任意文件如果需要知道网站路径才能读取文件的话,可以读取系统文件进行验证,要写 Windows 版和 Linux 版两个版本。 -9. 检测模式下,上传的文件一定要删掉。 -10. 程序可以通过某些方法获取表前缀,just do it;若不行,保持默认表前缀。 -11. PoC 编写好后,务必进行测试,测试规则为:5 个不受漏洞的网站,确保 PoC 攻击不成功;5个受漏洞影响的网站,确保 PoC 攻击成功 +8. 任意文件如果需要知道网站路径才能读取文件的话,可以读取系统文件进行验证,要写 Windows 版和 Linux 版两个版本。 +9. 检测模式下,上传的文件一定要删掉。 +10. 程序可以通过某些方法获取表前缀,just do it;若不行,保持默认表前缀。 +11. PoC 编写好后,务必进行测试,测试规则为:5 个不受漏洞的网站,确保 PoC 攻击不成功;5 个受漏洞影响的网站,确保 PoC 攻击成功 #### Pocsuite3 远程调用文件列表
部分 PoC 需要采用包含远程文件的形式,要求基于 Pocsuite3 的 PoC 统一调用统一文件(如需引用未在以下文件列表内文件,请联系 s1@seebug.org 或者直接提交 issue)。 From a4f63fae55454577aee0480f6d4087fac341b9ad Mon Sep 17 00:00:00 2001 From: Tian Qiao Date: Thu, 26 Aug 2021 15:41:13 +0800 Subject: [PATCH 5/5] chore(): update version to 1.8.1 --- CHANGELOG.md | 5 +++++ docs/CODING.md | 20 ++++++++++---------- manpages/poc-console.1 | 2 +- manpages/pocsuite.1 | 2 +- pocsuite3/__init__.py | 2 +- pocsuite3/lib/core/register.py | 2 +- setup.py | 2 +- 7 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 087a70d4..2606f649 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -244,3 +244,8 @@ Cross-platform shell code generation ----------------- * fix the timeout problem in shell mode leads to confusing results * made some improvements with network address related issues + +# version 1.8.1 +----------------- +* fix check_requires() can not handle dependent version correctly # 208 +* update docs diff --git a/docs/CODING.md b/docs/CODING.md index 9e20b691..ef435445 100644 --- a/docs/CODING.md +++ b/docs/CODING.md @@ -188,7 +188,7 @@ def _attack(self): 和验证模式一样,攻击成功后需要把攻击得到结果赋值给 result 变量 -**注意:如果该 PoC 没有攻击模式,可以在 \_attack() 函数下加入一句 return self.\_verify() 这样你就无需再写 \_attack 函数了。** +**注意:如果该 PoC 没有攻击模式,可以在 \_attack() 函数下加入一句 return self.\_verify() 这样你就无需再写 \_attack 函数了。** 6. 编写shell模式 [**new**] @@ -321,14 +321,14 @@ from pocsuite3.api import OptString, OptDict, OptIP, OptPort, OptBool, OptIntege | 字段类型 | 字段描述 | 参数解释 | 相关例子 | | ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- | -| OptString | 接收字符串类型数据 | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | -| OptDict | 接收一个字典类型参数,在选择上如果选择key,调用时会调用对应的value | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | -| OptIP | 接收IP类型的字符串 | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | -| OptPort | 接收端口类型参数 | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | -| OptBool | 接收布尔类型参数 | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | -| OptInteger | 接收整数类型参数 | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | -| OptFloat | 接收浮点数类型参数 | default:传入一个默认值
descript:字段描述,默认为空
require:是否必须,默认False | | -| OptItems | 接收list类型参数 | default:传入一个默认值
selectd:默认选择
descript:字段描述,默认为空
require:是否必须,默认False | | +| OptString | 接收字符串类型数据 | default: 传入一个默认值
descript: 字段描述,默认为空
require: 是否必须,默认False | | +| OptDict | 接收一个字典类型参数,在选择上如果选择key,调用时会调用对应的value | default: 传入一个默认值
descript: 字段描述,默认为空
require: 是否必须,默认False | | +| OptIP | 接收IP类型的字符串 | default: 传入一个默认值
descript: 字段描述,默认为空
require: 是否必须,默认False | | +| OptPort | 接收端口类型参数 | default: 传入一个默认值
descript: 字段描述,默认为空
require: 是否必须,默认False | | +| OptBool | 接收布尔类型参数 | default: 传入一个默认值
descript: 字段描述,默认为空
require: 是否必须,默认False | | +| OptInteger | 接收整数类型参数 | default: 传入一个默认值
descript: 字段描述,默认为空
require: 是否必须,默认False | | +| OptFloat | 接收浮点数类型参数 | default: 传入一个默认值
descript: 字段描述,默认为空
require: 是否必须,默认False | | +| OptItems | 接收list类型参数 | default: 传入一个默认值
selectd: 默认选择
descript: 字段描述,默认为空
require: 是否必须,默认False | | 需要注意的是,`console` 模式支持所有的参数类型,`cli` 模式除了`OptDict`、`OptBool`、`OptItems` 类型外都支持。 @@ -693,7 +693,7 @@ install_requires = ['pycryptodome:Crypto'] #### PoC 结果返回规范
-result 为 PoC 返回的结果数据类型,result 返回值要求返回完整的一项,暂不符合 result 字段的情况,放入 extra 字段中,此步骤必须尽可能的保证运行者能够根据信息 复现/理解 漏洞,若果步骤复杂,在取证信息中说明。例如: +result 为 PoC 返回的结果数据类型,result 返回值要求返回完整的一项,暂不符合 result 字段的情况,放入 extra 字段中,此步骤必须尽可能的保证运行者能够根据信息 复现/理解 漏洞,若果步骤复杂,在取证信息中说明。例如: ```python # 返回数据库管理员密码 diff --git a/manpages/poc-console.1 b/manpages/poc-console.1 index 486f68c1..87c323a2 100644 --- a/manpages/poc-console.1 +++ b/manpages/poc-console.1 @@ -31,7 +31,7 @@ is maintained at: .I https://github.com/knownsec/pocsuite3/blob/master/docs/USAGE.md .PP .SH VERSION -This manual page documents pocsuite version 1.8.0 +This manual page documents pocsuite version 1.8.1 .SH AUTHOR .br (c) 2014-2021 by Knownsec 404 Team diff --git a/manpages/pocsuite.1 b/manpages/pocsuite.1 index 5038b1ec..ab65addf 100644 --- a/manpages/pocsuite.1 +++ b/manpages/pocsuite.1 @@ -250,7 +250,7 @@ is maintained at: .I https://github.com/knownsec/pocsuite3/blob/master/docs/USAGE.md .PP .SH VERSION -This manual page documents pocsuite version 1.8.0 +This manual page documents pocsuite version 1.8.1 .SH AUTHOR .br (c) 2014-2021 by Knownsec 404 Team diff --git a/pocsuite3/__init__.py b/pocsuite3/__init__.py index 46c12585..167a61d9 100644 --- a/pocsuite3/__init__.py +++ b/pocsuite3/__init__.py @@ -1,5 +1,5 @@ __title__ = 'pocsuite' -__version__ = '1.8.0' +__version__ = '1.8.1' __author__ = 'Knownsec Security Team' __author_email__ = 's1@seebug.org' __license__ = 'GPL 2.0' diff --git a/pocsuite3/lib/core/register.py b/pocsuite3/lib/core/register.py index 860a8f83..9fb748a2 100644 --- a/pocsuite3/lib/core/register.py +++ b/pocsuite3/lib/core/register.py @@ -49,7 +49,7 @@ def check_requires(data): for r in requires: r = r.replace(' ', '') install_name, import_name = (r.split(':') + [''])[0:2] - t = re.split('>|<|=', install_name) + t = re.split('>|<|=|~', install_name) if len(t) > 1: install_name = t[0] if not import_name: diff --git a/setup.py b/setup.py index 73b22019..d7800e63 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ def find_packages(where='.'): setup( name='pocsuite3', - version='1.8.0', + version='1.8.1', url='http://pocsuite.org', description='Pocsuite is an open-sourced remote vulnerability testing framework developed by the Knownsec Security Team.', long_description="""\