BurpSuite からの Christmas Present

これは シーエー・アドバンス [Advent Calendar2022](https://qiita.com/advent-calendar/2022/ca-advance) 25日目の記事です。
前回の記事は @asami-H-Ishi さんの [AppSheetとGASでスマホでJANコードを読み取る在庫管理Appを作ってみた](https://qiita.com/asami-H-Ishi/items/6f65e0b3e7df848e40ad) でした。
## はじめに
初めまして。
シーエー・アドバンス（CAAD）技術統括本部セキュリティチームの @azama_yasuhiroです。
今日はクリスマスということで BurpSuite (以下 Burp とする)というプロキシーツールの Extender (拡張機能)を使用して Burp から Ascii Art の Christmas Present をもらいたいと思います。
 Burp の Extender は Java・Python・Ruby の言語を使用できるのですが、今回は Python を使用して作成してみました。
## 事前準備
まずはじめに Python 環境を準備するため Jython の[公式サイト](https://www.jython.org/download.html)より Jython Standalone の jar ファイルをダウンロードします。
![Jython Standalone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517080/4e3f43d3-5481-6fc7-db02-f6593cbb5951.png)

次に Burp を起動し Extentions の Options タブの Python Environment にてダウンロードした Jython Standalone の jar ファイルを設定します。
![pythonenvironment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517080/c1ff89c7-d293-2d39-0265-827a86ef07fb.png)
設定方法は Burp の公式サイトにも記載がありますので、詳しく知りたい方は[こちら](https://burp-resources-ja.webappsec.jp/Documentation/burp/documentation/desktop/tools/extender/index.html#python-environment)をご参照ください。
これで Python 環境の準備が完了です。
次に表示する Ascii Art の設定をしていきます。
画像を Ascii Art に変換する際にこちらのコマンドを使用しています。
```
ascii-art images/sample.jpg --width 100 --height 50 --font "Arial" --invert --normalize
```
※参照
https://dawsonbooth.github.io/ascii-art/
ascii-art コマンドにファイルのパスを指定し、width と height でサイズを、font で使用するフォントを指定しております。
こちらのコマンドを使用する際にエラーで`OSError: cannot open resource`が出て少し悩んでしまったのですが、 ascii_art の \_\_init__.py ファイルの font を指定してあげることで解消しました。
同じようなエラーが出た際は試してみてください。
```__init__.py
font = ImageFont.truetype(font)
↓　修正後
font = ImageFont.truetype("arial.ttf")
```
あとは好きな画像を images フォルダに保存してあげることでコマンドを実行できます。
これで全ての準備は完了です。
## ソースコード概要
実際の記述がこちらです。
```python
# -*- coding: utf-8 -*-
from burp import IBurpExtender,ITab
from javax.swing import JPanel,JTextArea
from java.io import PrintWriter
from java.awt import BorderLayout,Font
```
今回の Extender では IBurpExtender,ITab をインポートしており、IBurpExtender は Burp のExtender 作成に必ず必要となっております。ITab は Extender を読み込んだ際のカスタムタブの設定に使用します。
また、コンポーネントの設定で javax.swing 、UI の設定で java.awt、 データの出力で java.io をそれぞれインポートし使用しております。
それぞれ`,`で複数指定できるようになっています。
```python
class BurpExtender(IBurpExtender,ITab):
    def __init__(self):
        self.asciiart = ("ここにアスキーアートをべた書きしてます")
        self.asciiart2 = ("ここにアスキーアートをべた書きしてます")
        self.asciiart3 = ("ここにアスキーアートをべた書きしてます")
        #タブの名前
        self.tab = ("Christmas Present")
```
BurpExtender というクラスを使用して内容を記述していきます。
\_\_init__(self) にて使用するインスタンスを作成していきます。
早速ここで \_\_init__(self) が何を意味するかわからず詰まってしまったのですが、
下記の記事を参考に**クラス構造で情報を保持するための重要な構文として必要**ということで少し理解ができました。
※参照
https://qiita.com/ishigen/items/2d8b6e6398743f2c8110
```python
     def getTabCaption(self):
         return self.tab
```
getTabCaption にて先程指定したタブの名前を設定しています。
```python        
    def getUiComponent(self):
        #タブで使用するコンポーネント
        panel = JPanel(BorderLayout())
        asciiart = JTextArea(self.asciiart3)
        asciiart.setFont(Font(Font.MONOSPACED, Font.PLAIN, 12))
        panel.add(asciiart)
        return panel
```
getUiComponent にてタブ内で使用するコンポーネントの設定をしていきます。
JPanel でレイアウトを指定して JTextArea で Ascii Art を表示するのですが、ここで表示崩れがおきてしまいました。
かなり悩んでしまいましたが、フォントを指定することで表示崩れなく綺麗に表示することができました。
```python
    def registerExtenderCallbacks(self, callbacks):
        #Extensionの名前付け
        callbacks.setExtensionName("Christmas Present")
        #タブの作成
        callbacks.addSuiteTab(self)
        #output,errors出力
        output = PrintWriter(callbacks.getStdout(), True)
        errors = PrintWriter(callbacks.getStderr(), True)
        output.println(self.asciiart)
        errors.println(self.asciiart2)
```
registerExtenderCallbacks にてそれぞれの設定をしています。
今回使用している以外にも issueAlert で Dashboard に警告メッセージを表示したり、
様々なメソッドが用意されているため、今後また Extender を作成する際にどんどん活用できればと思っています。
## Christmas Present Extender 起動
長くなってしまいましたが、やっとここから実際に作成した Extender を使用して Christmas Present をもらいたいと思います。
まずは Extender を読み込みます。
 Extender を読み込んだ最初は Output が表示されるので、サンタさんからプレゼントをもらえるようにクリスマスツリーを用意しました。
![Output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517080/9ca303f0-7b2a-4116-4eab-f223bfe6905d.png)
次に Errors のタブを見てみましょう。
![Errors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517080/e0ab6b9c-bb85-c140-6bfd-422d486bb7c5.png)
おっと！ Errors のタブだけにサンタさんがまだプレゼントを袋に詰めてる状態でしたね。

それでは最後に読み込まれたタブを見てみましょう。
![MERRYXMAS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517080/9acf1e63-2ec8-951b-b0b3-b85f7bcaa8ea.png)
無事サンタさんからプレゼントを貰えてみんなも喜んでいますね。

**MERRY XMAS!!!**
## 終わりに
今回 Burp の Extender を作成するにあたり Python の基礎の勉強からはじめました。
簡単な記述のみにもかかわらず詰まることも多く勉強不足を痛感しましたが、
おかげで Burp への理解も少し深まったかと思います。
今後は実際に業務で使用できるような Extender を作成し、知見を深めて行きたいと思います。
最後まで読んでいただきありがとうございます。
**この記事を読んでいる皆様に素敵なクリスマスが訪れますように。**