Р. Эрик Кисер
Представьте, что вы проводите тест на проникновение и сталкиваетесь с пользователями, которые никогда не выходят из своих устройств и не выключают их, оставляя их уязвимыми для атак в нерабочее время и эксплуатации бокового перемещения. Эти пользователи могут стать главной целью злоумышленников, стремящихся получить доступ к конфиденциальной информации и ресурсам внутри организации. Ваша работа как пентестера заключается в выявлении и использовании уязвимостей в системе безопасности организации. Одним из очень эффективных способов сделать это является сбор исчерпывающей информации о пользователях организации, что часто является требованием для клиентов.
Чтобы получить эту информацию, вы можете использовать систему электронной почты организации с помощью Python и Outlook для извлечения ценных сведений, таких как адреса электронной почты и номера телефонов. Такой подход не только поможет вам составить подробный список пользователей, но и упростит горизонтальное перемещение внутри организации. Если вы действительно хотите выйти на новый уровень, вы также можете получить информацию о доступе пользователей к файлам и папкам, но это уже другая статья. В этой статье я покажу вам, как использовать Python для извлечения пользовательских данных из Outlook.
Чтобы получить доступ к контактам Outlook через Python, вам потребуется использовать пакет pywin32 на хосте, который обеспечивает доступ к API Outlook. Убедитесь, что pywin32
package установлен ( pip install pywin32
) в вашем терминале. Теперь мы можем импортировать необходимые модули
import win32com.client
Мы можем использовать текущий сеанс, запущенный пользователем, получив объект пространства имен MAPI.
# Connect to the running instance of Outlook outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
Мы хотим извлечь папку «Контакты» по умолчанию и адресную книгу, а затем собрать записи книги. В адресной книге будет больше контактной информации, так как она связана с глобальным списком адресов в AD (Active Directory).
# Get the default Contacts folder contacts_folder = outlook.GetDefaultFolder(10) # Get the address book folder address_book_folder = outlook.GetDefaultFolder(11) # Get the address book entries address_book = address_book_folder.Items
Нам нужно создать цикл for
, который перебирает каждый контакт в папке «Контакты» по умолчанию. Затем мы хотим, чтобы скрипт делал следующее:
- Проверьте, есть ли у контакта полное имя. Если это так, присвойте полное имя переменной
full_name
. В противном случае пропустите текущий контакт с помощьюcontinue
. Может быть полезно захватить их. Однако часто они не являются учетными записями пользователей. - Проверьте, есть ли у контакта адрес электронной почты. Если это так, назначьте адрес электронной почты переменной
email_address
. В противном случае назначьте строку'N/A'
дляemail_address
. - Проверьте, есть ли у контакта рабочий номер телефона. Если это так, назначьте номер телефона переменной
phone_number
. В противном случае назначьте строку'N/A'
дляphone_number
. - Проверьте, есть ли у контакта отдел. Если это так, он присваивает отдел переменной
department
. В противном случае назначьте строку'N/A'
дляdepartment
.
# Loop through the items in the Contacts folder and extract the desired information for contact in contacts_folder.Items: # Check if the contact has a full name if hasattr(contact, 'FullName'): full_name = contact.FullName else: continue # Skip this contact if full name is not available # Extract the email address if hasattr(contact, 'Email1Address'): email_address = contact.Email1Address else: email_address = 'N/A' # Check if the contact has a phone number if hasattr(contact, 'BusinessTelephoneNumber'): phone_number = contact.BusinessTelephoneNumber else: phone_number = 'N/A' # Check if the contact has a department if hasattr(contact, 'Department'): department = contact.Department else: department = 'N/A'
Теперь нам нужно вывести эти детали на экран.
# Print the contact information to the screen print(f"Name: {full_name}") print(f"Email: {email_address}") print(f"Phone: {phone_number}") print(f"Department: {department}") print('-' * 20)
Цикл for
для записей адресной книги делает то же самое, что и первый цикл, но он перебирает записи адресной книги вместо контактов в папке «Контакты» по умолчанию.
# Loop through the address book entries and extract the desired information for entry in address_book: # Check if the entry is a contact if entry.AddressEntryUserType == 0: # Get the contact object contact = entry.GetContact() # Check if the contact has a full name if hasattr(contact, 'FullName'): full_name = contact.FullName else: continue # Skip this contact if full name is not available # Extract the email address if hasattr(contact, 'Email1Address'): email_address = contact.Email1Address else: email_address = 'N/A' # Check if the contact has a phone number if hasattr(contact, 'BusinessTelephoneNumber'): phone_number = contact.BusinessTelephoneNumber else: phone_number = 'N/A' # Check if the contact has a department if hasattr(contact, 'Department'): department = contact.Department else: department = 'N/A' # Print the contact information to the screen print(f"Name: {full_name}") print(f"Email: {email_address}") print(f"Phone: {phone_number}") print(f"Department: {department}") print('-' * 20)
Таким образом, вы можете получить контактную информацию как из папки «Контакты» по умолчанию, так и из папки «Адресная книга». После извлечения информацию можно вывести на консоль или перенаправить в текстовый файл, что я обычно и делаю, поскольку информация может быть весьма обширной. Хлопайте и следуйте, если хотите, и удачной охоты!
Заключение
Скачать скрипт можно на моем GitHub. Хлопайте и следуйте, если хотите, и удачной охоты!
- Прямая ссылка на GitHub:
https://github.com/R-Eric-Kiser/python-pentesting/blob/main/OutlookContactExtraction.py - Смотрите, чем я занимаюсь в Твиттере: https://twitter.com/R_Eric_Kiser