1
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?

はじめに

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

  • ターゲットのIPアドレスの特定/ポートスキャン
  • FTP上のデータ取得
  • Webサイトの確認/不正ログイン
  • パスワード解析/ssh接続
  • 権限昇格/フラグゲット
  • おまけ

対象読者

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

今回のゴール

権限昇格を通して、管理者権限でログインしフラグ(root.txt)をゲットする!
ゼロから始めるハッキングラボの作り方 NO.1で用意したPotatoマシンに対してハッキングをしていきます。
まだ環境構築ができていない方はこちらのURLから構築してください。
URL:https://qiita.com/nekobayashi-222/items/2dff90aa5536d0d63890

Step1: Potatoマシンを起動する

Potatoマシンを起動します。
image.png
serv login: と表示されますが、Potato側での操作は行わないので、このままで大丈夫です。

Step2: ターゲットのIPアドレス特定/ポートスキャン

まず、mkdirコマンドを使ってpotatoのハッキング用のディレクトリを作成します。

1. vulnhubというディレクトリの作成
$ mkdir vulnhub

2. vulnhubの中にpotatoというディレクトリを作成
$ mkdir potato

2-1. 自身のIPアドレスの確認

まずは、ParrotOS(自分自身)のIPアドレスを確認していきます。

$ ip a ☜ IPアドレスの設定確認コマンド

実行結果↓
image.png
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 

実行結果↓
image.png

ネットワークを調査した際に 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 通常形式でファイル保存 スキャン結果を指定したファイル名でテキスト保存します。後から結果を見返して分析する際に必須となります。

実行結果↓
image.png
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のポート番号です。

実行結果↓
image.png

3行目にName:を聞かれますが、anonymousを入力してください。
その次にpassword:を聞かれますが、適当な文字を入力してください。
例)hogehogeなど
すると、プロンプトが変わり、簡単にアクセスすることができました。

3-3. データの取得

ftpサービスにアクセスできたら、lsコマンドを使用しどんなファイルやディレクトリがあるのかを確認します。

実行結果↓
image.png
ファイルが2つあるので、それぞれParrotOSの中にダウンロードしていきます。

1. ファイルをダウンロードするコマンドです。
$ get index.php.bak
$ get welcome.msg

2. ダウンロードが終わったら、exitでftpサービスから抜けます。
$ exit

3-4. ダウンロードしたデータの確認

ftpサービスから抜け出したらlsコマンドを使用し、データを確認します。
welcome.msg↓
image.png
welcome.msgの方はテキストファイルということが分かります。

index.php.bak↓
image.png
index.php.bakもテキストファイルであることが分かりますが、HTMLタグを含むPHPファイルになっており、ログイン処理のあるWebサイトのソースが書いてあります。
ユーザー名は、adminで固定になっており、パスワードはデフォルトが、potatoに設定されていることが分かります。
また、ログインが成功するとダッシュボードページに移動するような流れになっています。

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

次に、http(Webサイト)のポートが開いていたので、そっちを確認します。

4-1. Webサイトの確認

ParrotOSでfirefoxを開き、URL部分にhttp://192.168.56.103 を入力するとWebサイトが表示されました。
image.png

4-2. アクセスできるファイルを列挙

dirbという辞書攻撃ツールを使って、アクセスできるファイルやディレクトリーを列挙します。
dirbは未知のファイル、ディレクトリー、サブディレクトリーを発見するためのツールです。

$ dirb http://192.168.56.103 /usr/share/wordlists/dirb/common.txt

実行結果↓
image.png

結果の中に /adminというディレクトリがありました。adminというディレクトリ名から管理者向けの認証と推測できます。

4-3. ログイン画面

実際にアクセスしてみるとLogin画面が表示されます。
image.png

index.php.bakに書いてあった、ユーザー名(admin)とパスワード(potato)を入力すると認証に失敗してしまいました。
デフォルトのパスワードではなく、別のパスワードに変更されているっぽいです。

4-4. Burpsuiteで送信データの閲覧

ユーザー名とパスワードが分からないため、ブラウザからWebサイトへ送信されるデータを改ざんしていきます。

ParrotOSにはBurpsuiteがプリインストールされているため、それを立ち上げてください。
image.png
はじめて起動させると、警告ダイアログが表示されますが、先に進んで大丈夫です。

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

image.png
プロジェクトのロード画面が出てくるので、画面下のStart Burpを押してください。

Burpのメイン画面が表示されたら、Proxyタブに移動してください。
image.png
Interceptがオンになっているのでオフにしてください。
※Interceptがオンになっているとブラウザで行った操作がWebサーバーに届かなくなってしまうので通信データを改ざんする時以外はオフにしておいてください。

Opne browserをクリックするとWebサイトを開くタブが表示されるので、サイトのリンクを打って、http://192.168.56.103/admin を開いてください。
ログイン画面が表示されるので、4-3の時と同じく、ユーザー名:admin、パスワード:potatoを入力して送信してください。

この時に、burpsuiteのProxyタブHTTP historyに移動すると、データを送信したログが残っています。
image.png
リクエスト画面には、自分が入力したデータが載っており、レスポンス画面にはその応答が書いてあります。
このようにburpsuiteは、データ送信の際にブラウザでは見えない、ヘッダ情報や内容まですべて見ることができます。

4-5. Burpsuiteで送信データの改ざん

データを閲覧するだけでなく、改ざんすることもできます。
Webサイトを開いた後Interceptタブに戻り、Interceptをオンにしてください。
Interceptをオンにしたら、もう一度ログイン操作を行うとInterceptタブの中にBurpsuiteでせき止めている通信が表示されます。

改ざんしたいデータを選択すると、下にリクエスト画面が表示されます。
image.png
ユーザー名は、adminにし、パスワードのところはpasswrdの後に[]を付けるとパスワードを回避することができます。

この時点では、Burpsuiteで通信がせき止められており、まだWebサーバーに通信データが届いていない状態なので、InterceptタブにあるForwardボタンを押します。
image.png
Forwardボタンを押した後にWebサイトに戻るとログインが成功しています!

image.png
ダッシュボードに移動するリンクが表示されているので、そちらに移動します。

4-6. dashboard.php

image.png
サイトに移動すると管理者画面が表示されました。

UsersやDateなどを確認すると、LogsのところだけWebサーバーにデータを送信していることが分かります。
Logsの画面↓
image.png
log_01.txtなどファイルを選択し、Get the logのボタンを押すと、ログが表示される仕組みになっていることが分かります。
この仕組みを利用して、ディレクトリトラバーサル攻撃をしていきたいと思います。

4-7. ディレクトリトラバーサル攻撃

ディレクトリトラバーサル攻撃とは、ファイル名の検証が不十分であることによって、親ディレクトリへアクセスすることを許してしまう脆弱性のことです。
親ディレクトリから別のパスに移動できるため、サーバー内の任意のファイルにアクセスできます。

また、burpsuiteでWebに送信するデータを書き換えます。(手順は4-5で行ったデータの改ざんと同じです。)
image.png
../でカレントディレクトリの一つ上の親ディレクトリに移動しています。
/etc/passwdにはパスワードファイルがあるため、これが分かればssh接続に必要なデータを取得できます。

image.png
パスワードが取得できたので、このデータをコピーして、新しく作成した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$'

実行結果↓
image.png
▼ 実行結果からわかること
結果として 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

実行結果↓
image.png
これで、rockyou.txtが使えるようになりました。

5-3. パスワード解析

Wabadminユーザーのパスワードをpass.txtから取り出し、新しく作成したhash.txtに出力します。

$ cat pass.txt | grep -P 'sh$' | grep webadmin > hash.txt

成功しているかcatコマンドを使用して確認
$ cat hash.txt

実行結果↓
image.png
hash.txtにwebadminユーザーのパスワードがしっかり保存されたら、いよいよ解析していきます。

$ john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

johnの後に解読したいデータが入っているファイルと、解読に使う辞書を指定してあげます。
実行結果↓
image.png
webadminユーザーのパスワードがdragonということが分かりました。

5-4. ssh接続

ユーザ名とパスワードが揃ったので、ssh接続を行っていきたいと思います。

$ ssh webadmin@192.168.56.103

実行結果↓
image.png
Are you sure you want to continue connectingと聞かれますがyesで大丈夫です。
また、パスワードを途中で聞かれるので、dragonを入力するとプロンプトが変化し、webadminユーザーとしてログインすることができました。

Step6: 権限昇格/フラグゲット

6-1. 現状把握

webadminユーザーとしてログインできたので、現状を把握していきます。

現在の権限を確認するコマンド
$ id

実行結果↓
image.png
しっかり、webadminの権限が付いていることが分かります。
次にホームディレクトリを調べます。

ディレクトリ一覧表示コマンド
$ ls -al

実行結果↓
image.png
user.txtというファイルがあるので、catコマンドで確認して行きます。
image.png
すると、読めない変な文字列が表示されます。
もとの文章が何かに変換されていそうなので、とりあえずbase64でデコードしていきます。

$ cat user.txt | base64 -d
※ -dはデコードを表しています。

実行結果↓
image.png
フランス語のような文字が表示されました。

6-2. 他のユーザーのディレクトリにアクセスする

ホームディレクトリに移動し、他にどのユーザがいるのかやどんなデータがあるのかを調査していきます。

1. ホームディレクトリに移動
$ cd ../

2. ファイルやディレクトリを表示
$ ls 

image.png
すると、floriangesというデータが出てきました。
cdコマンドでfloriangesに移動し、どんなファイルやディレクトリがあるのか確認してみます。

1. cdコマンドで移動
$ cd florianges

2. ファイルやディレクトリ確認
$ ls -al

実行結果↓
image.png
するとパーミッション情報から、ほとんどのファイルとディレクトリに対して実行権限がついていないことが分かります。

6-3. webadminがsudoコマンドを使えるのか

webadminユーザーがsudoコマンドを使えるのか調査していきます。

$ sudo -l

実行結果↓
image.png
最後の行を見ると、webadminユーザーは /bin/nice プログラムと /notesディレクトリは以下の全てのファイルを指定できることが分かりました。

6-4. 権限昇格

まず、webadminは /bin/niceのプログラムを実行できるので、どんなことができるのか確認して行きます。

manコマンドで詳細を調べる
$ man /bin/nice

実行結果↓
image.png

nice コマンドは、本来はプログラムを実行する際の「優先度(ナイス値)」を設定するためのLinux標準コマンドです。これ単体では攻撃に使えませんが、「root権限で他のプログラムを仲介して実行できる」という性質を持っています。

次に、/noteディレクトリに移動し、どんなデータがあるのかを調査します。

/notesに移動する
$ cd /notes

ファイルやディレクトリの一覧を表示する
$ ls -al

実行結果↓
image.png
やはり、読み取り権限や実行権限がないので、niceコマンドを使用して挙動を確認します。

$ sudo /bin/nice /notes/clear.sh

実行するとターミナルの画面がクリアされてしまいました。

次に、/notes/id.shファイルを指定してみます。

$ sudo /bin/nice /notes/id.sh

実行結果↓
image.png
すると、rootユーザーがidコマンドを実行した時と同じ結果が表示されました。
root権限でコマンドを実行することに成功したため、niceコマンドを使えばルートシェルを奪取することができてしまいます。

niceコマンドを使ってシェルをrootで実行させる方法として、../ を活用します。

$ sudo /bin/nice /notes/../bin/bash

実行結果↓
image.png
無事権限昇格が成功し、root権限のプロンプトが表示されました。

6-5. フラグの取得

現在、/notesディレクトリにいるので、ホームディレクトリに移動します。

$ cd ~

ホームディレクトリでlsコマンドを実行するとroot.txtがあります。
catコマンドで確認するとbase64で変換されている文字列が表示されるためデコードします。

$ cat root.txt | base64 -d

実行結果↓
image.png
またもや、フランス語のような文字列が出てきました。

今回のハッキングはここまでです! 

💡読めない文字が出てきた場合の対処法

大抵、読めない文字が出てきたらBase64かシーザー暗号だったりすることが多いです。
今回は違いますが、base64は変換する際に文字数が足らないと =(イコール)で補うことがあるので、変な文字列の最後が = だった場合は100%、base64で変換されています。

最後まで閲覧していただき、ありがとうございます!!
potatoには今回やった手法以外にも攻略ルートがありそうなので、ぜひ「ハッキング・ラボの作り方」を購入して試してみてください。

1
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
1
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?