Exploiting Broken Crypto to SSRF On PHP-Proxy
PHP-Proxy
sebenarnya adalah project yang sudah tidak dikembangkan lagi, tapi disini saya melihat masih ada banyak orang yang menggunakan PHP-Proxy sebagai Web Proxy.
PHP-Proxy Overview
Url yang disubmit di form, akan di-encrypt dan dilakukan redirect ke /?q=<ENCRYPTED_URL>
.
add_http
adalah fungsi yang akan menambahkan http://
apabila $url
tidak diawali dengan https://
atau http://
Apabila yang disubmit adalah file:///etc/passwd
, oleh fungsi add_http
akan me-return http://file:///etc/passwd
sehingga kita tidak bisa exploit dengan cara men-submit URL lewat form.
proxify_url
adalah fungsi yang digunakan untuk membuild redirect URL, lalu bisa dilakukan proxying
Setelah form url disubmit, akan masuk ke logic ini, dimana disini proses fetch remote resource dilakukan.
Method fordward
dari class Proxy
secara internal menggunakan curl
sebagai Requester
nya.
Conclusion
Dari hasil overview tersebut, tidak ditemukan adanya filter apapun dalam url, sehingga ada kemungkinan kita bisa meng-abuse url untuk SSRF Attack. Agar bisa melakukan SSRF Attack, Payload harus di submit melalui GET /?q=
, karena apabila lewat form submit URL, fungsi add_http
akan menambahkan http://
sebagai schemal dari URL yang disubmit. Jadi agar bisa melakukan SSRF dengan memanfaatkan file://
ataupun gopher://
, kita harus men-generate Encrypted_URL dengan payload SSRF kita.
Broken Cryptography
Key yang digunakan untuk proses enkripsi adalah dari Config::get("encryption_key")
.
encryption_key
key di set dari md5(app_key + URL_MODE)
, yang dimana app_key
ini digenerate menggunakan fungsi openssl_random_pseudo_bytes(100)
sehingga tidak dapat ditebak.
Algoritma Crypto yang digunakan untuk meng-enkripsi URL adalah Caesar Cipher, dimana Caesar Cipher adalah algoritma Crypto classic dan Key nya sangat mudah didapatkan dengan cara Brute Force
atau dengan Known Plaintext
.
Agar bisa membuat URL yang digunakan untuk SSRF, pertama harus didapatkan terlebih dahulu encryption_key
. encryption_key
bisa didapatkan dari menggunakan fungsi str_rot_pass
dengan parameter $str=ENCRYPTED_URL
dan key=KNOWN_URL
.
$ php exploit.php
KEY : c96442dc36b61ebce28b02c537b9ad7c
Dengan memanfaatkan Known Plaintext
kita dengan mudah bisa mendapatkan encryption_key
.
SSRF
PHP-Proxy menggunakan curl
sebagai Requester
nya, seperti yang diketahui curl
support berbagai macam protokol termasuk file://
dan gopher://
yang biasa dimanfaatkan untuk SSRF Attack.
Local File Read
Local File Read sangat memungkinkan dengan memanfaatkan schema file://
, sebagai contoh disini saya mencoba membaca isi file dari /etc/passwd
❯ php exploit.php read '/etc/passwd'
KEY : c96442dc36b61ebce28b02c537b9ad7c
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
SSRF FastCGI RCE
Mendapatkan RCE dengan me-forge protokol FastCGI hanya bisa dilakukan apabila fastcgi menggunakan TCP Socket
.
❯ php exploit.php fastcgi 'id'
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Note : Detail mengenai SSRF FastCGI akan saya jelaskan pada postingan lain.