Новости RuCTF Quals. Ctb. Разбор.

blackzert
, 05 March 2009

После второго днями у монитора, прийдя домой и проверив статистику, я обнаружил появление нового раздела квестов - ctb. Обрадовался - тыкнул, однако оказалось, что можно только из сети туда попасть.. Сама судьба приказала мне выспаться :)

Выспаться не удалось - с 00 до 7:30 не хватило.. Итак, помере разбора dll, решил не мучать мозги ненужной инфой, и принятся за ctb. К тому же ctb100 ктото уже решил. Чем мы хуже?

ctb100

Дан ip и порт. Задание - достать message.secret с сайта. На запрос отдать его по хорошему, сервер ответил forbidden'ом 404... Наверно, это всё же не содержимое этого фала. Стас aka Wolong запустил сканер Nikto, и мы сели ожидать чуда.

5 минут спусть - О, Чудо!! Сервер поддерживает метод PUT. Wolong быстро установил необходимый софт, и мы стали пробовать закладывать на сервер разные скрипты. Начали с .php, однако Hello world не увидели. Потом пошел .cgi перловский скрипт.. Опять пусто. Наконец .pl выдал Hello world =) Мы получили примитивный веб шелл. Далее ?cmd=cat message.secret и Accepted.

ctb200

Вы знаете SQL? Задание состояло из 5 запросов с теми или иными орграничениями. База стояла PostgreSQL. Не придав особого значения этому заданию, мы со Стасом получили 200 баллов и пошли дальше

ctb300

Задание было добавить свой урл рядом с урлом на RuCTF на страничку.

Долгое время этот сервис был непоколебим... Апач, пхп, mysql - страничка с блогом. Всё тот же Nikto определил пару открытых папок ( в том числе includes). Вроде ничего особого, и параметры фильтруются через magic_quote_gpc. Кстати о нём - через веб шелл на другом порту, мы подняли конфиги апача и пхп. Доступ к папкам веб сайта был закрыт, прав не хватало. Поднимать права через веб шелл было несколько сложновато - ядро вроде свежее стояло. Мы как то забили на это дело.

Через некоторое время, зайдя на страничку вновь, мы увидили новое сообщение в блоге - о том что его никто не ломает... и внизу чтото вроде Add comment.. тут то мы и обрадовались. SQL иньекция была в скрипте comment.php в параметре id, значение которого просто подставлялось в запрос. через "-1 union select 1,2,3,4,5,6,7" мы увидели отоброжаемые поля (6,7), в которые и начали выводить. Сначала проверили table_name из information_schema.tables. Более всего подошла таблица users. В ней 2 пользера - root и еще какойто непонятный оператор (не помню я названия). У рута хэш пароля. passcracking.ru дал строчку rootrootroot которая являлась паролем рута. Далее через веб шелл мы подключились к базе с правами рута и добавили линк на sibears.ru в таблицу bm_links. Accepted. Причом мы первые кто его сдал :) (народ даже пошутил на вопрос "что не ломаете то никто?" фразой "а что тут ломать то?:)"..)

ctb400

Задание: написать ШеллКод для сервиса, который работает с sgid и chroot, и выудить содержимое текстового файла. Бинарник файла прилагался. Так как он был 64битный, а в иде была загружена дллка, решил пока покапать дллку, потом уже занятся этим сервисом. За 30 минут до конца, понял, что dll уже не вариант, и начал копать этот бинарик. Всё стандартно - сетевой сервис с биндом, листеном и форком по аксэпту, не стандартна только архитектура - 64бита на борту. минут 5-10 ушло на полное изучение. Сервис, при обработки информации от клиента создавал буффер в 0x90, а читал из потока 0x100. Учтя также то, что локальных переменных более не было, то на лицо переполнение буффера. Начали писать сплоит - open("file.name",0), read(rax,rbp+хоть скока ваще - по стеку не страшно,0x50),write(socket,тоже смещение что и при read,0x50); exit(0);. оставалось еще где то 20 байт до стека вверх. плюс оставалось вставить какое нибудь интересное значение в rbp и вместо rip - указатель на стек. Можно было также поискать в коде последовательности типа call rsp и поставить rip на них. К моменту нала вычисления значения rbp, игра окончилось.. а ведь оставалось чуть чтуь...  Следует также ответить, что сервис отправлял нам старшие 6 байт регистра rbp. Нижние же 4 байта можно было вычислить из заголовка elf и данного нам значения.. Обидно что не успели сдать =( если бы не эта дллка...(спасибо, kost?)) )

init 0...