CTF

ParrotOSで作る、ぼくのかんがえた最強のハッキングマシン【CTF/HackTheBox】

趣味でプログラミングとかセキュリティを勉強してます。

最近は、“Hack The Box”や”Try Hack Me”のようなペネトレーションテストの学習プラットフォームや、CTFでよく遊んでいます。

今回は、普段“Hack The Box”やCTFで使っているParrotOSの環境を立て直すことにしたので、備忘録代わりにセットアップ方法についてまとめておこうと思い、この記事を書きました。

この記事では以下についてまとめました。

  • ParrotOSをインストールした後に行う設定
  • HackTheBoxとCTFのためにインストールするアプリケーション
  • GhidraのDebuggerビルドのセットアップ
  • セットアップ後のあれこれ

記事について

本記事の内容は社会秩序に反する行為を推奨することを目的としたものではございません。

自身の所有する環境、もしくは許可された環境以外への攻撃の試行は、「不正アクセス行為の禁止等に関する法律(不正アクセス禁止法)」に違反する可能性があること、予めご留意ください。

またすべての発言は所属団体ではなく個人に帰属します。

ParrotOSとは?

Parrot Securityの開発しているDebianベースのLinuxディストリビューションです。

ペンテストやリバースエンジニアリング向けのディストリビューションで、Kali Linuxとよく似たディストリビューションです。

様々なペネトレーションテスト向けのツールがデフォルトで入っています。

ParrotOSはHackTheBoxとも連携して開発されています。

参考:HTB News | Hack The Box + Parrot OS

なぜParrotにしたのか

Parrotは1年弱使ってますが、アップグレード時の手間が体感的にKaliの100倍少ないです。 (OSが起動しなくなったりしないので)

このアップグレードの手間とトラブルが少ないという1点だけでParrotを使っていると言ってもいいかもしれません。

あとはUIが綺麗で使っていて楽しいOSかなと思います。

ウィンドウの操作ボタンが左上についているので、Macユーザの人はParrotの方が使いやすく感じるかもしれません。

僕はゴリゴリのWindow派ですが、Parrotの操作感は結構快適なのでおすすめです。

f92d52d7-2a95-0e25-b46b-41b28bc3296c.png

ParrotOSの初期設定

パッケージをアップグレードする

とりあえず最初にパッケージのアップグレードをしておきます。

※初回は結構時間かかります(環境によっては1時間以上)

ちなみに、ParrotOSは公式がapt upgradeを使用することを推奨していません。

そのため、以下のようなfull-upgradeparrot-upgradeを使ってパッケージを更新します。

sudo apt clean
sudo apt update
sudo apt full-upgrade --fix-missing -y
sudo apt autoremove -y

しばらく待った結果、依存関係とかでたまに失敗することが結構ありますが、そんなに嫌がらなくて大丈夫です。

大抵はアップグレードにこけたパッケージを先にアップグレードしてあげれば解消されます。

今回は特に何の問題もなくパッケージがアップグレードされました。

ちなみに、途中で出てくるWireSharkのポップアップは[Yes]を選んでます。

image-20210522113455941.png

他にもいくつかポップアップが出てきますが、自分の環境に合わせて適当に選んでください。

ネットワークIPを設定する

次にネットワークの設定をします。

僕の環境では、Parrotに外部接続用と内部環境用の2つのNICを設定しています。

外部接続ネットワークのIPは固定せずDHCPにしておいて、ホストからRDPをするための内部ネットワークのIPを固定すると、ホストのネットワーク環境が変わっても同じように使用できるので便利です。

各NICの設定は、[Advanced Network Configration]を使うと簡単に設定できます。

5b766783-a60d-f460-e39f-e5153589ec5b.png

RDPを設定する

ネットワークIPを固定したところで、Windows環境から快適に仮想マシンを操作するためにRDPを設定します。

まずは必要なパッケージをインストールします。

sudo apt install -y xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp

XRDPを使うときは、仮想マシンに誰もログインしていない必要があります。

そのため、一旦仮想マシンを再起動、もしくはログオフしてから、RDP接続を行ってください。

追加パッケージをインストールする

個人的によく使うパッケージを先にインストールしておきます。

特にパッケージの詳細については解説しません。

sudo apt install \
                 vim \
                 make \
                 git \
                 python3.9 \
                 python3-pip \
                 python3.9-dev \
                 unzip \
                 zip \
                 build-essential \
                 gdb \
                 radare2 \
                 ltrace \
                 strace \
                 xdotool \
                 -y

日本語入力に対応させる

次に、Parrotを日本語入力に対応させます。

まずはこちらをインストール。

sudo apt install fcitx-mozc

次に、[System]>[Preferences]>[Other]から、[Fcitx Configration]を開きます。

c2fe6eeb-554e-2232-f6f5-6eb02b094eaf.png

ここで、[Input Method]にMozcを追加した後、[Global Config]タブで[Trigger Input Method]を[Zenkakuhankaku]に設定します。

23925996-421b-fb0f-b47c-f2b689c8faba.png

これで、Parrotで日本語入力ができるようになりました。

ちなみに、Mozcの設定がデフォルトのままだと日本語入力の時にスペースが全角になって鬱陶しいので、こちらの設定も変えてあげると幸せになれるかもしれません。

Mozcの設定は、[System]>[Preferences]>[Other]から、[Mozc Settings]を開きます。

ここで[Space input style]を半角に設定します。

17a76c6a-f900-b263-906a-fb2e79aca864.png

OS起動時の入力設定を英字にする

現在aptでインストールされるfcitx-mozcのバージョンでは、OSの起動時に必ずかな入力で始まり、これは仕様上変更ができないようです。

このためだけに自分でパッチを当てるのも面倒なのでコマンドで対応しました。

以下のコマンドをスタートアップアプリケーションに設定するだけです。

xdotool key ctrl+alt+t && xdotool key Zenkaku_Hankaku

これでOS起動時に英字モードで開始することができます。 (ターミナルの起動ショートカットをCtrl+Alt+Tに割り当てておく必要があります。)

ALIASを設定する

.bashrcなどに、以下を追記します。

以下の例は、よく使っているアーカイブ解凍コマンドのエイリアスです。 あと、よく使うPython2とWineのコンテナ起動コマンドもエイリアス化してます。

好みに合わせて色々設定しておくといいと思います。

alias tarbz2='tar -jxvf'
alias targz='tar -zxvf'
alias tarxz='tar -Jxvf'

alias run_python2='docker run --net host --rm -it -v $PWD:/app python2 bash'
alias run_wine='docker run --rm -it --user ubuntu -v $PWD:/usr/app wine32 bash'

メニューバーの位置を変更する

デフォルトだと下部にあるメニューバーを右クリックして[Properties]をクリックすると、設定ウィンドウが開きます。

ここで[Orientation]の項目を変更するとメニューバーの位置が変更できます。

僕は大体左に設定しています。

1b802911-76aa-4fef-63b0-386913a7ada2.png

自動アップデートウィンドウを無効にする

起動時に毎回アップデートの確認ウィンドウが表示されるのが煩わしいので、自動アップデートを無効に設定します。

上部の[System]から、[Synapic Package Manager]を開きます。

7c182d4a-4f62-423e-5e7d-9b1dde60c8a8.png

初回起動時のウィンドウのチェックを外したままにして先に進めば、以降の起動時にアップデートの確認ウィンドウがポップアップされなくなります。

58a81f40-c281-473b-117b-98e46e00401f.png

あとは、[Startup Application]から、[System Updater]を無効化します。

image-20210522152103031.png

これで起動時にポップアップがでることがなくなります。

タイムゾーンを変更する

右上の時刻をクリックして[Location]を開き、[Edit]をクリックします。

ここで[Locations]にJapanを追加します。

image-20210521193540448.png

次に[Tokyo]の隣の[Set …]ボタンをクリックしてタイムゾーンを変更します。

これで時刻設定が反映されます。

ターミナルの設定を変更する

Parrotでは、デフォルトのターミナルがMATEになってます。

これは好みの問題ですが、この設定を少しいじります。

ターミナルの[Edit]>[Profiles]から設定一覧を開き、編集していきます。

とりあえず配色をSystem themeにして、背景の透明度も調整しました。

7da80db2-bd8e-5fc8-fd45-0c4833ce0476.png

[Keyboard Shortcuts]からショートカットの割り当ても変更できます。

好みに合わせて編集してます。

OSのショートカットキーを変更する

初期設定では、ターミナルを起動するショートカットがUbuntuと異なり使いづらいので、[Keyboard Shortcuts]を開いて[terminal]のショートカットを追加してます。

image.png

GithubにSSHキーを登録する

ssh-keygenで作成した公開鍵をGithubに登録します。

詳しくはConnecting to GitHub with SSH - GitHub Docsまで。

自動スリープを無効にする

[Power Management Preferences]を開いて、Displayの自動スリープを無効にします。

初期設定だと30分に設定されています。

3c912975-aaa2-4be4-03c3-a9c52f0fd83c.png

各種ツールをインストールする

僕が個人的にセットアップしているツールについてまとめます。

入れなくても特に問題はありません。

※ツールの記載については必要に応じて編集していきます。

Google Chrome

Google Chrome - Download the Fast, Secure Browser from Google から、debパッケージをダウンロードします。

sudo dpkg -i xxx.debコマンドでChromeをインストールできます。

VSCode

Visual Studio Code – コード エディター | Microsoft Azureから、debパッケージをダウンロードします。

sudo dpkg -i xxx.debコマンドでインストールできます。

拡張機能はお好みに合わせてインストール。

Symlinksの設定は無効化しておくと、変なタイミングでCPUリソース消費しなくなるのでいいかと思います。

image-20210522151845462.png

他にも、files.watcherExcludeやメモリ上限など、コンピュータリソースの負荷につながる設定項目がいくつかあるので、必要に応じてチューニングします。

Docker

Ubuntuのインストール方法とほぼ同じ手順でインストールできます。

Install Docker Engine on Ubuntu | Docker Documentationを参照。

ただし、リリースバージョンを取得するコマンドはParrotではうまく動作しないので、今回は’focal’を明示的に指定します。

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Dockerのインストールが終わったら、以下のコマンドでsudo権限なしでも使えるようにします。

sudo gpasswd -a $USER docker
sudo service docker start --enable

これで構築は完了です。

Dockerのよく使うイメージやコマンドについては後述します。

JDK

解凍したファイルを適当なディレクトリに配置します。

次に、PATHを追加しておきます。

sudo mv jdk-11.0.11+9 /usr/local/lib/jdk-11.0.11+9
echo "PATH=$PATH:/usr/local/lib/jdk-11.0.11+9/bin" >> ~/.bashrc

Ghidra

お馴染み最強ツールです。

最近のRevのWriteUpとかだとみんなGhidra使ってますね。

GhidraからGhidraをダウンロードして解凍します。

解凍したファイルは適当なフォルダに配置します。

どこからでも呼び出せるように、ghidraRunの配置されたフォルダをPATHに追加してあげるといいと思います。

echo "PATH=$PATH:/home/parrot/Tools/Ghidra/" >> ~/.bashrc

ちなみにGhidraですが、現在はまだメジャーリリース版には実装されていないデバッガ機能を使っていきたいニーズがあると思います。

その場合は、GhidraリポジトリのDebuggerブランチのソースコードから自分でビルドします。

ビルド方法は後述するので、やりたい方は参考にしてください。

Universal Radio Hacker (URH)

MiscとかRevやるときにたまに使うやつです。

適当なディレクトリで仮想環境を切ります。

pipenv install
pipenv shell
pip install urh

angr

Rev問やるときの神ツールです。

使い方はangrによるシンボリック実行でRev問を解いてみたまとめ【WaniCTF2021】で結構詳しく書きました。

適当なディレクトリで仮想環境を切ります。

pipenv install
pipenv shell
pip install angr

pwntools

CTFで使うツール全部のせみたいなライブラリです。

あんま競合しないのでグローバルにつっこみます。

pip install pwntools

PyCryptodome

暗号化機能が使えるようになるPythonのライブラリです。

これは他のパッケージと競合せずに使えるので、普通にグローバルにインストールします。

pip install pycryptodome

Ciphey

暗号化をいい感じに解除できます。

適当なディレクトリで仮想環境を切ります。

pipenv install
pipenv shell
python3 -m pip install ciphey --upgrade

PostMan

最近知ったのであまり使ってないですが、API叩くときの神ツールです。

Download Postman | Try Postman for Freeからダウンロードしたファイルを解凍します。

解凍したら使えます。

PATHも追加しておきます。

echo "PATH=$PATH:/home/parrot/Tools/Postman" >> ~/.bashrc

GIMP

ステガノやるときにたまに使います。

デフォルトで入ってます。

CopyQ

コピペ用ツールです。

Ctrl + ;とかで直近のクリップボードを呼び出せたりして意外とよく使います。

インストールはaptで。

sudo apt install copyq -y

ちなみに再起動時にはcopyqを毎回呼び出さないと動きません。

自動起動する設定がありそうですが、探すのが面倒なのでprofileで毎回起動するように設定してます。

Eclips

Eclipse downloads - Select a mirror | The Eclipse FoundationからLinux向けパッケージをダウンロードします。

解凍したら使えます。

PATHも追加しておきます。

echo "PATH=$PATH:/home/parrot/Tools/eclipse" >> ~/.bashrc

Wine

WineとMingwをインストールします。

sudo apt install wine mingw-w64 mingw-w64-common mingw-w64-i686-dev mingw-w64-tools mingw-w64-x86-64-dev -y

Wineはあまり使いたくないので、あくまでちょっとした検証用です。

PEバイナリの解析などは別にWindowsマシンを用意してます。

GDB-PEDA

Toolsディレクトリの直下に、GDB-PEDAをクローンして設定します。

git clone https://github.com/longld/peda.git ~/Tools/peda
echo "source ~/Tools/peda/peda.py" >> ~/.gdbinit

RustScan

Releases · RustScan/RustScan · GitHubからdebパッケージをダウンロードします。

sudo dpkg -i xxx.debコマンドでインストールできます。

FZF

なんかファイル検索が楽になるやつです。

git clone --depth 1 https://github.com/junegunn/fzf.git ~/Tools/.fzf
~/Tools/.fzf/install

Gobuster/Feroxbuster

Gobusterはデフォルトで使えます。

Feroxbusterは使いたければ入れるといいと思います。

これでdebパッケージをダウンロードできます。

wget https://github.com/epi052/feroxbuster/releases/latest/download/feroxbuster_amd64.deb.zip
unzip feroxbuster_amd64.deb.zip

sudo dpkg -i xxx.debコマンドでインストール。

ついでにrockyou.txtも先に解凍しておきます。

sudo gunzip /usr/share/wordlists/rockyou.txt.gz

BurpSuite

BurpSuiteはデフォルトで無料版がインストールされてます。

Chromeをインストールした後ならFirefoxはほとんど使わないので、Burp専用ブラウザとしてプロキシ設定を行っておくと、いちいち設定を変えなくて済むので楽です。

image-20210522152341267.png

SourceTrail

最近OSS化された、ソースコードを可視化できるツールです。

Releases · CoatiSoftware/Sourcetrail · GitHubからダウンロードします。

解凍したディレクトリに移動して、sudo ./install.shを実行すればインストール完了です。

YARA

YARAです。

YARAはCTFではあまり使いませんが、僕が個人的に好きで、コントリビューションもしたりしているツールなので、必ずインストールしてます。

aptでインストールできるバージョンは少し古いので、ソースコードからビルドします。

Releases · VirusTotal/yara · GitHubから、最新のソースコードをダウンロードできます。

前提要件のパッケージはここまでですでにインストールが完了しているので、以下のコマンドを叩けばOKです。

./bootstrap.sh
./configure
make
sudo make install

このままだと、ライブラリを参照できずYARAが起動しないので、/etc/ld.so.confにライブラリのPATHを追記します。

sudo echo "/usr/local/lib" >> /etc/ld.so.conf
sudo ldconfig

これで、最新ビルドのYARAがインストールできました。

$ yara -v
4.1.0

Qemuとクロスコンパイル環境

ARM向け実行ファイルとかをコンパイルして解析したり、実行したりしたいときありますよね。

問題ファイルがARM向けバイナリのときとか。

そんな環境を作ります。

sudo apt install qemu-user-binfmt qemu-efi qemu-efi-aarch64 qemu-efi-arm qemu-system qemu-system-arm qemu-system-common qemu-system-x86 qemu-system-misc qemu-utils -y

次に、クロスコンパイル用のツールをインストール。

sudo apt install g++-arm-linux-gnueabihf

x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめ - Qiitaを参考にしました。

AWS CLI

HackTheBoxとかでたまにAWS問題が出るときに、CLIがほしくなる時があります。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

impackets

SMBパケットとかを使ってマシン攻略するときなどに使うツールです。

Python2系のpipを使用する必要があり、Parrotにそのまま入れることができないのでDockerを使います。

git clone https://github.com/SecureAuthCorp/impacket
cd impacket
docker build -t impacket .

Tweak

バイナリエディタです。

VSCodeのバイナリエディタ拡張やhexeditorも使いますが、Tweakはバイナリデータの追加や削除ができるのが強みです。

sudo apt install tweak

最低限のコマンドだけよく忘れるので貼っておきます。

^X^I : Insert
^X^S : Save
^X^C : Exit

creddump

Forensicで使います。

使いかたは、CiscoCXSecurity/creddump7を参照。

USB keybord parser

USB pcapから入力された値をパースしてくれます。

ダウンロードは以下のリポジトリから。

TeamRocketIst/ctf-usb-keyboard-parser: This is the updated script from https://teamrocketist.github.io/2017/08/29/Forensics-Hackit-2017-USB-ducker/

Docker環境を構築する

Docker環境でよく使うのは以下のイメージです。

  • Python2
  • Ubuntu16.04
  • php
  • node
  • impackets

自分の環境で使うときには、一部カスタマイズしたDockerfileからイメージを作成してます。

## Python2
​```
docker build -t python2 .
docker run --rm -it -v $PWD:/app python2 bash
docker run --net host --rm -it -v $PWD:/app python2 bash
​```

## Ubuntu16
​```
docker build -t ubuntu16 .
docker run --rm -it -v $PWD:/app ubuntu16 bash
docker run --rm --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" -it -v $PWD:/app ubuntu16 bash
​```

## PHP
​```bash
docker build -t php .
docker run --rm -it -v $PWD:/root php bash
​```

## node
​```
docker pull node
docker run --rm -it -v $PWD:/root node bash
​```

## impackets
​```
git clone https://github.com/SecureAuthCorp/impacket
cd impacket
docker build -t impacket .
docker run --net host --rm -it -v $PWD:/root impacket bash
​```

特にPython2.7のpipが動くイメージは、2系でしか動かないエクスプロイトコードを動かすのに頻繁に使います。

Dockerのrunコマンドで引数に--net hostを与えれば、ホストのネットワークをコンテナから使用できます。

なので、ホストが構築したVPNコネクションを通して、コンテナからエクスプロイトコードを実行できるわけです。

Ghidraのデバッガブランチをビルドする

公式リポジトリより、Ghidraのビルドには次のアプリケーションが必要です。

  • JDK 11 64-bit
  • Gradle (minimum v6.0)
  • make, gcc, and g++ (Linux/macOS-only)
  • Microsoft Visual Studio (Windows-only)

ここまでの手順でGradle以外はすべてセットアップされているので、まずはGradleをインストールします。

unzip gradle-7.0.2-all.zip
sudo mv gradle-7.0.2 /opt/gradle
echo "PATH=$PATH:/opt/gradle/bin" >> ~/.bashrc

次に、Ghidraのdebuggerブランチをクローンして、Gradleを使ってビルドします。

git clone -b debugger https://github.com/NationalSecurityAgency/ghidra.git
cd ghidra
gradle -I gradle/support/fetchDependencies.gradle init
gradle buildGhidra

初回ビルドは結構時間かかります。

ちなみに、この記事を書いているときには、上記のドキュメントの手順だと以下のエラーがでてビルドに失敗しました。

> Task :Graph:ip FAILED
FAILURE: Build failed with an exception

こういうときはあまり焦らず、Ghidraのリポジトリのissueをエラー文で検索してみてください。

大抵の場合類似の事象の解決策がすでに提示されています。

今回はTask :GraphServices:ipでビルドにこけていたので、issueのアドバイスを参考に以下のコマンドを実行したところビルドが成功しました。

gradle buildGhidra -x ip

ビルドに成功すると、ghidra/build/dist/ghidra_10.0_DEV_20210523_linux64.zipというファイルが作成されていました。

あとはこれまでと同様の手順で、解凍したディレクトリを、PATH設定してあるディレクトリと置き換えれば、ghidraRunでビルドしたfutureバージョンが起動するようになります。

mv ghidra_10.0_DEV ~/Tools/Ghidra

Debuggerビルドでは、いつものドラゴンのアイコンの横に虫のアイコンが追加されています。

6d2c1c54-1af3-2bae-9c04-8acd9ffdb572.png

起動したら、右上の[File]から解析する実行ファイルを読み込みます。

適当な位置を右クリックして[Toggle Breakpoint]を選択すると、右側のBreakpointウィンドウに追加されます。

d9274723-d00a-42dc-447b-bce773d7bf98.png

デバッガを実行するときは、[Debugger]から使用するデバッガを選択して呼び出せばOKです。

a618c8f8-5136-c181-8991-335b925fb740.png

デバッガ機能のメジャーリリースが楽しみですね。

セットアップが終わったら・・・

ゴミを片づける

ゴミ掃除をしましょう。

Downloads配下に大量のファイルが残っているので、ちゃんと消しておきます。

また、ここまで.bashrcに追加してきたPATHも、一つにまとめて.bash_profileに入れてあげる方がスマートかと思います。

export PATH=$PATH:xxxxxxxxxx >> ~/.bash_profile

また、ここまでの内容では発生してないと思いますが、不要なコンテナイメージが残存している場合も考えられるので、Dockerしぐさとしてpruneを叩いておきます。

docker image prune

スナップショットをとる

次にアップデートなどの更新作業を行うときは、できるだけセットアップ直後のクリーンな環境をベースにやりたいです。

なので、スナップショット(Hyper-Vならチェックポイント)は必ず設定します。

イメージをエクスポートする

バックアップと環境保全をかねて、イメージをエクスポートします。

ここまでのセットアップ内容だと大体30GB弱くらいになると思います。

僕は64GBのUSBメモリにCTF用のParrotとWindows10のイメージを入れてます。

ギリギリ入ります。

まとめ

とりあえず環境を再構築するついでに、構築手順の備忘録としてこの記事を書いてみました。

ぜひ、「こんな便利なツールあるよ!」などあればコメントいただけますと幸いです。

また、記載の内容についての質問事項などもあればぜひお気軽に。

COMMENT

メールアドレスが公開されることはありません。