0x01 前言
最近在搞一个流量发生器,起初觉得大致原理应该是系统集成了很多pcap攻击包,然后在发送的时候去修改pcap包中的一些参数从而达到发出去的每条数据包流量特征的一些变化;后来使用后发现是更简洁的方式实现:通过编写一套描述漏洞的规则,有什么字段需要调整直接动态调整规则后利用脚本生成攻击流量pcap包,这样做的方式既减少的制作、修改发生流量的成本,又减轻了数据存储;
做安全类产品无论是主动、被动或者一些监控类大多还是依赖于漏洞规则进行识别,填充规则这块较费精力,同时不同的产品之间基本不会共享规则,即使共享了里的一些字段、格式等不统一最后整合的面目全非,与其花精力去调整格式,不如去约定一套通用字段模板以不变应万变方式生成适应不同的产品,既可以更方便的闭环管理漏洞库,也可以更高效的去生成检测规则减少重复劳动力。基于以上想法,便约定了一套模板:psp模板(Poc - Snort/Suricata- Pcap)。
0x02 约定通用模板
1、约定模板
- 格式
在json、xml、yaml中选择json,考虑解析字段时候不用调用第三方库以及看的直观些。
- 字段
围绕漏洞基本信息、复现利用以及修复监控等漏洞闭环的几个点上进行设定。
- 模板
第一个版本如下:
{
"vuln_name":"Zabbix latest.php SQL注入漏洞",
"vuln_time": "2016-08-15",
"vuln_type":"WEB通用型漏洞",
"vuln_category": "SQL注入",
"vuln_cve": "CVE-2016-10134",
"vuln_cvss": "9.8",
"vuln_rank": "CRITICAL",
"vuln_desc": "由于Zabbix的jsrpc的profileIdx2参数由于过滤不当,导致产生Insert型SQL注入漏洞;攻击者可以无需授权即可登陆zabbix管理系统,也可通过script等功能轻易直接获取zabbix服务器的操作系统权限。",
"vuln_repair": "目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:https://support.zabbix.com/browse/ZBX-11023。",
"vuln_refer": "http://cn-sec.com/archives/21982.html",
"app_effect":"Zabbix v2.2.x 3.0.0-3.0.3",
"app_dorks": "Zabbix 2.4.8 Copyright 2001-2016 by Zabbix SIA",
"attck_way":"GET",
"attack_payload":[
"/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get×tamp=2471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=2'3297&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color=1",
"/zabbix/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get×tamp=2471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=2'3297&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color=1"],
"attack_keyword":["You have an error in your SQL syntax", "nvalid input syntax"]
"attack_verify":"通过访问漏洞地址,然后在返回的页面中查看是否存在关键字'You have an error in your SQL syntax'等或者使用sqlmap工具等进行验证。",
"attack_case":"https://github.com/vulhub/vulhub/tree/master/zabbix/CVE-2016-10134",
"attack_ratio": "high",
"psp_id":"1",
"psp_author":"coco413",
"psp_envi":"docker",
"psp_poc":"1",
"psp_pcap":"1",
"psp_suricata":"1",
"psp_create":"2020-01-01"
}
最初版本虽然大致信息涵盖,但在生成poc时候还是较多场景不适用,因此优化如下版本:
{
"vuln_info":{
"vuln_name":'Draytek企业级路由器命令执行漏洞',
"vuln_time": "2020-02-01",
"vuln_type":"命令执行",
"vuln_category": "路由器漏洞",
"vuln_cve": "CVE-2020-8515",
"vuln_cvss": "9.8",
"vuln_rank": "critical",
"vuln_desc": "DrayTek URI未能正确处理SHELL字符,远程攻击者可以利用该漏洞提交特殊的请求,可以ROOT权限执行任意命令。",
"vuln_repair": "目前厂商已经发布补丁修复了上述漏洞,建议用户及时确认漏洞影响,尽快采取修补措施。官方补丁下载地址:https://www.draytek.com",
"vuln_refer": "https://www.hayasec.me/2020/03/31/cve-2020-8515/"
},
"effect_info":{
"app_effect": ["Vigor2960 <v1.5.1", "Vigor300B <v1.5.1", "Vigor3900 <v1.5.1", "VigorSwitch20P2121 <= v2.3.2", "VigorSwitch20G1280 <= v2.3.2", "VigorSwitch20P1280 <= v2.3.2", "VigorSwitch20G2280 <= v2.3.2", "VigorSwitch20P2280 <= v2.3.2"],
"app_dorks": "app:'DrayTek Vigor 2960 VPN server httpd'",
},
"base_info":{
"psp_id":"1",
"psp_author":"coco413",
"psp_envi":"docker",
"psp_poc":"1",
"psp_pcap":"1",
"psp_suricata":"1",
"psp_doc":"1",
"psp_create":"2020-01-01"
},
"attack_info":{
"attack_request":{
"default_port":443,
"default_service":"https",
"path":"/cgi-bin/mainfunction.cgi",
"method":"POST",
"headers":{"Origin":"https://qq.com"},
"data":"action=login&keyPath=%27%0A%2fbin%2fcat${IFS}%2fetc%2fpasswd%0A%27&loginUser=a&loginPwd=a",
},
"attack_match":{
"match_condition":"and",
"match_keyword":[
{"type":"regex","content":"root:[x*]:0:0:","part":"body"},
{"type":"code","content":200,"part":"status"},
{"type":"words","content":"[config]","part":"headers"}
]
},
"attack_verify":"1.开启服务级别身份验证,如Kerberos认证;2.建议按照安全最小化原则,禁止公网对这部分端口访问。",
"attack_case":"https://127.0.0.1",
"attack_ratio": "high",
}
}
这个版本主要增加了一些请求和响应的匹配的字段适应更多的场景,同时在github上也发现一个不错的社区项目projectdiscovery/nuclei-templates,它用yaml编写的一套模板做成的一套扫描器,字段内容更多适应的场景也更全,当时也考虑是否还有必要去新约定一个模板,后来想了下还是有必要的,主要(1) psp模板不是去做扫描器中的一环,而是建立一套模板去生成适应不同的扫描器、IDS等格式,从而提升规则编写的效率;(2) psp模板包含一些管理字段,更好的管理自己的漏洞库;(3)nuclei模板有较多也很细致的字段满足很多场景,但字段过多也增加了一些复杂和繁琐,psp模板不想搞的字段过多违背提高效率的想法,不需要适应所有场景,更多的是为了解决80%重复劳动力,剩余最后1km交给人工进行测试和优化。(4) 建立这样的一套模板既可以作为扫描器、IDS其中一环直接解析也可以用来生成文件更加灵活些。
2、解释规则
- vuln_name
解释: 漏洞名称
格式: xxx应用xxx组件下的xxx漏洞
限制:低于255个字符,不允许为空
- vuln_time
解释:漏洞爆发时间
格式:datetime格式
限制:不允许为空
- vuln_type
解释:漏洞类型
限制:不允许为空
具体类型项参考创宇如下:
英文名称 | 中文名称 | 缩写 |
Cross Site Scripting | 跨站脚本 | xss |
Cross Site Request Forgery | 跨站请求伪造 | csrf |
SQL Injection | Sql注入 | sql-inj |
LDAP Injection | ldap注入 | ldap-inj |
Mail Command Injection | 邮件命令注入 | smtp-inj |
Null Byte Injection | 空字节注入 | null-byte-inj |
CRLF Injection | CRLF注入 | crlf-inj |
SSI Injection | Ssi注入 | ssi-inj |
XPath Injection | Xpath注入 | xpath-inj |
XML Injection | Xml注入 | xml-inj |
XQuery Injection | Xquery 注入 | xquery-inj |
Command Execution | 命令执行 | cmd-exec |
Code Execution | 代码执行 | code-exec |
Remote File Inclusion | 远程文件包含 | rfi |
Local File Inclusion | 本地文件包含 | lfi |
Abuse of Functionality | 功能函数滥用 | func-abuse |
Brute Force | 暴力破解 | brute-force |
Buffer Overflow | 缓冲区溢出 | buffer-overflow |
Content Spoofing | 内容欺骗 | spoofing |
Credential Prediction | 证书预测 | credential-prediction |
Session Prediction | 会话预测 | session-prediction |
Denial of Service | 拒绝服务 | dos |
Fingerprinting | 指纹识别 | finger |
Format String | 格式化字符串 | format-string |
HTTP Response Smuggling | http响应伪造 | http-response-smuggling |
HTTP Response Splitting | http响应拆分 | http-response-splitting |
HTTP Request Splitting | http请求拆分 | http-request-splitting |
HTTP Request Smuggling | http请求伪造 | http-request-smuggling |
HTTP Parameter Pollution | http参数污染 | hpp |
Integer Overflows | 整数溢出 | int-overflow |
Predictable Resource Location | 可预测资源定位 | res-location |
Session Fixation | 会话固定 | session-fixation |
URL Redirector Abuse | url重定向 | redirect |
Privilege Escalation | 权限提升 | privilege-escalation |
Resolve Error | 解析错误 | resolve-error |
Arbitrary File Creation | 任意文件创建 | file-creation |
Arbitrary File Download | 任意文件下载 | file-download |
Arbitrary File Deletion | 任意文件删除 | file-deletion |
Backup File Found | 备份文件发现 | bak-file-found |
Database Found | 数据库发现 | db-found |
Directory Listing | 目录遍历 | dir-listing |
Directory Traversal | 目录穿越 | dir-traversal |
File Upload | 文件上传 | file-upload |
Login Bypass | 登录绕过 | login-bypass |
Weak Password | 弱密码 | weak-pass |
Remote Password Change | 远程密码修改 | remote-pass-change |
Code Disclosure | 代码泄漏 | code-disclosure |
Path Disclosure | 路径泄漏 | path-disclosure |
Information Disclosure | 信息泄漏 | info-disclosure |
Security Mode Bypass | 安全模式绕过 | sec-bypass |
Malware | 挂马 | mal |
Black Link | 暗链 | black-link |
Backdoor | 后门 | backdoor |
- vuln_category
解释:漏洞分类
限制:不允许为空
具体分类项如下:
Web漏洞
主机漏洞
PC端漏洞
移动端漏洞
路由器漏洞
浏览器漏洞
IOT应用漏洞
- vuln_cve
解释:漏洞CVE编号
限制:大小写不限制建议大写,可以为空。
- vuln_cvss
解释:漏洞cvss评分,默认采用CVSS3.1标准
限制:允许为空
- vuln_rank
解释: 漏洞威胁等级
限制: 不区分大小写建议小写且不允许为空,;该字段与cvss评分有一定关联1~3.9分low、4~6.9分middle、7~8.9分high、9~10分critical
具体分类项如下:
low
middle
high
critical
- vuln_desc
解释:漏洞描述信息
限制:不允许为空
- vuln_repair
解释:漏洞修复方式
限制:不允许为空
- vuln_refer
解释:漏洞引用地址
限制:不允许为空
- app_effect
解释:影响组件
格式:列表形式,例如:["Vigor2960 <v1.5.1", "Vigor300B <v1.5.1"]
限制:不允许为空
- app_dorks
解释:组件dorks
格式:可以zoomeye、shodan、fofa或者google等dorks。
限制:不允许为空
- psp_id
解释:规则编号
限制:不允许为空
- psp_author
解释:规则作者
限制:不允许为空
- psp_envi
解释:规则环境,可以docker环境或者online环境
限制:不允许为空
具体项有:
docker
online
- psp_poc
解释:规则poc存在状态【1存在0不存在】
限制:不允许为空
- psp_suricata
解释:规则suricata存在状态【1存在0不存在】
限制:不允许为空
- psp_pcap
解释:规则pcap存在状态【1存在0不存在】
限制:不允许为空
- psp_doc
解释:规则分析文章存在状态【1存在0不存在】
限制:不允许为空
- psp_create
解释:规则创建时间
限制:不允许为空
- default_port
解释:默认的端口号
限制:不允许为空,默认端口可以通过组件的默认端口或者zoomeye搜索端口最多的那个端口号。
- default_service
解释:默认的服务
限制:不允许为空,默认服务可以通过组件的默认端口或者zoomeye搜索服务最多的那个服务。
- path
解释:攻击路径
限制:不允许为空,路径首字符/添加无要求;
- method
解释:请求方式
限制:不允许为空
具体项有:
GET
POST
PUT
HEAD
OPTIONS
- path
解释:攻击路径
限制:不允许为空,路径首字符/添加无要求;
- headers
解释:请求头
格式:K/V字典格式,例如 {"Origin":"https://qq.com"}
限制:可以为空
- data
解释:POST请求参数
格式:等号连接的键值对,例如 action=login&keyPath=1
限制:可以为空
- match_condition
解释:匹配关系
限制:不允许为空。
具体项有:
and
or
- match_keyword
解释:匹配关键字
格式:列表格式,每列表项一条匹配项,根据match_condition匹配关系对列表中的项进行and或者or判断,例如:
[
{"type":"regex","content":"root:[x*]:0:0:","part":"body"},
{"type":"code","content":200,"part":"status"},
{"type":"words","content":"[config]","part":"headers"}
]
单条匹配具体项如下:
type匹配类型:regex正则 / code状态码 / words字符串
part匹配来源: boay响应体 / status状态码 / headers响应头 / url网址
限制:不允许为空
- path
解释:攻击路径
限制:不允许为空
- attack_verify
解释:漏洞存在与否验证信息
限制:不允许为空
- attack_case
解释:漏洞poc案例
限制:不允许为空
- attack_ratio
解释:漏洞规则可信度
限制:不允许为空
具体项有:
high
low
0x03 生成PSP
1、建立json文件
- 手工修改json方式
psp_rule={
"vuln_info":{
"vuln_name":'',
"vuln_time": "",
"vuln_type":"命令执行", #见文档
"vuln_category": "Web漏洞", #Web漏洞 主机漏洞 PC端漏洞 移动端漏洞 路由器漏洞 浏览器漏洞 IOT应用漏洞
"vuln_cve": "",
"vuln_cvss": "",
"vuln_rank": "critical", # low middle high critical
"vuln_desc": "",
"vuln_repair": "",
"vuln_refer": ""
},
"effect_info":{
"app_effect": [],
"app_dorks": "",
},
"base_info":{
"psp_id":"1",
"psp_author":"coco413",
"psp_envi":"docker", # docker online
"psp_poc":"1", # 1 0
"psp_pcap":"1", # 1 0
"psp_suricata":"1", # 1 0
"psp_doc":"1", # 1 0
"psp_create":""
},
"attack_info":{
"attack_request":{
"default_port":80,
"default_service":"http",
"path":"",
"method":"GET", # GET POST PUT HEAD OPTIONS
"headers":{},
"data":"",
},
"attack_match":{
"match_condition":"and", # or and
"match_keyword":[
# type:regex/code/words; part:body/url/headers/status
{"type":"words","content":"[config]","part":"body"},
]
},
"attack_verify":"",
"attack_case":"",
"attack_ratio": "high", # high low
}
}
- 在线生成方式
漏洞类型太多选的麻烦,搞了一个在线的
2、适应生成规则
写个脚本针对你希望适应的格式去解析json进行填充 ,例如我生成的方式:
- Poc
Poc生成我的一个扫描器和pocsuite3两种格式。
- Suricata
Suricata生成4.1.3版本格式。
- Pcap
Python调用tcpdump生成pcap流量文件。
3、存档闭环漏洞
闭环漏洞存档漏洞库,结束这个漏洞的生命历程:(