今日はTryHackMeの「Basic Pentesting」に挑戦した。これまでKali LinuxのインストールやOpenVPNによるVPN接続環境までは構築していたが、実際に一台のLinuxサーバーを対象として、情報収集から侵入、権限昇格、最終的なフラグ取得までを一通り体験するのは今回が初めてだった。
映画やドラマでは、ハッキングはキーボードを数秒叩くだけで侵入できるように描かれることが多い。しかし実際のペネトレーションテストは全く違う。まず情報を集め、そこから仮説を立て、その仮説を検証し、新たな情報を得て、さらに次の仮説を立てる。このサイクルを何度も繰り返しながら少しずつゴールへ近づいていく。その考え方を初めて体験できた一日だった。
今回の流れは、「Kali Linuxの起動 → VPN接続 → ポートスキャン → Web調査 → SMB調査 → ユーザー名の特定 → パスワードクラック → SSHログイン → サーバー内部調査 → 秘密鍵の取得 → 秘密鍵のパスフレーズ解析 → 権限昇格 → フラグ取得」という流れで進んだ。
最初に行ったのは作業環境の準備である。Kali Linuxを起動し、OpenVPNを使ってTryHackMeへ接続した。VPN(Virtual Private Network)は、自分のPCをTryHackMeの仮想ネットワークへ参加させるための仕組みであり、この接続が完了して初めてLab Machineへアクセスできるようになる。その後、「~/TryHackMe/BasicPentesting」という作業ディレクトリを作成した。ここへスキャン結果や取得したファイル、秘密鍵など、今回の調査に関する全てのデータを保存しながら進めた。最初は少し面倒だと思ったが、途中から非常に整理しやすくなり、今後もルームごとに作業ディレクトリを作ることを習慣にしようと思った。
準備が終わると、最初に対象サーバーの調査を行った。ここで使用したツールが「nmap」である。nmapはネットワーク上のコンピューターがどのようなサービスを公開しているかを調査するツールで、ペネトレーションテストでは最初に実行することが多い。家に例えるなら、「玄関」「勝手口」「窓」など、侵入できそうな入口を確認する作業に近い。
今回実行したコマンドは「nmap -sC -sV -oA scan <IP>」である。「-sC」は標準スクリプトを実行し、「-sV」はサービスのバージョン情報を取得し、「-oA」は結果を複数形式で保存するオプションである。スキャンの結果、22番ポートではSSH、80番ポートではApache、139番と445番ではSMB(Samba)、8009番ではAJP13、8080番ではApache Tomcatが動作していることが分かった。
ここで重要なのは、ポート番号そのものではなく、「どのサービスが動いているか」である。SSHが開いているならログインを狙える可能性があり、SMBが動いているなら共有フォルダを調査できる可能性がある。つまり、ポートスキャンは攻撃そのものではなく、「攻撃できそうな場所を探す作業」だった。
次にWebサーバーを調査した。ブラウザでトップページへアクセスすると、「Maintenance」という画面しか表示されず、一見すると何も情報が無いように見えた。しかしペネトレーションテストでは「見えているページだけが全てではない」と考える。そのため、隠しディレクトリを探すためにGobusterを使用した。
Gobusterとは、辞書に入っている大量の単語をURLへ当てはめ、存在するディレクトリを探すツールである。例えば、「/admin」「/backup」「/test」「/development」などを自動で試し、存在するページを探してくれる。今回実行したところ、「/development」という隠しディレクトリを発見することができた。
このディレクトリには、「dev.txt」と「j.txt」という二つのテキストファイルが置かれていた。最初は何気ないメモのように見えたが、中身を読むと非常に重要な情報が書かれていた。
「dev.txt」では、開発者同士の会話が記録されており、Sambaが導入されていることやApacheをセットアップしたことが分かった。一方、「j.txt」には「Janのパスワードは弱すぎるから変更した方がいい」という内容が書かれていた。
ここで初めて、「Jan」というユーザーが存在すること、そしてそのユーザーは弱いパスワードを使っている可能性が高いことが分かった。この時点ではパスワード自体は分からない。しかし、「弱いパスワードなら辞書攻撃で破れるかもしれない」という仮説を立てることができた。
この時に学んだことは、「文章も立派な情報源である」ということだった。ソースコードや設定ファイルだけではなく、開発者が残したコメントやメモ、チャットの内容も攻撃者にとっては重要なヒントになる。実際の企業でもGitHubのコメントや設定メモから情報漏えいが発生するケースは少なくない。
次にSMBの調査を行った。SMB(Server Message Block)はWindowsやLinuxで利用されるファイル共有プロトコルであり、LinuxではSambaというソフトウェアによって実装されている。今回利用したツールは「enum4linux-ng」である。
enum4linux-ngはSMBから取得できる情報を列挙(Enumeration)するツールである。Enumerationとは「列挙」という意味で、対象から取得できる情報を可能な限り集める工程を指す。ユーザー一覧、共有フォルダ、OS情報、ドメイン情報など、多くの情報を自動で収集してくれる。
調査の結果、「Anonymous」という共有フォルダが存在し、しかも認証無しでアクセスできることが分かった。これは企業環境では設定ミスとして扱われる典型例である。
そこで「smbclient」を使ってAnonymous共有へ接続した。中には「staff.txt」というファイルが保存されており、内容を確認するとスタッフ一覧が記載されていた。その中には「jan」という名前があり、先ほど開発者メモで見つけたJanというユーザーの存在を裏付けることができた。
ここで学んだことは、「一つの情報だけを信用しない」ということだった。開発者メモだけでは単なる噂かもしれない。しかしSMBの共有フォルダにも同じ名前が存在したことで、「Janというユーザーは実在する」という確信へ変わった。ペネトレーションテストでは、このように複数の情報を組み合わせて仮説の精度を高めていくことが非常に重要になる。
続いて、取得したユーザー名を使ってパスワードの特定を試みた。ここで使用したツールが「Hydra」である。
HydraはSSHやFTPなどのログイン画面に対して、辞書ファイルに登録されているパスワードを順番に試す「辞書攻撃(Dictionary Attack)」を自動で行うツールである。ブルートフォース攻撃との違いは、ブルートフォースが全ての文字の組み合わせを試すのに対し、辞書攻撃は実際によく使われるパスワードをまとめたリストを利用する点にある。そのため、弱いパスワードを使っている場合は非常に短時間で突破されてしまう。
今回はKali Linuxに標準で含まれている「rockyou.txt」を使用した。rockyou.txtは、過去に流出した数千万件以上の実際のパスワードをまとめた有名な辞書ファイルであり、ペネトレーションテストでは最もよく利用されるワードリストの一つである。
最初はHydraがうまく動かなかった。古いIPアドレスに対して実行していたことや、前回実行時のhydra.restoreファイルが残っていたこと、SSH側の接続制限などが重なり、「Too many connection errors」というエラーが発生してしまった。その時は「Hydraが壊れているのではないか」と考えてしまったが、一つ一つ原因を切り分けながら確認していくことで問題を解決できた。
最終的にHydraは「jan」のパスワードとして「armando」を発見した。非常に嬉しかったのは、この瞬間だった。今まで収集してきた情報が全てつながり、「弱いパスワードなら辞書攻撃で破れる」という仮説が正しかったことを自分の手で証明できたからである。
取得した認証情報を使い、次はSSHでサーバーへログインした。SSH(Secure Shell)はLinuxサーバーを遠隔操作するための仕組みであり、世界中の企業で最も利用されている管理方法である。ユーザー名に「jan」、パスワードに「armando」を入力すると、初めて対象サーバーへログインすることができた。
ここが今回の大きな転換点だった。それまでは外部から調査をしていただけだったが、ここからは実際にサーバー内部で調査を行えるようになった。ペネトレーションテストでは、この最初の侵入を「Initial Access(初期侵入)」と呼ぶ。
侵入後は慌てて探索するのではなく、まず現在の状況を確認した。「whoami」で現在のユーザーを確認し、「pwd」で現在地を確認、「ls」や「ls -la」でディレクトリの内容や権限を確認した。Linuxでは、まず自分が誰としてログインしているのか、どこにいるのかを把握することが基本であることを学んだ。
ホームディレクトリを確認すると、「jan」だけではなく「kay」というユーザーも存在していた。この時点ではまだkayへログインする方法は分からない。しかし、最終的な目標はより権限の高いユーザーになることだと考え、そのための手掛かりを探し始めた。
ここで利用したコマンドが「find」である。
「find /home -name id_rsa」を実行すると、「/home/kay/.ssh/id_rsa」というファイルが見つかった。id_rsaとはSSHで利用する秘密鍵であり、通常は所有者以外が閲覧できない重要なファイルである。しかし今回は設定ミスにより読み取ることができた。
秘密鍵とは、SSHへパスワードではなく「鍵」でログインするための認証情報である。企業でも広く利用されており、パスワード認証よりも安全性が高い。しかし秘密鍵が漏えいしてしまえば、その安全性は失われてしまう。
表示した秘密鍵はKali Linux側へコピーし、「kay_id_rsa」というファイルとして保存した。この作業ではnanoの使い方が分からず何度か失敗した。保存されていないことに気付かず混乱したが、「Ctrl + O」で保存し、「Enter」、「Ctrl + X」で終了するという基本操作を覚えることができた。
保存後は「chmod 600」を実行した。chmodはLinuxのファイル権限を変更するコマンドであり、SSHは秘密鍵の権限が厳しく設定されていないと安全性の理由から利用を拒否する。そのため600へ変更する必要があった。この作業を通して、Linuxでは権限管理が非常に重要であることも理解できた。
しかし、この秘密鍵だけではまだログインできなかった。秘密鍵にはさらに「パスフレーズ」が設定されていたためである。パスフレーズとは、秘密鍵を保護するために設定する追加のパスワードのようなものであり、秘密鍵が盗まれても簡単には利用できないようにする仕組みである。
ここで使用したツールが「John the Ripper」だった。
まず「ssh2john」を利用して秘密鍵をJohnが解析できる形式へ変換し、その後John the Ripperを使ってrockyou.txtによる辞書攻撃を実施した。
解析の結果、「beeswax」というパスフレーズを取得することができた。
HydraとJohn the Ripperは似ているようで役割が違うことも理解できた。Hydraはログイン画面そのものへパスワードを試すツールであり、John the Ripperは取得済みのハッシュや秘密鍵などのファイルを解析するツールである。同じ「クラック」という言葉でも、攻撃対象が異なることを学んだ。
取得した秘密鍵とパスフレーズを利用し、「kay」としてSSHログインを実行した。無事ログインに成功し、一般ユーザーであるjanから、より権限の高いkayへアクセスできるようになった。この工程を「Privilege Escalation(権限昇格)」と呼ぶ。ペネトレーションテストでは最も重要な工程の一つであり、侵入できたとしても権限昇格できなければ取得できない情報も多い。
最後にkayのホームディレクトリ内にあった「pass.bak」を閲覧すると、TryHackMeの最終フラグが保存されていた。それをサイトへ入力し、「Basic Pentesting」を無事クリアすることができた。
今回一番印象に残ったことは、「ハッキングは情報を積み重ねる作業である」ということだった。最初から答えが分かっているわけではない。ポートスキャンでサービスを知り、Webサイトからヒントを見つけ、SMBでユーザー名を確認し、Hydraでパスワードを取得し、SSHで侵入し、サーバー内部で秘密鍵を探し、John the Ripperで解析し、最後に権限昇格する。このように、一つ一つの情報が次の手掛かりとなり、それらをつなぎ合わせることで初めてゴールへ到達できる。
また、今回使用したツールにはそれぞれ明確な役割があった。nmapは入口を探すためのツール、Gobusterは隠れたWebページを探すツール、enum4linux-ngはSMBから情報を列挙するツール、Hydraはログイン画面を攻撃するツール、John the Ripperは秘密鍵やハッシュを解析するツールである。それぞれ単独では目的を達成できないが、組み合わせることで一連の攻撃が成立することを実感した。
今回のBasic Pentestingは、単にツールの使い方を覚えるルームではなく、「ペネトレーションテストではどのように考え、どの順番で情報を集め、どのように次の行動を決めるのか」という思考プロセスを学ぶ教材だった。今後も今回と同じように学習内容を記録し、自分だけのペネトレーションテスト教科書として積み重ねていきたい。