BurpSuite で API ペンテスト用の拡張機能を作成するためのステップバイステップ ガイド

APIペンテストはセキュリティ評価の不可欠な部分であり、BurpSuiteはAPIをテストするための強力なツールになることができます. しかし、独自の拡張機能を作成することで、BurpSuite の機能をさらに拡張できることをご存知でしたか?

この記事では、API ペンテストに役立つカスタム burp スイート拡張機能を作成するためのステップバイステップ ガイドを提供します。 環境のセットアップから拡張インターフェイスの操作まですべてをカバーし、ニーズに合わせて明示的に調整された効果的な拡張機能を構築するために必要なすべてのツールを用意します。

それでは始めましょう!

セットアップ中

そのため、Java、Python、Ruby などのいくつかの言語でカスタム BurpSuite 拡張機能を作成できます。 個人的には、Java 開発環境をセットアップしようとするよりもセットアップと作業がはるかに簡単で簡単なため、Python でそれらを作成することの大ファンです。 本当に必要なのは、コード エディター (地獄、vi でも十分です) と Jython だけです。

ジソンとは?

Jython は、Java プラットフォームで実行するように設計された Python プログラミング言語の実装です。 これは、BurpSuite が Java で記述されているために必要です。そのため、拡張機能は Jython を利用して、PortSwigger が BurpSuite 内で公開している API とやり取りする必要があります。

Jthon のセットアップ

BurpSuite で動作するように Jython を設定するのは比較的簡単です。

手順は次のとおりです。

  1. Jython スタンドアロン jar をダウンロードします。 安全でアクセスしやすい場所に置きます。 ホームディレクトリのburpフォルダに入れました。
  2. BurpSuiteを開く
  3. クリック 拡張機能 テーブル
  4. クリック オプション サブタブ
  5. Python環境、 クリック ファイルを選ぶ… ボタン
  6. Jython スタンドアロン jar を参照して、 開ける

最も基本的な BurpSuite 拡張機能を Python で作成する

したがって、開始するには、PortSwigger が利用できるようにする API を理解する必要があります。 BurpSuite では、公開されているすべての API が文書化されています。 アピス 拡張機能のサブタブ。 より詳細なドキュメントをオンラインで見つけることもできます。

それでは、最初の “Hello World” 拡張機能を作成してみましょう。その後、順を追って説明します。 お気に入りのコード エディターを開き、.py 拡張子を持つ新しい python ファイルを作成します。 hello_world.py.

このコードをそこに入れ、ファイルを保存します。

from burp import IBurpExtender

class BurpExtender(IBurpExtender):
	def registerExtenderCallbacks(self, callbacks):
		self._callbacks = callbacks
		self._helpers = callbacks.getHelpers()
		callbacks.setExtensionName("Hello World")
		print( "Hello World extension loaded." )
		return

では、このコードを見ていきましょう。

  • 最初に行うことは、burp モジュールから IBurpExtender をインポートすることです。 すべてのBurp拡張機能は、このインターフェースを実装する必要があります。
  • 次に、拡張クラスを作成し、IBurpExtender を実装します。
  • その拡張クラス内で、と呼ばれるメソッドを実装する必要があります registerExtenderCallbacks()、IBurpExtender インターフェイスを介して公開されます。 このメソッドは、拡張機能がロードされるときに呼び出されます。 IBurpExtenderCallbacks インターフェイスのインスタンスを登録し、さまざまなアクションを実行するために拡張機能が呼び出すことができるメソッドを提供します。 混乱しているように見えても心配しないでください…後でそれを利用する必要があるので、それを片付けます。
  • 内部 registerExtenderCallbacks() メソッドで、コールバックとそのヘルパーへの内部参照を作成します。 この「Hello World」の例では実際には必要ありませんが、実際の拡張機能は、他のメソッドで実際の作業を行う必要がある場合、最終的にこれらに依存します。
  • 拡張子名を設定します。
  • 次に、Burp Extensions ローダーの出力画面に表示される文字列を出力します。 これは、拡張機能が適切に読み込まれることを確認し、何かが正しくない場合にすぐにフィードバックを提供するのに役立ちます。

よし、この拡張機能をロードして、何が起こるか見てみましょう!

最初のカスタム拡張機能を読み込んでいます

最初のエクステンションを書いたので、それをBurpにロードして何が起こるか見てみましょう:

  1. クリックしてください 拡張機能 テーブル
  2. クリックしてください インストール済み サブタブ
  3. バープエクステンション セクションで、 追加 ボタン
  4. 拡張子の詳細、 の拡張タイプを選択します パイソン そしてクリック お茶 ファイルを選ぶ… ボタン
  5. Python で作成した拡張機能を参照して選択し、 開ける.
  6. クリック .
  7. すべてがうまくいけば、テキストが 出力 タブ。 何か問題が発生した場合は、 エラー タブ。
  8. クリック 近い.

この時点で、作成した最初のカスタム拡張機能が BurpSuite で実行されます。 おめでとう!

API ペンテスト用の価値ある拡張機能の構築

最初の拡張機能が完成したので、API をハッキングするときに役立つものを一緒に作成しましょう。

私のブログの読者であれば、予測可能な GUID への攻撃に関する私の記事を思い出すかもしれません。 それでも読む必要がある場合は、読むことをお勧めします。 心配しないで…待ってます…

わかりました。v1 UUID を使用すると、適切なコンテキストで有用な攻撃ベクトルになる可能性があることがわかっています。 最初にそのような UUID を発見することからすべてが始まります。 これらを手動で探す代わりに、パッシブ スキャンを実行しながら BurpSuite に任せてみませんか?

そして、それこそがまさに今、私たちが一緒に書き込もうとしているものです。

UUID チェッカー拡張機能のセットアップ

開始するには、 hello_world.py への拡張 uuid_checker.py お気に入りのコード エディターで開きます。

この拡張機能の目標は、HTTP 応答の本文をスキャンし、v1 UUID に一致するパターンを探すことです。 それが検出された場合は、問題を作成し、BurpSuite のダッシュボードの[問題のアクティビティ]に登録します。

パッシブ スキャン中にこれを検出したいので、スキャナー チェックが発生したときに通知を受けるように BurpSuite に指示する必要があります。 これは、IScannerCheck インターフェイスを実装することで実行できます。

に書き込むことができるようにするには 問題の活動 レポート ビューを作成するには、IScanIssue インターフェイスに基づいて独自のクラスを実装する必要があります。

最後に、v1 UUID パターンを実際に探すために、Python の正規表現モジュールを活用します。

それをすべて手に入れましたか? OK、それに応じて拡張コードを更新しましょう。

インポートを更新する

ファイルの上部にあるインポートを次のように変更します。

from burp import IBurpExtender, IScannerCheck, IScanIssue
import re

クラスの実装を更新する

拡張クラスを変更して実装する IScannerCheck:

class BurpExtender(IBurpExtender, IScannerCheck):

これで実装が完了しました IScannerCheck、拡張クラス内に次の追加メソッドを実装する必要があります。

def doPassiveScan(self, baseRequestResponse):
	pass
	
def doActiveScan(self, baseRequestResponse, insertionPoint):
	pass

def consolidateDuplicateIssues(self, existingIssue, newIssue):
	if existingIssue.getIssueName() == newIssue.getIssueName():
		return -1
	return 0

後で、私たちはほとんどの作業を doPassiveScan(). とりあえず足場を組みます。

スキャナーの更新登録

スキャナチェックが行われているときにBurpに通知するように指示したいので、更新する必要があります registerExtenderCallbacks(). これが今のように見えるはずです:

def registerExtenderCallbacks(self, callbacks):
	self._callbacks = callbacks
	self._helpers = callbacks.getHelpers()
	callbacks.setExtensionName("UUID Inspector")
	callbacks.registerScannerCheck(self)
	callbacks.issueAlert("Registered UUID Inspector...")
	print( "UUID Inspector extension loaded." )
	return

いくつかの変更点に注意してください:

  • Hello World と同じ基本的な足場ですが、新しい拡張機能名が付いています。
  • Burpに電話するように指示するスキャナーチェックに登録しました doPassiveScan() 時が来たら。
  • 拡張機能がロードされたというアラートをダッシュ​​ボードに発行し​​ました。 これはイベント ログに書き込まれます。 Burpが再起動するたびに正しくロードされていることを知っておくと役に立ちます. これは、独自のカスタム タブやメニュー項目など、この拡張機能に UI 要素を実装していないためです。

HTTP 応答を解析するためのヘルパー メソッドを作成する

したがって、Burp からのデフォルトの応答オブジェクトは、より複雑なバイトを介して行われます。[] Python での作業がより困難な配列です。 それでは、ヘッダーと本文を抽出し、より簡単に解析できる形式で返すヘルパー メソッドを作成しましょう。

def getResponseHeadersAndBody(self, content):
	response = content.getResponse()
	response_data = self._helpers.analyzeResponse(response)
	headers = list(response_data.getHeaders())
	body = response[response_data.getBodyOffset():].tostring()
	return headers, body

このコードで気付くのは、これが初めての self._helpers 応答を分析します。 次に、抽出されたデータを取得し、ヘッダーのリストを解析し、バイト配列内の本体が存在するデータのオフセットを見つけて、それを文字列に変換します。

次に、自由に処理できるように、ヘッダーと本文を返します。

これは便利な再利用可能なヘルパーで、おそらく Python の拡張機能でかなり活用するでしょう。

有効な v1 UUID を検出する方法を作成する

したがって、v1 UUID の検出は比較的簡単です。 基本的には、次の条件に一致する文字のパターンを探します。

  • 16 進数 8 文字のグループ
  • 続いてダッシュ
  • 4 つの 16 進数文字のグループが続きます
  • 続いてダッシュ
  • 1 (v1 UUID を表す) が続く
  • 3 つの追加の 16 進数文字が続く
  • 続いてダッシュ
  • 4 つの追加の 16 進文字が続く
  • 続いてダッシュ
  • 12 個の追加の 16 進文字が続く

Python の正規表現モジュールを使用してそのようなパターンを検索する方法を次に示します。

def valid_v1_uuid(self, uuid):
	# To look for v1 UUID we check if a valid pattern exists for a UUID 
	# where the number after the second dash is a '1'.
	pattern = '[a-f0-9]{8}-?[a-f0-9]{4}-?1[a-f0-9]{3}-?[a-f0-9]{4}-?[a-f0-9]{12}'
	match = re.search(pattern, uuid, flags=re.IGNORECASE)
	return bool(match)

チップ: の使用に注意してください re.IGNORECASE. これにより、UUID が大文字か小文字かを無視するかどうかを確認できます。 それを達成する別の方法は、「[a-fA-F0-9]」。 この方法は、正規表現を頻繁に使用しない人にとっては、より読みやすくなります。

IScanIssue に基づいて新しいクラスを作成する

有効な v1 UUID を検出したことを通知するには、ダッシュボードの課題アクティビティの下にレコードを挿入する必要があります。 それを達成する IScanIssue に基づいて独自のクラスを構築できます。

class UUIDScanIssue(IScanIssue):
    def __init__(self, httpService, url, httpMessages):
        self._httpService = httpService
        self._url = url
        self._httpMessages = httpMessages

    def getUrl(self):
        return self._url

    def getIssueName(self):
        return "Possible v1 UUID detected"

    def getIssueType(self):
        return 0

    def getSeverity(self):
        return "Medium"

    def getConfidence(self):
        return "Certain"

    def getIssueBackground(self):
        pass

    def getRemediationBackground(self):
        pass

    def getIssueDetail(self):
        return "The response contains a potential v1 UUID, which is prone to attack. See: https://danaepp.com/attacking-predictable-guids-when-hacking-apis"

    def getRemediationDetail(self):
        pass

    def getHttpMessages(self):
         return self._httpMessages

    def getHttpService(self):
        return self._httpService

doPassiveScan() ですべてをまとめる

すべての余分なビットを実装したので、これらの有効な UUID を見つけるためにいくつかの作業を行いましょう。

メソッドの実装を示してから、説明します。

def doPassiveScan(self, baseRequestResponse):
	issues = []
	headers, body = self.getResponseHeadersAndBody(baseRequestResponse)
        
	# Test the body for GUIDs
	if self.valid_v1_uuid(body):
		self._callbacks.issueAlert("Found potential valid v1 UUID in body. Check Issue Activity!")
			
		# report the issue
		issues.append( UUIDScanIssue(
			baseRequestResponse.getHttpService(),
			self._helpers.analyzeRequest(baseRequestResponse).getUrl(),
			[baseRequestResponse]
		))

	if not issues:
		issues = None 

	return issues

したがって、コードは次のようになります。

  • 応答からヘッダーと本文を抽出します。 ここでは本文のみをテストしていますが、可能性のある UUID のすべてのヘッダーをスキャンすることは良い追加です。 しかし、それは私が練習するためにあなたに任せる練習です.
  • 本文を取得し、有効な v1 UUID パターンをスキャンします。 見つかった場合は、アラートをイベント ログに書き込みます。 また、UUIDScanIssue オブジェクトを問題リストに追加します。このオブジェクトは、このメソッド呼び出しから戻ると、スキャナの問題アクティビティ ログにプッシュされます。

完全な拡張コード

詳細をセクションに分割することは、説明するときに役立ちました。 従い、それに応じて拡張機能を更新していただければ幸いです。

念のため、完全な UUID インスペクター コードを次に示します。

from burp import IBurpExtender, IScannerCheck, IScanIssue
import re

class BurpExtender(IBurpExtender, IScannerCheck):
	def registerExtenderCallbacks(self, callbacks):
		self._callbacks = callbacks
		self._helpers = callbacks.getHelpers()
		callbacks.setExtensionName("UUID Inspector")
		callbacks.registerScannerCheck(self)
		callbacks.issueAlert("Registered UUID Inspector...")
		print( "UUID Inspector extension loaded." )
		return

	def getResponseHeadersAndBody(self, content):
		response = content.getResponse()
		response_data = self._helpers.analyzeResponse(response)
		headers = list(response_data.getHeaders())
		body = response[response_data.getBodyOffset():].tostring()
		return headers, body

	def valid_v1_uuid(self, uuid):
		# To look for v1 UUID we check if a valid pattern exists for a UUID 
		# where the number after the second dash is a '1'.
		pattern = '[a-f0-9]{8}-?[a-f0-9]{4}-?1[a-f0-9]{3}-?[a-f0-9]{4}-?[a-f0-9]{12}'
		match = re.search(pattern, uuid, flags=re.IGNORECASE)
		return bool(match)

	def doPassiveScan(self, baseRequestResponse):
		issues = []
		headers, body = self.getResponseHeadersAndBody(baseRequestResponse)
        
		# Test the body for GUIDs
		if self.valid_v1_uuid(body):
			self._callbacks.issueAlert("Found potential valid v1 UUID in body. Check Issue Activity!")
			
			# report the issue
			issues.append( UUIDScanIssue(
				baseRequestResponse.getHttpService(),
				self._helpers.analyzeRequest(baseRequestResponse).getUrl(),
				[baseRequestResponse]
			))

		if not issues:
			issues = None 

		return issues
	
	def doActiveScan(self, baseRequestResponse, insertionPoint):
		pass

	def consolidateDuplicateIssues(self, existingIssue, newIssue):
		if existingIssue.getIssueName() == newIssue.getIssueName():
			return -1
		return 0
		
class UUIDScanIssue(IScanIssue):
    def __init__(self, httpService, url, httpMessages):
        self._httpService = httpService
        self._url = url
        self._httpMessages = httpMessages

    def getUrl(self):
        return self._url

    def getIssueName(self):
        return "Possible v1 UUID detected"

    def getIssueType(self):
        return 0

    def getSeverity(self):
        return "Medium"

    def getConfidence(self):
        return "Certain"

    def getIssueBackground(self):
        pass

    def getRemediationBackground(self):
        pass

    def getIssueDetail(self):
        return "The response contains a potential v1 UUID, which is prone to attack. See: https://danaepp.com/attacking-predictable-guids-when-hacking-apis"

    def getRemediationDetail(self):
        pass

    def getHttpMessages(self):
         return self._httpMessages

    def getHttpService(self):
        return self._httpService

拡張機能の動作を確認する

わかった。 v1 UUID のハンティングに役立つ拡張機能が用意されました。 BurpSuiteにロードして試してみましょう。

  1. クリックしてください 拡張機能 テーブル
  2. クリックしてください インストール済み サブタブ
  3. バープエクステンション セクションで、 追加 ボタン
  4. 拡張子の詳細、 の拡張タイプを選択します パイソン そしてクリック お茶 ファイルを選ぶ… ボタン
  5. Python で作成した拡張機能を参照します (uuid_checker.py)、それを選択し、クリックします。 開ける.
  6. クリック .
  7. すべてがうまくいけば、テキストが 出力 タブ。 何か問題が発生した場合は、 エラー タブ。
  8. クリック 近い.

すべてが正常に機能すると、BurpSuite のダッシュボードのイベント ログにアラートが表示されます。

Burp を介してプロキシするブラウザを使用して、v1 UUID が存在する場所に移動します。 簡単な例を次に示します。

すぐに 問題 押し込まれた 問題の活動 上で ダッシュボード. また、下にもあります 問題 をクリックすると、サイトマップで 目標 タブをクリックし、 サイトマップ サブタブ。 次のようになります。

そして、そこに行きます。 API ペンテスト中に役立つ最初のカスタム拡張機能を作成しました。 文字通り何もする必要はありません。応答の本文で v1 UUID が検出されると、警告が表示されます。 その後、問題をクリックして、 応答 タブを開き、潜在的に脆弱な UUID のデータを調べ、悪用可能かどうかを判断します。

より複雑な拡張機能を作成する

優れた基盤を構築し、Python で最初の BurpSuite 拡張機能を構築したので、それだけにとどまらないでください。 できることは他にもたくさんあります。 まず、PortSwigger の GitHub リポジトリを調べて、Python をフィルター処理することをお勧めします。 そこには大量のサンプルコードがあります。 リポジトリで「例」を検索すると、Java、Python、および Ruby のコードを含むいくつかの重要な例が見つかります。

結論

Python で BurpSuite 拡張機能を記述することは、API ペンテスト タスクの一部を自動化するのに役立つ優れた方法です。 この記事では、独自の拡張機能を作成する方法について順を追って説明し、攻撃できる可能性のある予測可能な GUID を探すことができる単純な拡張機能の例も示しました。

この記事が、独自の拡張機能を作成するための出発点として役立つことを願っています。 しかし、それは始まりに過ぎません。 可能性を想像してください!

API ハッキング技術の向上に役立つ、このようなリソースがさらに必要ですか? 次に、API ハッキング リソースの究極のガイドに関する無料の電子ブックをダウンロードしてください。

一生懸命ハック!

BurpSuite で API ペンテスト用の拡張機能を作成するためのステップバイステップ ガイドの投稿は、Dana Epp のブログに最初に掲載されました。

*** これは、Dana Epp が執筆した Dana Epp のブログからの Security Bloggers Network シンジケート ブログです。 元の投稿を読む: https://danaepp.com/a-step-by-step-guide-to-writing-extensions-for-api-pentesting-in-burpsuite

Leave a Comment

Your email address will not be published. Required fields are marked *