0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「ハッキング・ラボのつくりかた」 #6

0
Last updated at Posted at 2026-09-01

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

スクリーンショット 2026-08-07 223420.png
Empire_LupinOneのIPアドレスは192.168.56.115だと分かります。

3.Empire_LupinOneマシンに疎通確認を行う

Pingで疎通確認をします。

ping 192.168.56.115

スクリーンショット 2026-08-07 224333.png
疎通確認が取れていることが分かります。

4.Empire_LupinOneマシン用のディレクトリを作成する

スクリーンショット 2026-08-07 224404.png
上記のように作成します。ディレクトリの名前はお好みの名前で分かりやすいものにしてください。

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解析機能を使用して名前解決を行う
    スクリーンショット 2026-08-07 224531.png
    上記のことから二つのポートが開いていることが分かります。
  • 22/tcp(SSH):SSH
  • 80/tcp(HTTP):HTTP
    • robots.txtファイルと/myfilesディレクトリがある

6.サイトにアクセスする

http://192.168.56.115/にアクセスします。
スクリーンショット 2026-08-07 224834.png
ソースを表示してみますが、Its an easy box,dont give up.とあり、特に手がかりになる情報は得られませんでした。
スクリーンショット 2026-08-07 225440.png

先ほどポートスキャンした際、robots.txtファイルがあることが分かっています。

:bulb: robots.txtとは?
Webサイトのルートディレクトリに配置し、検索エンジンのクローラー(Webロボット)に対して「どのページを巡回してよいか・ダメか」を指示するための指示書ファイルです。
[役割・目的]
1.クローラーのアクセスの制御
管理画面、検索結果ページ、一時ファイルなど、検索結果に表示する必要がないページの巡回を防ぐ
2.サーバー負担の軽減
大量のページが存在する大規模サイトにおいて、不要なページへのアクセスを抑え、重要なページを優先的に巡回させる
3.サイトマップの場所の明示
クローラーに対して、サイトマップファイル(sitemap.xml)の存在場所を教えることができる

記述子 役割
User-agent 対象とするクローラー(ボット)を指定(*は全クローラー)
Disallow クロール(巡回)を禁止するパス
Allow Disallowの中で例外的に許可するパス
Sitemap XMLサイトマップの絶対URLを指定

http://192.168.56.115/robots.txtにアクセスします。
スクリーンショット 2026-08-07 225647.png

  • User-agent: *:すべてのクローラーを対象
  • Disallow: /~myfiles/~myfilesで始まるディレクトリやファイルへの巡回(クロール)およびインデックス登録を禁止している。

禁止されているためhttp://192.168.56.119/~myfiles/にアクセスすると、404エラーが起きます。

スクリーンショット 2026-08-07 225752.png

7.アクセスできるディレクトリを特定する

ファジングツールを用いてディレクトリを特定します。

wfuzz -c -z file,/usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt --hc 404 "http://192.168.56.115/~FUZZ/"

スクリーンショット 2026-08-07 233140.png
myfiles以外にもsecretというアクセス可能なディレクトリが存在することが分かります。
http://192.168.56.115/~secret/にアクセスしてみます。
スクリーンショット 2026-08-07 235505.png
翻訳すると以下のようになっています。

やあ、友よ。僕の秘密のディレクトリを見つけてくれて嬉しいよ。これは、僕が作成した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はこの#も単語の一部として読み込んでしまい、エラーや無駄なノイズが発生してしまいます。
そうなってしまわないように今回はコマンドを使って不要な行を削除したカスタムな辞書を作成します。
スクリーンショット 2026-08-19 124634.png
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"

スクリーンショット 2026-08-19 124656.png
Responseが200になっているところに注目します。
今回はmysecret??????の2つがあることが分かっています。
実際にアクセスしてみましょう。
先に、http://192.168.56.115/~secret/.??????.txtにアクセスします。しかし、存在していないことが分かりました。原因はよく分かりませんがヒットしたように見えるだけなのかもしれません。
次に、http://192.168.56.115/~secret/.mysecret.txtにアクセスしたところよく分からない謎の文章が表示されます。
スクリーンショット 2026-08-24 142258.png
エンコードされているテキストだと仮定し、デコードができるか試していきます。

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」を開くとこのような画面が出るかと思います。
スクリーンショット 2026-08-27 140434.png
今回は「Data format」のFrom Base(数字)と書かれているところを試します。
「Data format」をクリックし、From Base(数字)のところを1つずつ試していくと、From Base58を適用した際、一行目に英文が出てきます。
スクリーンショット 2026-08-19 150154.png
訳すと秘密鍵と書かれており、秘密鍵のファイルだと分かりました。この結果をコピーし、次はSSHのパスワードを解析していきます。
スクリーンショット 2026-08-19 150311.png
先ほどコピーしたものをペーストし、[Ctrl]+[D]で終了します。その後lsコマンドでKeyファイルが作られているか確認してください。

11.SSH秘密鍵からパスワードハッシュの生成およびクラッキングの検証

python3 /usr/share/john/ssh2john.py key

スクリーンショット 2026-08-24 142415.png
書籍の方ではエラーが出ていますが、バージョンが新しくなっているからかエラーが出ずに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

スクリーンショット 2026-08-24 142238.png
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

スクリーンショット 2026-08-29 093146.png
文章の最後に\が入っていることが分かりました。おそらく、Cyberchefでコピーした際に空白文字が含まれてしまったと考えられます。
keyファイルを開き、空白文字を消します。
全て消されたことを確認し、もう一度SSH接続を行います。
パスワードにはP@55w0rd!を入力するとプロンプトが返ってきたためログインに成功したことが分かります。
スクリーンショット 2026-08-27 155245.png
lsコマンドを実行すると、user.txtというファイルがあることが分かりました。
catコマンドで中身を調べると、flagが出ました。
スクリーンショット 2026-08-29 094349.png
スクリーンショット 2026-08-29 094410.png

13.sudoでできることを調べてみる

sudo -l

sudo -lコマンドを実行することで現在ログインしているユーザーが、sudoを使って実行を許可されているコマンドの一覧を表示することができます。
スクリーンショット 2026-08-29 125933.png
上記のことからarseneユーザーはsudoコマンドを使えば、パスワードを入力せずに/home/arsene/heist.pyを実行できると分かります。
このファイルの中身を調べます。

14.攻撃アプローチを考える

目標は悪意のあるコードをプログラム内に追加し編集します。やり方は大きく分けて2種類ありますが、今回はbashを起動するコードを追加する方法で進めていきます。また、後日リバースシェルを起動するコードを追加し権限昇格を行う方法も紹介していきたいと思います。
スクリーンショット 2026-09-01 140504.png
しかし、nanoを使って直接heist.pyファイルを開こうとしても、権限エラーで編集することができませんでした。
そこで、スクリプトの処理内容に着目します。コード内でimport webbrowserが実行されているため、直接改ざんできないheist.pyではなく、呼び出されているモジュール側(webbrowser.py)のパーミッションを確認し、もし書き込み権限がある場合、そこに悪意のあるコードを割り込ませることによって権限昇格が可能になります。
まずはwebbrowserのパーミッションを確認します。
スクリーンショット 2026-09-01 140828.png
確認したところrwxであり、icex64ユーザーでも編集可能なことが分かります。nanoを使い、webbrowser.pyファイルを開き「os.system("/bin/bash")」を追加します。

nano /usr/lib/python3.9/webbrowser.py

import threadingと書かれている一行空いたその下にos.system("/bin/bash")を追加します。
スクリーンショット 2026-09-01 141343.png
上記のようになっていることを確認し、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スクリプトファイルのパス

スクリーンショット 2026-09-01 141651.png
arseneユーザーとしてプロンプトが返ってきました。

15.arseneユーザーがsudoでできることを調べる

arseneユーザーでsudo -lコマンドを実行し、権限昇格を目指します。
スクリーンショット 2026-09-01 141825.png
上記の結果からルートユーザーとしてパスワードなしで/usr/bin/pipを実行できることが分かります。
Pythonのパッケージ管理ツールである「pip」は、管理者権限で実行な設定になっている場合、セキュリティ上の脆弱性となります。悪意のあるシェル起動スクリプトを含んだパッケージを作成し、それをroot権限のpipに読み込ませることで権限昇格を狙っていきます。

まずは/tmpディレクトリに移動します。ここでは、一時的なディレクトリを安全に作成するmktemp -dコマンドを使用します。コマンドを$()で囲むことでディレクトリが作成され、その作成されたパスが画面に表示されます。
スクリーンショット 2026-09-01 142756.png
そして、生成されたディレクトリのパスをシェル変数に代入します。
シェル変数の名前は分かりやすいもので構いません。今回私は書籍に沿って攻略しているためTFにしています。
スクリーンショット 2026-09-01 142831.png
次に以下のコマンドを実行し、ルート権限取得していきます。このコマンドは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が作成されていることを確認し、権限昇格を行っていきます。

スクリーンショット 2026-09-01 142846.png

16.権限昇格を行い、フラグを取得する

以下のコマンドを実行することで先ほど作成したsetup.pyを呼び出し、管理者権限のままshが起動します。

sudo pip install $TF

スクリーンショット 2026-09-01 142914.png
その結果、#に変わりルート権限を取得することができました。
あとは/rootに移動し、lsコマンドを実行し、catで中身を確認し、終了です。
スクリーンショット 2026-09-01 143226.png
スクリーンショット 2026-09-01 143329.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?