Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Эдриан_Прутяну_Как_стать_хакером_сборник_практическиз_сценариев.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
20.34 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

 

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w Click

to

BUY 194  Глава 8.Вредоносная сериализация

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

Эксплуатация уязвимостей десериализации в PHP-приложениях, внутрен-

 

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

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

Packagist – это репозиторий для PHP-библиотек и фреймворков, обычно используемый разработчиками приложений: https://

packagist.org.

Для упрощения процесса разработки Composer, менеджер зависимостей для PHP, предоставляет приложениям возможность автоматически загружать библиотеки с помощью простого однострочника. Это означает, что приложения могут содержать код библиотеки,следовательно,и гаджеты POP,когда выполняется уязвимый метод unserialize().

Composer можно найти на странице https://getcomposer.org.

Атака на пользовательские протоколы

Так же как и PHP, Java предоставляет возможность обрабатывать объекты для удобной передачи или хранения. В тех случаях когда сериализованные в PHP данные представляют собой простые строки, в Java используется несколько иной подход. Сериализованный Java-объект представляет собой поток байтов с заголовком и содержимым, разбитым на блоки. Возможно, его нелегко прочитать, но он выделяется при записи пакетов или в журналах прокси-сервера в виде значений в кодировке Base64. Поскольку это структурированный заголовок, первые несколько байтов эквивалента Base64 будут одинаковыми для каждого потока.

Поток сериализованных объектов в Java всегда начинается с магических байтов: 0xAC 0xED, за которыми следует номер версии из двух байтов: 0x00 0x05.Остальныебайтывпотокебудутописыватьобъектиегосодержимое.Все, что нам действительно нужно, чтобы обнаружить это на практике, – это первые два шестнадцатеричных байта ac ed, а остальная часть потока, вероятно, будет сериализованным объектом.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

 

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

Атака на пользовательские протоколы  195 BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

Программист Ник Блур (Nick Bloor) разработал удивительно уязвимое при-

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

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

DeserLab и исследования Ника Блура можно найти на странице https://github.com/NickstaDB.

Технику,которуюмырассмотрим,оченьлегкоможно использоватьдляатак на базе HTTP-протокола. Приложения нередко считывают сериализованные объекты Java из куки-файлов или параметров URL-адреса.В конце концов,облегчение межпроцессного или межсерверного взаимодействия является одним из основных преимуществ сериализации. В случае с веб-приложениями перед передачей этиданные обычно кодируются в Base64,что позволяетлегко обнаружить их в журналах прокси-серверов.Сериализованные в Java объекты, закодированные в Base64, обычно начинаются со строки rO0ABX, которая декодируется в 0xACED0005, или ранее упомянутых магических байтов и номера версии.

Чтобы запустить новый экземпляр DeserLab, можно вызвать JAR-файл, используя параметр –server, и указать IP-адрес и порт для прослушивания. Для легкости будем использовать имя сайта deserlab.app.internal для подключения к уязвимому приложению, после того как оно будет готово к запуску. Будем использовать двоичный файл java для запуска компонента сервера

DeserLab на целевой машине DeserLab.

root@deserlab:~/DeserLab-v1.0# java -jar DeserLab.jar -server 0.0.0.0 4321

[+] DeserServer started, listening on 0.0.0.0:4321

Анализ протокола

DeserLab – это простое приложение, которое предоставляет сервисы хеширования строк и доступно пользовательскому клиенту, встроенному в файл DeserLab.jar. После запуска компонента сервера DeserLab на целевой машине можем запустить компонент клиента на нашей машине, используемой для осуществления атаки, kali, применив опцию –client.

root@kali:~/DeserLab-v1.0# java -jar DeserLab.jar -client deserlab.app.internal 4321

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

BUY 196  Глава 8.Вредоносная сериализация

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

 

e

 

 

 

 

 

[+] DeserClient started, connecting to deserlab.app.internal:4321

 

 

 

 

 

n

 

 

 

 

 

 

 

-xcha

 

 

 

 

[+] Connected, reading server hello packet...

[+] Hello received, sending hello to server...

[+] Hello sent, reading server protocol version...

[+] Sending supported protocol version to the server...

[...]

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

После соединения клиента и сервиса и обмена приветствиями между ними клиент запроситданные для отправки на сервер для обработки.Можно ввести тестовые данные и наблюдать ответ.

root@kali:~/DeserLab-v1.0# java -jar DeserLab.jar -client deserlab.app.internal 4321

[+]DeserClient started, connecting to deserlab.app.internal:4321

[+]Connected, reading server hello packet...

[+]Hello received, sending hello to server...

[+]Hello sent, reading server protocol version...

[+]Sending supported protocol version to the server...

[+]Enter a client name to send to the server:

name

[+]Enter a string to hash: string

[+]Generating hash of "string"...

[+]Hash generated: b45cffe084dd3d20d928bee85e7b0f21

Втерминале серверного компонента приложения выводится журнал другой сторонывзаимодействия.Обратитевнимание наобмен приветствиямимежду клиентом и сервером и обмен сообщениями,где присутствуетслово name.Это пригодится, когда мы будем создавать свой эксплойт.

[+]Connection accepted from 10.0.2.54

[+]Sending hello...

[+]Hello sent, waiting for hello from client...

[+]Hello received from client...

[+]Sending protocol version...

[+]Version sent, waiting for version from client...

[+]Client version is compatible, reading client name...

[+]Client name received: name

[+]Hash request received, hashing: string

[+]Hash generated: b45cffe084dd3d20d928bee85e7b0f21

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

 

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

Атака на пользовательские протоколы  197 BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

Поскольку используется протокол TCP,то мыдолжны перехватыватьтрафик

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

с помощью Wireshark или tcpdump, а не Burp или ZAP. Запустив Wireshark, можем собирать и проверять поток данных TCP нашего взаимодействия с сервером DeserLab, как показано на рисунке.

Рис.8.7. Поток данных по протоколу TCP

Можно увидеть весь диалог в формате шестнадцатеричного дампа, проанализировав pcap-файл,сгенерированный нашим анализатором пакетов.На предыдущем рисунке отправленные данные – это поток, обозначенный свет- ло-серым цветом, а более темная часть– это ответ сервера.

Хотя данные могут быть немного сложными для чтения, у каждого байта свое предназначение. Можно увидеть знакомый заголовок ac ed и различные входные данные, отправленные клиентом, такие как name и string. Вы также заметите,что строковое значение–это сериализованный объектHashRequest. Это класс Java, реализуемый как сервером, так и клиентом. Сериализация ис-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w Click

to

BUY 198  Глава 8.Вредоносная сериализация

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

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

Сериализованный сервером объект также содержит одно дополнительное свойство: сгенерированный хеш.

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

Поскольку DeserLab имеет открытый исходный код, можем проанализироватьпроцессдесериализации на серверном компоненте,посмотрев его исходный код, размещенный на GitHub.

[...]

oos = new ObjectOutputStream(clientSock.getOutputStream());

//Read a HashRequest object

request = (HashRequest)ois.readObject();

//Генерируем хеш. request.setHash(generateHash(request.getData()));

oos.writeObject(request); [...]

Мы видим, что данные считываются с клиента с помощью объекта ObjectInputStream(ois). Это просто причудливый термин для данных, поступающих от клиента,которые мы наблюдали при захвате пакетов Wireshark. Следующим шагом является попытка преобразовать данные, считанные из ois, к структуре данных HashRequest. Ссылка на новый объект HashRequest сохраняется в переменной request, которую затем можно использовать как обычный объект в памяти. Сервер получит входное значение строки, подлежащей десериализации путем вызова метода getData(), вычисления хеша и сохраненияегообратновобъектспомощьюметодаsetHash(). МетодsetHash доступен с помощью класса HashRequest, и все, что он делает,– это заполняет свойство хеша внутри объекта. Затем данные сериализуются и записываются обратно в сетевой поток с помощью метода writeObject().

Все это прекрасно работает, но данный код основан на опасных предположениях. Предполагается, что данные, поступающие от ненадежного источника (злоумышленника), на самом деле являются объектом HashRequest. Если данные – это нечто иное, чем то, что может быть безопасно преобразовано к HashRequest, Java сгенерирует исключение, и когда мы это обнаружим, будет уже слишком поздно.