Inboxing corp-mails/outlook. Инбоксим корпы/аутлук. Часть 2
Aels, InboxLords. Tg: @crazymarkHi. Here is Aels again, and this is a second (private) part of the original instruction on how to inbox outlook.
The first part is located here: https://telegra.ph/Inboxing-corp-mailsoutlook-Inboksim-korpyautluk-02-03
This part of the article is also written in Russian, so, please, use a translator.
Let's go.
Ссылка не ложится в inbox? Создадим чистые и трастовые редиректы
Антиспам-фильтры не имеют права проверять содержимое ссылок, т.к. иначе они бы регулярно наступали на важные ссылки подтверждений активации, верификации, удаления аккаунта и тому подобные. Однако, outlook как минимум проверяет следующие параметры у каждой ссылки:
- сигнатурный детект известных плохих строк
- трафик-ранк домена
- возраст домена
- популярность домена внутри самого outlook
- ip-адрес, на который ссылается домен, и репутацию этого ip-адреса (в том числе, сколько еще доменов расположено на этом ip-адресе)
- рейтинг подсети ip-адреса, в зависимости от его популярности и количества грязных ip-адресов и доменов в ней.
По этой причине мы не можем использовать редиректы, размещенные на шеллах, или любых других взломанных сайтах, cPanels и т.д. Потому что шеллы как правило добываются через публичные уязвимости и запачканы многими спамерами уже задолго до нас. Так же домены шеллов имеют как правило около-нулевой traffic-rank, и расположены на shared-хостингах вместе с сотнями других. Использование CloudFlare частично решает эту проблему, но мы выберем другой путь.
Для отличного инбокса нам нужны ссылки на доменах, собирающих большой объем трафика, зарегистрированных давно, часто используемых, и ссылающиеся на ip-адреса, на которых не замечено вредоносной активности.
Идеально для этого подходят click-tracker-ы популярных банерных серверов, т.к. каждый из них - это открытый редиректор. Найти их можно через расширение для хрома Redirect-path, покликав по банерам на разных сайтах (не забудьте перед этим выключить ad-blocker).

Вот несколько примеров редиректов, которые я нашел за 15 минут:
https://track.adform.net/adfserve/?bn=12345;redirurl={{url}}
https://secure.adnxs.com/seg?redir={{url}}
https://p.rfihub.com/cm?forward={{url}}
https://tags.bluekai.com/site/35702?redir={{url}}
https://ssum.casalemedia.com/usermatchredir?s=183875&cb={{url}}
https://sync.mathtag.com/sync/img?cs_wd_sy=1&dp=43&redir={{url}}
Каждого такого редиректа нам хватаит на рассылку ~50 тысяч писем без рандомизации остальной части ссылки и без добавления мусорных параметров. Затем дадим им неделю отдыха, и они снова начнут залезать в инбокс. Результат - супер.
Однако что, если нам нужно очень много трастовых редиректов? Для этого нам нужно посетить очень много сайтов через банеры. Fuck it. За нас уже собрали миллионы ссылок.
Парни из UrlTeam собрали все адреса, куда ведут популярные шортнеры ссылок. И среди них есть много-много открытых редиректов. Вот полный архив их работы по датам:
https://archive.org/details/UrlteamWebCrawls
Отсюда мы возьмем для примера архив ссылок, куда ведет давно закрытый шортнер goo.gl (или любой другой):
https://archive.org/details/urlteam_2023-01-14-00-17-02

Сначала мы выберем из этого файла все ссылки, в адресе которых есть другой url. На линуксе это удобно сделать командой grep. Также перед каждой ссылкой будет стоять id, который нам не нужен. Удалим его с помощью команды cut:
cut -d '|' -f 2 /path/to/goo-gl-urlteam-urls.txt | grep "=http" > click-trackers-to-check.txt
Затем нам нужно проверить, какие редиректоры еще живы и сохранят работоспособность, если сменить в их параметрах адрес сайта на другой. Для начала заменим все адреса в их параметрах на сайт example.com с помощью утилиты sed:
sed 's/=http/=https\:\/\/example.com%23/g' click-trackers-to-check.txt > click-trackers-prepared.txt
Кодом выше мы заменили в нашем файле с потенциальными открытыми редиректами все ссылки в их параметрах на домен example.com, а %23 - это закодированный символ #, который при переходе даст браузеру указание игнорировать остальную часть url, идущую после него.
Затем, для того, чтобы проверить, какие ссылки сохранили работоспособность, нам нужно проверить, какие из них после редиректа действительно ведут на сайт example.com. Для этого мы используем web-fuzzer ffuf (github.com/ffuf/ffuf). Установим его:
# this command is for Linux: apt install golang-go go install github.com/ffuf/ffuf/v2@latest # this command is for MacOS: brew install ffuf
И запустим со следующими параметрами:
ffuf -w click-trackers-prepared.txt -u FUZZ -r -mr "-apple-system, system-ui, BlinkMacSystemFont" -o click-trackers-tested.txt -of csv -timeout 2 -t 20
-w- это наш файл с ссылками, которые нужно посетить и проверить.-u- какими символами эти ссылки нужно обернуть, и ключевое слово FUZZ, на место которого будет вставлена наша ссылка (т.к. мы используем только слово FUZZ, то ссылки будут запрошены "как есть")-r- указание "следовать редиректам"-mr- указание искать на посещенной странице текстовую строку. В нашем случае это строка из кода сайта example.com-o- файл, куда сохранять результаты-of- формат файла с результатами. В нашем случае - csv.-t- число потоков фаззера. ffuf очень мощная штука и способен держать до тысячи потоков, но мы в любом случае или упремся в пропускную способность канала VPS-сервера, или взорвем его. Так что пусть будет 20 потоков (не будем жадничать).

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

Удалим их с помочью cut, отсортируем:
cut -d ',' -f 2 click-trackers-tested.txt | sort -u > click-trackers-sorted.txt
*если вы используете MacOS, то предварительно введите команду LC_CTYPE=C && LANG=C;, иначе cut выбросит ошибку "Illegal byte sequence".
Теперь нам нужно удалить дубликаты доменов, которых будет очень много. Для этого напишем python-скрипт:
#!/usr/local/bin/python3
import sys, re
with open(sys.argv[1], 'r', encoding='utf-8', errors='ignore') as fp:
prev = fp.readline()
while True:
next = fp.readline()
if not next:
exit(1)
if not next[0:20] in prev:
print(re.sub(r'https://example.com[^&]+', r'{{url}}', next), end='')
prev = next
https://gist.github.com/aels/7150b6d3615f4ff9f3acd80d8f64ff9f
Сохраним его как remove_dupes.py, и вызовем, передав параметром наш файл:
python3 remove_dupes.py click-trackers-sorted.txt > click-trackers-uniq.txt
Теперь у нас есть собственные, приватные и трастовые редиректоры.

Если для вас было затруднительно проделать шаги по их добыче, то вот мои редиректоры (их хватит на какое-то время, пока не запачкаются):
https://gist.github.com/aels/4692b4e8016e93a8de31cb0085aa0c97

Для трекинга кликов нам достаточно использовать любой url-шортенер, например gg.gg, bit.ly, is.gd или любой другой. Если нам нужна передача параметров на нашу целевую ссылку (например email получателя), то нужно использовать шортенеры, которые это умеют, например tinyurl.com.
Если мы хотим передать параметры usermail={{email}} и id=273427 на сайт example.com, то наша желаемая ссылка будет выглядеть так:
https://example.com/?usermail=john@outlook.com&id=273427
Тогда сокращенная ссылка будет такой:
https://tinyurl.com/kjcr75us?usermail=john@outlook.com&id=273427
Теперь добавим ее к нашему редиректору:
https://tags.bluekai.com/site/35702?redir=//tinyurl.com/kjcr75us?usermail=john@outlook.com&id=273427 - не правильно.
В примере выше все идущие после первого символа & параметры будут переданы браузером домену редиректора (в нашем случае tags.bluekai.com). Чтобы браузер понял, что эти парамерты принадлежат ссылке шортнера, переданной в параметре redir, необходимо url-кодировать или всю передаваемую в параметре redir ссылку (например на сайте urlencoder.org), или хотя бы все символы & в ней. Тогда наша правильная ссылка с редиректором будет выглядеть так:
Теперь браузер поймет, что все параметры нашей укороченной через шортнер ссылки нужно передать в параметр redir редиректора.
Обфускация ссылки и приятные мелочи
Когда браузер запрашивает ссылку https://example.com, предварительно он проводит с ней ряд нормализаций, такие как:
- декодирование utf8-омонимов: http://exaⓂple.com/ - символы других локалей приводятся к их ascii-эквивалентам.
- url-декодирование: http://example%2ecom/ - доменное имя проходит url-декодирование перед отправкой на него пользователя. К сожалению, использовать вместе с символами других локалей этот метод нельзя.
- форматирование порта (если он указан): https://example.com:000443/ - в хроме и сафари (суммарно 95% рынка браузеров) перед портом можно указывать любое количество нулей. Порты по-умолчанию:
443для https-протокола и80для http-протокола. - нормализация протокола: ///example.com/ - можно убрать строчку
https:и ссылка продолжит работать, а за протокол будет принят протокол родительской страницы. Вместо//можно использовать///, и такая комбинация будет так же корректно воспринята браузером.
Давайте посмотрим, что можно сделать с ссылкой, чтобы она продолжила работать:
///ⅇⓍᵃℳpᴸₑ.ⓒoⓂ:0443/
Ради развлечения можно побаловаться с генератором таких доменов: https://splitline.github.io/domain-obfuscator/. В бою мы его использовать не будем, т.к. ссылки с доменами, в которых есть utf8-омонимы или ссылки не начинающиеся с http, блокируются в outlook именно в целях безопасности. Тем не менее, некоторые манипуляции нам все же доступны, т.к. мы будем производить их не над основным доменом, а над доменом шортнера, который находится в одном из параметров.Теперь давайте подготовим финальную ссылку:
https://traffic.shareaholic.com/e/?u={{url}}&r=1&a=1&s=313&f=2309672
Заменим наш макрос и уберем https (/// понимают не все редиректоры, и выбранный нами не понимает):
https://traffic.shareaholic.com/e/?u=//tinyurl.com/kjcr75us?usermail=john@outlook.com&r=1&a=1&s=313&f=2309672
Url-кодируем точку:
https://traffic.shareaholic.com/e/?u=//tinyurl%2ecom/kjcr75us?usermail=john@outlook.com&r=1&a=1&s=313&f=2309672
Добавим порт и url-кодируем точку еще раз (т.к. первый раз она декодируется как часть url, а второй - как часть домена):
https://traffic.shareaholic.com/e/?u=//tinyurl%252ecom:00443/kjcr75us?usermail=john@outlook.com&r=1&a=1&s=313&f=2309672
Vio-la, финальная ссылка для письма готова. Теперь outlook сигнатурно не определяет в ней домен шортнера. Теперь даже без дополнительного замусоривания ссылки фальшивыми параметрами мы можем спокойно разослать ~50,000 писем с ней внутри.
Теперь, когда у нас есть трастовая ссылка, на секунду вернемся к тексту нашего письма. Outlook не любит, когда текст внутри ссылки, и адрес, куда она ведет различаются, по-этому мы изменим нашу ссылку в html-коде письма, чтобы текст внутри нее будто бы соответствовал ее адресу. В моем случае код теперь выглядит вот так:
<a href="https://tags.bluekai.com/site/35702?redir=///is.gd:0443/6qhDFV"><u>https://tags.bluekai.com/site/35702?redir=///is.gd:0443/6qhDFV#</u>https://only<u> ah, no more fans for me =( </u>fans.com/mashaspeechka</a>

Замечательно.
Как защитить лендинг от красного экрана Google Safe Browsing?

Это довольно обширная тема. Для того, чтобы сделать все правильно, и наша страница не загорелась красным экраном GoogleSafeBrowsing, я написал отдельную пошаговую инструкцию:
https://telegra.ph/Getting-rid-of-Google-Safebrowsing-red-screen-once-and-forever-Step-by-step-02-18.
Поговорим об аттачах
Почти все исполняемые файлы запрещены к пересылке в outlook (как и в google, впрочем). Вот полный список запрещенных расширений файлов:
Если мы хотим положить в инбокс какой-то из этих типов файлов, то предварительно его нужно положить в архив. Однако это не спасет нас от детекта антивирусом (outlook использует движок от Windows Defender). Все архивы без проблем распаковываются как минимум до глубины 5 вложений (дальше я не проверял в виду бессмысленности процесса). По-этому файл нужно слать чистый, или, как минимум, не определяемый Defender-ом при статическом анализе как вредоносный.
Проверять файлы на чистоту я рекомендую в сервисе www.checkzilla.io
Архив под паролем - неплохое решение, и, хотя он добавляет баллов подозрительности к письму, положить его в инбокс вполне реально, если мы не палимся по остальным параметрам. В случае и со SpamAssasin, и с антиспамом в outlook, их антиспам-фильтры не анализирует бинарные файлы. Эти файлы передаются антивирусному движку. И не смотря на наличие пароля, антивирус все равно может видеть имена файлов в архиве. По-этому проверки намного лучше проходят матрешки вида password-protected-zip->iso->lnk (lnk-файл взят в данном случае как пример. Это может быть и doc, и xll, и любой другой на ваш вкус).
В случае со SpamAssasin, по-умолчанию максимальный размер файла, который передается антивирусному движку (чаще всего это Amavis) для анализа - 25Mb. К сожалению, такого лимита нет в outlook, а максимальный размер пересылаемого файла составляет всего 20Mb. Все остальные файлы предлагается заливать в облачные хранилища.
И это отличная идея. Тут у нас два варианта:
- Мы можем сделать страницу, иммитирующую, например, сервис OneDrive.
- Мы можем разместить свой файл на настоящем OneDrive, расшарить его "для всех", и с помощью инструкции https://metadataconsulting.blogspot.com/2019/03/OneDrive-2019-Direct-File-Download-URL-Maker.html получить прямую ссылку на скачивание, которую спрятать в трастовый редирект, следуя инструкции, описанной выше. Если это не запароленный архив, файл загорится с первым визитом краулера GoogleSafeBrowsing. Но произойдет это через 2-3 часа. За это время нужно все успеть.
В случае с outlook не стоит использовать брендовые слова в именах аттачей (например FirefoxInstaller.msi), т.к. это резко снижает инбокс. Так же мы не можем использовать в именах аттачей emoji, или специальные символы, такие как висящая табуляция, перенос строки, символ возврата каретки и им подобные - такие письма не попадут даже в спам.
Самые ходовые форматы аттачей на данный момент, это html, htm, rar, pdf, svg (формат векторной графики, который может содержать код javascript, чего достаточно для переадресации пользователя или загрузки своего фишинга вместо картинки). И все они отлично ложатся в inbox. Использовать pdf, чтобы скрыть ссылки, ведущие на ваш фишинг нет смысла (жизнь ссылки это не продлит), т.к. в WindowsDefender-е есть встроенный декодер и парсер pdf-файлов. Так же не стоит слать .doc-документ с макросами, не убрав его предварительно в архив с паролем, т.к. WindowsDefender так же извлекает макросы из .doc-документа и анализирует их.
Запароленный архив, хоть и снижает корверсию в несколько раз, на данный момент является лучшим способом доставки исполняемых файлов для outlook (главное - понятным языком объяснить получателю письма необходимость пароля, например "We value your privacy, so..." и т.д.).
Прикрепление файла с вашей нагрузкой к телу письма гарантирует попадание вашей нагрузки в руки работников антивирусных компаний. Если вы все же считаете такой метод рассылки необходимым, мы можем спрятать исполняемый файл в тело прикрепленной .html или .svg страницы. Вот подробная статья с примерами кода, описывающая способы, как это сделать:
https://blog.delivr.to/html-smuggling-recent-observations-of-threat-actor-techniques-74501d5c8a06 (eng).
Один из редко используемых форматов файлов, который я рекомендую попробовать - это .vhd (виртуальный диск windows). Скрестим пальцы и пожелаем нам много загрузок и запусков.
Трекинг просмотров писем
Старый добрый пиксель, добавленный в конец письма, работает отлично, но его загрузка блокируется, если письмо попадает в спам. По-этому мы можем отслеживать только число просмотров писем, попавших в inbox.
<img src="https://trusted_domain/image_tracker.png" width=1 height=1>
Так же блокируются или удаляются из тела письма вообще все html-теги, которыми можно отправить запрос на другой домен: img, picture, object, figure, link, заданное через css свойство ::before и content у элементов, и т.д., если они содержат запрос на внешний домен по http/https. Это сложно или дорого решаемая проблема. Возможность отправки из письма в спаме запроса "наружу" - уязвимость, которая попадает под программу bug-bounty от Microsoft. По-этому найти способ отслеживать письма из папки spam - задача для крутых специалистов, которые глубоко понимают работу html и css парсеров, и при этом по какой-то причине не сдадут найденный способ в Microsoft. Нам же, простым смертным, можно об этом забыть. Тем не менее, подобные уязвимости регулярно находятся в корпоративных mail-серверах меньшей популярности. Например возможность запрашивать произвольный url в письмах, найденная в Horde WebMail: https://www.sonarsource.com/blog/horde-webmail-rce-via-email/

Apple скачивает все изображения в письме используя свои сервера в момент попадания письма в почтовый ящик. Gmail скачивает рисунки в момент, когда пользоватесь открывает письмо, но предварительно так же загружает их к себе на сервера, и это не позволяет нам определить ОС, браузер получателя и его страну (в прочем, как и у Apple). Однако Outlook скачивает изображения честно - по прямой ссылке, в момент открытия письма получателем. Благодаря этому мы можем отслеживать статистику по ОС и браузерам, странам и типам устройств.
Поступим так же, как мы поступили со ссылкой в письме: к трастовому редиректу добавим шортнер, ведущий на любую картинку в интернете. Самая красивая на мой взгляд статистика в реальном времени в шортнере https://dkly.me/. Выглядеть наш трекер будет примерно вот так:

Для удобства сделаем в кабинете dkly.me страницу статистики нашей ссылки-трекера публично доступной, и сможем легко делиться ей с партнером или клиентом.
Как заблокировать пересылку (форвардинг) письма на другой адрес
На самом деле - никак. Однако мы можем осложнить жизнь получателю пересланного письма, визуально скрыв его содержимое. Не смотря на то, что при просмотре исходного кода письма, его содержимое по-прежнему будет видно, шанс, что такое письмо проигнорируют заметно выше. А значит и наши ленды будут жить дольше. Это особенно полезно, если получатель переслал наше письмо службе безопасности, например. Этот метод уже несколько лет заблокирован у всех основных mail-провайдеров, но до сих пор работает в "частных" почтовых серверах, таких как Zimbra или Horde WebMail. Что ж... Это все же лучше, чем ничего.
При пересылке исходный код нашего письма или помещается в тег <blockquote>, или перед ним добавляются элементы, отображающие текст, добавленный к исходному тексту письма (в случае с outlook это тег <font>). Добавим к html-коду письма следующие css-стили:
<style type="text/css">
font ~ div {width: 10px; height: 5px;}
blockquote div, .quote div {width: 10px; height: 5px;}
</style>
В коде выше мы сжали содержимое блока <div>, идущего за тегом <font> до размера 10*5 пикселей (т.к. стиль с размером 0*0 будет удален самим outlook-ом как подозрительный). Так же мы ужали до 10*5 пикселей размер всех блоков, вложенных внутрь тега <blockquote> или вложенных в любой блок с классом .quote. Этих манипуляций со стилями достаточно, чтобы скрыть исходный контент письма при отображении в большинстве частных email-серверов, где этот способ еще работает.


А пока мы перевариваем всю полученную информацию, время зарядиться.

Отлично. Продолжаем.
Как защитить ссылку от автоматического анализа краулерами антивирусных компаний?
Однажды наше письмо все же попадет в руки антивирусных компаний - для начала оно будет подвергнуто автоматическому анализу и содержимое ссылок будет проверено краулером. В зависимости от языка программирования, на котором построен краулер, наша ссылка будет интерпретирована различным образом. Пусть для примера наша ссылка выглядит так:
https://secure.adnxs.com/seg?redir=///example.com
При ее загрузке краулер получит указание на переадресацию через заголовок Location:

Из-за использования /// заголовок Location будет некорректный, и библиотеками различных языков программирования он будет интерпретирован по-разному:
# Curl just error # php curl just error # python requests https://secure.adnxs.com/example.com -> 404 error. # NodeJS http.request //example.com -> https://example.com # Google Chrome / Safari //example.com -> https://example.com
Таким образом получить контент нашего лендинга корректно смогут только построенные на основе настоящего браузера или NodeJS краулеры. Остальными же автоматическими системами анализа антивирусных компаний наш лендинг проанализирован не будет.
Неплохо.
Теперь у нас все готово для рассылки. Переходим к самому приятному - запуску нашей email-кампании.
Продолжение статьи: https://telegra.ph/Inboxing-corp-mailsoutlook-Inboksim-korpyautluk-CHast-3-02-22.