はじめに
この記事で出来るようになること
- Toppoマシンの起動
- ターゲットのIPアドレスの特定/ポートスキャン
- Webサイトの確認(gobuster)
- SSH接続
- 権限昇格/最終フラグのゲット
- おまけ
対象読者
- セキュリティやハッキングの学習を始めたい方
今回のゴール
ParrotOSでToppoマシンを攻撃し、フラグを取得すること!
Step1: Toppoマシンの起動
1-1. Toppoのダウンロード
下のリンクからToppoをダウンロードしていきます。
URL:https://www.vulnhub.com/entry/toppo-1,245/

ダウンロードが失敗する方は、Download (Mirror) のほうを試してみてください。
ダウンロードに成功したら、Toppoのファイルが圧縮されているので解凍しておきます。
1-2. Toppoの仮想マシンを作成
virtualboxのホーム画面から新規作成をクリックします。
名前を付けたら、OSをLinuxに設定します。
OSをLinuxに変更すると自動で、OSディストリビューションとOSバージョンが変わるため、そのままで大丈夫です。

今回は手動でインストールするため、無人ゲストOSインストールの設定は飛ばして仮想ハードウェアを指定に進みます。

メインメモリーは1024MB、プロセッサー数は2にすることをお勧めします。
ParrotOSではパスワード解析で負荷がかかる場面があるため、2に設定しておきます。
注意
Enable EFI(special OSes only)にはチェックを入れないでおきます。
最後に仮想ハードディスクを指定を設定します。

ファイルサイズはデフォルト(20GB)で大丈夫です。
今回使用するToppoはISOファイルではなく、すでにOSのインストールや初期設定などが完了している仮想ハードディスクファイルです。
よって、すでにある仮想ハードディスクファイルを使用するにチェックをいれ、フォルダーアイコンをクリックします。

まだ、Toppoの仮想ハードディスクファイルを登録していないため、追加アイコンをクリックします。
ファイル選択画面に移動するので、Toppo.vmdkファイルを選択します。

ハードディスクの選択画面に**Not Attached(アタッチされていない)**という項目にToppo.vmdkが表示されます。
このToppoを選択した状態で、「選択ボタン」を押します。

仮想ハードディスクの指定画面に移動すると、Toppo.vmdkが選択されています。
この状態で作成ボタンを押して仮想マシンの作成は完了です!
注意 (仮想マシンのネットワーク設定)
アダプター1がブリッジアダプターになっているとvirtualbox内のマシン同士で通信が取れなくなるため、必ずホストオンリーアダプターにしてください。
Step2: ターゲットのIPアドレスの特定/ポートスキャン
2-1. 自身のIPアドレスの特定
今回もPotatoの時と同様にまず最初に、自分のIPアドレスを確認していきます。
$ ip a
実行結果

ParrotOS自身のアドレスは192.168.56.104であることが分かりました。
2-2. ターゲットIPアドレスの特定
自分のIPアドレスが192.168.56.104だと分かったので、同じネットワークにいるターゲットIPアドレスを探します。
# 192.168.56.0/24のネットワークにあるIPアドレスの一覧を表示する
$ sudo netdiscover -i enp0s3 -r 192.168.56.0/24
実行結果

Toppoのアドレスは、192.168.56.106だと分かりました。
💡 IPアドレス特定についての詳しい解説
ネットワークの仕組みや、表示される3つのIPアドレスの正体については、以前の記事 ゼロから始めるハッキング・ラボの作り方 No.2 で詳細に解説しています。
「どれがターゲットか見分けがつかない!」という方はぜひそちらも参考にしてください。
2-3. ポートスキャン
ターゲットIPアドレスが特定できたので、ポートスキャンを実行していきます。
$ sudo nmap -sT -sC -sV -Pn -p- 192.168.56.105 -oN nmap.txt
nmapの主要オプション解説
| オプション | 役割 | 詳しい説明・使う理由 |
|---|---|---|
-sT |
TCP Connectスキャン | TCPでポートに接続できるか調べることができる |
実行結果

ポート22:SSHサービスとポート80:HTTPサービス、ポート111:RPCBINDサービスが開いていることが分かります。
Step3: Webサイトの確認(gobuster)
ポートスキャンで HTTP(80番ポート) が開いていたので、Webサイトを確認します。
ParrotOSでfirefoxを開き、URL部分にhttp://192.168.56.106 を入力するとWebサイトが表示されました。

3-1. アクセスできるファイルを列挙
Gobusterというブルートフォースツールを使って、アクセスできるファイルやディレクトリーを列挙します。
💡 Gobusterについての詳しい解説
Gobusterについては、以前の記事 ゼロから始めるハッキング・ラボの作り方 No.3 で詳細に解説しています。
$ gobuster dir -u http://192.168.56.106 -w /usr/share/wordlists/dirb/common.txt
実行結果↓

複数のディレクトリが表示されましたが、その中でも/adminにアクセスしてみます。
ブラウザーにnotes.txtファイルが見つかったので、開くと管理者のメモ書きが表示されました。

内容:
「自分へのメモ。パスワード12345ted123 はとても古くて変更したいが、テクノロジーは苦手なので釣りやサッカー観戦をしている」
Step4: SSH接続
4-1. SSHアクセス
3-1.でパスワードを発見しましたが、まだユーザー名の候補はわかっていません。
パスワードに注目すると文字列の中に、tedという文字が含まれており、これがユーザー名かもしれないので、とりあえず試していきます。
$ ssh ted@192.168.56.106
プロンプトが返ってきたので、無事サーバーへ侵入することができました。
Step5: 権限昇格とフラグの取得
5-1. 現状把握
tedユーザーとしてログインできたので、現状を把握していきます。
現在の権限を確認するコマンド
$ id
実行結果↓

すると、sudoコマンドが使えないことが分かりました。
これにより、パスワードが分かっても直接権限昇格できないため、ほかの方法を考える必要があります。
5-2. 権限設定ファイル(/etc/sudoers)の調査
tedユーザーがどこまで出来るのか調べるため、/etc/sudoersを確認していきます。
💡 /etc/sudoersとは
LinuxやMacなどのUNIX系OSにおいて、「どの一般ユーザーに、どの管理者権限(root権限)の実行を許可するか」を厳密に定義している、セキュリティ上もっとも重要な設定ファイルです。
通常、このファイルは root 権限を持つユーザーしか中身を覗き見ることができません。
しかし、もしこのシステムに設定ミスがあり、一般ユーザーである ted でもこのファイルを読み取ることができれば、「root権限で実行できる隠されたコマンドのヒント」 が手に入るかもしれません。
$ cat /etc/sudoers
実行結果

tedユーザーはパスワードなしで /usr/bin/awkを実行できることが分かりました。
5-3. awkコマンドの調査
/usr/bin/awk というコマンドの「実体」がどこにあり、どのような「権限」を持っているかを調査していきます。
$ ls -al /usr/bin/awk
実行結果

/usr/bin/awkの先頭が l(シンボリックリンク=ショートカット) になっています。
どうやら /etc/alternatives/awk という別の場所を指しているようなので、そちらのリンク先を追跡します。
$ ls -al /etc/alternatives/awk
実行結果

すると、ここもまだショートカットでした!
さらにその先にある /usr/bin/mawk を調査します。
$ ls -al /usr/bin/mawk
実行結果

長い追跡の末、ようやく /usr/bin/mawk がこのコマンドの本当の本体(実体ファイル)であることが分かりました。
そしてこの実行結果には、root権限を奪取できる決定的な脆弱性が隠されています。
5-4. SUID(Set User ID)の脆弱性
所有者が root であるにもかかわらず、実行権限の表記が x ではなく s になっています。
これは SUID と呼ばれる特殊な権限設定です。
-rwsr-xr-x 1 root root ... /usr/bin/mawk
▲
ここが「x」ではなく「s」になっている!
SUIDが設定されたプログラムは、「誰が実行しても、そのプログラムの所有者(今回はroot)の権限で動作する」 という性質を持ちます。
つまり、一般ユーザーである ted がこの mawk(awk)を実行すると、裏側では root権限としてプログラムが動いてしまう状態 になっています。
これを利用して、sudoの制限を完全に無視したrootシェルの奪取を試みます!
5-5. 権限昇格
💡 awk 'BEGIN{system("whoami")}' の意味
一見すると呪文のようなコマンドですが、パーツを分解すると以下のような仕組みになっています。
-
① BEGIN{ ... } (ファイルを読まずに即実行)
本来、awkはテキストファイルを1行ずつ読み込んで処理するコマンドです。
しかし、頭に BEGIN と書くと 「ファイルを開く前に、まずこの中身の処理を最優先で実行しなさい」 という命令になります。
今回はファイルを読み込ませる必要がないため、この BEGIN を使って強制的に中の処理を動かしています。 -
② system("whoami") (Linuxコマンドを裏で呼び出す)
system() は、awk の内部から、 「Linuxの通常のコマンドを実行させる」 ための特殊な関数(機能)です。カッコの中に書いた文字列(今回は whoami)が、そのままLinuxのターミナルに引き渡されて実行されます。
$ awk 'BEGIN{system("whoami")}'
実行結果

無事、rootが表示され、root権限でコマンドを実行できました。
5-6. フラグの取得
rootユーザーしかアクセスできない、/rootディレクトリを確認していきます。
$ awk 'BEGIN{system("ls /root")}'
フラグファイルが見つかったので、catコマンドを使って中身を確認していくとフラグが表示されました。
$ awk 'BEGIN{system("cat /root/flag.txt")}'
おまけ
- ルートシェルを奪取する方法
- 別のSUIDの悪用
ルートシェルを奪取する方法
system関数の引数に /bin/shを指定すると、ルートシェルを奪取できます。
$ awk 'BEGIN{system("/bin/sh")}'
別のSUIDの悪用
今回はawkのSUID設定を悪用しましたが、他のファイルを悪用することもできます。
その場合、以下のコマンドを使うことで、システム内の全てのSUIDファイルを調べることができます。
$ find / -perm -u=s -type f 2> /dev/null




