Р. Эрик Кисер

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

Чтобы получить эту информацию, вы можете использовать систему электронной почты организации с помощью 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, который перебирает каждый контакт в папке «Контакты» по умолчанию. Затем мы хотим, чтобы скрипт делал следующее:

  1. Проверьте, есть ли у контакта полное имя. Если это так, присвойте полное имя переменной full_name. В противном случае пропустите текущий контакт с помощью continue. Может быть полезно захватить их. Однако часто они не являются учетными записями пользователей.
  2. Проверьте, есть ли у контакта адрес электронной почты. Если это так, назначьте адрес электронной почты переменной email_address. В противном случае назначьте строку 'N/A' для email_address.
  3. Проверьте, есть ли у контакта рабочий номер телефона. Если это так, назначьте номер телефона переменной phone_number. В противном случае назначьте строку 'N/A' для phone_number.
  4. Проверьте, есть ли у контакта отдел. Если это так, он присваивает отдел переменной 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. Хлопайте и следуйте, если хотите, и удачной охоты!