Добрый день. 1)В сети полно информации о том, как использовать уязвимости программ. Но совсем мало информации о том, как эти самые уязвимости искать. Пишут, что мол , исследователь просматривает листинги кода, ищет "опасные функции".. некоторые реверсят программу, чтобы найти уязвимые места..и тд. Возник такой вопрос. Так как, кто ищет эти самые уязвимости в программах в боевых условиях? Как с помощью реверсинга и изучения дизассемблированного кода, можно найти место, в котором можно с помощью эксплойта(естественно написанного самолично) передать управление, скажем root-у. ?? 2) (про сети...)В книгах по криптографии, учил способы перехвата информации. Но это всё в теории. Были описаны крипто протоколы и показаны их слабые места. Чтоб понять принцип действий перехвата информации, этого было достаточно. Но как быть, если работа протокола не известна? как его изучать? как действовать? 3)Если есть какая-то программа, о которой НИЧЕГО не известно (ни под какую ОС написана, ни на каком языке, ни чего использует, ни того что делает, ни зашифрована ли она... в конце концов не известно, может это просто плоский двоичный файл какой-то bios). Хотя видимо с шифрованием я перестарался.. ( пусть будет не зашифрована ) и выполняющая некие действия на определённых ОС одинаково, а далее делующая различные переходы для различных ОС.. С чего начинать исследование?.... (с намерением искать уязвимость) Прошу поделиться опытом.
3) Если программа принимает какие-то данные, то посылка ей разных данных с определенными предположениями (метод черного ящика) - больших обьемов в расчете на переполнение, спец символов, escape символов, заведомо некорректных данных. И наблюдение за реакцией на эти данные. Есть еще метод фаззинга.
stellaco Т.е. посылка в автоматическом режиме рандомных входных данных исследуемой программе и наблюдение за ее поведением (например, если прога упадет, это может означать наличие уязвимости).
_tmp17628 Если говорить про переполнение, то возможно ли в системе обладая низкими привилегиями отладить программу с более высокими привилегиями ? (например root) . Например, найти в программе приём данных и подкорректировать принимаемые данные, скажем с 20 символов, на 100.
мне понравился вот этот цикл статей, советую ознакомится: http://www.wasm.ru/series.php?sid=17 хотя бы общее представление о взломе программ получите... у каждого протокола есть свои признаки, наглядно отличающие зашифрованную информацию... кроме того есть некоторые методы сродни шпионажу за источником шифр-текста, включающие в себя, как социальную инженерию, так и всякие внедряемые программно-аппаратные закладки... "нет абсолютно защищенной системы, есть тупые хакеры" (с) уже не помню кто, вроде Крис Касперский, хотя могу ошибаться... кстати весьма полезная весчь...
это всеголишь снятие защит, с программ (у меня с этим достаточно хорошо да и вообще нормально с дизассемблированием.). Вопрос в другом.. начинаем реверсить программу, потихонечку начинаем понимать, как она работает... видим всякие циклы..алгоритмы... запись данных... Так вот, во всём этом месеве (а оно обычно не маленькое) куда смотреть?? как отличить уязвимость программы, хотябы тоже самое переполнение буфера.. (сейчас рассматриваем возможность использования эксплойтов.а не снятие защиты с программ) но всёравно, спасибо что не поленились найти ссылку. Про шифрование, хотел бы ещё задать вопрос. Он конечно не относится к рассматриваемым вопросам, но всёже...всегда хотелось узнать. Допустим нам известен алгоритм шифрования (к примеру блочный с входом, открытого текста и ключа), открытый текст, и этот текст в зашифрованном виде. Каким образом при таком расскаледе вычисляется ключ???? (пусть будет шифр, не абсолютно стойким.)
это весьма странная задача... обычно ищут открытый текст по закрытому, перебирая ключи, или с помощью дыр в алгоритме... в хороших алгоритмах используются односторонние функции преобразования, то есть ключ шифрования отличается от ключа дешифрования... таким образом, зная алгоритм и имея шифр-текст и открытый текст, ты можешь прямым перебором подобрать как ключ шифрования, так и ключ дешифрования... можно попытаться сделать это используя дырки в алгоритме, всетки математика не идеальна)))) но повторюсь, зная шифр-текст и открытый текст, эта задача становится бесполезной... разве что, если много сообщений шифруются одними и теме же ключами, хотя это уже полнейший идиотизм пользователя алгоритма... все приходит с опытом... я помню анализировал taskmgr.exe, искал какие функции используются для вывода списка процессов, замучался очень... потом примерно тоже самое делал для explorer.exe, iexplore.exe, winword.exe, так там уже все быстро и легко пошло после taskmgr.exe... просто к такому анализу нужно привыкнуть, разработать свои методы работы... потом все это тебе покажется гораздо легче))) смотри функции, которые вызываются на определенном моменте работы программы... анализируй их параметры... если функции экспортируются из длл, поищи их описание в интернете... советую поставить побольше брейкпойнтов, чем больше - тем лучше))) ну и так далее... вообще завалить процесс просто, гораздо проще, чем заставить его работать по своему)))) можно допустим вместа пуша одного из параметров функции поставить ноп, скорее всего из-за этого возникнет ошибка Access Violating))))
stellaco Беглый взгляд на хидер файла - и эти вопросы отпадают, что-то ты сильно всё усложнил.. Сам в теме не больше чем новичек, но очевидно ответ на вопрос "что анализировать" вытекает из вопроса "как взаимодействовать" с потенциально уязвимым кодом. И получается первое на что смотрим - это интерфейс, который этот кодес предоставляет.. ну и с последующим анализом того, как он его предоставляет... т.е. реверсинг обрабатывающих входные данные ф-ций и т.д. Для того чтобы разобраться, думаю лишним не будет анализировать уже найденные уязвимости.. Кстати, сейчас копаю MS08-067.. то что нарыл из эксплойтов, например на www.milw0rm.com, у меня дает сообщение DEP (который по умолчанию включен для системных процессов) и все идет лесом =// Хотя Win32/Conficker.AA пролазит. Может кто смотрел глубже?..
deLight Частый пример - неизвестная программа на сервере, принимающая данные от клиентов (возможно через веб интерфейс). Какие тут могут быть хидеры и реверсинг?
видимо речь о том, что бинарник есть и вопрос как его исследовать. если все удаленно, то естессно о хидерах и реверсе речь не идет )))
splinter как написано в статье давайте будем разбирать, именно.... более осмысленные методы поиска ошибок.
_tmp17628 А кто ищет уязвимости на удаленной машине? В этом случае сперва надо узнать установленное удаленно ПО. Поставить его себе и тестировать сколь угодно долго. Чаще всего ПО известно. Как правило задача ставится так, что ПО известно, а надо найти в нем ошибки. А если фаззингом тестировать неизвестное удаленное ПО шансы на успех почти нулевые при относительно качественном ПО. Да и при удаленном тестировании подходит только метод черного ящика, что крайне затрудняет поиск и сужает его. _tmp17628 Извини, но это опять же глупость. Если шифр симметричный, то если есть преобразование в одну сторону, то по определению есть преобразование в другую сторону. В общем случае задача описывается так: Y = F(X, K); Y - зашифрованные данные X - открытые данные K - ключ При симметричном шифровании, ключ используется как при шифровании так и при дешифровании, т.е. справедливо следующее: X = F(Y, K); После этого становится явно очевидным: K = F1(X, Y); Например для простой функции XOR, ключ ищется так K = X XOR Y. В общем случае это обратное математическое преобразование. Учитывая, что шифр симметричный оно гарантированно существует. deLight Я тоже копал и сильно продвинулся в этом, хоть и не закончил. Вообще исследование этой ошибки я бы не сказал, что простое, приходится во-первых анализировать много асм-кода, ошибка хоть и по смыслу не сложная, но чтобы ее найти надо потратить прилично времени. Далее, написание самого эксплоита тоже задача не из легких - протокол взаимодействия по DCOM не документирован и приходится искать структуры в сурцах Самбы и примеры взаимодействия дампить через сниффер. Хитрость еще заключается в том, что обычным вызовом DCOM проэксплуатировать уязвимость не удастся. Необходимо построить спецпакет, структура которого официально недокументированна. И почему-то в некоторых эксплоитах, создали пытаются одним вызовов все реализовать, но этим максимум можно достигнуть DOS удаленной машины. DEP аппаратно только на 64x машинах. И если ты смотришь паблик сплоиты, то там дело не в DEP, а в том что эти эксплоиты по сути вообще не работают. Я слышал, что работают экспы из Metasploit. Сам не пробовал, но DCOM-пакеты там сделать легко, поэтому сам сплоит написать легче. stellaco В общем случае мы ищем ошибки в программах. Программы написаны на каком-то языке программирования. Если бы у нас были сурцы как у разработчика, то можно было бы искать ошибки быстрее. Можно просто представить исходный код программы, как мы будем там искать ошибки? Можно по смыслу предельных значений, можно по смыслу самих протоколов и выделяемой памяти. Но при наличие только бинарника область поиска суживается, сам поиск становится сложнее т.к. мы оперируем уже асм-командами. Поиск суживается до взаимодействия с программой на уровне предоставляемого интерфейса. Иначе ошибка в программе может быть, но какбы то ни было нам не удастся ее вызвать. Что до самого поиска, то чудес не бывает, все ищется на основе логики и смысла. Первое что можно сделать - подача специально сгенерированных, но случайных данных - метода фаззинга. Данные могут быть как полностью случайные, так на основе шаблонов поля которых случайны. Я например искал с помощью фаззинга ошибки в перехватчиках Native-функций Windows драйвера KIS - klif.sys. Если BSOD возник, то мы нашли что нужно. Далее имеет смысл более глубокий смысловой анализ на возможность проведения атаки повышения привилегий. Для фаззинга Native-функций существует специальная утилита - BSODhook (http://www.matousec.com/projects/bsodhook/). Другим методом поиска ошибок является поиск ошибок на основе шаблонов ошибок. Существует множество шаблонов ошибок, которые надо знать. Они связаны часто например со строковыми функциями, с множеством небезопасных функций. Если программа обрабатывает какой то файл, то есть смысл проверить проверку полей входного файла в программе, возможно она выполняется не достаточно качественно (как например было в MS07-17 - обработка ANI-файлов). Шаблонами могут быть - использование любых строковых функций в которых не проверяется размер строки - я думаю что MS08-67 был открыт именно так, там рядом как раз использовались подобные функции, которые в патче заменили на безопастные. Также шаблонами атак может быть выделение буфера с фиксированным размером. Ну и т.д.
BlackParrot Наверно те, кто хочет эти уязвимости найти Если ПО на сервере неизвестное (сделанное на заказ) - только метод черного ящега. Фаззинг естесснно применяется в других случаях. Что-то мне подсказывает, что кому-то стоит почитать книжки по криптографии, в частности обратить внимание на атаки с известным (выбранным) плейн-текстом и стойкость симметричных шифров к ним.
_tmp17628 Давайте мыслить все-таки реалистично, а не придумывать утопические ситуации. Простой поиск уязвимости в ПО исходный код, которых доступен далеко не простая задача. Сколько человек даже на этом форуме могли бы сказать, что они нашли хоть одну уникальную уязвимость самостоятельно в таком ПО? А если доступны только бинарники? Если же ничего не доступно, и ПО не школьник писал вероятность такого исследования равна нулю. И это очевидно, если вы хоть пару раз пытались искать ошибки в ПО и разрабывали эксплоиты. Согласен. Забыл я уже криптографию стойкую. Или не знал
Вот неплохие статьи с milw0rm'a по теме: Fuzzing for Fun and Profit (концепция+исходники на С и Perl) Fuzzing: A Useful Approach to Finding Bugs
BlackParrot Давайте. По вашему все просто как в сказке - взял исходники и вперед... Возмем упрощенный пример - хотите вы, к примеру, найти уязвимость в процессинговом ПО WebMoney с целью дописать несколько нулей к своему счету. И что, вы попросите их выслать вам исходники или на крайняк бинарники их софта? Лично я так не считаю. Кстати уязвимости - широкое понятие и не сводятся к одному переполнению.
_tmp17628 По-моему как раз сложно все Пранк такой. Нет, я бы не стал так делать, исход очевиден. Да, это реалистичный пример. Но, с учетом серьезности конторы, я утверждаю, что метод черного ящика здесь скорее всего не сработает для достижения результата. Лучше разобрать протокол взаимодействия реверсингом клиентских бинарников и анализируя протокол уже мыслить над упущениях в архитектуре или каких-то технических просчетах безопасности. Такой анализ имеет большие шансы на успех. А вообще я говорил о еще более реалистичных вещах. Все-таки взломать WebMoney это что-то заоблачное, хоть и не невозможное. Возьмем те ошибки, описание которых мы встречаем каждый день. Все они к известным приложениям. Т.е. приложения известные. Бинарники есть. Ищи не хочу. Там и черный и белый, и серый ящик можно использовать. Но и там придется подтрудиться чтобы хоть что-то отыскать. Думаю есть смысл вести дисскусию о тех вещах которые у нас перед глазами. Об известных ошибках и об известном ПО. Отстранения в другие области выглядят мало реалистичными из-за малого количества имеющейся информации. Пусть вы будете юзать черный ящик для WebMoney, пусть что-то получите на выходе странное. Но в сложной закрытой системе вы со вероятностью 0 сможете написать эксплоит. Поэтому говорить об этом - просто мечтания.