はじめに
この記事で出来るようになること
- ターゲットのIPアドレスの特定/ポートスキャン
- FTP上のデータ取得
- Webサイトの確認/不正ログイン
- パスワード解析/ssh接続
- 権限昇格/フラグゲット
- おまけ
対象読者
- セキュリティやハッキングの学習を始めたい方
今回のゴール
権限昇格を通して、管理者権限でログインしフラグ(root.txt)をゲットする!
ゼロから始めるハッキングラボの作り方 NO.1で用意したPotatoマシンに対してハッキングをしていきます。
まだ環境構築ができていない方はこちらのURLから構築してください。
URL:https://qiita.com/nekobayashi-222/items/2dff90aa5536d0d63890
Step1: Potatoマシンを起動する
Potatoマシンを起動します。

serv login: と表示されますが、Potato側での操作は行わないので、このままで大丈夫です。
Step2: ターゲットのIPアドレス特定/ポートスキャン
まず、mkdirコマンドを使ってpotatoのハッキング用のディレクトリを作成します。
1. vulnhubというディレクトリの作成
$ mkdir vulnhub
2. vulnhubの中にpotatoというディレクトリを作成
$ mkdir potato
2-1. 自身のIPアドレスの確認
まずは、ParrotOS(自分自身)のIPアドレスを確認していきます。
$ ip a ☜ IPアドレスの設定確認コマンド
実行結果↓

192.168.56.104がParrotOS自身に割り当てられているIPアドレスです。
💡 192.168.56.xx と 10.0.3.xx の違い
VirtualBoxを構築していると、大きく分けて2つのIPアドレス(ネットワーク)が登場します。
それぞれ「何のために使うのか」の役割が全く異なります。
| IPアドレスの範囲 | ネットワークモード | 一言でいうと? | 主な役割 |
|---|---|---|---|
192.168.56.0/24(192.168.56.0 ~ 255) |
ホストオンリーアダプター | 隔離された実験場 | ParrotOS、Potato、自分のPC(ホストOS)だけが繋がる閉じられたネットワーク。ハッキング実験(2台の間の通信)にはこれを使います。 |
10.0.3.0/24(10.0.3.0 ~ 255) |
NAT | インターネット用通路 | 各マシンが個別にインターネット(外の世界)へ接続するためのもの。ParrotOSとPotato同士の通信には使いません。 |
もう少し詳しく!
-
ホストオンリーアダプターとは?
外の世界(インターネット)からは完全に遮断された、あなた専用の秘密のプライベートネットワークです。安全性が高いため、マルウェアの解析やハッキングの練習に最適な環境を作ることができます。 -
NATとは?
仮想マシンがインターネットに繋がって、OSのアップデート(apt upgradeなど)やツールのダウンロードをするために使います。ただし、このモードのままだと仮想マシン同士(ParrotOS ⇔ Potato)で通信し合うことができません。
まとめ
今回のハッキングラボでは、お互いを通信させたい(攻撃を成立させたい)ので「ホストオンリーアダプター(192.168.56.xx)」をメインに使用していく、と覚えておけばOKです!
2-2. PotatoのIPアドレスの特定
192.168.56.0/24の範囲にあるIPアドレスを列挙するコマンドをターミナルに打ち込みます。
$ sudo netdiscover -i enp0s3 -r 192.168.56.0/24
ネットワークを調査した際に 192.168.56.xx というアドレスが3つ表示されました。「どれがPotatoのアドレス?」と迷いやすいですが、それぞれの正体は以下の通りです。
-
192.168.56.1
👉 Windows(あなたのホストPC)に割り当てられているアドレスです。 -
192.168.56.100
👉 仮想マシンにIPアドレスを自動で割り当てている DHCPサーバー自体のアドレスです。 -
192.168.56.103(上記以外の数字)
👉 これがターゲット(Potato)のIPアドレスです!
2-3. ポートスキャン
ターゲットのIPアドレス(192.168.56.xx)が特定できたので、ポートスキャンを行っていきたいと思います。
$ sudo nmap -sC -sV -Pn -p- 192.168.56.103 -oN portscan_result.txt
nmapの主要オプション解説
| オプション | 役割 | 詳しい説明・使う理由 |
|---|---|---|
-sC |
デフォルトスクリプト実行 | 一般的な脆弱性や情報を自動でチェックしてくれる、nmap標準のスクリプト群(NSE)を実行します。 |
-sV |
バージョン検出 | 開いているポートで動作しているソフトウェアの名前と詳細なバージョンを調査します。 |
-Pn |
疎通確認(ping)のスキップ | スキャン前の疎通確認(ICMP)を行いません。 理由: ターゲットのセキュリティ設定によってはICMPがブロックされ、ポートスキャン自体が途中で終了してしまうのを防ぐためです。 |
-p- |
全ポートスキャン |
0 ~ 65535番のすべてのポートを対象にします。 理由: オプションなし(デフォルト)だと一般的な主要ポート(上位1,000個など)しか調査されず、怪しいポートを見落とす可能性があるためです。 |
-oN |
通常形式でファイル保存 | スキャン結果を指定したファイル名でテキスト保存します。後から結果を見返して分析する際に必須となります。 |
実行結果↓

ssh,http,ftpのポートが開いていることが分かります。
ssh接続を行う際はユーザー名やパスワードが必要ですが、まだ分からないためftpにあるデータを確認して行きます。
Step3: FTP上のデータ取得
3-1. ftpのインストール
ftp上のデータを取得する際にftpというコマンドを使いますが、ParrotOSにはプリインストールされていません。
1. ターミナルを開いてパッケージリストを更新する。
$ sudo apt update
※「apt list --upgradeableを実行してください」というメッセージが表示されても無視してください。
2. ftpをインストールするコマンド。
$ sudo apt install ftp
3. ftpがしっかりインストールされているか確認する方法
$ ftp -h
これで書式の解説が表示されればインストールは成功しています。
3-2. ftpサービスにアクセスする
ポートスキャンの結果を改めて確認すると、Anonymous FTP login allowed (FTP code 230)と書かれています。
これは、対象のFTPサーバーがパスワードなし(公開状態)で誰でもログインできるように設定されていることによる警告文です。
ユーザー名に anonymous または ftp と入力し、パスワードを空欄(または適当な文字)にすることで、誰でも簡単にアクセスすることが可能です。
実際にFTPサーバーにアクセスしていきます。
$ ftp 192.168.56.103 2112 ☜ 2112はftpのポート番号です。
3行目にName:を聞かれますが、anonymousを入力してください。
その次にpassword:を聞かれますが、適当な文字を入力してください。
例)hogehogeなど
すると、プロンプトが変わり、簡単にアクセスすることができました。
3-3. データの取得
ftpサービスにアクセスできたら、lsコマンドを使用しどんなファイルやディレクトリがあるのかを確認します。
実行結果↓

ファイルが2つあるので、それぞれParrotOSの中にダウンロードしていきます。
1. ファイルをダウンロードするコマンドです。
$ get index.php.bak
$ get welcome.msg
2. ダウンロードが終わったら、exitでftpサービスから抜けます。
$ exit
3-4. ダウンロードしたデータの確認
ftpサービスから抜け出したらlsコマンドを使用し、データを確認します。
welcome.msg↓

welcome.msgの方はテキストファイルということが分かります。
index.php.bak↓

index.php.bakもテキストファイルであることが分かりますが、HTMLタグを含むPHPファイルになっており、ログイン処理のあるWebサイトのソースが書いてあります。
ユーザー名は、adminで固定になっており、パスワードはデフォルトが、potatoに設定されていることが分かります。
また、ログインが成功するとダッシュボードページに移動するような流れになっています。
Step4: Webサイトの確認/不正ログイン
次に、http(Webサイト)のポートが開いていたので、そっちを確認します。
4-1. Webサイトの確認
ParrotOSでfirefoxを開き、URL部分にhttp://192.168.56.103 を入力するとWebサイトが表示されました。

4-2. アクセスできるファイルを列挙
dirbという辞書攻撃ツールを使って、アクセスできるファイルやディレクトリーを列挙します。
dirbは未知のファイル、ディレクトリー、サブディレクトリーを発見するためのツールです。
$ dirb http://192.168.56.103 /usr/share/wordlists/dirb/common.txt
結果の中に /adminというディレクトリがありました。adminというディレクトリ名から管理者向けの認証と推測できます。
4-3. ログイン画面
index.php.bakに書いてあった、ユーザー名(admin)とパスワード(potato)を入力すると認証に失敗してしまいました。
デフォルトのパスワードではなく、別のパスワードに変更されているっぽいです。
4-4. Burpsuiteで送信データの閲覧
ユーザー名とパスワードが分からないため、ブラウザからWebサイトへ送信されるデータを改ざんしていきます。
ParrotOSにはBurpsuiteがプリインストールされているため、それを立ち上げてください。

はじめて起動させると、警告ダイアログが表示されますが、先に進んで大丈夫です。

プロジェクト作成画面が表示されたら、画面下のNextボタンを押してください。

プロジェクトのロード画面が出てくるので、画面下のStart Burpを押してください。
Burpのメイン画面が表示されたら、Proxyタブに移動してください。

Interceptがオンになっているのでオフにしてください。
※Interceptがオンになっているとブラウザで行った操作がWebサーバーに届かなくなってしまうので通信データを改ざんする時以外はオフにしておいてください。
Opne browserをクリックするとWebサイトを開くタブが表示されるので、サイトのリンクを打って、http://192.168.56.103/admin を開いてください。
ログイン画面が表示されるので、4-3の時と同じく、ユーザー名:admin、パスワード:potatoを入力して送信してください。
この時に、burpsuiteのProxyタブのHTTP historyに移動すると、データを送信したログが残っています。

リクエスト画面には、自分が入力したデータが載っており、レスポンス画面にはその応答が書いてあります。
このようにburpsuiteは、データ送信の際にブラウザでは見えない、ヘッダ情報や内容まですべて見ることができます。
4-5. Burpsuiteで送信データの改ざん
データを閲覧するだけでなく、改ざんすることもできます。
Webサイトを開いた後Interceptタブに戻り、Interceptをオンにしてください。
Interceptをオンにしたら、もう一度ログイン操作を行うとInterceptタブの中にBurpsuiteでせき止めている通信が表示されます。
改ざんしたいデータを選択すると、下にリクエスト画面が表示されます。

ユーザー名は、adminにし、パスワードのところはpasswrdの後に[]を付けるとパスワードを回避することができます。
この時点では、Burpsuiteで通信がせき止められており、まだWebサーバーに通信データが届いていない状態なので、InterceptタブにあるForwardボタンを押します。

Forwardボタンを押した後にWebサイトに戻るとログインが成功しています!

ダッシュボードに移動するリンクが表示されているので、そちらに移動します。
4-6. dashboard.php
UsersやDateなどを確認すると、LogsのところだけWebサーバーにデータを送信していることが分かります。
Logsの画面↓

log_01.txtなどファイルを選択し、Get the logのボタンを押すと、ログが表示される仕組みになっていることが分かります。
この仕組みを利用して、ディレクトリトラバーサル攻撃をしていきたいと思います。
4-7. ディレクトリトラバーサル攻撃
ディレクトリトラバーサル攻撃とは、ファイル名の検証が不十分であることによって、親ディレクトリへアクセスすることを許してしまう脆弱性のことです。
親ディレクトリから別のパスに移動できるため、サーバー内の任意のファイルにアクセスできます。
また、burpsuiteでWebに送信するデータを書き換えます。(手順は4-5で行ったデータの改ざんと同じです。)

../でカレントディレクトリの一つ上の親ディレクトリに移動しています。
/etc/passwdにはパスワードファイルがあるため、これが分かればssh接続に必要なデータを取得できます。

パスワードが取得できたので、このデータをコピーして、新しく作成したpass.txtに張り付けていきます。
💡 おまけ:SQLインジェクションの検証(失敗談)
ログイン画面の定番攻撃である SQLインジェクション(SQLi) が通用するのか、試しに以下の入力値で裏口ログインを試みてみました。
- ユーザー名: ' or 1=1 --
- パスワード:test
▼ 結果
残念ながら認証に失敗してしまいました……!
バックアップファイル(index.php.bak)のソースコードを見返してみると、ユーザー名が adminで完全一致するかどうかが厳密にチェックされており、SQLの構文を外から歪めて突破することはできないロジックになっていました。
「定番の攻撃がすべて通用するわけではない」という、ペネトレーションテストのリアルな難しさを体感できるポイントです。
Step5: パスワード解析/ssh接続
Step4で取得したユーザー一覧(pass.txt)ですが、すべてのアカウントがSSHでログインできるわけではありません。また、すべてのアカウントが解析できるわけでもありません。
効率よくターゲットを絞り込むために、データを分析していきます。
5-1. ログイン可能なユーザーの絞り込み
Linuxにおいてログイン可能なユーザーは、データの第7フィールド(一番右端)に、ログイン後に起動するシェル(/bin/bash や /bin/shなど)が指定されています。
そこで、grep コマンドを使って「末尾が shで終わるユーザー」だけを特定します。
$ cat pass.txt | grep -P 'sh$'
実行結果↓

▼ 実行結果からわかること
結果として root、florianges、webadmin の3人が特定できましたが、それぞれのパスワード欄(第2フィールド)に大きな違いがあります。
-
root/ florianges の場合
👉 パスワード欄が x になっています。これはパスワードが別ファイルに隔離(シャドウ化)されている状態を意味しており、現時点ではパスワードハッシュすら分かりません。 -
webadmin の場合
👉 パスワード欄に $6$vL... という長い文字列が露出しています。これこそが、今回お目当ての 暗号化されたパスワード(パスワードハッシュ) です!
💡 ここがポイント!
パスワード解析ツール(John the Ripperなど)を使うには、この「パスワードハッシュ」が手元にある必要があります。
つまり、現時点で解析を進められるのは、設定不備でハッシュが丸見えになっている webadminだけ ということです!
パスワードの解析は、John the Ripperやhashcatなど様々なものがありますが、今回はJohn the Ripperを使用していきます。
5-1. John the Ripper(以降、john)
johnは、昔からハッキングの場面で頻繁に使われています。
パスワード候補が収録されたテキストファイル(辞書ファイル)を使用して、パスワードの総当たりを行うことで解読します。
今回は、rockyou.txtという世界的にも有名な辞書ファイルを使用します。
5-2. rockyou.txtの準備
ParrotOSには、rockyou.txtなどの辞書ファイルがいくつか圧縮された状態でプリインストールされています。
使用する場合は、解凍してあげる必要があるので、解凍していきます。
$ sudo gunzip /usr/share/wordlists/rockyou.txt.gz
実行結果↓

これで、rockyou.txtが使えるようになりました。
5-3. パスワード解析
Wabadminユーザーのパスワードをpass.txtから取り出し、新しく作成したhash.txtに出力します。
$ cat pass.txt | grep -P 'sh$' | grep webadmin > hash.txt
成功しているかcatコマンドを使用して確認
$ cat hash.txt
実行結果↓

hash.txtにwebadminユーザーのパスワードがしっかり保存されたら、いよいよ解析していきます。
$ john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
johnの後に解読したいデータが入っているファイルと、解読に使う辞書を指定してあげます。
実行結果↓

webadminユーザーのパスワードがdragonということが分かりました。
5-4. ssh接続
ユーザ名とパスワードが揃ったので、ssh接続を行っていきたいと思います。
$ ssh webadmin@192.168.56.103
実行結果↓

Are you sure you want to continue connectingと聞かれますがyesで大丈夫です。
また、パスワードを途中で聞かれるので、dragonを入力するとプロンプトが変化し、webadminユーザーとしてログインすることができました。
Step6: 権限昇格/フラグゲット
6-1. 現状把握
webadminユーザーとしてログインできたので、現状を把握していきます。
現在の権限を確認するコマンド
$ id
実行結果↓

しっかり、webadminの権限が付いていることが分かります。
次にホームディレクトリを調べます。
ディレクトリ一覧表示コマンド
$ ls -al
実行結果↓

user.txtというファイルがあるので、catコマンドで確認して行きます。

すると、読めない変な文字列が表示されます。
もとの文章が何かに変換されていそうなので、とりあえずbase64でデコードしていきます。
$ cat user.txt | base64 -d
※ -dはデコードを表しています。
6-2. 他のユーザーのディレクトリにアクセスする
ホームディレクトリに移動し、他にどのユーザがいるのかやどんなデータがあるのかを調査していきます。
1. ホームディレクトリに移動
$ cd ../
2. ファイルやディレクトリを表示
$ ls

すると、floriangesというデータが出てきました。
cdコマンドでfloriangesに移動し、どんなファイルやディレクトリがあるのか確認してみます。
1. cdコマンドで移動
$ cd florianges
2. ファイルやディレクトリ確認
$ ls -al
実行結果↓

するとパーミッション情報から、ほとんどのファイルとディレクトリに対して実行権限がついていないことが分かります。
6-3. webadminがsudoコマンドを使えるのか
webadminユーザーがsudoコマンドを使えるのか調査していきます。
$ sudo -l
実行結果↓

最後の行を見ると、webadminユーザーは /bin/nice プログラムと /notesディレクトリは以下の全てのファイルを指定できることが分かりました。
6-4. 権限昇格
まず、webadminは /bin/niceのプログラムを実行できるので、どんなことができるのか確認して行きます。
manコマンドで詳細を調べる
$ man /bin/nice
nice コマンドは、本来はプログラムを実行する際の「優先度(ナイス値)」を設定するためのLinux標準コマンドです。これ単体では攻撃に使えませんが、「root権限で他のプログラムを仲介して実行できる」という性質を持っています。
次に、/noteディレクトリに移動し、どんなデータがあるのかを調査します。
/notesに移動する
$ cd /notes
ファイルやディレクトリの一覧を表示する
$ ls -al
実行結果↓

やはり、読み取り権限や実行権限がないので、niceコマンドを使用して挙動を確認します。
$ sudo /bin/nice /notes/clear.sh
実行するとターミナルの画面がクリアされてしまいました。
次に、/notes/id.shファイルを指定してみます。
$ sudo /bin/nice /notes/id.sh
実行結果↓

すると、rootユーザーがidコマンドを実行した時と同じ結果が表示されました。
root権限でコマンドを実行することに成功したため、niceコマンドを使えばルートシェルを奪取することができてしまいます。
niceコマンドを使ってシェルをrootで実行させる方法として、../ を活用します。
$ sudo /bin/nice /notes/../bin/bash
実行結果↓

無事権限昇格が成功し、root権限のプロンプトが表示されました。
6-5. フラグの取得
現在、/notesディレクトリにいるので、ホームディレクトリに移動します。
$ cd ~
ホームディレクトリでlsコマンドを実行するとroot.txtがあります。
catコマンドで確認するとbase64で変換されている文字列が表示されるためデコードします。
$ cat root.txt | base64 -d
実行結果↓

またもや、フランス語のような文字列が出てきました。
今回のハッキングはここまでです!
💡読めない文字が出てきた場合の対処法
大抵、読めない文字が出てきたらBase64かシーザー暗号だったりすることが多いです。
今回は違いますが、base64は変換する際に文字数が足らないと =(イコール)で補うことがあるので、変な文字列の最後が = だった場合は100%、base64で変換されています。
最後まで閲覧していただき、ありがとうございます!!
potatoには今回やった手法以外にも攻略ルートがありそうなので、ぜひ「ハッキング・ラボの作り方」を購入して試してみてください。






