В этой статье я объ­ясню, как пос­тро­ить инфраструк­туру для симуля­ции фишин­говой ата­ки в рам­ках тес­тирова­ния орга­низа­ции. Мы соз­дадим с нуля поч­товый сер­вер, уста­новим и нас­тро­им обратный прок­си Evilginx, а затем внед­рим его в фишин­говый фрей­мворк Gophish. В кон­це я покажу на прак­тике про­цесс про­веде­ния фишин­говой ата­ки с перех­ватом логина, пароля и сес­сион­ных cookie, c пос­леду­ющим обхо­дом двух­фактор­ной аутен­тифика­ции.

warning

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

Связка Evilginx и Gophish

Два фрей­мвор­ка, которые мы будем исполь­зовать для про­веде­ния фишин­говой кам­пании, называ­ются Evilginx и Gophish. Это два самос­тоятель­ных инс­тру­мен­та, которые выпол­няют раз­ные задачи.

Gophish — это прог­рамма с откры­тым кодом, соз­данная Джор­даном Рай­том. Gophish поз­воля­ет про­водить авто­мати­зиро­ван­ные фишин­говые рас­сылки и таким обра­зом ими­тиро­вать дей­ствия зло­умыш­ленни­ка.

Evilginx — это обратный прок­си‑сер­вер, который прок­сиру­ет соеди­нение меж­ду поль­зовате­лем и целевым веб‑ресур­сом, поз­воляя перех­ватить логин, пароль и клю­чи сеан­са. С помощью это­го фрей­мвор­ка мож­но обой­ти двух­фактор­ную аутен­тифика­цию. Автор Evilginx — Куба Грец­ки.

Есть две вер­сии интегра­ции этих двух инс­тру­мен­тов. Пер­вая — не­офи­циаль­ная, ее раз­работал Дилан Эванс, он же fin3ss3g0d. Она вклю­чает в себя более рас­ширен­ный набор воз­можнос­тей вро­де SMS-рас­сылок и генера­ции QR-кодов, а так­же некото­рые дру­гие отли­чия от офи­циаль­ной вер­сии.

Офи­циаль­ную интегра­цию раз­работал автор Evilginx Куба Грец­ки, и появи­лась она отно­ситель­но недав­но — в апре­ле 2024 года. На дан­ный момент в ней мень­ше фун­кций, чем в вер­сии fin3ss3g0d, но инс­тру­мент пос­тоян­но обновля­ется, и, ско­рее все­го, все недос­тающее добавят. В статье я буду исполь­зовать имен­но эту вер­сию интегра­ции.

Начинаем строить инфраструктуру

Для начала необ­ходимо арен­довать VPS/VDS и домен­ное имя. Нам хва­тит сле­дующей кон­фигура­ции: 1 Гбайт ОЗУ, 20 Гбайт SSD и один про­цес­сор. В качес­тве ОС — Ubuntu 20.04.

По­луча­ем кре­ды от сер­вера, под­клю­чаем­ся к машине по SSH и про­водим базовую нас­трой­ку: соз­даем нового поль­зовате­ля и добав­ляем его в груп­пу sudo, соз­даем клю­чи SSH, отклю­чаем аутен­тифика­цию по паролю, нас­тра­иваем пор­ты, пра­вила фай­рво­ла и так далее.

info

Под­робнее о пер­воначаль­ной нас­трой­ке сер­вера ты можешь про­честь в статье «Ваш чек, сэр! Todo пос­ле покуп­ки вир­туаль­ного Linux-сер­вера».

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

Я решил соз­дать неп­римет­ный домен webaccount.site, что­бы потом добавить к нему под­домены, содер­жащие наз­вания извес­тных орга­низа­ций, так как под­домены необя­затель­но дол­жны быть уни­каль­ными. Нап­ример, если добавим под­домен microsoft, у нас получит­ся microsoft.webaccount.site.

Те­перь прис­тупим к нас­трой­ке DNS. Пер­вым делом нуж­но уста­новить основную запись типа А, которая свя­зыва­ет домен­ное имя с IP-адре­сом сер­вера. Для это­го редак­тиру­ем ресур­сные записи в раз­деле управле­ния зоной DNS у регис­тра­тора.

В даль­нейшем при соз­дании фишин­говых адре­сов будет исполь­зовать­ся мно­жес­тво под­доменов и для каж­дого такого под­домена пот­ребу­ется отдель­ная запись типа A, одна­ко мож­но исполь­зовать и запись типа CNAME, передав ей в качес­тве аргу­мен­та регуляр­ное выраже­ние «звез­дочка».

Этот тип записи сопос­тавит псев­доним (под­домен) с канони­чес­ким име­нем домена (webaccount.site) в момент генера­ции фишин­гового адре­са и получе­ния TLS/SSL-сер­тифика­та в Evilginx.

По­дож­дем, пока DNS-записи рас­простра­нят­ся (это может занять некото­рое вре­мя, от 15 минут до нес­коль­ких часов), и про­верим работос­пособ­ность сер­вера. Для это­го прос­то обра­щаем­ся к домену через бра­узер.

До­мен успешно при­вязал­ся к сер­веру. Пос­ле арен­ды домена желатель­но подож­дать хотя бы неделю: чем домен стар­ше, тем мень­ше веро­ятность, что он ока­жет­ся в чер­ных спис­ках. Во вре­мя моих пер­вых попыток я регис­три­ровал домен и сра­зу же исполь­зовал его в ими­тации фишин­говой ата­ки, из‑за чего его отс­тре­лива­ли в течение суток. Раз с доменом разоб­рались, прис­тупим к уста­нов­ке поч­тового сер­вера.

Поднимаем почтовый сервер

SMTP-сер­вер — один из клю­чевых ком­понен­тов нашей будущей инфраструк­туры. Его задача — выс­тупать в роли рет­ран­сля­тора. Нас­трой­ка поч­тового сер­вера нес­ложная, но тре­бует мно­жес­тва пос­ледова­тель­ных дей­ствий.

Пер­вым делом необ­ходимо уста­новить две записи. Одна — типа А с име­нем mail, ука­зыва­ющая на IP-адрес сер­вера.

Вто­рая запись — типа MX, которая ука­зыва­ет на сер­вер, обра­баты­вающий элек­трон­ную поч­ту.

Те­перь мож­но прис­тупить к уста­нов­ке и нас­трой­ке Postfix. Под­клю­чаем­ся к сво­ему VPS/VDS по SSH и запус­каем уста­нов­ку:

sudo apt install postfix

При нас­трой­ке в пер­вом шаге выбира­ем пункт Internet Site.

Вво­дим домен­ное имя, которое будет опре­делять­ся при отправ­ке поч­ты.

Ука­зыва­ем поч­товый адрес адми­нис­тра­тора домена. Мож­но оста­вить пус­тым (что не рекомен­дует­ся), тог­да поч­та, пред­назна­чен­ная для адми­нис­тра­тора, будет отправ­лять­ся в /var/mail/nobody.

Даль­ше про­писы­ваем адре­са вот в таком фор­мате:

<hostname>, <domain>, localhost.com, localhost

От­казыва­емся от при­нуди­тель­ного выпол­нения син­хро­низа­ции обновле­ний.

По­ле с локаль­ной сетью не тро­гаем и оставля­ем по умол­чанию.

Раз­мер поч­тового ящи­ка оставля­ем со зна­чени­ем 0, в этом слу­чае он будет опре­делять­ся общим дис­ковым прос­транс­твом.

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

И в пос­ледней нас­трой­ке выбира­ем исполь­зуемые про­токо­лы — all.

Пос­ле нас­трой­ки уста­нов­ку Postfix мож­но счи­тать завер­шенной. Про­веря­ем при помощи ути­литы netcat, запус­тился ли поч­товый сер­вер. Дос­таточ­но пос­тучать­ся на 25-й порт нашего хос­та (порт SMTP по умол­чанию).

Поч­товый сер­вер запущен, но одной уста­нов­ки мало, необ­ходимо так­же нас­тро­ить ресур­сные записи, что­бы поч­та доходи­ла до конеч­ной точ­ки. Если про­пус­тить этот важ­ный этап, поч­та не то что будет попадать в спам, она в прин­ципе не будет рас­смат­ривать­ся поч­товыми сер­верами. Для успешной дос­тавки сооб­щений необ­ходимо нас­тро­ить ресур­сные DNS-записи типа TXT — SPF, DKIM, DMARC.

Настраиваем SPF, DKIM и DMARC

SPF

Нач­нем с записи SPF (Sender Policy Framework). Это тек­сто­вая запись, которая опи­сыва­ет то, какие хос­ты име­ют пра­во отправ­лять поч­ту от име­ни домена, то есть это спи­сок доверен­ных сер­веров. По сути, SPF — это механизм, про­веря­ющий, авто­ризо­ван ли хост, отправ­ляющий элек­трон­ное пись­мо от опре­делен­ного домен­ного име­ни.

Что­бы такое пра­вило работа­ло, соз­даем запись TXT в панели управле­ния доменом.

Эта запись опре­деля­ет, что элек­трон­ную поч­ту от име­ни домена могут отправ­лять сер­веры, ука­зан­ные в записях MX и A домена, а так­же име­ющие IP-адре­са из диапа­зона 94.142.141.0/24. Поч­та от дру­гих хос­тов будет помече­на как подоз­ритель­ная.

www

Ты можешь вос­поль­зовать­ся веб‑инс­тру­мен­том SPF Wizard, что­бы соз­дать свои пра­вила SPF.

DKIM

Вто­рой записью нас­тро­им DKIM (DomainKeys Identified Mail). Это механизм про­вер­ки элек­трон­ной поч­ты, задача которо­го — пре­дот­вра­щать под­делку сооб­щений. Для это­го при­меня­ется асим­метрич­ное шиф­рование: каж­дое сооб­щение под­писыва­ется зак­рытым клю­чом.

info

DKIM исполь­зует пары клю­чей: зак­рытый, к которо­му име­ет дос­туп толь­ко поч­товый сер­вер, и откры­тый, который про­писы­вает­ся в тек­сто­вой DNS-записи, а затем исполь­зует­ся получа­телем для про­вер­ки легитим­ности сооб­щения.

Нас­трой­ка этой записи пот­ребу­ет мно­жес­тво шагов, будь вни­мате­лен при их выпол­нении — сде­лать что‑то не так доволь­но лег­ко. Пол­ное руководс­тво по нас­трой­ке DKIM есть на DigitalOcean, я не буду пол­ностью перепи­сывать его, а толь­ко опи­шу клю­чевые момен­ты.

Пер­вым делом уста­нав­лива­ем ути­литу OpenDKIM:

sudo apt update
sudo apt install opendkim opendkim-tools

И редак­тиру­ем файл /etc/opendkim.conf. Добавим сле­дующие стро­ки (номер пор­та Socket выбира­ем любой, который не занят):

AutoRestart Yes
AutoRestartRate 10/1h
UMask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:12712@localhost

Под­клю­чаем рас­ширение Milter к Postfix. Сна­чала откры­ваем файл /etc/default/opendkim и меня­ем номер пор­та вот в этой стро­ке:

SOCKET="inet:12301@localhost"

Но­вый номер выбира­ем тот, что ука­зали ранее в opendkim.conf:

SOCKET="inet:12712@localhost"

За­тем нас­тра­иваем Postfix на исполь­зование Milter. Для это­го откры­ваем файл /etc/postfix/main.cf и убеж­даем­ся, что при­сутс­тву­ют эти две стро­ки и они не заком­менти­рова­ны:

milter_protocol = 2
milter_default_action = accept

Ре­дак­тиру­ем сле­дующие стро­ки, меняя номер пор­та на тот, что опре­дели­ли ранее.

Ес­ли таких парамет­ров в фай­ле нет, то про­писы­ваем их:

smtpd_milters = inet:localhost:12712
non_smtpd_milters = inet:localhost:12712

Соз­даем катало­ги для вза­имо­дей­ствия с клю­чами:

sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys

Ука­зыва­ем доверен­ные хос­ты в фай­ле /etc/opendkim/TrustedHosts.

Соз­даем таб­лицу клю­чей, для это­го про­писы­ваем в файл /etc/opendkim/KeyTable такую стро­ку:

mail._domainkey.webaccount.site webaccount.site:mail:/etc/opendkim/keys/webaccount.site/mail.private

Соз­даем таб­лицу под­писей, про­писав в файл /etc/opendkim/SigningTable эту стро­ку:

*@webaccount.site mail._domainkey.webaccount.site

Те­перь прис­тупим к соз­данию пары откры­того и зак­рытого клю­чей. Перехо­дим в каталог /etc/opendkim/keys и соз­даем дирек­торию для домена, в которой будут хра­нить­ся клю­чи.

Ге­нери­руем клю­чи сле­дующей коман­дой:

sudo opendkim-genkey -s mail -d webaccount.site

Пос­ле чего меня­ем вла­дель­ца фай­ла с зак­рытым клю­чом на учет­ную запись opendkim.

Ос­талось добавить содер­жимое фай­ла mail.txt в тек­сто­вую запись DNS в панели управле­ния доменом. Выводим содер­жимое фай­ла в кон­соль, копиру­ем всю стро­ку, которая находит­ся в скоб­ках, и при­водим к нуж­ному фор­мату.

В ито­ге у меня получи­лось отформа­тиро­ван­ное зна­чение, которое нуж­но добавить в DNS-запись типа TXT с клю­чом mail._domainkey.

DMARC

DMARC (Domain-based Message Authentication, Reporting & Conformance) — это про­токол аутен­тифика­ции элек­трон­ной поч­ты, соз­данный для защиты доменов от спу­фин­га (под­делки отпра­вите­ля) и фишин­говых атак. Полити­ка DMARC опре­деля­ет то, как сер­верам‑получа­телям сле­дует обра­баты­вать элек­трон­ные пись­ма, которые не про­ходят про­вер­ку аутен­тифика­ции SPF и DKIM.

Нас­трой­ка край­не прос­та, осо­бен­но на фоне DKIM. Дос­таточ­но соз­дать TXT-запись вро­де той, что на скрин­шоте.

Тестируем SMTP-сервер

Ког­да все нас­тро­ено, вре­мя про­верить работос­пособ­ность сер­вера SMTP. Для это­го мож­но либо отпра­вить сооб­щение себе на поч­ту с любого сер­виса, либо же вос­поль­зовать­ся mail-тес­тером. Откры­ваем сайт по ссыл­ке, копиру­ем ука­зан­ный там поч­товый адрес и жмем боль­шую кноп­ку «Про­верить». Теперь мы можем отпра­вить сооб­щение на выдан­ный нам адрес. Это дела­ется вот такой коман­дой:

echo "Test" | mail -s "Test" [почтовый адрес]

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

Ставим и настраиваем Evilginx и Gophish

Ставим Gophish

Преж­де чем под­нимать Evilginx и Gophish, нуж­но уста­новить в сис­тему язык Go, так как оба этих инс­тру­мен­та работа­ют на нем. Отправ­ляем­ся на сайт раз­работ­чика и откры­ваем стра­ницу уста­нов­ки, ска­чива­ем deb-пакет коман­дой wget и сле­дуем инс­трук­ции.

Прис­тупим к уста­нов­ке Gophish. Нам нуж­но ска­чать вер­сию с интегра­цией в Evilginx из ре­пози­тория, тут есть два вари­анта уста­нов­ки. Пер­вый — ска­чива­ем коман­дой wget архив с релизом для сво­ей ОС со стра­ницы releases, пос­ле чего прос­то разар­хивиру­ем файл и дела­ем бинар­ник Gophish исполня­емым коман­дой chmod.

Вто­рой вари­ант — сбор­ка из исходно­го кода. Для это­го копиру­ем репози­торий и запус­каем уста­нов­ку:

sudo git clone https://github.com/kgretzky/gophish/
go build

В резуль­тате у нас будет вер­сия Gophish, модифи­циро­ван­ная для работы с Evilginx.

Те­перь мож­но прис­тупить к нас­трой­ке и запус­ку Gophish. Пер­вым делом редак­тиру­ем файл config.json. В нем нуж­но изме­нить параметр admin_server.listen_url. По умол­чанию там ука­зан локаль­ный IP 127.0.0.1. Что­бы Gophish работал не толь­ко локаль­но и к нему воз­можно было под­клю­чить­ся через интернет, нуж­но изме­нить этот IP на 0.0.0.0:3333. Номер пор­та, кста­ти, мож­но выс­тавить любой незаня­тый в сис­теме.

Пос­ле нас­трой­ки запус­каем исполня­емый файл Gophish и сра­зу ищем в логах логин и пароль по умол­чанию для дос­тупа к панели управле­ния.

Те­перь перехо­дим в бра­узер и обра­щаем­ся к панели Gophish по адре­су сво­его VPS/VDS с ука­зан­ным ранее пор­том.

Вво­дим кре­ды, которые наш­ли в логах, пос­ле чего у нас откры­вает­ся фор­ма для изме­нения пароля по умол­чанию. Меня­ем пароль, сно­ва вво­дим кре­ды, аутен­тифици­руем­ся и попада­ем в нашу учет­ную запись Gophish.

Что­бы опти­мизи­ровать запуск и даль­нейшие фишин­говые кам­пании, нуж­но нас­тро­ить Gophish как демон, то есть соз­дать сер­вис, который будет запус­кать Gophish в фоновом режиме или оста­нав­ливать одной коман­дой. В катало­ге /etc/init.d находят­ся сце­нарии обо­лоч­ки, которые запус­кают­ся сис­темой ини­циали­зации SysVinit, поэто­му соз­даем в этом катало­ге файл Gophish и добав­ляем сле­дующий код, ука­зав в парамет­ре appDirectory абсо­лют­ный путь к Gophish:

processName=Gophish
process=gophish
appDirectory=/home/zxc/gophish
logfile=/var/log/gophish/gophish.log
errfile=/var/log/gophish/gophish.error
start() {
echo 'Starting '${processName}'...'
cd ${appDirectory}
nohup ./$process >>$logfile 2>>$errfile &
sleep 1
}
stop() {
echo 'Stopping '${processName}'...'
pid=$(/bin/pidof ${process})
kill ${pid}
sleep 1
}
status() {
pid=$(/bin/pidof ${process})
if [["$pid" != ""| "$pid" != "" ]]; then
echo ${processName}' is running...'
else
echo ${processName}' is not running...'
fi
}
case $1 in
start|stop|status) "$1" ;;
esac

Сох­раня­ем файл и про­писы­ваем коман­ды для запус­ка демона и про­вер­ки ста­туса его работы.

Сер­вис запус­кает­ся и работа­ет кор­рек­тно.

Ставим Evilginx

Ко­пиру­ем офи­циаль­ный репози­торий Evilginx с GitHub:

sudo git clone https://github.com/kgretzky/evilginx2 && cd evilginx2

Evilginx тоже написан на Go, который у нас уже уста­нов­лен. Поэто­му прос­то выпол­няем make. Скрипт соберет весь про­ект и соз­даст исполня­емый файл evilginx в дирек­тории build.

Что­бы пос­тоян­но не про­писы­вать бес­конеч­ные пути, луч­ше соб­рать все необ­ходимое в отдель­ном катало­ге. Соз­даем дирек­торию evilginx в домаш­нем катало­ге и копиру­ем исполня­емый файл evilginx вмес­те с дирек­тори­ями phishlets и redirectors в ~/evilginx:

sudo mkdir ~/evilginx
cd ~
sudo cp evilginx/build/evilginx ~/evilginx
sudo cp -r evilginx/phishlets/ ~/evilginx
sudo cp -r evilginx/redirectors/ ~/evilginx

Ког­да все готово, прис­тупа­ем к нас­трой­ке. Запус­каем Evilginx:

sudo ./evilginx -p phishlets/

Нам необ­ходимо опре­делить IP-адрес и домен, а так­же интегри­ровать Gophish. В кон­соли Evilginx про­писы­ваем эти коман­ды:

config domain [ваш домен]
config ipv4 [IP вашего VPS/VDS]
config gophish admin_url [URL, на котором поднят gophish]
config gophish api_key [ключ API gophish]
config gophish insecure true

Ключ API Gophish мож­но най­ти в панели управле­ния Gophish, перей­дя на вклад­ку Account Settings.

Те­перь выпол­няем коман­ду config gophish test для тес­тирова­ния соеди­нения Evilginx и Gophish.

Со­обще­ние гла­сит о том, что соеди­нение успешно.

На этом эта­пе мы пос­тро­или основную часть инфраструк­туры. Теперь мож­но начать под­готов­ку к про­веде­нию фишин­говой кам­пании.

Настройка кампании Gophish

От­прав­ляем­ся в панель управле­ния Gophish и начина­ем нас­тра­ивать ком­понен­ты для рас­сылки фишин­говых сооб­щений.

Пер­вый ком­понент — это груп­пы поль­зовате­лей, которым будут рас­сылать­ся пись­ма. Дру­гими сло­вами, это жер­твы, точ­нее, подопыт­ные в нашем тес­те.

Пред­положим, в резуль­тате раз­ведки мы получи­ли име­на и поч­товые адре­са работ­ников ком­пании. Все эти дан­ные добав­ляем в соот­ветс­тву­ющие поля и нажима­ем кноп­ку Add для каж­дого поль­зовате­ля. Либо можешь сра­зу заг­рузить файл CSV, содер­жащий все эти дан­ные. Ког­да вся инфа добав­лена, нажима­ем кноп­ку Save changes.

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

info

О фишин­говых при­емах ты можешь про­честь в статье «Пись­мо с сюр­при­зом. Изу­чаем улов­ки и хит­рости для дос­тавки писем с мал­варью».

Что­бы соз­дать фишин­говое пись­мо, я взял HTML-код нас­тояще­го сооб­щения от Microsoft, которое при­ходи­ло мне на поч­ту, а затем нем­ного изме­нил его содер­жание.

В раз­деле Email Templates встав­ляем HTML-код и редак­тиру­ем сооб­щение на вклад­ке HTML.

Не забыва­ем пос­тавить галоч­ку Add Tracking Image, которая добавит тре­кер для отсле­жива­ния ста­тис­тики по откры­тым пись­мам. Тре­кер выг­лядит как перемен­ная {{.Tracker}} в коде сооб­щения. Кста­ти, об этих перемен­ных сто­ит погово­рить чуть под­робнее.

При помощи перемен­ных ты можешь менять содер­жимое сооб­щения в зависи­мос­ти от поль­зовате­ля, которо­му оно отправ­лено. Все­го перемен­ных десять, нам в пер­вую оче­редь при­годят­ся {{.FirstName}}, {{.LastName}} и {{.Email}}, которые под­став­ляют имя, фамилию и адрес поч­ты из нас­тро­ек групп поль­зовате­лей. Бла­года­ря им пись­ма не при­дет­ся пер­сонали­зиро­вать вруч­ную.

Пе­ремен­ная {{.URL}} под­став­ляет сге­нери­рован­ную фишин­говую ссыл­ку в сооб­щение. Нап­ример, я под­ста­вил ссыл­ку через перемен­ную в кноп­ку «Под­твер­дить». Про осталь­ные перемен­ные мож­но про­читать в до­кумен­тации.

Так­же про­писы­ваем заголо­вок и отпра­вите­ля сооб­щения, который будет ука­зан, ког­да пись­мо дой­дет. Я прос­то ско­пиро­вал отпра­вите­ля из офи­циаль­ного сооб­щения Microsoft, но изме­нил домен на свой, добавив сло­во microsoft под­доменом треть­его уров­ня. В ито­ге мое сооб­щение будет отправ­лено от име­ни «Служ­ба тех­ничес­кой под­дер­жки учет­ных записей Microsoft noreply@microsoft.webaccount.site».

Ни­же — фишин­говое пись­мо, которое у меня получи­лось. Gophish будет под­став­лять поч­ту поль­зовате­ля вмес­то перемен­ной {{.Email}}.

Пись­мо, как видишь, условное и на прак­тике пот­ребова­ло бы доработ­ки.

Тре­тий ком­понент — это про­филь отправ­ки, тот, ради которо­го мы нас­тра­ива­ли поч­товый сер­вер и записи DNS. Здесь мы ука­зыва­ем SMTP-рет­ран­сля­тор, с помощью которо­го будет про­исхо­дить рас­сылка. Откры­ваем вклад­ку Sending Profile, пишем наз­вание про­филя, ука­зыва­ем поч­ту отпра­вите­ля и, наконец, пишем адрес и порт SMTP-рет­ран­сля­тора. Так как он находит­ся на том же хос­те, где мы запус­тили Gophish, вво­дим localhost:25 (порт SMTP ука­зывать обя­затель­но). Так­же не забудь пос­тавить галоч­ку Ignore Certificate Errors.

В этом же окне есть кноп­ка для отправ­ки тес­тового пись­ма, обя­затель­но про­веряй работос­пособ­ность SMTP-рет­ран­сля­тора перед про­веде­нием кам­пании.

На этом нас­трой­ка ком­понен­тов Gophish закон­чена, поэто­му сво­рачи­ваем бра­узер и прис­тупа­ем к соз­данию фишин­говых ресур­сов Evilginx.

Cоздание фишинговых ресурсов Evilginx

Пер­вое, с чем нуж­но озна­комить­ся, — фиш­леты Evilginx. Это самая осно­ва, с их помощью и обхо­дит­ся 2FA. Фиш­леты — это кон­фигура­цион­ные фай­лы YAML, которые опре­деля­ют, какие домены и под­домены прок­сировать, под­менять, какие аутен­тифика­цион­ные дан­ные перех­ватывать и что с ними делать. В общем, пра­виль­но нас­тро­енный фиш­лет опре­деля­ет тех­ничес­кий успех фишин­говой ата­ки. Для каж­дого веб‑ресур­са пишет­ся свой фиш­лет, одна­ко каж­дый фиш­лет — это шаб­лон.

Я не буду под­робно опи­сывать, как работа­ют фиш­леты или как их соз­давать, об этом погово­рим в дру­гой раз. Пока же можешь обра­тить­ся к офи­циаль­ной докумен­тации. Самое глав­ное — не покупай фиш­леты в «Телег­раме», на форумах и тому подоб­ных ресур­сах!

Настраиваем фишлет

Це­левым веб‑ресур­сом я выб­рал Outlook, фиш­лет к которо­му уже написан и опуб­ликован в ре­пози­тории на GitHub. Ска­чива­ем его и переме­щаем в дирек­торию ~/evilginx/phishlets.

За­пус­каем Evilginx с фиш­летом:

sudo ./evilginx -p phishlets/

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

microsoft.outlook.webaccount.site

Так как под­домены необя­затель­но дол­жны быть уни­каль­ными, мы исполь­зуем это свой­ство для добав­ления извес­тных и авто­ритет­ных имен. Ука­зыва­ем имя хос­та и акти­виру­ем фиш­лет:

phishlets hostname Outlook microsoft.outlook.webaccount.site
phishlets enable Outlook

В этот момент Evilginx будет авто­мати­чес­ки получать сер­тифика­ты SSL/TLS для всех доменов и под­доменов, которые исполь­зуют­ся в ата­ке, что­бы фишин­говый URL, да и соеди­нение в прин­ципе работа­ли по про­токо­лу HTTPS.

Че­рез 30 секунд успешно получа­ем все сер­тифика­ты SSL/TLS и дви­гаем­ся даль­ше.

Готовим приманки

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

lures create Outlook

Кон­соль выведет чис­ловой иден­тифика­тор при­ман­ки, он нам еще при­годит­ся. При­водим ссыл­ку к такому виду:

https://microsoft.outlook.webaccount.site/user/account

Ко­пиру­ем сге­нери­рован­ную фишин­говую ссыл­ку и перехо­дим в Gophish.

Запускаем фишинговую атаку

Те­перь откро­ем вклад­ку Campaigns и соберем все воеди­но. Пишем наз­вание кам­пании и выбира­ем по задан­ным име­нам: шаб­лон элек­трон­ного пись­ма, про­филь отправ­ки и груп­пу поль­зовате­лей.

Выб­рав все ком­понен­ты, встав­ляем сге­нери­рован­ную ранее ссыл­ку в поле Evilginx Lure URL и нажима­ем на кноп­ку Launch Campaign.

Пос­ле запус­ка кам­пании мы видим ста­тис­тику, которая ведет­ся в режиме реаль­ного вре­мени. Пока что четыре сооб­щения отправ­лены, но никем не про­чита­ны.

Про­веря­ем поч­ту и видим, что фишин­говое сооб­щение дош­ло.

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

Сра­зу же про­верим, работа­ет ли тре­кер, отсле­жива­ющий откры­тие сооб­щений. Видим, что прос­мотр сооб­щения регис­три­рует­ся, ста­тус поль­зовате­ля в стол­бце Status меня­ется, к тому же обновля­ются диаг­раммы.

Вер­немся к нашему фишин­говому пись­му. Ког­да мы наводим кур­сор на кноп­ку «Под­твер­дить», в ниж­нем углу бра­узе­ра видим ссыл­ку, по которой мы перей­дем пос­ле нажатия.

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

Нас перенап­равля­ет на нас­тоящую стра­ницу авто­риза­ции Microsoft, но при этом весь тра­фик про­ходит через наш обратный прок­си‑сер­вер вот с таким доменом:

live.microsoft.outlook.webaccount.site

Вво­дим логин и пароль, пос­ле чего получа­ем зап­рос на под­твержде­ние вто­рого фак­тора аутен­тифика­ции в при­ложе­нии Microsoft Authenticator.

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

И в ито­ге вхо­дим в учет­ную запись. При этом соеди­нение все еще про­исхо­дит через прок­си‑сер­вер потен­циаль­ного зло­умыш­ленни­ка.

От­кры­ваем кон­соль Evilginx и видим логи успешно­го перех­вата.

Вво­дим коман­ду

sessions [ID сессии]

И получа­ем информа­цию, которая содер­жит вре­мя перех­вата, IP-адрес жер­твы, User agent, логин, пароль и cookie сеан­са.

Ло­гин и пароль — это, конеч­но, важ­ная и кри­тичес­кая информа­ция, но смысл этой ата­ки — перех­ватить токен сеан­са в виде фай­ла cookie. Что­бы про­экс­плу­ати­ровать перех­ват сес­сии, копиру­ем всю стро­ку cookies и откры­ваем бра­узер.

Ус­танав­лива­ем рас­ширение Cookie-Editor, которое поз­воля­ет манипу­лиро­вать куками, и откры­ваем легитим­ную стра­ницу вхо­да в Microsoft Outlook. Перед тем как под­менять cookie, уда­ляем те, что наз­начены бра­узе­ром. Для это­го прос­то нажима­ем кноп­ку Delete All.

За­тем нажима­ем кноп­ку Import и встав­ляем сплош­ную стро­ку из перех­вачен­ной сес­сии в Evilginx. Теперь еще раз нажима­ем на Import и обновля­ем стра­ницу.

Пос­ле обновле­ния стра­ницы бра­узер обра­баты­вает куки, которые мы внед­рили, и откры­вает учет­ную запись поль­зовате­ля, у которо­го был перех­вачен сес­сион­ный токен.

Раз­добыв учет­ку Microsoft в любом сер­висе, мы так­же получа­ем дос­туп к основным нас­трой­кам и ко всем сер­висам этой учет­ной записи. Это может быть доволь­но кри­тич­но, осо­бен­но учи­тывая, сколь­ко кон­фиден­циаль­ной информа­ции может хра­нить­ся в OneDrive или в докумен­тах Word.

Подводим итоги

За­дача Gophish зак­люча­ется не толь­ко в авто­мати­зации рас­сылок, но и в ведении ста­тис­тики, нап­ример для под­готов­ки отче­тов о резуль­татах ата­ки, которые при­годят­ся пен­тесте­рам. Пос­ле завер­шения кам­пании мы получа­ем ста­тис­тику о том, кто открыл пись­мо, кто перешел по ссыл­ке, кто попал­ся на фишинг и ввел кре­ды или же что‑то заподоз­рил и пожало­вал­ся на пись­мо.

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

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

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