Chrome プラグイン
Chrome プラグインは、Chrome ブラウザに機能を追加または変更するブラウザ拡張機能です。 。一般に、Chrome プラグインは JavaScript、HTML、CSS を使用して作成できます。市場には多くの優れたChrome拡張機能があり、多くのユーザーがいます。 Chrome プラグインの作成も比較的簡単で、基本的に、フロントエンドの知識があり、Chrome プラグインの API に慣れていれば、Chrome プラグインを作成できます。
Chrome プラグインをインストールするには、Chrome ストアで公開していない場合 (ネットワーク上の理由により、ストアから直接ダウンロードできない場合があります)、Chrome プラグインをインストールできます。 -開発者モードを通じて。または、Chrome プラグイン開発者アカウントにサインアップすることもできます (わずか 5 ドルで 20 個のプラグインを公開できます)。
Chrome プラグインの開発についての簡単な紹介。主に Chrome プラグインのパッシブ スキャナーの側面について説明します。 Chrome プラグインの場合、主にブラウザを通過するトラフィックを取得し、そのトラフィックを処理のためにバックエンドに転送するプラグインの機能によって行われます。
Chrome プラグインがネットワーク トラフィックを処理するには、chrome.devtools.network と chrome.webRequest という 2 つの主要な API があります。ただし、前者を使用する場合、Chrome 開発者ツールを開く必要があり、少し不便なので、パッシブ トラフィックを取得する一般的な方法でもある後者を選択しました。
Chrome プラグインの webrequest API は、対応するイベントによって駆動されます。リクエストのライフサイクル図は次のとおりで、7 つの主要なイベントがあります。主要なイベントをリッスンし、それらを処理してトラフィックを取得するパッシブ スキャナーのニーズを満たすだけで済みます。
実際、これらのイベントを理解するのは難しいことではありません。基本的に、主にリクエストを送信する前に、イベントの名前を通じてイベントの意味を知ることができます。リクエストヘッダーの送信、リクエストヘッダーの送信などのイベント。イベントが異なれば、取得できる交通データも異なります。
まず、パッシブ スキャナーにとってどのトラフィック データがより重要であるかを検討します。パッシブ スキャナーは主に通常のビジネス トラフィックを収集することによってテストを実行し、テストの効率を向上させ、アクティブ スキャナーよりも優れた結果を達成します。一般に、パッシブ スキャナーが最も気にするのは、要求された URL と要求ヘッダーです。POST 要求の場合は、要求本文も必要です。スキャナーにとって、レスポンス ヘッダーとレスポンス ボディはそれほど重要ではありません。むしろ、レスポンスのステータスによってフィルタリングすることができます。通常は、正常に応答できるリクエスト ヘッダーとリクエスト ボディのみが必要です。
パッシブ スキャナーの上記の要件については、chrome.webrequest の 2 つのイベント onBeforeRequest と onSendHeaders で要件を満たすことができます。前者によりリクエストボディを取得できます。後者により、リクエストヘッダーを取得できます。ただし、onSendHeaders を使用する場合は、次の点に注意する必要があります。
互換性の問題
Chrome 79 以降、Origin リクエスト ヘッドを取得するには、opt_extraInfoSpec で extraHeaders を指定する必要があります。 Chrome 72 以降、次のリクエスト ヘッダーを取得するには、opt_extraInfoSpec で extraHeaders を指定する必要があります:
Accept-Language
Accept-Encoding
Referer
Cookie
これらのリクエスト ヘッダーが価値があることは疑いの余地がありません。これらのリクエスト ヘッダーを取得するには、opt_extraInfoSpec で extraHeaders を指定して、対応するリクエスト ヘッダーを取得する必要があります。なお、旧バージョンのブラウザでは属性を指定する必要はなく、互換性チェックにも注意してください。
const headers = version >= 72 ? ["requestHeaders", "extraHeaders"] : ["requestHeaders"]; chrome.webRequest.onSendHeaders.addListener( beforeSendHeaderHandler, requestFilters, headers )
requestBody 形式の問題
POST リクエストのリクエスト本文は、onBeforeRequest イベントを通じて取得できます。ただし、注意すべき点が 1 つあります。リクエスト本文は chrome.webrequest で解析されるため、取得されるのはネイティブのリクエスト本文ではないということです。リクエストボディは requestBody の fromData にあり、formData には実際には 2 つのフォームがあります。1 つはキーと値のペアの形式の辞書です。このタイプのリクエストボディは通常 multipart/form-data または application/x-www-form です-urlencoded. 一般的には、a=xxx&b=xxx&c=xxx の形式が一般的で、もう一方はネイティブ バイトです。この公式 API ドキュメントでは直接言及されていません。データを自分で手動で解析する必要があります。
const postbody = decodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(details.requestBody.raw[0].bytes)));
RequestFilter を使用してリクエストをフィルタリングする
如果你希望在事件中可以过滤特定的请求地址或者请求的资源类型,那么就可能需要使用到 RequestFilter 了。RequestFilter 里面有4个属性,比较重要的属性就是 urls 以及 types,通过这两个属性就可以过滤特定的请求 URL 以及资源类型。
但是注意一点是,RequestFilter 是在注册事件的时候配置的参数的,不可以后续直接修改。不过有一种方法是先移除监听事件,再添加新的事件。
if (!chrome.webRequest.onSendHeaders.hasListener(beforeSendHeaderHandler)) { chrome.webRequest.onSendHeaders.addListener( beforeSendHeaderHandler, requestFilters, headers ) }
Burp 插件篇
Burp 是渗透测试中不可缺少的工具之一,而 Burp 插件也让测试者如虎添翼,达到事半功倍的效果。同时,开发 Burp 插件也是为了弥补一些系统无法在 Chrome 中使用的场景来进一步地补充。
Burp 插件开发的资料网上不是特别的丰富,之前也写过一篇文章“如何写一个 Burp 插件”。其实开发 Burp 插件比较简单,只要遵守基本的规范,然后学习一下 API 的使用,基本就可以完成 Burp 插件的开发了。反倒是如果希望在 Burp 插件中开发 GUI 有点困难,因为使用 J**A 来写 GUI 比较麻烦,毕竟不能像 C# 那样,妥妥拽拽就搞定了,不过这也不是本文的重点。
其实在 Burp 中的 Extender 标签页中的 APIs 就可以看到提供的 API 接口。基本上每个函数都有参数说明的注释,不过其实学习 Burp 插件的最好的方法就是拿一个现成的插件代码看一下,就可以很好地理解这些 API 的作用了。
public interface IHttpListener{ /** * This method is invoked when an HTTP request is about to be issued, and * when an HTTP response has been received. * * @param toolFlag A flag indicating the Burp tool that issued the request. * Burp tool flags are defined in the * <code>IBurpExtenderCallbacks</code> interface. * @param messageIsRequest Flags whether the method is being invoked for a * request or response. * @param messageInfo Details of the request / response to be processed. * Extensions can call the setter methods on this object to update the * current message and so modify Burp's behavior. */ void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo); }
在这,以我开发的 Burp 插件 r-forwarder-burp 为例,使用 J**A 开发。在开发 Burp 插件需要注意几点。必须定义一个 BurpExtender 类,并且必须实现 IBurpExtender,如果还需要其他 API 可以实现多个其它接口,J**A 中的类是可以实现多个接口的。另外还需要重写父类中的 registerExtenderCallbacks 方法。同样,针对被动扫描器的需求,在 Burp 插件中我们最主要涉及的接口是 IHttpListener 接口。这个主要涉及到 HTTP
在 processHttpMessage 方法中,主要涉及到以上3个参数。toolFlag 主要指的是和请求相关的 Burp 工具,比如 Proxy 以及 Repeater。可以在 IBurpExtenderCallbacks 接口中看到相应的定义。
messageIsRequest 则表示是请求还是响应,而我们只关心请求部分。通过解析 messageInfo 则可以获取请求头以及请求体数据。
public Map<String, String> getHeaders(IHttpRequestResponse messageInfo) { Map<String, String> headers = new HashMap<>(); IRequestInfo analyzeRequest = helpers.analyzeRequest(messageInfo); List<String> h = analyzeRequest.getHeaders(); for (String h1: h) { if (h1.startsWith("GET") || h1.startsWith("POST")) { continue; } else { String[] header = h1.split(":", 2); headers.put(header[0], header[1].trim()); } } return headers; } private String getBody(IHttpRequestResponse messageInfo) { IRequestInfo requestInfo = helpers.analyzeRequest(messageInfo); int bodyOffset = requestInfo.getBodyOffset(); byte[] byteRequest = messageInfo.getRequest(); byte[] byteBody = Arrays.copyOfRange(byteRequest, bodyOffset, byteRequest.length); return new String(byteBody); }
上面是简单开发的内容方面的介绍,其它方面可以直接看源代码了解更多,尤其是 GUI 开发的部分。另外想说明的一点就是如何打 jar 包。通过 maven-assembly-plugin 插件可以很方便地打包,只需要配置如下,然后通过 mvn package 即可进行打包。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration></plugin>
另外注意如果使用了外部依赖的时候,需要配置 jar-with-dependencies,这样在打包的时候就可以把依赖的 jar 包一并打进去。最后,成品的 jar 包安装之后就可以使用了。
其实,我认为在 Burp 插件开发过程中最重要的部分就是调试了。通过调试可以快速提高开发效率。以 IDE IDEA 为例,只需要以下几步就可以进行插件开发地调试:
1.配置 debug 配置项,点击 IDE 右上角就可以新增配置项。
在终端中通过上述的配置项启动 burp 插件。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar burpsuite_community_v2.1.0.jar
2.在 Burp 中通过上面的方式安装打包好的插件。
3.在 IDE 中相应的代码打上断点,并打开 debug 就可以进行调试了。
总结
以上就是在开发被动扫描器 Chrome 插件以及 Burp 插件遇到的一些坑,在这里和大家分享一下。其实被动扫描器开发,最重要的还是一些细节方面的考虑,可以将插件的功能做到更完美。
相关文章教程推荐:web服务器安全教程
以上がパッシブ スキャナ プラグインの開発時に発生するいくつかの問題の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。