はじめに
みなさんこんにちは!
今回は3回目のハッキング実践していきます!
前回より短めなので、丁寧に解説付きでやっていきます!
今回は「Toppoマシン」というおいしそうなマシンをハッキングしてみます!
(マシンの導入等の部分は解説を省きます。)
1. ToppoマシンのIPアドレス特定と初期調査
まずは、netdiscoverコマンドを使用して同一ネットワーク内の端末を探索し、ToppoマシンのIPアドレスを特定します。
sudo netdiscover -i enp0s3 -r 192.168.56.0/24
コマンドの説明
-
sudo:管理者権限でコマンドを実行する。 -
netdiscover:ARPを利用してネットワーク上のホストを検出するツール。 -
-i enp0s3:使用するネットワークインターフェースを指定する。 -
-r 192.168.56.0/24:探索対象となるIPアドレスの範囲を指定する。
実行結果から、以下のIPアドレスを確認できました。
- 192.168.56.1:攻撃用OS(ParrotOS)
- 192.168.56.100:DHCPサーバー
- 192.168.56.108:Toppoマシン
ToppoマシンのIPアドレスは 192.168.56.108 であることが分かりました。
続いて、今後のコマンド入力を簡略化するため、ToppoマシンのIPアドレスを環境変数に設定します。
export IP=192.168.56.108
コマンドの説明
-
export:環境変数を設定するコマンド。 -
IP:環境変数名。 -
192.168.56.108:ToppoマシンのIPアドレス。
以降はIPアドレスを直接入力する代わりに、$IPで参照できるようになります。
次に、pingコマンドを使用してToppoマシンへ通信できるか確認します。
ping $IP -c 1
コマンドの説明
-
ping:指定したホストへICMPパケットを送信し、通信できるか確認するコマンド。 -
$IP:先ほど設定した環境変数を参照する。 -
-c 1:Pingを1回だけ送信する。
正常に応答が返ってくれば、Toppoマシンと通信できていることが確認できます。
最後に、nmapを使用してToppoマシンで開放されているポートやサービスを調査します。
sudo nmap -sT -sC -sV $IP
コマンドの説明
-
sudo:管理者権限で実行する。 -
nmap:ネットワークスキャンツール。 -
-sT:TCP Connectスキャンを実施する。 -
-sC:Nmap標準のNSEスクリプトを実行する。 -
-sV:稼働しているサービスのバージョン情報を取得する。 -
$IP:対象となるToppoマシンのIPアドレス。
スキャンの結果、以下のポートが開放されていることが確認できました。
| ポート番号 | サービス |
|---|---|
| 22 | SSH |
| 80 | HTTP |
| 111 | rpcbind |
この結果から、SSHによるリモート接続やWebサーバーが稼働していることが分かります。また、rpcbindサービスも動作しているため、今後の調査対象として確認していきます。
2. Webサイトへアクセスして情報収集を行う
まずは、ブラウザからToppoマシンのWebサイトへアクセスします。
Parrot OSのブラウザを起動し、以下のURLへアクセスします。
http://192.168.56.108/
Webサイトへアクセスすると、トップページが表示されました。
ページのソースコードやデザインを確認すると、このWebサイトではBootstrapが利用されていることが分かります。
Bootstrapとは
Bootstrapとは、HTML・CSS・JavaScriptを利用してWebサイトを効率よく作成できるフロントエンドフレームワークです。
レスポンシブデザインに対応しており、ボタンやナビゲーションバー、フォームなどのデザイン済みコンポーネントが豊富に用意されているため、短時間で見栄えの良いWebサイトを作成できます。
次に、URLを環境変数へ設定します。
export URL="http://$IP/"
コマンドの説明
-
export:環境変数を設定するコマンド。 -
URL:WebサイトのURLを格納する環境変数。 -
$IP:先ほど設定したToppoマシンのIPアドレスを参照する。
環境変数へ登録しておくことで、以降はURLを毎回入力する必要がなくなります。
続いて、gobusterを使用してWebサーバー上に存在するディレクトリやファイルを列挙します。
gobuster dir -u $URL -w /usr/share/wordlists/dirb/common.txt
コマンドの説明
-
gobuster:Webサーバーのディレクトリやファイルを探索するツール。 -
dir:ディレクトリ・ファイル探索モードを指定する。 -
-u $URL:探索対象となるWebサイトを指定する。 -
-w /usr/share/wordlists/dirb/common.txt:探索に使用する単語リスト(Wordlist)を指定する。
このコマンドを実行することで、公開されているディレクトリやファイルを列挙できます。
列挙されたディレクトリやファイルの中から、攻撃の足掛かりとなるページや設定ファイルが存在しないか調査していきます。
列挙の結果、/admin ディレクトリが存在することが確認できました。
ブラウザで以下のURLへアクセスします。
http://192.168.56.108/admin
アクセスすると、notes.txt ファイルが公開されていることが確認できました。
notes.txtを開くと、以下のような内容が記載されていました。
内容(日本語訳)
自分へのメモ。パスワード「12345ted123」はとても古いので変更したい。しかし、テクノロジーは苦手なので、趣味の釣りやサッカーをして過ごしている。
このメモから、**「12345ted123」**というパスワードらしき文字列を入手することができました。
また、**釣り(Fishing)やサッカー(Soccer)**といった趣味に関する情報も記載されており、これらは後のパスワード推測やユーザー情報の調査に利用できる可能性があります。そのため、重要な情報として記録しておきます。
3. SSHでサーバーへ接続する
先ほどnotes.txtから入手したユーザー名とパスワードを利用して、SSHでToppoマシンへ接続します。
ssh ted@$IP
コマンドの説明
-
ssh:SSH(Secure Shell)を利用してリモートサーバーへ接続するコマンド。 -
ted:接続先のユーザー名。 -
$IP:環境変数に設定したToppoマシンのIPアドレス。
コマンドを実行するとパスワードの入力を求められるため、notes.txtから取得した以下のパスワードを入力します。
12345ted123
認証に成功すると、SSH経由でToppoマシンへログインできました。
(プロンプトが返ってきていることが分かる。)
これにより、tedユーザーとしてサーバーへアクセスできることを確認できました。今後はサーバー内部の調査を進め、権限昇格につながる情報を探索していきます。
4. サーバー内の情報を調査する
SSHでログインできたため、まずはサーバー内の基本情報を確認します。
whoami
id
uname -a
cat /etc/issue
コマンドの説明
-
whoami:現在ログインしているユーザー名を表示する。 -
id:現在のユーザーID(UID)、グループID(GID)、所属グループを表示する。 -
uname -a:OSやカーネルなどのシステム情報を表示する。 -
cat /etc/issue:Linuxディストリビューションの情報を表示する。
各コマンドの実行結果から、現在のユーザー情報やOSのバージョンを確認できました。
また、サーバー内を調査した結果、wget がインストールされていることも確認できました。
wgetは、Webサーバーからファイルをダウンロードするためのコマンドであり、状況によってはファイルの取得や情報収集などに利用できるツールです。
次に、sudoの設定を確認します。
cat /etc/sudoers
コマンドの説明
-
cat:ファイルの内容を表示するコマンド。 -
/etc/sudoers:ユーザーごとのsudo実行権限が定義されている設定ファイル。
/etc/sudoersファイルの内容を確認したところ、tedユーザーはパスワードを入力せずにawkコマンドを実行できる設定になっていることが分かりました。
このような設定は、適切に制限されていない場合、awkの機能を利用して権限昇格できる可能性があります。そのため、次はawkを利用した権限昇格を試みます。
5. awkを利用してroot権限でコマンドを実行する
awkコマンドの動作を確認します。
環境を調査したところ、awkコマンドを実行すると、最終的にmawkが呼び出されていることが分かりました。
また、mawkのパーミッションを確認すると、SUIDが設定されていました。
SUIDとは、ファイルを実行したユーザーの権限ではなく、そのファイルの所有者の権限でプログラムを実行する仕組みです。
今回のmawkはrootユーザーが所有しているため、awkのsystem関数を利用することで、指定したコマンドをroot権限で実行できる可能性があります。
まずは、現在の実行ユーザーを確認するため、system関数を使用してwhoamiコマンドを実行します。
awk 'BEGIN {system("whoami")}'
コマンドの説明
-
awk:テキストの検索や加工を行うためのコマンド。 -
BEGIN:入力データを読み込む前に処理を実行する。 -
system():引数に指定した外部コマンドを実行する関数。 -
whoami:現在の実行ユーザー名を表示するコマンド。
実行結果として、以下のように表示されました。
root
この結果から、awkのsystem関数を利用することで、root権限でコマンドを実行できることが確認できました。
次に、通常はrootユーザーしかアクセスできない/rootディレクトリの内容を確認します。
awk 'BEGIN {system("ls /root")}'
コマンドの説明
-
ls /root:rootユーザーのホームディレクトリ内にあるファイルやディレクトリを一覧表示する。 -
system():指定したコマンドを外部コマンドとして実行する。
実行結果から、/rootディレクトリ内に以下のフラグファイルが存在することを確認できました。
flag.txt
最後に、フラグファイルの内容を確認します。
awk 'BEGIN {system("cat /root/flag.txt")}'
コマンドの説明
-
cat /root/flag.txt:/rootディレクトリにあるflag.txtの内容を表示する。 -
system():指定したコマンドをroot権限で実行する。
コマンドを実行すると、通常はrootユーザーしか閲覧できないflag.txtの内容を表示できました。
これにより、awkに設定されていたSUIDとsystem関数を利用してroot権限でコマンドを実行し、最終的にrootユーザーのフラグファイルを取得できました。
6. ルートシェルを取得する
最後に、awkのsystem関数を利用してルートシェルを取得します。
system関数の引数に/bin/shを指定することで、root権限でシェルを起動できることが期待できます。
awk 'BEGIN {system("/bin/sh")}'
コマンドの説明
-
awk:テキスト処理を行うコマンド。 -
BEGIN:入力データを処理する前に実行されるブロック。 -
system():指定した外部コマンドを実行する関数。 -
/bin/sh:Linuxで使用される標準的なシェル。
コマンドを実行したところ、期待どおりroot権限のシェルを取得することができました。
whoamiコマンドを実行するとrootと表示され、ルートシェルの取得に成功したことを確認できます。
これにより、Toppoマシンの攻略は完了です。
おわりに
今回は前回より、攻略内容が短かったと思います。
個人的には、コマンドの意味を理解することに時間がかかりました。
(今もまだまだ理解が追い付いてない部分があるので頑張ります...)
次回は長期戦になるかもしれません...!!
でもまた少しづつ攻略していきましょう!!:)
長々とご覧いただきありがとうございました!















