• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Определение технологий используемых сайтом с помощью Wappalyzer и Python

Иногда, при исследовании сайта необходимо знать, какие технологии использовались при его разработке, а также используются в данный момент. Инструментов, которые предоставляют такой функционал не так уж и много. Одним из популярных решений является Wappalyzer. Посмотрим, как можно использовать данный инструмент при определении технологий с помощью Python.

000.jpeg

Конечно же, если вы установите Wappalyzer в браузер, в качестве расширения, точность определения технологий, а также количество сайтов, на которых можно их определить, будет значительно выше. Так как при анализе данных иногда перехватываются запросы, если не представляется возможным определить технологии иным способом. Тем не менее, если вам нужно проверить большое количество сайтов, использование автоматизации существенно облегчит данную задачу. Давайте попробуем написать небольшой скрипт, который использует Wappalyzer при определении технологий.


Что потребуется?

Для работы данного скрипта необходимо установить две сторонние библиотеки. Первая – это requests. С его помощью мы будем выполнять запросы к сайту для получения данных. Вторая – собственно python-Wappalyzer. Именно с помощью данной библиотеки и будет происходить анализ. Третья – validators. Ее мы будем использовать для проверки корректности ввода пользователем ссылок на сайты.

Для их установки пишем в терминале команду:

pip install python-Wappalyzer requests validators


Импорт библиотек в скрипт

После того, как будут установлены нужные библиотеки, импортируем в скрипт все, что необходимо для его работы.

Python:
import warnings
from urllib.parse import urlparse

import requests
import validators
from Wappalyzer import Wappalyzer, WebPage

Как видите, пришлось использовать библиотеку warnings. Обнаружилась одна не особо приятная особенность – при работе библиотеки Wappalyzer выскакивает warning который ругается на regex. На работе библиотеки это не сказывается. Поэтому, для того, чтобы подавить данный warning мы и будем использовать данную библиотеку.

После импорта библиотек нужно прописать еще две строчки кода.

Python:
requests.packages.urllib3.disable_warnings()
warnings.filterwarnings("ignore")

Первая подавляет warning при использовании requests с отключенной верификацией, вторая подавляет warning от библиотеки Wappalyzer.

Теперь приступим к написанию функции, которая будет получать данные и выполнять их анализ. В данном коде я не стал разносить получение данных и их анализ по разным функциям, так как, кроме определения технологий в данном коде не выполняется других операций. Однако, если бы это было не так, получение данных лучше вынести отдельно.


Получаем данные с сайта

Почему не только код? Дело в том, что Wappalyzer анализирует не только код, но и cookies, headers. Поэтому, кроме кода ему для анализа необходим полный запрос, из которого он уже выберет нужные ему параметры.

Создадим функцию detect_tech(url: str) -> (dict, bool), которая на входе будет принимать ссылку на страницу сайта, а возвращать словарь с определенными технологиями в случае успеха или False в случае, если не удалось получить данные или технологии не были определены.

Создадим словарь с заголовками для запроса, в который добавим user-agent, accept и accept-encoding. Затем определим переменную category которую сделаем словарем. В нее мы будем складывать полученные технологии по категориям для удобства дальнейшего использования. Так как возвращаемый Wappalyzer словарь представлен в несколько неудобном виде:

01.png

Выполняем запрос к сайту по переданной в функцию ссылке. Передаем в запросе заголовки, определяем параметр allow_redirects=True, а также отключаем верификацию.

Проверяем полученный статус код. Если он находиться в двухсотом диапазоне создаем объект Wappalyzer. В метод WebPage.new_from_response передаем полный ответ от сайта. Затем с помощью метода wappalyzer.analyze_with_versions_and_categories определяем полученные технологии.

Запускаем цикл по полученному словарю, забираем из него полученные данные и распределяем в словарь category по категориям. После чего возвращаем словарь из функции. Если данные не были получены или не определены технологии, возвращаем False.

Python:
def detect_tech(url: str) -> (dict, bool):
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
                  'application/signed-exchange;v=b3;q=0.9',
        'accept-encoding': 'gzip, deflate, br',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/110.0.0.0 Safari/537.36'
    }
    category = dict()
    resp = requests.get(url=url, headers=headers, timeout=5, allow_redirects=True, verify=False)
    if 200 <= resp.status_code <= 299:
        wappalyzer = Wappalyzer.latest()
        webpage = WebPage.new_from_response(resp)
        techs = wappalyzer.analyze_with_versions_and_categories(webpage)
        if techs:
            for tech in techs:
                if techs[tech].get('categories')[0]:
                    if not techs[tech].get('categories')[0] in category:
                        category[techs[tech].get('categories')[0]] = dict()
                    try:
                        category[techs[tech].get('categories')[0]].update({tech: techs[tech].get('versions')[0]})
                    except IndexError:
                        category[techs[tech].get('categories')[0]].update({tech: ""})
            return category if category else False
        return False
    return False


Запрос адреса сайта и вывод полученных технологий в терминал

Здесь мы запрашиваем у пользователя ссылку на сайт или страницу сайта, прогоняем через валидатор, чтобы убедиться, что ссылка введенная пользователем корректна и запускаем функцию получения данных. В зависимости от того, возвращает она словарь или False, выполняем следующие операции. Если вернулся словарь – итерируемся по нему и выводим информацию в терминал. Если словарь вернулся пустым, сообщаем об этом пользователю.

Python:
def main():
    url = input("Введите ссылку на сайт для анализа технологий: ")
    if validators.url(url):
        if category := detect_tech(url):
            ln = len(f"Технологии использующиеся на сайте: {urlparse(url).hostname}")
            print(f"\nТехнологии использующиеся на сайте: {urlparse(url).hostname}\n{'-' * ln}")
            for cat in category:
                print(f'{cat}:')
                for item in category[cat]:
                    print(f'   - {item} {category[cat][item]}'.strip())
                print("")
        else:
            print("Не удалось получить технологии")


if __name__ == "__main__":
    main()


Вот результат запроса к codeby.net:

02.png

Python:
# pip install python-Wappalyzer requests validators

import warnings
from urllib.parse import urlparse

import requests
import validators
from Wappalyzer import Wappalyzer, WebPage

requests.packages.urllib3.disable_warnings()
warnings.filterwarnings("ignore")


def detect_tech(url: str) -> (dict, bool):
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
                  'application/signed-exchange;v=b3;q=0.9',
        'accept-encoding': 'gzip, deflate, br',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/110.0.0.0 Safari/537.36'
    }
    category = dict()
    resp = requests.get(url=url, headers=headers, timeout=5, allow_redirects=True, verify=False)
    if 200 <= resp.status_code <= 299:
        wappalyzer = Wappalyzer.latest()
        webpage = WebPage.new_from_response(resp)
        techs = wappalyzer.analyze_with_versions_and_categories(webpage)
        if techs:
            for tech in techs:
                if techs[tech].get('categories')[0]:
                    if not techs[tech].get('categories')[0] in category:
                        category[techs[tech].get('categories')[0]] = dict()
                    try:
                        category[techs[tech].get('categories')[0]].update({tech: techs[tech].get('versions')[0]})
                    except IndexError:
                        category[techs[tech].get('categories')[0]].update({tech: ""})
            return category if category else False
        return False
    return False


def main():
    url = input("Введите ссылку на сайт для анализа технологий: ")
    if validators.url(url):
        if category := detect_tech(url):
            ln = len(f"Технологии использующиеся на сайте: {urlparse(url).hostname}")
            print(f"\nТехнологии использующиеся на сайте: {urlparse(url).hostname}\n{'-' * ln}")
            for cat in category:
                print(f'{cat}:')
                for item in category[cat]:
                    print(f'   - {item} {category[cat][item]}'.strip())
                print("")
        else:
            print("Не удалось получить технологии")


if __name__ == "__main__":
    main()

Конечно же, таким образом удается получить не все технологии. А на некоторые сайты с помощью requests просто не попасть. Но, тем не менее, в большинстве случаев, данный код работает довольно хорошо.

А на этом, пожалуй, все.

Спасибо за внимание. Надеюсь, данная информация будет вам полезна
 

Вложения

  • tech_detection.zip
    1,2 КБ · Просмотры: 115
Последнее редактирование модератором:

satfan

Green Team
26.06.2022
77
1
BIT
60
Спасибо.
>>>
*** Remote Interpreter Reinitialized ***
Traceback (most recent call last):
File "C:\Users\Пк\Desktop\Определение технологий используемых сайтом с помощью Wappalyzer\tech_detection.py", line 8, in <module>
from Wappalyzer import Wappalyzer, WebPage
ModuleNotFoundError: No module named 'Wappalyzer'
Получил это: WARNING: Skipping Wappalyzer as it is not installed.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!