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?

はじめに

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

  • DC-2の起動
  • ターゲットのIPアドレスの特定/ポートスキャン
  • Webサイトの確認
  • WordPressのユーザー列挙
  • 総当たりでWordPressの認証突破
  • SSH接続/rbashからの脱出
  • 権限昇格/最終フラグのゲット

対象読者

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

今回のゴール

初心者向けペネトレーションテスト環境であるDC-2を攻撃し、隠されている5つのフラグを確認すること

Step1: DC-2の起動

1-1. DC-2のダウンロード

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

ダウンロードが失敗する方は、Download (Mirror) のほうを試してみてください。

ダウンロードに成功したら、DC-2のファイルが圧縮されているので解凍しておきます。

1-2. VirtualboxにDC-2の仮想マシン作成

VirtualBoxを起動し、メニューのファイル > 仮想アライアンスのインポートを選びます。
image.png
ファイルにダウンロードしたDC-2のファイルを指定して、次に進みます。

image.png

設定画面では、仮想マシンの名前とMACアドレスのポリシーがすべてのアダプターのMACアドレスを含むを選択して、完了ボタンを押します。
これでDC-2の仮想マシンが作成されました。

1-3. DC-2の仮想マシンの起動

作成したDC-2の仮想マシンを起動してください。

注意 (仮想マシンのネットワーク設定)
アダプター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

DC-2のアドレスは、192.168.56.105だと分かりました。

💡 IPアドレス特定についての詳しい解説

ネットワークの仕組みや、表示される3つのIPアドレスの正体については、前回の記事
ゼロから始めるハッキング・ラボの作り方 No.2 で詳細に解説しています。
「どれがターゲットか見分けがつかない!」という方はぜひそちらも参考にしてください。

2-3. ポートスキャン

ターゲットIPアドレスが特定できたので、ポートスキャンを実行していきます。

$ sudo nmap -sV -Pn -p- 192.168.56.105 -oN nmap.txt 

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

Step3: Webサイトの確認 / 不正ログイン

ポートスキャンで HTTP(80番ポート) が開いていたので、Webサイトを確認します。

3-1. Webサイトの確認(リダイレクトの罠)

ParrotOSでFirefoxを開き、URLバーに http://192.168.56.105 を入力してアクセスしてみます。
image.png

すると、自動的にURLが http://dc-2/ に書き換わり(リダイレクト)、画面に「We can’t connect to the server」というエラーが表示されてページが開きません。

💡 なぜエラーになるの?(WordPressの仕組み)

この現象は、DC-2で使われている WordPress というWebシステムの仕様が原因です。
裏側では以下のようなすれ違いが起きています。

[あなた] 
http://192.168.56.105 へアクセス!
│
▼
[DC-2] 
「アクセスありがとう!でも私の正式名は『dc-2』なんだ。
URLを http://dc-2/ に転送(リダイレクト)するからアクセスし直してね!」
│
▼
[ブラウザ] 
「了解!じゃあ『dc-2』に繋ぐね!……ところで『dc-2』のIPアドレスって何番だっけ?
インターネット上の電話帳(DNS)を探しても載ってないぞ…諦めよう(エラー)」

DC-2は仮想環境内のプライベートなマシンなので、インターネットのDNSサーバーには登録されていません。そのため、ブラウザが「dc-2」という名前からIPアドレスを見つけられず(名前解決に失敗し)、エラーになってしまいます。

🛠️ 解決策: hostsに登録する

ブラウザに「dc-2のIPアドレスはこれだよ!」と教えてあげるために、hosts ファイル を書き換えます。

📌 hostsファイルとは?
PCの内部にある「世界で一番優先される、自分専用のローカル電話帳」です。
ここに手動で登録することで、インターネットに載っていないマシンでも名前でアクセスできるようになります。

hostsファイルに以下の設定を追加することで、ブラウザが迷わずにDC-2へアクセスできるようになります。

hostsファイルを開く
$ sudo nano /etc/hosts 

開いたら、以下の文字を追加する
192.168.56.105 dc-2

編集後のhostsファイル↓
image.png

hostsファイルを書き換えたら、もう一度、Webサイトを開いてみましょう!
image.png
無事、サイトを開くことができました。

3-2. フラグ1の確認

Webサイトを開くと、flagタブがあるので選択すると、flag1が表示されました。
image.png
これでまずは1つ目のフラグを見つけることができました。

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

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

💡 Gobusterについて

Gobuster は、Go言語で作られた非常に高速なブルートフォースツールです。
今回はWebサイト内にある「アクセスできる隠しファイルやディレクトリ」を列挙するために使用しますが、実はWeb以外にも以下のような多彩なスキャンモードを持っています。

 モード   主な役割
dir ディレクトリやファイルの探索
dns サブドメインの列挙(隠れたサーバーの発見)
vhost 仮想ホスト(同一IP上の別サイト)の特定
s3 AWS S3などクラウドストレージのバケット探索

📌 なぜGobusterを使うの?
前回のPotato編で使った dirbに比べ、Gobusterは実行結果がとても見やすいからです。
dirbを使って検証していたのですが、検索結果が整理されておらず、見えずらかったためGobusterを採用しました。


今回は dirモードを使って、以下のようにコマンドを組み立てて実行していきます。
また、dirbの時と同様に辞書ファイルを使用して総当たりするため、使用する辞書ファイルのパスを後ろに指定します。

 オプション  役割 
dir ディレクトリやファイルの探索
-u 攻撃対象のURLを指定する
-w 辞書ファイルを指定する
gobuster dir -u http://192.168.56.105:80 -w /usr/share/wordlists/dirb/common.txt

実行結果
image.png
複数のディレクトリが表示されましたが、その中でもadminが含まれている /wp-admin
アクセスしてみます。

image.png
すると、WordPressのダッシュボードの認証ページが出てきました。

Step4: WordPressのユーザー列挙

認証ページが表示されましたが、現時点ではアカウント情報がひとつもありません。
そこで、まずはWebサイト内にどんなユーザーが存在するのかを特定していきます。

4-1. ログインエラーの挙動チェック

試しに、適当なユーザー名とパスワードを入力してみます。

ユーザー名: hoge / パスワード: hoge
image.png
👉 エラー文: 「無効なユーザー名です」というエラーが表示されます。

次に、定番の管理者名(admin)を入力してみます。
ユーザー名: admin / パスワード: hoge
image.png

👉 エラー文: 「ユーザー名 admin のパスワードが間違っています」という、先ほどとは
違うエラー文が表示されました!

💡 ここがポイント!

エラーメッセージが変わったということは、「hogeというユーザーは存在しないが、adminというユーザーはシステム内に実在する」 という証明になります。この仕様(情報の漏洩)を利用して、他のユーザーも探していきます。


4-2. 投稿者アーカイブ(?author=)を使ったユーザー列挙

WordPressには、投稿者ごとに記事をまとめる「投稿者アーカイブ」という機能が標準で
備わっています。

特別な対策がされていない限り、URLの末尾に /?author=[数字] というパラメーターをつけてアクセスすると、その数字に対応した個人のページへ自動的にリダイレクトされ、URLからユーザー名が丸見えになります。

実際にブラウザのURLバーに入力して、隠れたユーザーをあぶり出してみましょう!

http://dc-2/?author=1
👉 http://dc-2/index.php/author/admin/ に転送! ➔ admin を特定

http://dc-2/?author=2
👉 転送されない ➔ 対応するユーザーがいない

http://dc-2/?author=3
👉 http://dc-2/index.php/author/jerry/ に転送! ➔ jerry を特定

これで、jerryユーザーを洗い出すことができました!

4-3. nmapのNSE機能を使った調査

jerry以外にユーザーがいないか調査を行うため、nmapのNSE機能を使用します。

💡 NSE(Nmap Scripting Engine)

NSEは、Lua言語で記述されたスクリプトを使って、ネットワーク探査や脆弱性スキャンなどのタスクを自動化・拡張できる強力な機能です。

使用する際は、Nmapの実行時に --script オプションを使用します。

$ nmap -p80 --script http-wordpress-users 192.168.56.105

実行結果
image.png
新たにtomというユーザーを発見しました。
以上で、admin・jerry・tomの合計3名のユーザーの存在が確定しました。
特定した上記のデータをこのあと、総当たりで認証を突破する際に使用するためユーザーのリストを作ります。

ユーザーリストのファイルを作成
$ sudo nano users.txt

ファイルの中にadmin,jerry,tomを書き込んだら、保存しcatコマンドで確認
$ cat users.txt

実行結果
image.png

Step5: 総当たりでWordPressの認証突破

WordPressのユーザー名が特定できたので、あとはパスワードが分かれば総当たりすることができます。

5-1. CeWLを使った辞書ファイルの作成

ここでflag1を思い出してほしいのですが、flag1にはCeWLを利用するというヒントが記載されていました。

💡 CeWL

CeWLはRubyで作成された辞書ファイル生成ツールです。
指定したWebサイトをスクレイピングして、パスワードとして使われそうなキーワードを
辞書ファイル化することができます。

まず、CeWLを実行するコマンドがあるかどうかを確認していきます。

$ cewl --h

実行結果
image.png
オプションが沢山表示されたら、cewlがすでに実行できる状態になっています。

CeWLがインスト―スされていない場合

CeWLが謎にプリインストールされていないことがあるので、インストール作業を行っていきます。

CeWLをインストールする
$ sudo apt install cewl -y

インストールが完了したら、正常に動作するか確認
$ cewl --help

実行結果
image.png
オプションが沢山表示されたら、cewlのインストール成功です。


CeWLが実行できるかどうかを確認出来たら、辞書ファイルを作成していきます。
辞書ファイル生成するもとのWebサイトを指定し、作成したファイルをカレントディレクトリに保存するように指定します。

$ cewl http://dc-2 -w ./cewl.txt

実行結果
image.png

💡 なぜ、-wオプションをつけるのか?

- w オプションを付けずにcewlを実行すると、Webサイトから収集した大量のキーワードがターミナルの画面上にズラズラズラッ!と一瞬で流れて終わってしまいます。

Linuxの標準機能であるリダイレクトを使ってファイルに保存することも可能ですが、実はそれだとツール起動時に表示される「バナー」まで一緒に保存されてしまうという問題が発生します。

CeWLの起動バナー
▲ 画像の一番上に表示されているロゴのような文字列が「バナー」です。

❌ リダイレクトで保存した場合

バナーテキストがファイルの一番上に混入してしまいます。
このまま次のツール(Hydraなど)に読み込ませると、バナーの文字まで「パスワードの候補」として無駄にテストされてしまい、エラーや効率低下の原因になります。

- w オプションで保存した場合

ツールの機能として、バナーを除外した 「Webサイトから集めた純粋な単語リストだけ」 の綺麗なファイルを自動で生成してくれます。

📌 まとめ
後続のハッキングツールで不具合を起こさないためにも、ワードリストを作成する際は必ず
-w [ファイル名] を指定して、余計な文字を含めないようにしましょう!

5-2. WordPressの認証突破

ユーザー名のリストとパスワードの候補リストが揃ったので、認証を突破していきます。
今回はオンラインパスワードクラッカーであるHydraを使って解読していきます。

💡 Hydra

高速なパスワードクラックツールを指します。
SSH、FTP、Telnet、HTTP(Webフォーム)などのネットワーク認証サービスに対して、
ユーザー名とパスワードを総当たり(ブルートフォース攻撃)または辞書攻撃で試行し、
突破できるか検証するツール。

パラメーター 役割・意味
-L users.txt ユーザー名が大量に載ったファイルを指定します。
-P cewl.txt パスワード候補が載ったファイルを指定します。
dc-2 ターゲットとなるサーバー名(またはIPアドレス)を指定します。
http-form-post 攻撃対象の形式(WebサイトのPOSTフォーム)を指定します。
'/wp-login.php:...' ログインページの 「URL」「送信データ」「判定条件」 を指定します。

⚠️ 初心者が間違えやすいポイント!

  • 大文字 と 小文字 の使い分け
    • ファイルを読み込ませる場合は、大文字の -L / -P を使います。
    • ユーザー名やパスワードを直接1つだけ指定する場合は、小文字の -l ユーザー名 / -p パスワード を使います。
      (※今回はファイルを読み込ませるため、必ず大文字で入力してください)
$ hydra -L users.txt -P cewl.txt dc-2 http-form-post '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=log In&testcookie=1:S=Location'

実行結果
image.png

jerryのパスワードはadipiscing、tomのパスワードはparturientであることが分かりました。

5-3. 不正ログイン

まず、jerryユーザーでログインし、Pages > All Pagesを開きます。7つのページがあり、
2番目にflag2というタイトルの記事があります。
image.png

次に、tomユーザーでログインしましたが、これといった情報は何もありませんでした...

flag2の文面によると、WordPressの脆弱性を攻撃できないなら、別の侵入口を見つけるべきと書いてあります。
現在は、jerryユーザーでログインしており、管理者ではないためWordPressのダッシュボードを利用した攻撃を行うことができません。

Step6: SSH接続/rbashからの脱出

別の侵入経路として、SSH接続を行っていきます。

6-1. SSH接続

ポートスキャンの際にSSHのポート(7744番)が開いていたのでSSH接続をしてみます。
まず、jerryユーザーで試します。

$ ssh jerry@192.168.56.105 -p 7744

実行結果
image.png

途中でパスワードを聞かれるので、adipiscingを入力しましたが、ログインできませんでした。

次に、tomユーザーで試すと、ログインが成功しました。
tomのパスワードはparturientです。

$ ssh tom@192.168.56.105 -p 7744

実行結果
image.png

6-2. 現状把握

tomユーザーが何をできるのか把握するため、whoamiコマンドとidコマンドを実行しました。

指定されたユーザーのシステム識別 (ID) を含むメッセージを表示
$ id

現在システムにログインして操作しているユーザーのユーザー名を表示するコマンド
$ whoami

実行結果
image.png
なぜかうまくいきませんでした。
原因を特定するため、echoコマンドで現在のシェルを確認してみました。

$ echo $SHELL

実行結果
image.png
すると、現在のシェルがrbashになっていることが分かります。

rbash(制限シェル)の主な特徴

rbash環境では、攻撃者や一般ユーザーがシステムを悪用できないよう、以下のような厳しい制限がかけられています。

  • 環境変数PATHが読み取り専用: コマンドを探すパスを勝手に変更できません。
  • フルパスでのコマンド実行不可: /bin/shのように直接実行ファイルを指定して動かすことができません。
  • リダイレクトの禁止: > や >>を使ってファイルへの書き込みや出力変更ができません。
  • 機能制限モードの解除不可: 途中で通常の bashへ切り替える操作が拒否されます。

一応、lsコマンドを使用できるか確認すると無事実行され、flag3.txtとusrディレクトリがありました。
試しにcatコマンドでflag3.txtを確認すると、catコマンドが使えないため失敗します。
image.png

6-3. 現在使えるコマンドの調査

lsコマンドでを使用して、usrディレクトリの中身を確認していきます。
※cdコマンドで移動して開こうとすると、cdコマンドも使えないため失敗します。
image.png
その結果、less,ls,scp,viのシンボリックリンクがありました。
先ほどlsコマンドが普通に使用できたので、もしかしたら上記のいくつかのコマンドにはパスが通っているかもしれないため、調べていきます。

環境変数のリストを表示する
$ export -p

実行結果
image.png
環境変数PATHには /home/tom/usr/bin だけが設定されています。
これで先ほどの4つのコマンドを直接実行することができるということが分かります。

6-4. flag3.txtの確認

viコマンドが直接実行できるので、flag3.txtの中身を確認していきます。

$ vi flag3.txt

実行結果
image.png
これで無事、flag3までを確認することができました。

6-5. rbashからの脱出

rbashによってほとんどのコマンド実行や環境変数の操作が制限されていますが、システム内に用意されているお馴染みのテキストエディタ vi を利用することで、この不自由な制限シェルから脱出することができます。

このように、Linuxの標準コマンドやバイナリの「仕様」を突いて制限を迂回・特権昇格する手法は GTFObins という有名なサイトにまとめられており、今回の vi を使った手法もそこから引用しています。
手順は非常にシンプルで、viの内部から直接新しいシェルを呼び出します。

1. まずは通常通り vi を起動します

$ vi

実行結果
image.png
そしたら、:set shell=/bin/shを入力してEnterキーを押します。
image.png
最後に、:shellを入力して、Enterキーを押すと、プロンプトが返ってきます。
image.png

rbashから脱出できているか確認するため、現在のシェルをechoを使って調べます。

$ echo $SHELL

実行結果
image.png

変化が分からなかったため、現在のシェルを格納している $0 を使って調べてみます。

$ echo $0

実行結果
image.png
rbashからshへの切り替えに成功しています!
これにより、rbashの機能制限を回避し、環境変数を変更することができるようになります。

6-6. 環境変数PATHの変更

まだ、catコマンドが使えないため、環境変数PATHを変更しほかのコマンドが使えるようにしていきます。

$ export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

変更が反映されているかechoを使って確認
$ echo $PATH

実行結果
image.png

これで、catコマンドなども使用可能になりました。

Step7: 権限昇格/最終フラグのゲット

7-1. jerryとしてログイン

現在、tomユーザーとしてログインしているため、suコマンドを使ってjerryユーザーとしてログインします。

$ su jerry

実行結果
image.png
無事、jerryとしてログインができましたが、現在いるディレクトリがtomになっているので、jerryユーザーはコマンドを使うことができません。

そこで、cdコマンドを使ってjerryユーザーのディレクトリに移動します。
image.png
lsコマンドを使うとflag4.txtがあるので、catコマンドで中身を確認していきます。
image.png
flag4.txtには、まだ最後のflagが残されており、そのヒントはここになしと書いてあります。
jerryユーザーの中には最終フラグがないことが分かったので、管理者でログインしていきます。

7-2. 管理者権限でログイン

管理者としてログインするために、sudoコマンドの設定を確認していきます。

$ sudo -l

実行結果
image.png
最後の行に、/usr/bin/gitについてはパスワードなしで実行できると書いてあります。
ここから、sudoコマンドをつければgitコマンドをパスワードなしで実行できてしまうことが判明しました。

GTFObinsにはgitコマンドを利用した管理者権限のシェルを奪う方法があります。
様々な方法がありますが、今回はgit -p help configコマンドを使用します。

$ sudo git -p help config

実行結果
image.png
ずらずらとヘルプが表示され、最後に : が表示されるので、!/bin/shと入力するとルート(管理者権限)のプロンプトが返ってきます。
image.png

7-3. 最終フラグの確認

ルートユーザーとしてのログインは成功しているので、ルートユーザーだけがアクセスできる /root に移動します。
移動したら、最終フラグがあるのでcatコマンドで開くと中身を確認することができます。
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?