MENU

加快漏洞生命历程的步伐

March 12, 2021 • Read: 2966 • 安全攻防阅读设置

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&timestamp=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&timestamp=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、存档闭环漏洞

    闭环漏洞存档漏洞库,结束这个漏洞的生命历程:(

---The END---
  • 文章标题:《加快漏洞生命历程的步伐》
  • 文章作者:Coco413
  • 文章链接:https://coco413.com/archives/75/
  • 版权声明:本文为原创文章,仅代表个人观点,内容采用《署名-非商业性使用-相同方式共享 4.0 国际》进行许可,转载请注明出处。
  • Archives QR Code
    QR Code for this page
    Tipping QR Code