ХАКЕР 04 /171/ 2013 Easy Hack63body += fileData + "\r\n";body += "--" + boundary + "--";xhr.send(body);Рис. 2. Используя JavaScript, мы сделали аналогичный запрос-загрузкунам делать очень страшные вещи. Но для того, чтобыпонять, что нам нужно для загрузки файла, необходиморазобраться, чем отличается обычныйPOST-запрос от POST-запроса на загрузку файла.Итак, смотрим рис. 1.Это POST-запрос, в котором я выбрал файлzzzz.jpg для отправки на какой-то сайт.Можно заметить несколько важных моментов.Во-первых, это Content-Type — "multipart/form-data", с указанием границ расположениявложения — «boundary= ---------------------------228852196221080». Во-вторых, само тело запроса,которое выделено границами. В нем в заголовкеContent-Disposition: указывается имя поля изформочки — uploaded_file, а также имя файла вfilename. Далее идет сам файл.Раньше с POST-запросами для нас была проблемав том, что мы не могли влиять на заголовки иимели проблемы с бинарщиной.Теперь же у нас есть JavaScript и мы можемполностью сконструировать аналогичный запрос,используя XMLHTTPRequest:var fileData= 'zzzzzzzzzzzzzzzzzz',fileSize = fileData.length,boundary = "---------------------------228852196221080",xhr = new XMLHttpRequest();xhr.open("POST", "http://victim.com/upload.php", true);xhr.setRequestHeader("Content-Type","multipart/form-data, boundary="+boundary);xhr.setRequestHeader("Content-Length",fileSize);xhr.withCredentials = "true";var body = "--" + boundary + "\r\n";body += 'Content-Disposition:form-data; name=" uploaded_file";filename="zzzzz.jpg"\r\n';body += "Content-Type: application/octet-stream\r\n\r\n";Разберем по пунктикам, чтобы не возникаловопросов. С первой по третью строки — определениепараметров загружаемого файла. В fileDataмогут быть любые данные (включая бинарные),далее нужна их длина, а также границы (хотя онимогут быть произвольными). Следующие две строки— стандартное конструирование запроса. Нотеперь запросы на сторонние хосты разрешены.И еще очень важные строки с шестой повосьмую. Мы можем добавить произвольныезаголовки, а точнее, интересующие насContent-Type и Content-Length. Но еще интереснее— withCredentials, которое укажет браузеру добавитькуки или Basic-аутентификацию в итоговыйзапрос. Без этого запрос отправлялся бы без кук, аэто чаще всего лишало бы атаку смысла.Далее же идет простая конкатенация данных,в аналогичной обычному запросу последовательности.И наконец, отправка данных жертве. Всепросто. Итог смотри на рис. 2. Теперь о плюсах,минусах и тонкостях.Как я уже сказал, разработчики всегда верили внеприкасаемость загрузки файлов, а потому защитуот CSRF на нее не ставили. Скорее даже наоборот,считали, что необходимость загрузки файламожет защитить всю формочку. А потому на этом«погорели» и всякие сайты типа Facebook и Flickr, иразличные Java-серверы типа Tomcat’а. На самомделе есть еще где и что покопать.Минус у техники теперь один — если есть защитаот CSRF, то ее надо как-то обходить.Ну и не могу не поблагодарить «автора» сейтехники — знаменитого Кшиштофа Котовича(Krzysztof Kotowicz). Спасибо! Примеры атаки можнопотрогать на его же сайте — goo.gl/Uql0m.ОТСЛЕДИТЬ ИЗМЕНЕНИЯ В ОСРЕШЕНИЕВ прошлом номере я писал про применение тулзенокиз набора Sysinternals для выявления всевозможныхконфигурационных уязвимостей вОС, которые возникают после кривости админовили из-за уязвимостей устанавливаемого ПО.Но приведенные примеры касались всей ОС вобщем — то есть мы ее всю целиком смотрим истараемся выискать, что же страшного и как мыможем наделать. Но если с правами на папки, нафайлы еще можно как-то быстро разобраться,понять и выделить векторы атаки, то с каким-нибудьреестром это уже не прокатит. Очень уж таммного всякого мусора. Особенно это относится кпоиску уязвимых конфигов. Веток, доступных длячтения, — масса, а просмотреть все и выделитькритичные нереально. Точнее, реально, но этомартышкин труд. Так что же делать? Ну, во-первых,конкретизировать свои желания и не копать всеОС в целом, а сосредоточиться на определенномстороннем ПО. Здесь нам в помощь те же тулзыиз Sysinternals. А во-вторых, дабы еще уменьшитьскоуп работы, можно исходить не из поиска данных,а из тех изменений, которая сделала программапри своей установке в ОС.Добиться этого можно так: делаем снимокОС перед установкой ПО, а потом — снимок послеустановки. После чего все, что нам необходимо,— сравнить эти снимки. Все, в общем-то,просто.Тулз, которые позволяют сделать это, достаточно.Этот функционал есть во многих «продвинутых»анинсталлерах. Но не ведись на рекламу! Для насих функционал мал, так как они в массе своей отслеживаюттолько изменения в файловой системеи реестре, причем только появление чего-то нового,а не изменения существующего.Так что для наших целей нам нужна специальнообученная собака. И имя ей — Attack SurfaceAnalyzer (goo.gl/OibSW). Странно, но продуктсей — дите Microsoft’а. Вероятно, его добройи честной части :). А потому хорош и глубок. Вотсписок мониторинга:filesregistry keysmemory informationwindowsWindows firewallGAC Assembliesnetwork sharesLogon sessionsportsnamed pipesautorun tasksRPC endpointsprocessesthreadsdesktopshandlesС точки зрения практической использованиепросто. Для начала ставим всякие сторонние штуки,которые могут потребоваться для ПО (типабазы данных), чтобы изменения, внесенные оттретьих программ, не мешались. Делаем baselineскриншотсистемы. После чего устанавливаемПО и делаем product-скриншот. Далее запускаемсравнение — и все :).Ну и конечно, анализ лучше всего производитьна виртуальном чистом сервачке или хотя бы приотключенных сторонних программах.В конце еще хотелось бы добавить одну мысль.Как это ни странно, но опыт показывает, что конфигурационныеуязвимости встречаются систематическии искать их достаточно просто. Так чтодля личного фана и лучшего понимания моделибезопасности винды советую тебе поискать такиебаги. Успех почти гарантирован!Ну вот и все. Надеюсь, что было интересно :).Если есть пожелания по разделу Easy Hack илиесть охота поресерчить — пиши на ящик. Всегдарад :).И успешных познаний нового!
64ХАКЕР 04 /171/ 2013WARNINGВся информация предоставленаисключительнов ознакомительных целях. Ниредакция, ни автор не несутответственности за любой возможныйвред, причиненныйматериалами данной статьи.Борис Рютин, ЦОР(Esage Lab)dukebarman@xakep.ru@dukebarmanРоутеры в опасности! Этотмесяц богат на эксплойты дляразличных роутеров, в частностииз-за отсутствия реакциивендоров на обращенияисследователей. Ну и уже потрадиции — 0-day в Java.ОБЗОРЭКСПЛОЙТОВАНАЛИЗ СВЕЖЕНЬКИХ УЯЗВИМОСТЕЙPIWIGO — МНОГОЧИСЛЕННЫЕ УЯЗВИМОСТИCVSSv2:7.6 (AV:N/AC:H/Au:N/C:C/I:C/A:C)Дата релиза: 27 февраля 2013 годаАвтор:High-Tech Bridge SACVE: 2013-1468CVE: 2013-1469Исследователями из High-Tech Bridge SA были обнаружены уязвимоститипа CSRF (Сross-Site Request Forgery) и Path Traversal в Piwigo версии 2.4.6.Piwigo — это open source скрипт фотогалереи, пользующейся популярностьюсреди как начинающих, так и продвинутых фотографов. Причем в каждой уязвимостиесть свои нюансы.EXPLOIT. Первая уязвимость CSRF существует из-за отсутствия проверкиправ в скрипте /admin.php при редактировании файлов с помощью плагинаLocalFiles Editor. Несмотря на то что по умолчанию он выключен, все равновектор атаки реален, так как входит в стандартную поставку и не все используютFTP-протокол для редактирования.Для успешной атаки надо всего лишь помочь залогиненному админу зайтина нашу специальную страничку, которая создаст выполняемый скриптна уязвимом сервере. Например, следующий код создаст скрипт file.phpс функцией phpinfo(); и будет доступен по адресу http://[TARGET_HOST]/file.php.document.f1.submit();Вторая уязвимость типа path traversal (раскрытие путей) имеет деструктивныйхарактер. Мы узнаём содержимое файла, но при этом его удаляем.Сама уязвимость находится в файле install.php и заключается в недостаточнойпроверке GET-параметра dl:if (!empty($_GET['dl']) && file_exists(PHPWG_ROOT_PATH.$conf['data_location'].'pwg_'.$_GET['dl'])){$filename = PHPWG_ROOT_PATH.$conf['data_location'].'pwg_'.