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/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..ef435445 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,43 +306,44 @@ 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
```
| 字段类型 | 字段描述 | 参数解释 | 相关例子 |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- |
-| 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`类型外都支持。
+| 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` 类型外都支持。
+
#### 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. 检测模式下,上传的文件一定要删掉。
-10. 程序可以通过某些方法获取表前缀,just do it;若不行,保持默认表前缀。
-11. PoC 编写好后,务必进行测试,测试规则为:5个不受漏洞的网站,确保 PoC 攻击不成功;5个受漏洞影响的网站,确保 PoC 攻击成功
+8. 任意文件如果需要知道网站路径才能读取文件的话,可以读取系统文件进行验证,要写 Windows 版和 Linux 版两个版本。
+9. 检测模式下,上传的文件一定要删掉。
+10. 程序可以通过某些方法获取表前缀,just do it;若不行,保持默认表前缀。
+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
+```
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/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}')
diff --git a/pocsuite3/lib/core/register.py b/pocsuite3/lib/core/register.py
index eec8f1a3..9fb748a2 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):
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="""\