こんにちは、ゆるいぞITチャンネルです。
今回はハッキングの基本的な流れである「偵察、侵入、情報収集、権限昇格、そしてデータ取得までの工程」について順を追って見ていきましょう。
TryHackMeの演習問題(Room:Basic Pentesting)を題材に、攻撃者がどのような視点でサーバーを攻略していくのかをイメージしてもらえればと思います。
※Youtubeでは動画版をご視聴いただけます。
- ペネトレーションテスト(侵入テスト)の流れを知りたい方
- CTF(Capture The Flag)初心者の方
- ハッキングツール(Nmap, Hydra, JohnTheRipperなど)の実際の使い方を見たい方
- セキュリティエンジニアを目指している方
※実務や演習等を除き、インターネット上のサーバへクラッキングすることは違法行為となりますのでご注意ください。
ハッキングの全体像(流れ)
実際の演習に入る前に、今回実施するハッキングの全体フローを確認しておきましょう。
一般的に攻撃(対象へのクラッキング)は以下のフェーズで進行します。
ターゲットのポートやサービス、脆弱性を探る。
見つけた脆弱性やアカウント情報を利用してログインする。
サーバー内部のファイルや設定を調査・収集する。
一般ユーザーから管理者(root)へ権限を昇格させる。
機密情報の奪取や痕跡の消去を実行する。(今回はフラグの取得)
ラボ環境の構成
ソフトウェア
- 仮想環境 : Virtual Box
- 攻撃用サーバ : Kali Linux
- ターゲットホスト : TryHackMeのWebサーバ
演習環境

※「ハッキングラボの初期構築」、「TryHackMeへの接続方法」については下記のページをご参照ください。
【Phase 1:偵察】ターゲットの情報を洗い出す
まずはターゲットホストの情報収集を実施します。
演習の内容としてはnmapでポートスキャンだけ実行すればいいことになっていますが、せっかくなので前回紹介した偵察コマンドも一緒に実行してみたいと思います。
ポートスキャン(nmap)
まずは基本となる「nmap」で開いているポート(サービスの入り口)を確認します。
$ nmap -Pn -sS -sV -T4 10.201.90.238
実行結果を確認すると、以下のポートが開いていることが分かりました。
- 22/tcp (SSH):遠隔操作用
- 80/tcp, 8080/tcp (HTTP):Webサーバー
- 139, 445/tcp (SMB):ファイル共有

Webサーバーの脆弱性診断(nikto)
80番ポート(HTTP)が開いていたので「nikto」を使って、Webサーバー特有の脆弱性がないかチェックします。
$ nikto -h 10.201.90.238 -port 80
スキャン結果から「Server may leak inodes via ETags」ということで一つだけ脆弱性情報が出ています。

あとは「Apacheのバージョンが古いですよ」といった警告も表示されています。

共有フォルダの調査(enum4linux)
次にSMB(ファイル共有)が有効だったので「enum4linux」で共有フォルダの情報を探ります。
$ enum4linux 10.201.90.238
結果を確認すると「Anonymous(匿名)」という共有フォルダが見つかりました。

早速このフォルダにアクセスしてみましょう。
$ smbclient //10.201.90.238/Anonymous
> get staff.txt
フォルダには「staff.txt」というファイルがあったので中身を確認してみます。
$ cat staff.txt
記載内容から「Jan」と「Kay」という2名の従業員がいることが判明しました。

さらに「仕事に関係ないファイルをアップロードするな(特にJan!)」というKayからの注意書きもあります…。
ディレクトリの探索(gobuster)
Webサーバー上に隠されたディレクトリがないか「gobuster」で総当たり攻撃を仕掛けます。
$ gobuster dir -u http://10.201.90.238 -w /usr/share/wordlists/dirb/common.txt
スキャン結果から「/development」というディレクトリが見つかりました。

ここにアクセスしてみると、テキストファイルから再度「J」と「K」というユーザーの存在を確認することができます。

さらに「Jさんのパスワードは簡単にクラックできたから変更するように…」という記述も確認できます。

偵察フェーズのまとめ
ここまでの偵察で以下の内容が分かりました。
- 「Jan」と「Kay」というユーザが存在している
- Janのパスワードは脆弱である可能性が高い
- リモートアクセス用のSSH(22番ポート)が開いている
【Phase 2:侵入】パスワードを特定してログインする
偵察フェーズで得た「Janのパスワードは脆弱である可能性がある」という情報を元に侵入を試みてみます。
パスワードクラッキング(hydra)
ユーザIDは「jan」を想定し、hydraを使ってパスワードの総当たり攻撃(ブルートフォースアタック)を実行します。
ワードリストは「rockyou.txt」を使用します。
$ hydra -l jan -P /usr/share/wordlists/rockyou.txt 10.201.90.238 ssh
解析結果から「jan」のパスワードは「armando」であることが判明しました。

SSHログイン
入手した認証情報を使って、ターゲットサーバーにログインします。
$ ssh jan@10.201.90.238 (パスワードを入力: armando)
これで「Jan」のアカウントで侵入することができたので侵入フェーズは完了になります。

【Phase 3:情報収集】侵入後のサーバー内を調査する
ターゲットサーバに侵入することができたので、次はサーバ内にある情報を収集してみましょう。
ディレクトリを漁って手動で探しても良いですが、今回は時短のために「linPEAS」という情報収集ツールを使用します。
KaliLinuxにはデフォルトで入っていないので、はじめて使う場合はGitHubからダウンロードしてきます。
$ wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh
$ chmod 600 linpeas.sh
Kali Linuxからターゲットサーバーへツール(linPEAS)を転送します。
$ sudo scp linpeas.sh jan@10.201.90.238:/tmp
転送が完了したら再度ログインしてツールを実行します。
$ ssh jan@10.201.90.238 (パスワードを入力: armando)
$ sh /tmp/linpeas.sh
情報の収集が完了するとズラズラと情報が表示されますが、赤字で記載されてる部分が重要そうな情報になっています。

これだと少し見ずらいので、もう少し情報を絞ってみましょう。
$ sh /tmp/linpeas.sh | grep kay
そうすると「sshの秘密鍵らしき情報(id_rsa)」や「pass.bak」といった怪しそうなファイルが見つかりました。


「pass.bak」を確認してみましたが、Janのアカウントでは権限が無く見れません。

なので、もう一つの「Kay(ケイ)」のアカウントでログインしてみましょう。
【Phase 4:権限昇格】管理者権限(root)を奪取する
これ以上のサーバ内の情報を確認する為には管理者権限が必要なるので、最後のフェーズである「権限昇格」のフェーズを実施してみましょう。
もう一つの「Kay(ケイ)」のアカウントが管理者権限のアカウントになると思うのでログインする為の方法を探します。
SSH秘密鍵のクラッキング
「Kay(ケイ)」のアカウントでSSHでログインする場合は秘密鍵(id_rsa)を使う必要があるので、KaliLinux側に秘密鍵のファイルをダウンロードしておきます。
$ scp jan@10.201.90.238:/home/kay/.ssh/id_rsa /home/kali
$ chmod 600 /home/id_rsa
ここでいう鍵を使った認証方式のことを「公開鍵認証方式」といいます。
簡単に言うとパスワードを使った認証よりセキュリティが高い認証方式になります。
サーバとクライアントに「公開鍵」と「秘密鍵」というファイルを用意しておかないと認証できないので、パスワードクラッキングの対策になったりする認証方式になります。
ダウンロードした秘密鍵を使って「Kay(ケイ)」のアカウントでログインしてみましょう。
$ sudo ssh -i id_rsa kay@10.201.90.238
そうすると「秘密鍵を使用するのにパスフレーズを入力してください」と表示されました。

秘密鍵(id_rsa)にかかっているパスワードについてもクラッキングする必要があるので、「JohnTheRipper」というツールを使用して解析を実施します。
「JohnTheRipper」はKali Linuxにデフォルトでインストールされていますが、「ssh2john」というSSHの秘密鍵をjohn形式に変換にするツールはインストールされていないので、そちらはインストールしましょう。
$ wget https://raw.githubusercontent.com/openwall/john/bleeding-jumbo/run/ssh2john.py
ツールを使って対象の秘密鍵からハッシュ値を抽出します。
$ python3 ssh2john.py id_rsa > hash.txt
次にワードリストを使って抽出したハッシュファイルを解析します。
$ john hash.txt –wordlist=/usr/share/wordlists/rockyou.txt
しばらく待つと「Session completed.」となり解析が完了します。
「beeswax」が秘密鍵のパスフレーズになります。

Kayのアカウントでログイン
判明した「秘密鍵(パスフレーズ)」を使ってKayのアカウントにログインします。
$ sudo ssh -i id_rsa kay@10.201.90.238 (パスフレーズを入力: beeswax)
Root権限へ昇格
ユーザ:Kayでログインしたことで、先ほどは見れなかった「pass.bak」が閲覧できるようになっています。
$ cat /home/kay/pass.bak

「pass.bak」の中身がroot権限になるためのパスワードになるので、そのパスワードを使用してroot権限に昇格します。
$ sudo su (pass.bakにあったパスワードを入力)
これでサーバーの全権限を掌握したことになります。

【Phase 5:データ取得】ゴールへの到達
Root権限があればサーバー内のすべてのファイルにアクセス可能となります。
今回の演習のゴールであるフラグ(root.txtなど)も自由に確認することができます。
最後に
今回はハッキングの基本的なフローをTryHackMeの演習を通して実施してみました。
- 偵察が重要:ポートスキャンやWebスキャンで得た情報が、後の侵入の足掛かりになる
- 情報の連鎖:脆弱なパスワード(Jan)→ 内部調査 → 秘密鍵の発見(Kay)→ Rootパスワード発見と、小さな穴を広げていくイメージ
- ツールの活用:Nmap, Hydra, JohnTheRipper, LinPEASなど、適切な場所で適切なツールを使うことが効率化の鍵になる
今回はパスワードクラッキングがメインのアプローチでしたが、実際の脆弱性(エクスプロイト)を利用する場合や、他の手法を使う場合でも「偵察→侵入→調査→昇格」という大枠の流れは変わりません。
是非皆さんも、安全な環境で実際に手を動かして学んでみてください。
ということで、今回はここまでにしたいと思います。
それではまた次回お会いしましょう!