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

Tor, V3 Onion Services + auth + obfs4

antipasta

CD-диск
Пользователь
Регистрация
19.12.2022
Сообщения
14
Реакции
25
Реализация основных функций Tor для доступа к onion-сервисам версии 3 с возможностью аутентификации клиента.
Поддерживает работу с Guard-узлами из консенсуса, мостов, а также мостов с транспортом obfs4 (iat-mode=0).

Также присутствует самописная реализация TLS 1.3 (шифрование TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, кривые secp256r1 и x25519). Много чего отсутствует из стандарта, но в контексте задачи это и не нужно.

Писал как прототип для отладки/изучения и последующего переписывания на C
Архив в аттаче.

Для работы необходимы следующие модули
python -m venv py_test_env
call .\py_test_env\Scripts\activate.bat
pip install cryptography
pip install PyNaCl

Запуск
call .\py_test_env\Scripts\activate.bat
python main.py

Подключение к мосту
Python:
tor = make_tor('87.100.193.2', 9010)

Подключение к Guard-узлу (нужен fingerprint узла и его ntor-ключ)
Python:
tor = make_tor('87.100.193.2', 9010, '<fingerprint>', '<ntor key>')

Подключение к мосту с поддержкой obfs4
Python:
tor = make_tor_obfs4('167.71.76.157', 7962, '1/awezUsTbi3BUkYm95ye/tx+yNiqNhHs9nUZYc/97/krESVR64NwxTW9MYcBmdX/4zzMw')

Запрос в клирнет
Python:
    host = 'api.ipify.org'
    port = 80
    req = f'GET / HTTP/1.1\r\n' \
          f'Host: {host}\r\n' \
          f'Connection: close\r\n\r\n'
    
    circ_id = tor.clearnet_create_circuit(7)
    
    data = tor.clearnet_send(circ_id, host, port, req)
    hexdump(data)

Запрос в даркнет
Python:
    host = 'xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion'
    port = 80
    req = f'GET / HTTP/1.1\r\n' \
          f'Host: {host}\r\n' \
          f'Connection: close\r\n\r\n'

    circ_id = tor.darknet_create_circuit(host)

    data = tor.darknet_send(circ_id, port, req)
    hexdump(data)

Запрос в даркнет с авторизацией клиента
Python:
    host = 'ltkdzbpfxl3fhzq3oyk6uqjzfoiin2q6debfjb7o3rfupft2jkmkitqd.onion'
    port = 80
    auth_key = 'E37NV62BY7X2TQUCQMH7QQKBNSEON23EAPSWNZBEP2WAIQNV2ASQ'
    req = f'GET / HTTP/1.1\r\n' \
          f'Host: {host}\r\n' \
          f'Connection: close\r\n\r\n'
    
    circ_id = tor.darknet_create_circuit(host, auth_key)
    
    data = tor.darknet_send(circ_id, port, req)
    hexdump(data)
 

Вложения

  • tor.zip
    28.7 КБ · Просмотры: 57
О неплохая имплементация, хоть и неполная, не видел этого поста ранее.
Сырая потому, что например не нашел в коде учитывания SRV интервалов, из-за чего можно достоверно сказать, что в половине случаев подключение будет отваливаться, потому что не учитываются периоды (там разница между SRV и TP периодами 12 часов (2.2.4), а значит при подключении к onion сервисам код будет работать только в половине суток), возможно есть и другие недочёты, это просто первое, что бросилось в глаза.
Но в целом имплементация неплохая, для общего понимания определённо сойдет. =)

Edit: Так же не заметил имплементации ни circuit, ни guard паддингов (только хандлинг) и современного congestion контроля (tor vegas), используемого тором (вместо него используется sendme, который deprecated). А conflux вообще похоже был забыт. Про pow ничего говорить не буду, на момент написании статьи он ещё вроде не был имплементирован. Короче да, имплементация очень сырая, но опять же, для ознакомления с протоколом самое то.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Но работать отказывается.
Дебажить надо, самое простое - в коде пишешь print и смотришь что и куда.
А так, по уму этот код надо на Си реализовать, чтобы юзать в ехе, а не костылить с инсталлерами. Это сугубо РоС , дальше пишите сами.
 
А так, по уму этот код надо на Си реализовать,
Пробовал собрать с nuitka
Собирается без проблем.
Но опять же при попытке собрать одним файлом "--onefile"
Выдает ошибку.
 
Как из него EXE собрать?

По стандарту собирается "pyinstaller -F main.py"
Но работать отказывается.
Все уже перепробовал.
Попробуй nuitka, это при условии что сам .py исходник у тебя работает, если нет то сначало почини его.
 
Пробовал собрать с nuitka
Собирается без проблем.
Но опять же при попытке собрать одним файлом "--onefile"
Выдает ошибку.
Не увидел, возможно nuitka чего то не хватает, прочитай внимательнее что выдаёт, а лучше скинь сюда
 
имплементация очень сырая
Спасибо за внимание к теме.
Задачей было проработать основные моменты и разово пообщаться с конечной точкой, по правде говоря обилие криптографии на каждом шагу с течением времени утомило, и когда код минимально выполнял то что планировалось - я с радостью выдохнул и как можно быстрее релизнул) Конечно в спеке много нюансов но как в шапке и написал - "много чего отсутствует из стандарта, но в контексте задачи это и не нужно", это также можно отнести и к самописным tls/obfs.

Как из него EXE собрать?

По стандарту собирается "pyinstaller -F main.py"
Но работать отказывается.
Все уже перепробовал.
Могу ошибаться, но возможно создание процесса дает глюк - Process(target=PluggableTransportObfs4, ...
 
О неплохая имплементация, хоть и неполная, не видел этого поста ранее.
Сырая потому, что например не нашел в коде учитывания SRV интервалов, из-за чего можно достоверно сказать, что в половине случаев подключение будет отваливаться, потому что не учитываются периоды (там разница между SRV и TP периодами 12 часов (2.2.4), а значит при подключении к onion сервисам код будет работать только в половине суток), возможно есть и другие недочёты, это просто первое, что бросилось в глаза.
Но в целом имплементация неплохая, для общего понимания определённо сойдет. =)

Edit: Так же не заметил имплементации ни circuit, ни guard паддингов (только хандлинг) и современного congestion контроля (tor vegas), используемого тором (вместо него используется sendme, который deprecated). А conflux вообще похоже был забыт. Про pow ничего говорить не буду, на момент написании статьи он ещё вроде не был имплементирован. Короче да, имплементация очень сырая, но опять же, для ознакомления с протоколом самое то.
Интересно, а ради чего ты все это заучивал? Если не заресерчил конечно ради ответа и критики.. Там в документации тора 500 страниц, тебе настолько делать нечего было? Это не предъява, чисто интерес..
 
Интересно, а ради чего ты все это заучивал? Если не заресерчил конечно ради ответа и критики.. Там в документации тора 500 страниц, тебе настолько делать нечего было? Это не предъява, чисто интерес..
Я не заучивал, у меня собственная имплементация протокола тора на плюсах, я уже писал это здесь где-то в одной из тем, отсюда и знания для ответа. =)
1723625851844.png
 
Я не заучивал, у меня собственная имплементация протокола тора на плюсах, я уже писал это здесь где-то в одной из тем, отсюда и знания для ответа. =)
Посмотреть вложение 92586
Заливай сорцы, сделаю тебе ревью, бесплатно =)
 
Все время использовал это код...
Python:
proxy = {'all': 'socks5h://127.0.0.1:9150'}
r = requests.get(url, proxies=proxy)
 
Все время использовал это код...
Python:
proxy = {'all': 'socks5h://127.0.0.1:9150'}
r = requests.get(url, proxies=proxy)
На машине клиента? Силен, впечатляет.
 


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