Главная страница

Установка Kali Linux


Скачать 2.4 Mb.
НазваниеУстановка Kali Linux
АнкорBlack
Дата15.03.2022
Размер2.4 Mb.
Формат файлаpdf
Имя файлаBlack_Hat_Python_RUS.pdf
ТипДокументы
#398533
страница6 из 13
1   2   3   4   5   6   7   8   9   ...   13
. Откройте новый
Python файл, назовите его bhp_fuzzer.py и пропишите следующий код: from burp import IBurpExtender

from burp import IIntruderPayloadGeneratorFactory from burp import IIntruderPayloadGenerator from java.util import List, ArrayList import random class BurpExtender(IBurpExtender, IIntruderPayloadGeneratorFactory):

def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks self._helpers = callbacks.getHelpers()
callbacks.registerIntruderPayloadGeneratorFactory(self)

return

def getGeneratorName(self):
return "BHP Payload Generator"
def createNewInstance(self, attack):

return BHPFuzzer(self, attack)
Это база того, что нам нужно сделать, чтобы выполнить первый ряд требований для нашего расширения. Сначала нам нужно импортировать
IBurpExtender
, что является общим

требованием для всех расширений, которые мы пишем. Для этого, мы импортируем необходимые классы для создания генератора полезной нагрузки Intruder. После этого, мы определяем наш
BurpExtender класс , который расширяет классы

IBurpExtender и
IintruderPayloadGeneratorFactory
. Затем мы используем функцию registerIntruderPayloadGeneratorFactory для регистрации нашего класса,

чтобы инструмент Intruder понимал, что мы можем генерировать полезные нагрузки. Далее, мы внедряем функцию getGeneratorName function
, чтобы просто вернуть

название нашего генератора полезной нагрузки. Последний шаг — создаем функцию
createNewInstance
, которая получит параметры атаки и вернут экземпляр

IintruderPayloadGenerator класса, который мы назовем BHPFuzzer.
Заглянем в документацию класса
IintruderPayloadGenerator,
чтобы мы знали, что нам нужно внедрять.

/**
* This interface is used for custom Intruder payload generators.
* Extensions
* that have registered an
* IIntruderPayloadGeneratorFactory must return a new instance of
* this interface when required as part of a new Intruder attack.
*/
public interface IIntruderPayloadGenerator
{
/**
* This method is used by Burp to determine whether the payload
* generator is able to provide any further payloads.
*
* @return Extensions should return
* false when all the available payloads have been used up,
* otherwise true
*/
boolean hasMorePayloads();

/**
* This method is used by Burp to obtain the value of the next payload.
*
* @param baseValue The base value of the current payload position.
* This value may be null if the concept of a base value is not
* applicable (e.g. in a battering ram attack).
* @return The next payload to use in the attack.
*/
byte[] getNextPayload(byte[] baseValue);

/**
* This method is used by Burp to reset the state of the payload
* generator so that the next call to
* getNextPayload() returns the first payload again. This
* method will be invoked when an attack uses the same payload
* generator for more than one payload position, for example in a
* sniper attack.
*/
void reset();

}
Отлично! Итак, нам нужно внедрить базовый класс и он должен прописывать три функции.
Первая функция hasMorePayloads помогает решить, продолжать ли отправлять

мутированные запросы обратно в Burp Intruder. Для этого мы используем счетчик и как только он покажет максимальное значение, которые мы установим, мы возвращаем
False
, чтобы больше не генерировать фаззинг кейсы. Функция getNextPayload получает

оригинальную полезную нагрузку от HTTP-запроса, который вы захватили. Или, если вы выбрали несколько областей полезной нагрузки в HTTP-запросе, вы получите только байты, которые вы запросили для фаззинга (об этом чуть позже). Эта функция помогает нам осуществлять фаззинг оригинального тест-кейса и затем возвращать его, чтобы Burp отправил новое значение фаззинга. Последняя функция reset необходима для генерации

известного набора запросов, скажем 5 запросов. Затем для каждой позиции полезной нагрузки, для которой мы назначили вкладку в Intruder, мы запустим итерацию через пять значений фаззинга.
Наш фаззер никуда не спешит и всегда продолжает делать свое дело рандомно по каждому
HTTP-запросу. Теперь давайте посмотрим, как все это выглядит в Python. Пропишите следующий код внизу bhp_fuzzer.py:
class BHPFuzzer(IIntruderPayloadGenerator):

def __init__(self, extender, attack):
self._extender = extender self._helpers = extender._helpers self._attack = attack self.max_payloads = 10

self.num_iterations = 0
return
def hasMorePayloads(self):

if self.num_iterations == self.max_payloads:
return False else:
return True def getNextPayload(self,current_payload):

# convert into a string

payload = "".join(chr(x) for x in current_payload)
# call our simple mutator to fuzz the POST
payload = self.mutate_payload(payload)

# increase the number of fuzzing attempts

self.num_iterations += 1
return payload def reset(self):
self.num_iterations = 0
return
Начинаем с определения
BHPFuzzer класса , который расширяет класс

IintruderPayloadGenerator
. Мы определяем переменные требуемого класса, а также переменные add max_payloads и

num_iterations
, чтобы мы могли отслеживать, когда сообщить Burp об окончании фаззинга. Конечно, вы можете запустить расширение да бесконечный период, если хотите, но для тестирования нам это не нужно. Затем мы добавляем функцию hasMorePayloads
, которая проверяет, достигли ли мы

максимального числа итераций фаззинга. Вы можете это модифицировать, чтобы непрерывно запускать расширение, всегда возвращая True. Функция getNextPayload получает

оригинальную HTTP полезную нагрузку и именно здесь и будет осуществляться фаззинг.
Переменная current_payload представлена как массив байтов, поэтому мы конвертируем ее в строку и затем передаем функции фаззинга

mutate_payload

Теперь прописываем переменную num_iterations и возвращаем мутирующую

полезную нагрузку. Наша последняя функция — reset
, она возвращается без каких-либо других действий.
Теперь давайте применим самую простую функцию фаззинга, которые вы можете модифицировать, как вам угодно. Так как эта функция осведомлена о текущей полезной нагрузке, если у вас сложный протокол, которому требуется что-то особенное, например CRC
вариант контрольной суммы в начале полезной нагрузки или длина поля, то вы можете проводить вычисления в самой функции до возврата, что делает ее невероятно гибкой. В bhp_fuzzer.py пропишите следующий код и убедитесь, что функция mutate_payload вложена в наш
BHPFuzzer класс: def mutate_payload(self,original_payload):
# pick a simple mutator or even call an external script picker = random.randint(1,3)
# select a random offset in the payload to mutate offset = random.randint(0,len(original_payload)­1)
payload = original_payload[:offset]
# random offset insert a SQL injection attempt if picker == 1:
payload += "'"

# jam an XSS attempt in if picker == 2:
payload += ""
# repeat a chunk of the original payload a random number if picker == 3:
chunk_length = random.randint(len(payload[offset:]),len(payload)­1)
repeater = random.randint(1,10)
for i in range(repeater):
payload += original_payload[offset:offset+chunk_length]
# add the remaining bits of the payload payload += original_payload[offset:]
return payload
Этот простой фаззер не требует особых разъяснений. Мы выбрали три модификатора в случайном порядке: простой тест SQL инъекция с одной кавычкой, XSS и модификатор, который выбирает в случайном порядке кусок полезной нагрузки и повторяет его случайное количество раз. Теперь у нас есть расширение Burp Intruder, которое мы можем использовать.
Давайте посмотрим, как мы можем его загрузить.

Проверка на деле
Сначала нам нужно загрузить наше расширение и убедиться, что нет ошибок. Нажмите на вкладку Extender в Burp, затем нажмите на кнопку Add. Появится экран, на котором вы укажете фаззеру на Burp. Проверьте, что вы задали те же опции, как показано на Рис. 6-3.
Рис. 6-3. Настройки Burp для загрузки нашего расширения
Нажимаем Next и Burp начинает загрузку нашего расширения. Если все идет хорошо, то Burp должен указать, что расширение было успешно загружено. Если есть ошибки, нажмите на вкладку Errors, устраните все опечатки и затем нажмите на кнопку Close. Экран Extender теперь должен выглядеть, как на Рис. 6-4.

Рис. 6-4. Burp Extender показывает, что наше расширение загружено.
Вы видите, что наше расширение загрузилось и Burp определил, что генератор полезной нагрузки Intruder зарегистрирован. Мы готовы попробовать применить наше расширение для реальной атаки. Проверьте, что ваш веб-бразуер настроен на использование Burp Proxy, как прокси на localhost на стандартном порту 8080 и теперь давайте попробуем совершить атаку на приложение Acunetix из Главы 5. http://testphp.vulnweb.com
В качестве примера я использовал небольшую строку поиска на их сайте, чтобы отправить поисковый запрос для строк «тест». На Рис. 6-5 показано, как я вижу этот запрос во вкладке
HTTP history. Нажатием правой кнопки мыши я отправил запрос Intruder.

Рис. 6-5. Выбираем HTTP запрос для отправки Intruder.
Теперь переключаемся на вкладку Intruder и нажимаем на вкладку Positions. Появится экран, на котором будут выделены все параметры запроса. Это Burp определил те места, где мы должны осуществлять фаззинг. Вы можете попробовать покрутить разграничители полезной нагрузки или выбрать всю нагрузку для фаззинга на ваше усмотрение. В нашем случае, мы оставляем это на усмотрение Burp. Для того чтобы все было наглядно, посмотрите на Рис. 6-6, на котором показано, как работает выделение полезной нагрузки.
Теперь нажимаем на вкладку Payloads. На экране нажимаем на выпадающее меню Payload type и выбираем Extension-generated. В разделе Payload Options, нажимаем на кнопку
Select generator … и выбираем из выпадающего меню BHP Payload Generator. Экран теперь должен выглядеть, как на Рис. 6-7.

Рис. 6-6. Выделение параметров полезной нагрузки в Burp Intruder.
Рис. 6-7. Использование фаззинг расширения в качестве генератора полезной нагрузки.

Итак, мы готовы отправить наши запросы. В самом верху меню Burp, нажмите Intruder и затем выберите Start Attack. Начнется отправка запросов, и вы сможете быстро просмотреть результаты. Когда я запускаю фаззер, я получаю результат, как на Рис. 6-8.
Рис. 6-8. Запущенный в Intruder фаззер.
Как можно видеть в строке 61 с предупреждением, в запросе 5 мы обнаружили то, что оказалось уязвимостью SQL инъекции.
Да, конечно, наш фаззер запущен только для демонстрационных целей, но вы удивитесь, насколько это может быть эффективно для выявления ошибок веб-приложения, обнаружения путей приложения или другого поведения, которое отсутствует у большинства сканеров.
Теперь давайте создадим приложение, которое поможет нам выполнить расширенную разведку на веб-сервере.

Bing для Burp
Когда вы осуществляете атаку на веб-сервер, то не редко эта одна машина обслуживает несколько веб-приложений, о некоторых из которых вы можете не знать. Конечно, вам хочется узнать имена хоста на этом же веб-сервере, потому что благодаря им вы можете легко получить оболочку. Часто получается обнаружить небезопасное веб-приложение или даже ресурсы разработки, расположенные на той же машине, что и ваша цель. Microsoft поисковая система Bing обладает поисковыми возможностями, которые позволяют вам делать запрос по всем веб-сайтам на одном IP-адресе (при помощи поискового IP модификатора). Bing также подскажет, какие есть поддомены у данного домена (используйте модификатор «domain»).
Теперь мы можем использовать скрапер (scraper), чтобы отправить эти запросы Bing и затем найти в результатах HTML. Но это признак плохих манер и к тому же, нарушает правила пользования большинства поисковых систем. Для того чтобы избежать проблем, мы можем использовать Bing API [13], чтобы отправить эти запросы программным путем и затем самостоятельно спарсить результаты. Мы не будем внедрять никакие особенные Burp GUI дополнения (кроме контекстного меню) в это расширение. Мы просто будем добавлять полученные результаты в Burp каждый раз, когда запускаем запрос, а любой обнаруженный
URL будет добавляться автоматически. Так как я уже рассказывал вам, как читать Burp API документацию и как переводить ее в Python, перейдем сразу к коду.
Открываем bhp_bing.py и вводим следующий код: from burp import IBurpExtender from burp import IContextMenuFactory from javax.swing import JMenuItem from java.util import List, ArrayList from java.net import URL
import socket import urllib import json import re import base64
bing_api_key = "YOURKEY"

class BurpExtender(IBurpExtender, IContextMenuFactory):

def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks self._helpers = callbacks.getHelpers()
self.context = None
# we set up our extension callbacks.setExtensionName("BHP Bing")
callbacks.registerContextMenuFactory(self)

return def createMenuItems(self, context_menu):
self.context = context_menu menu_list = ArrayList()

menu_list.add(JMenuItem("Send to Bing", actionPerformed=self.bing_
menu))
return menu_list

Это первый кусок нашего Bing расширения. Проверьте, что вставили Bing API ключ в нужное место ; вы можете делать около 2 500 бесплатных поисков в месяц. Мы начинаем с

определения нашего BurpExtender класса , который внедрит стандартный IBurpExtender

интерфейс и IcontextMenuFactory, что позволит нам иметь контекстное меню, когда пользователь щелкает правой кнопкой мыши на запрос в Burp. Регистрируем обработчик меню , чтобы мы смогли определить, на какой сайт

нажал пользователь, следовательно, мы сможем потом создать свои Bing запросы. Последним шагом будет настройка функции createMenuItem
, которая получает объект
IcontextMenuInvocation,
и мы его будем использовать для определения, какой был выбран HTTP запрос. И самый последний шаг — визуализация пункта меню, и мы получаем функцию bing_menu
, которая будет обрабатывать click-события . Теперь добавим

функциональности, чтобы выполнить Bing запрос, вывести результаты и добавить любые обнаруженные виртуальные хосты в целевую область действия Burp. def bing_menu(self,event):
# grab the details of what the user clicked http_traffic = self.context.getSelectedMessages()

print "%d requests highlighted" % len(http_traffic)
for traffic in http_traffic:
http_service = traffic.getHttpService()
host = http_service.getHost()
print "User selected host: %s" % host self.bing_search(host)
return def bing_search(self,host):
# check if we have an IP or hostname is_ip = re.match("[0­9]+(?:\.[0­9]+){3}", host)
if is_ip:

ip_address = host domain = False else:
ip_address = socket.gethostbyname(host)
domain = True bing_query_string = "'ip:%s'" % ip_address

self.bing_query(bing_query_string)
if domain:

bing_query_string = "'domain:%s'" % host self.bing_query(bing_query_string)
Наша функция bing_menu запускается, когда пользователь нажимает на пункт контекстного меню, которое мы определили. Мы извлекаем все HTTP запросы, которые были выделены

и затем извлекаем часть запроса хоста и отправляем ее функции bing_search для дальнейшей обработки. Функция bing_search сначала определяет, что нам передали: IP- адрес или имя хоста . Затем мы делаем у Bing запрос обо всех виртуальных хостах с

одинаковым IP-адресом , когда пользователь щелкнет правой кнопкой на хост,

содержащийся в HTTP запросе. Если домен был передан нашему расширению, тогда мы проводим второй поиск любых поддоменов, которые Bing может проиндексировать.

Пропишите следующий код, но проверьте, что вы правильно обозначили
BurpExtender класс, иначе у вас будут ошибки: def bing_query(self,bing_query_string):
print "Performing Bing search: %s" % bing_query_string
# encode our query quoted_query = urllib.quote(bing_query_string)
http_request = "GET https://api.datamarket.azure.com/Bing/Search/Web?$.
format=json&$top=20&Query=%s HTTP/1.1\r\n" % quoted_query http_request += "Host: api.datamarket.azure.com\r\n"
http_request += "Connection: close\r\n"
http_request += "Authorization: Basic %s\r\n" % base64.b64encode(":%s" % .

bing_api_key)
http_request += "User­Agent: Blackhat Python\r\n\r\n"
json_body = self._callbacks.makeHttpRequest("api.datamarket.azure.com",.

443,True,http_request).tostring()
json_body = json_body.split("\r\n\r\n",1)[1]

try:
r = json.loads(json_body)

if len(r["d"]["results"]):
for site in r["d"]["results"]:
print "*" * 100

print site['Title']
print site['Url']
print site['Description']
print "*" * 100
j_url = URL(site['Url'])
if not self._callbacks.isInScope(j_url):

print "Adding to Burp scope"
self._callbacks.includeInScope(j_url)
except:
print "No results from Bing"
pass return
Итак, HTTP API Burp запрашивает, чтобы мы создали весь HTTP запрос, как строку, прежде чем отправлять его. В частности, вы видите, что нам нужно зашифровать наш Bing API ключ в формате base64 и использовать HTTP базовую аутентификацию, чтобы совершить API

вызов. Затем мы отправляем наш HTTP запрос на серверы Microsoft. Когда ответ

возвращается, у нас будет весь ответ полностью, включая заголовки, поэтому мы разбиваем заголовки и передаем ответ JSON парсеру . Для каждого набора результатов, мы


выводим информацию о сайте, который мы обнаружили , и если этот сайт не входит в

целевую область действия Burp , то мы его автоматически добавляем. Это отличный

пример синтеза Jython API и Python, работающих в расширении Burp.

Проверка на деле
Используйте ту же самую процедуру, которую мы использовали для фаззинг расширения, чтобы запустить поисковое расширение Bing в работу. Когда оно загрузится, перейдите по ссылке http://testphp.vulnweb.com/
1   2   3   4   5   6   7   8   9   ...   13


написать администратору сайта