概要
Hack The Box(以下、HTB)のRetiredチャレンジであるWeak RSAのwriteupです。
環境
-
実行環境
dockerでkali linuxのコンテナを立てて解析しました。 -
使用ツール
- RsaCtfTool
- CyberChef
環境構築
低スペックWindowsマシンを利用しており、VMwareなどでkali linuxの環境構築をすると反応が遅くてフラストレーションがたまるため、dockerで最低限の環境構築を行います。
あまり同じような状況の方はいないかと思うので、ここはざっくりでいきます。
1. Docker Desktopの準備
こちらでDocker Desktopをダウンロードし利用環境を構築してください。
詳細なやり方は別途お調べください。
2. kali linuxのコンテナイメージからコンテナ作成
https://www.kali.org/docs/containers/official-kalilinux-docker-images/
https://hub.docker.com/r/kalilinux/kali-rolling
この辺の情報を参考にkali linuxのコンテナを作成してください。
わたしはコンテナ作成時にHTB用の作業用フォルダをマウントし、ローカルのファイルを直接操作できるようにしました。
kali-rollingイメージの場合、作成するだけでは何も入っていないので、
apt update && apt -y install kali-linux-headless
を実行して、最低限のパッケージを導入します。
3. RsaCtfToolの導入
RsaCtfToolはCTFなどでRSA暗号の解析を行うために作成されたツールです。
2023/6/14時点ではPython3.9が必要です。
https://github.com/RsaCtfTool/RsaCtfTool
-
作成したkali lunuxコンテナ上で以下のコマンドを実行
git clone https://github.com/RsaCtfTool/RsaCtfTool.git ~/RsaCtfTool apt install libgmp3-dev libmpc-dev cd ~/RsaCtfTool
公式ではここでrequirements.txtのインストールを行いますが、私が実行した時点ではほかのライブラリと競合してWarningが出ました。
今回はこれによるエラーなどを避けるために仮想環境にライブラリをインストールします。python -m venv venv source ./venv/bin/activate pip install -r requirements.txt
RsaCtfToolを利用するときはこの仮想環境に入って実行します。
Walkthrough
1. 対象ファイルのダウンロード
HTBのWeak RSAのページから対象のファイルをダウンロードし、作業用フォルダに格納します。
2. ファイルの確認
unzipでファイルを解凍します。
unzip "Weak RSA.zip"
- flag.enc
- key.pub
の2つのファイルが入っていました。
ファイルの素性をfileコマンドとcatコマンドで確認します。
-
flag.enc
dataファイル
なぞの文字列 -
key.pub
ASCIIのテキストファイル
PUBLIC KEYが記載してある
2.5 . RSA暗号に関して
RSA暗号とは公開鍵暗号方式と呼ばれる暗号方式で、
- 送信者は公開鍵でファイルを暗号化して送信
- 受信者は自身の持つ秘密鍵でファイルを復号し使用
という流れで使用される。
公開鍵はオープンに公開されており、だれでも暗号化は可能だが、秘密鍵は厳重に管理されており、秘密鍵を持つ限られた受信者だけが暗号化されたファイルを復号できる。
通常、秘密鍵をもたない攻撃者などは復号できないが、弱いRSA暗号であれば公開鍵から秘密鍵を計算できてしまう。
今回のチャンレンジでは暗号化されたファイル(flag.enc)と公開鍵(key.pub)が渡されていることから、公開鍵から秘密鍵を推測することで暗号化ファイルを復号する問題だと予想される。
3. 秘密鍵の生成
RsaCtfToolを使って秘密鍵を推測する。
3.1 前段
公式によると公開鍵とファイルを指定すると復号してくれる機能があるっぽいが、2023/6/14時点ではうまく動かない。
元コード的には公開鍵と暗号化ファイルのみの指定すると何もせずにexitするように見えるが詳細までは追っていない。
Uncipher file
./RsaCtfTool.py --publickey ./key.pub --uncipherfile ./ciphered_file
これを実行してもそのまま何もせずに終了
そのため、今回は公開鍵から秘密鍵を推定しCyberChefと組み合わせて暗号ファイルを復号する
3.2 秘密鍵の生成
環境構築の際に作成した仮想環境に入る
cd <作業用のディレクトリ>
source ~/RsaCtfTool/venv/bin/activate
公開鍵から秘密鍵を生成する
python ~/RsaCtfTool/RsaCtfTool.py --publickey key.pub --private --output key.pri
実行するとkey.priというファイル名で秘密鍵ができます。
中身を確認します。
4. CyberChefによる復号
CyberChefは無料で使える変換ツールでエンコードや複合などにとても便利です。
ブラウザで使えます。
https://cyberchef.org/
4.1 RSA復号の準備
画面左の検索窓で"RSA"を検索し、でてきた"RSA Decrypt"をひとつ右のRecipeにドラッグアンドドロップする
4.2 ファイルのインポート
右上のOpen file as inputでflag.encを取り込みます。
4.3 秘密鍵の入力
画面中央のRSA Private key(PEM)に先ほど作成した秘密鍵の内容を
-----BEGIN RSA PRIVATE KEY-----
MIICOQIBAAKBgQMwO3kPsUnaNAbUlaubn7ip4pNEXjvUOxjvLwUhtybr6Ng4undL
tSQPCPf7ygoUKh1KYeqXMpTmhKjRos3xioTy23CZuOl3WIsLiRKSVYyqBc9d8rxj
NMXuUIOiNO38ealcR4p44zfHI66INPuKmTG3RQP/6p5hv1PYcWmErEeDewKBgGEX
xgRIsTlFGrW2C2JXoSvakMCWD60eAH0W2PpDqlqqOFD8JA5UFK0roQkOjhLWSVu8
c6DLpWJQQlXHPqP702qIg/gx2o0bm4EzrCEJ4gYo6Ax+U7q6TOWhQpiBHnC0ojE8
kUoqMhfALpUaruTJ6zmj8IA1e1M6bMqVF8srlb/NAiBhwngxi+Cbie3YBogNzGJV
h10vAgw+i7cQqiiwEiPFNQJBAYXzr5r2KkHVjGcZNCLRAoXrzJjVhb7knZE5oEYo
nEI+h2gQSt1bavv3YVxhcisTVuNrlgQo58eGb4c9dtY2blMCQQIX2W9IbtJ26KzZ
C/5HPsVqgxWtuP5hN8OLf3ohhojr1NigJwc6o68dtKScaEQ5A33vmNpuWqKucecT
0HEVxuE5AiBhwngxi+Cbie3YBogNzGJVh10vAgw+i7cQqiiwEiPFNQIgYcJ4MYvg
m4nt2AaIDcxiVYddLwIMPou3EKoosBIjxTUCQQCnqbJMPEQHpg5lI6MQi8ixFRqo
+KwoBrwYfZlGEwZxdK2Ms0jgeta5jFFS11Fwk5+GyimnRzVcEbADJno/8BKe
-----END RSA PRIVATE KEY-----
までコピペします。
4.4 スキームの選択
Outputには「RSA-OAEPのパディングじゃないよ」みたいな注意がでるので画面中央窓のEncryption Schemeでスキーマを変更します。
今回はRSAES-PKCS1-v1_5を選択するとOutputに正しいフラグが出力されます。