開發 Burp Proxy 擴充套件能大幅提升資安測試效率與彈性。本文將探討兩種擴充套件的開發:模糊測試及利用 Bing 搜尋。模糊測試擴充套件會隨機變異 HTTP 請求的負載,藉此找出潛在的應用程式漏洞,例如 SQL 注入或 XSS。Bing 搜尋擴充套件則能自動收集目標網站相關資訊,並加入 Burp 的目標範圍,方便後續分析。此外,文章也提供一個從網站內容生成密碼詞彙表的 Burp 擴充套件範例,可用於模擬密碼猜測攻擊,強化網站安全性。

模糊測試與 Burp Proxy 擴充套件開發

模糊測試(Fuzzing)是一種自動化測試技術,旨在透過向應用程式輸入大量隨機或半隨機資料來發現潛在的漏洞。本章將介紹如何開發一個簡單的模糊測試擴充套件,並將其整合到 Burp Proxy 中,以進行有效的安全測試。

開發模糊測試擴充套件

首先,我們需要定義一個簡單的模糊測試方法。這個方法將會隨機修改 HTTP 負載,並生成新的測試資料。以下是 BHPFuzzer 類別中的 mutate_payload 方法:

def mutate_payload(self, original_payload):
    # 選擇一個簡單的變異器或呼叫外部指令碼
    picker = random.randint(1, 3)
    # 選擇負載中一個隨機偏移量進行變異
    offset = random.randint(0, len(original_payload) - 1)
    front, back = original_payload[:offset], original_payload[offset:]

    # 隨機偏移插入 SQL 注入嘗試
    if picker == 1:
        front += "'"
    # 插入跨站指令碼(XSS)嘗試
    elif picker == 2:
        front += "<script>alert('BHP!');</script>"
    # 重複原始負載中的一個隨機區塊
    elif picker == 3:
        chunk_length = random.randint(0, len(back) - 1)
        repeater = random.randint(1, 10)
        for _ in range(repeater):
            front += original_payload[:offset + chunk_length]

    return front + back

內容解密:

上述程式碼定義了一個簡單的 mutate_payload 方法,用於對原始 HTTP 負載進行變異。該方法首先選擇一個隨機變異器(SQL 注入、XSS 或重複區塊),然後在負載中選擇一個隨機偏移量進行變異。根據選擇的變異器,程式碼會對負載進行不同的修改:

  • SQL 注入:在偏移量處插入單引號。
  • XSS:在偏移量處插入跨站指令碼標籤。
  • 重複區塊:重複原始負載中的一個隨機區塊。

整合到 Burp Proxy

完成模糊測試方法後,我們需要將其整合到 Burp Proxy 中。以下是詳細步驟:

  1. 載入擴充套件:點選 Burp 的 Extender 標籤,然後點選 Add 按鈕,選擇我們開發的模糊測試擴充套件。確保設定與圖示中的相同。

  2. 確認擴充套件載入:Burp 應該會開始載入擴充套件。如果有錯誤,可以點選 Errors 標籤進行除錯和修正。

  3. 準備攻擊:確保瀏覽器設定 Burp Proxy 作為 localhost 代理,然後在我們要攻擊的網頁上執行操作。例如,在 Acunetix 網頁應用程式上進行搜尋操作。

  4. 使用 Intruder:在 Intruder 標籤中,選擇要 fuzzing 的引數,然後設定負載型別為 Extension-generated,選擇我們的 BHP Payload Generator。

執行模糊測試

完成上述設定後,我們可以開始執行模糊測試。以下是具體步驟:

  1. 開始攻擊:點選 Intruder 標籤頂部的 Start Attack 按鈕,Burp 應該會開始傳送模糊測試請求。

  2. 分析結果:檢視模糊測試結果,找出可能的漏洞。例如,我們可能會發現 SQL 注入漏洞或其他安全問題。

最佳化與改進

以上是一個簡單的模糊測試擴充套件範例。實際應用中,我們可以根據具體需求進行最佳化和改進。例如:

  • 增加變異器:新增更多種類別的變異器,提高模糊測試的覆寫範圍。
  • 處理特殊協定:如果目標應用程式使用特殊協定(如 CRC 堆疊校驗或長度欄位),可以在 mutate_payload 中新增相應的計算邏輯。
  • 提高效率:最佳化模糊測試方法,提高測試效率和準確性。

此圖示為模糊測試過程流程圖:

  graph TD
    A[開始] --> B[載入擴充套件]
    B --> C{確認無錯誤?}
    C -- 是 --> D[準備攻擊]
    C -- 否 --> E[除錯並修正錯誤]
    E --> C
    D --> F[選擇引數並設定負載型別]
    F --> G[啟動攻擊]
    G --> H[分析結果]

內容解密:

上述流程圖展示了模糊測試過程的基本步驟。首先載入擴充套件並確認無錯誤,然後準備攻擊並選擇要 fuzzing 的引數。接著啟動攻擊並分析結果,找出潛在漏洞。

摘要

透過本章內容,我們學習瞭如何開發一個簡單的模糊測試擴充套件並將其整合到 Burp Proxy 中。這樣我們可以利用 Burp 的強大功能進行有效的安全測試。實際應用中,我們可以根據具體需求進行最佳化和改進,以提高模糊測試的效率和準確性。

Burp Proxy 拓展:利用 Bing 搜尋增強資安測試

在進行網路安全測試時,蒐集目標網站的相關資訊是非常重要的一環。Burp Proxy 是一個強大的網路安全工具,而擴充它的功能可以讓我們更加靈活地進行測試。本篇文章將介紹如何利用 Bing 搜尋 API 來擴充 Burp Proxy,從而自動化地蒐集目標網站的相關資訊。

解析與翻譯 Burp API 檔案

首先,我們需要了解如何使用 Burp API 來擴充 Burp Proxy 的功能。Burp 提供了一個詳細的 API 檔案,我們可以透過這些檔案來瞭解如何使用 Python 語言來編寫擴充程式。以下是一些關鍵步驟:

  1. 下載 Burp API 檔案:Burp 的 API 檔案通常可以在 Burp 的官方網站上找到。
  2. 閱讀 API 檔案:仔細閱讀 API 檔案,瞭解各種可用的方法和類別。
  3. 翻譯 API 檔案:將 API 檔案中的 Java 語法翻譯成 Python 語法。這裡我們使用的是 Jython,它是一種可以在 Java 平台上執行的 Python 虛擬機器。

編寫 Bing 搜尋擴充程式

接下來,我們將實際編寫一個 Bing 搜尋擴充程式。這個擴充程式會在使用者右鍵點選 Burp 中的 HTTP 請求時,顯示一個「Send to Bing」的選項。點選這個選項後,程式會自動進行 Bing 搜尋,並將搜尋結果新增到 Burp 的目標範圍中。

from burp import IBurpExtender
from burp import IContextMenuFactory
from java.net import URL
from java.util import ArrayList
from javax.swing import JMenuItem
from thread import start_new_thread
import json
import socket
import urllib

API_KEY = "YOUR_KEY"
API_HOST = 'api.cognitive.microsoft.com'

class BurpExtender(IBurpExtender, IContextMenuFactory):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        self.context = None

        # 設定擴充程式名稱
        callbacks.setExtensionName("BHP Bing")

        # 註冊上下文選單工廠
        callbacks.registerContextMenuFactory(self)
        return

    def createMenuItems(self, context_menu):
        self.context = context_menu
        menu_list = ArrayList()
        menu_list.add(JMenuItem("Send to Bing", actionPerformed=self.bing_menu))
        return menu_list

內容解密:

  • API_KEY 和 API_HOST:這兩個變數分別存放 Bing API 的金鑰和主機名稱。
  • BurpExtender 類別:這個類別實作了 IBurpExtender 和 IContextMenuFactory 介面,使得我們可以在 Burp 中新增自定義選單專案。
  • registerExtenderCallbacks 方法:這個方法會在擴充程式被載入時被呼叫,我們在此方法中設定擴充程式的名稱並註冊上下文選單工廠。
  • createMenuItems 方法:這個方法會在使用者右鍵點選 HTTP 請求時被呼叫,我們在此方法中建立一個「Send to Bing」的選單專案。

執行 Bing 搜尋並處理結果

接下來,我們需要實作 Bing 搜尋的邏輯。當使用者點選「Send to Bing」選項時,程式會根據所選取的 HTTP 請求進行 Bing 搜尋,並將搜尋結果新增到 Burp 的目標範圍中。

def bing_menu(self, event):
    http_traffic = self.context.getSelectedMessages()
    print("%d requests highlighted" % len(http_traffic))
    for traffic in http_traffic:
        http_service = traffic.getHttpService()
        host = http_service.getHost()
        print("User selected host: %s" % host)
        self.bing_search(host)
    return

def bing_search(self, host):
    try:
        is_ip = bool(socket.inet_aton(host))
    except socket.error:
        is_ip = False

    if is_ip:
        ip_address = host
        domain = False
    else:
        ip_address = socket.gethostbyname(host)
        domain = True

    start_new_thread(self.bing_query, ('ip:%s' % ip_address,))
    if domain:
        start_new_thread(self.bing_query, ('domain:%s' % host,))

內容解密:

  • bing_menu 方法:這個方法會在使用者點選「Send to Bing」選項時被呼叫。它會取得所選取的 HTTP 請求,並提取出主機名稱。
  • bing_search 方法:這個方法會根據主機名稱決定是否為 IP 地址或網域名稱,並啟動 Bing 搜尋執行緒。

與 Bing API 做互動及解析結果

接下來,我們需要實作與 Bing API 的互動邏輯。當使用者點選「Send to Bing」選項時,程式會根據所選取的 HTTP 請求進行 Bing 搜尋,並將搜尋結果新增到 Burp 的目標範圍中。

def bing_query(self, bing_query_string):
    print('Performing Bing search: %s' % bing_query_string)
    http_request = 'GET https://%s/bing/v7.0/search?' % API_HOST
    http_request += 'q=%s HTTP/1.1\r\n' % urllib.quote(bing_query_string)
    http_request += 'Host: %s\r\n' % API_HOST
    http_request += 'Connection:close\r\n'
    http_request += 'Ocp-Apim-Subscription-Key: %s\r\n' % API_KEY
    http_request += 'User-Agent: Black Hat Python\r\n\r\n'

    json_body = self._callbacks.makeHttpRequest(
        API_HOST, 443, True, http_request).tostring()
    json_body = json_body.split('\r\n\r\n', 1)[1]

    try:
        response = json.loads(json_body)
    except (TypeError, ValueError) as err:
        print('No results from Bing: %s' % err)
    else:
        sites = list()
        if response.get('webPages'):
            sites = response['webPages']['value']
            if len(sites):
                for site in sites:
                    print('*'*100)
                    print('Name: %s ' % site['name'])
                    print('URL: %s ' % site['url'])
                    print('Description: %r' % site['snippet'])
                    print('*'*100)

                    java_url = URL(site['url'])
                    if not self._callbacks.isInScope(java_url):
                        print('Adding %s to Burp scope' % site['url'])
                        self._callbacks.includeInScope(java_url)
            else:
                print('Empty response from Bing.: %s' % bing_query_string)

內容解密:

  • bing_query 方法:這個方法負責構建 HTTP 請求並傳送給 Bing API。它會將搜尋結果解析成 JSON 格式,並根據結果決定是否將新發現的網站新增到 Burp 的目標範圍中。
  • HTTP 請求構建:我們構建了一個完整的 HTTP GET 請求,並在請求頭中增加了必需的引數,包括 API 金鑰和 User-Agent。
  • JSON 請求處理:我們利用 json.loads 函式將 JSON 資料轉換為 Python 物件,並在成功解析後輸出相關資訊。
  • 新增到目標範圍:如果發現的網站不在 Burp 的目標範圍中,我們就將其新增進去。

測試與驗證

完成以上步驟後,我們就可以測試這個擴充程式了。以下是一些測試步驟:

  1. 載入擴充程式:按照之前介紹的方法載入這個擴充程式。
  2. 測試搜尋功能:瀏覽到一個測試網站(例如 http://testphp.vulnweb.com/),右鍵點選 GET 請求並選擇「Send to Bing」。
  3. 檢查結果:檢查Burp中的搜尋結果及自動新增於target scope中的新發現網址。

透過這樣的測試流程,我們可以確保這個擴充程式能夠正確地與 Bing API 做互動並處理搜尋結果。

未來趨勢與應用評估

隨著網路安全技術的不斷發展,自動化工具在資安測試中的應用越來越廣泛。這樣一種利用外部資源進行資料收集和分析的方式具有很大的潛力和前景。

未來趨勢方面:

  1. AI 與機器學習: AI 和機器學習技術可以進一步增強工具對資料的分析能力和自動化程度。
  2. 多源資料整合: 未來可能會有更多外部資源(如其他搜尋引擎、社交媒體等)被整合到此類別工具中。

應用評估方面:

  1. 效率提升: 自動化工具顯著提升了測試效率和準確性。
  2. 風險管理: 自動化工具能夠幫助測試人員快速發現潛在風險並採取適當措施。

從網站內容創造密碼寶藏

在網路安全中,使用者密碼往往是防禦的第一道防線。然而,許多自訂的網頁應用程式在這方面存在漏洞,例如未限制連續失敗的登入嘗試次數或未強制使用強密碼。這些情況下,網站可能會成為密碼猜測攻擊的目標。為了進行有效的密碼猜測,你需要一個針對特定網站的詞彙表(word list)。這裡介紹如何使用 Burp Suite 建立一個針對特定網站的高效詞彙表。

基本概念與挑戰

首先,瞭解為什麼針對特定網站的詞彙表如此重要。一般來說,我們無法在短時間內測試數百萬個密碼,因此需要一個能快速生成且針對性強的詞彙表。這裡我們將介紹如何利用 Burp Suite 的擴充套件功能來完成這個任務。

程式碼實作

以下是一個使用 Python 實作的 Burp Suite 擴充套件範例,名為 bhp_wordlist.py。這個擴充套件會從 Burp 的 HTTP 通訊中提取文字內容並生成一個詞彙表。

from burp import IBurpExtender
from burp import IContextMenuFactory
from java.util import ArrayList
from javax.swing import JMenuItem
from datetime import datetime
from HTMLParser import HTMLParser
import re

class TagStripper(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.page_text = []

    def handle_data(self, data):
        self.page_text.append(data)

    def handle_comment(self, data):
        self.page_text.append(data)

    def strip(self, html):
        self.feed(html)
        return " ".join(self.page_text)

class BurpExtender(IBurpExtender, IContextMenuFactory):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        self.context = None
        self.hosts = set()
        self.wordlist = set(["password"])
        callbacks.setExtensionName("BHP Wordlist")
        callbacks.registerContextMenuFactory(self)
        return

    def createMenuItems(self, context_menu):
        self.context = context_menu
        menu_list = ArrayList()
        menu_list.add(JMenuItem("Create Wordlist", actionPerformed=self.wordlist_menu))
        return menu_list

內容解密:

  • 模組匯入:首先匯入所需的模組,包括 burp 相關模組、Java GUI 元件、datetime 和正規表示式。
  • TagStripper 類別:這個類別繼承自 HTMLParser,用於剝離 HTML 標籤並提取純文字內容。handle_datahandle_comment 方法分別處理頁面文字和開發者註解。
  • BurpExtender 類別:這個類別實作了 IBurpExtenderIContextMenuFactory 介面,用於在 Burp 的 UI 中建立自定義選單專案。初始化時設定副檔名稱並註冊選單工廠。
    def wordlist_menu(self, event):
        http_traffic = self.context.getSelectedMessages()
        for traffic in http_traffic:
            http_service = traffic.getHttpService()
            host = http_service.getHost()
            self.hosts.add(host)
            http_response = traffic.getResponse()
            if http_response:
                self.get_words(http_response)
        self.display_wordlist()
        return

    def get_words(self, http_response):
        headers, body = http_response.tostring().split('\r\n\r\n', 1)
        if headers.lower().find("content-type: text") == -1:
            return
        tag_stripper = TagStripper()
        page_text = tag_stripper.strip(body)
        words = re.findall("[a-zA-Z]\w{2,}", page_text)
        for word in words:
            if len(word) <= 12:
                self.wordlist.add(word.lower())

內容解密:

  • wordlist_menu 方法:處理選單點選事件,取得選中的 HTTP 流量並提取主機名稱和 HTTP 回應。
  • get_words 方法:處理 HTTP 回應,確保只處理文字型別的回應。使用 TagStripper 剝離 HTML 標籤,並使用正規表示式提取單詞並加入詞彙表中。
    def mangle(self, word):
        year = datetime.now().year
        suffixes = ["", "1", "!", year]
        mangled = []
        for password in (word, word.capitalize()):
            for suffix in suffixes:
                mangled.append("%s%s" % (password, suffix))
        return mangled

    def display_wordlist(self):
        print("#!comment: BHP Wordlist for site(s) %s" % ", ".join(self.hosts))
        for word in sorted(self.wordlist):
            for password in self.mangle(word):
                print(password)

內容解密:

  • mangle 方法:對每個單詞進行變形處理,新增常見的密碼字尾(如當前年份、數字、感嘆號等)。
  • display_wordlist 方法:顯示生成的詞彙表,並附上來源網站資訊。

操作流程

  1. 安裝擴充套件:在 Burp Suite 中,開啟 Extender 標籤頁面,點選 Add 按鈕並上傳 bhp_wordlist.py 檔案。
  2. 選擇 HTTP 流量:在 Burp 的 Dashboard 標籤頁面中選擇新的 Live Task,新增所有觀察到的流量鏈結。
  3. 生成詞彙表:選取需要生成詞彙表的 HTTP 流量,右鍵點選並選擇 Create Wordlist,即可生成針對該網站的詞彙表。

常見問題與改進建議

  • 命令列引數:如果你不想記住太多命令列引數,可以將其封裝在指令碼中。
  • 多樣化變形策略:可以根據不同的網站特性調整變形策略,例如增加更多常見的密碼變形方式。

未來趨勢與合理預測

隨著網路安全技術的不斷進步,未來可能會出現更多智慧化且自動化的詞彙表生成工具。這些工具可能會結合機器學習技術,根據使用者行為和歷史資料生成更精確且高效的詞彙表。

藍圖圖示

flowchart TD
    A[HTTP Traffic] --> B[Parse Response]
    B --> C{Is Text?}
    C -- No --> D[Ignore]
    C -- Yes --> E[Extract Words]
    E --> F[Filter Words]
    F --> G[Mangle Words]
    G --> H[Display Wordlist]

此圖示顯示了從 HTTP 流量到生成詞彙表的整個過程。首先解析 HTTP 回應,檢查是否為文字型別;如果是文字型別則提取單詞並進行過濾和變形處理;最後顯示生成的詞彙表。