2
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?

はじめに

この記事で出来るようになること

  • Toppoマシンの起動
  • ターゲットのIPアドレスの特定/ポートスキャン
  • Webサイトの確認(gobuster)
  • SSH接続
  • 権限昇格/最終フラグのゲット
  • おまけ

対象読者

  • セキュリティやハッキングの学習を始めたい方

今回のゴール

ParrotOSでToppoマシンを攻撃し、フラグを取得すること!

Step1: Toppoマシンの起動

1-1. Toppoのダウンロード

下のリンクからToppoをダウンロードしていきます。
URL:https://www.vulnhub.com/entry/toppo-1,245/
image.png

ダウンロードが失敗する方は、Download (Mirror) のほうを試してみてください。
ダウンロードに成功したら、Toppoのファイルが圧縮されているので解凍しておきます。

1-2. Toppoの仮想マシンを作成

virtualboxのホーム画面から新規作成をクリックします。
名前を付けたら、OSをLinuxに設定します。
OSをLinuxに変更すると自動で、OSディストリビューションとOSバージョンが変わるため、そのままで大丈夫です。
image.png

今回は手動でインストールするため、無人ゲストOSインストールの設定は飛ばして仮想ハードウェアを指定に進みます。
image.png
メインメモリーは1024MB、プロセッサー数は2にすることをお勧めします。
ParrotOSではパスワード解析で負荷がかかる場面があるため、2に設定しておきます。

注意
Enable EFI(special OSes only)にはチェックを入れないでおきます。

最後に仮想ハードディスクを指定を設定します。
image.png
ファイルサイズはデフォルト(20GB)で大丈夫です。
今回使用するToppoはISOファイルではなく、すでにOSのインストールや初期設定などが完了している仮想ハードディスクファイルです。
よって、すでにある仮想ハードディスクファイルを使用するにチェックをいれ、フォルダーアイコンをクリックします。
image.png
まだ、Toppoの仮想ハードディスクファイルを登録していないため、追加アイコンをクリックします。
ファイル選択画面に移動するので、Toppo.vmdkファイルを選択します。
image.png
ハードディスクの選択画面に**Not Attached(アタッチされていない)**という項目にToppo.vmdkが表示されます。
このToppoを選択した状態で、「選択ボタン」を押します。
image.png
仮想ハードディスクの指定画面に移動すると、Toppo.vmdkが選択されています。
この状態で作成ボタンを押して仮想マシンの作成は完了です!

注意 (仮想マシンのネットワーク設定)
アダプター1がブリッジアダプターになっているとvirtualbox内のマシン同士で通信が取れなくなるため、必ずホストオンリーアダプターにしてください。

Step2: ターゲットのIPアドレスの特定/ポートスキャン

2-1. 自身のIPアドレスの特定

今回もPotatoの時と同様にまず最初に、自分のIPアドレスを確認していきます。

$ ip a

実行結果
image.png
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

実行結果
image.png
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でポートに接続できるか調べることができる

実行結果
image.png
ポート22:SSHサービスポート80:HTTPサービスポート111:RPCBINDサービスが開いていることが分かります。

Step3: Webサイトの確認(gobuster)

ポートスキャンで HTTP(80番ポート) が開いていたので、Webサイトを確認します。
ParrotOSでfirefoxを開き、URL部分にhttp://192.168.56.106 を入力するとWebサイトが表示されました。
image.png

3-1. アクセスできるファイルを列挙

Gobusterというブルートフォースツールを使って、アクセスできるファイルやディレクトリーを列挙します。

💡 Gobusterについての詳しい解説

Gobusterについては、以前の記事 ゼロから始めるハッキング・ラボの作り方 No.3 で詳細に解説しています。

$ gobuster dir -u http://192.168.56.106 -w /usr/share/wordlists/dirb/common.txt

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

内容:
「自分へのメモ。パスワード12345ted123 はとても古くて変更したいが、テクノロジーは苦手なので釣りやサッカー観戦をしている」

Step4: SSH接続

4-1. SSHアクセス

3-1.でパスワードを発見しましたが、まだユーザー名の候補はわかっていません。
パスワードに注目すると文字列の中に、tedという文字が含まれており、これがユーザー名かもしれないので、とりあえず試していきます。

$ ssh ted@192.168.56.106

実行結果
image.png

プロンプトが返ってきたので、無事サーバーへ侵入することができました。

Step5: 権限昇格とフラグの取得

5-1. 現状把握

tedユーザーとしてログインできたので、現状を把握していきます。

現在の権限を確認するコマンド
$ id

実行結果↓
image.png
すると、sudoコマンドが使えないことが分かりました。
これにより、パスワードが分かっても直接権限昇格できないため、ほかの方法を考える必要があります。

5-2. 権限設定ファイル(/etc/sudoers)の調査

tedユーザーがどこまで出来るのか調べるため、/etc/sudoersを確認していきます。

💡 /etc/sudoersとは

LinuxやMacなどのUNIX系OSにおいて、「どの一般ユーザーに、どの管理者権限(root権限)の実行を許可するか」を厳密に定義している、セキュリティ上もっとも重要な設定ファイルです。

通常、このファイルは root 権限を持つユーザーしか中身を覗き見ることができません。
しかし、もしこのシステムに設定ミスがあり、一般ユーザーである ted でもこのファイルを読み取ることができれば、「root権限で実行できる隠されたコマンドのヒント」 が手に入るかもしれません。

$ cat /etc/sudoers

実行結果
image.png
tedユーザーはパスワードなしで /usr/bin/awkを実行できることが分かりました。

5-3. awkコマンドの調査

/usr/bin/awk というコマンドの「実体」がどこにあり、どのような「権限」を持っているかを調査していきます。

$ ls -al /usr/bin/awk

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

$ ls -al /etc/alternatives/awk

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

$ ls -al /usr/bin/mawk

実行結果
image.png
長い追跡の末、ようやく /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")}'

実行結果
image.png
無事、rootが表示され、root権限でコマンドを実行できました。

5-6. フラグの取得

rootユーザーしかアクセスできない、/rootディレクトリを確認していきます。

$ awk 'BEGIN{system("ls /root")}'

実行結果
image.png

フラグファイルが見つかったので、catコマンドを使って中身を確認していくとフラグが表示されました。

$ awk 'BEGIN{system("cat /root/flag.txt")}'

実行結果
image.png

おまけ

  • ルートシェルを奪取する方法
  • 別のSUIDの悪用

ルートシェルを奪取する方法

system関数の引数に /bin/shを指定すると、ルートシェルを奪取できます。

$ awk 'BEGIN{system("/bin/sh")}'

実行結果
image.png

別のSUIDの悪用

今回はawkのSUID設定を悪用しましたが、他のファイルを悪用することもできます。
その場合、以下のコマンドを使うことで、システム内の全てのSUIDファイルを調べることができます。

$ find / -perm -u=s -type f 2> /dev/null

image.png

ここまで閲覧していただき、ありがとうございます!

2
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
2
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?