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

Статья Создаем свой Whonix. (роутер через тор)

D3buG

RAID-массив
Пользователь
Регистрация
30.10.2022
Сообщения
94
Реакции
101
Гарант сделки
2
Оглавление
Введение
Часть 0. Базовое программное обеспечение.
Часть 1. Сетевые интерфейсы
Часть 2. Настройка tor
Часть 3. Настройка редиректа трафика
Часть 4. Автоматизация
Часть 5. Как подрубиться к шлюзу с клиента
Часть 6. Заключение

Введение

Наверняка каждый из вас слышал про сборку Whonix. А также наверняка вас посещали мысли о том, что это потенциальный хонипот.
Вот и меня, пока я читал очередной тред в анонимности, посетила такая мысль. Ведь это действительно удобно создать инструмент для блэчеров и сидеть мониторить их. Но что нам мешает создать свой хуникс-гейт? По сути ничего.
Ведь всё что делает хуникс гейт так это берёт трафик с одного интерфейса и перенаправляет в тор через другой. Больше ничего волшебного по сути не происходит. В целом не сложно сообразить как это сделать, имея базовые знания в администрировании юникс систем.
Так давайте сделаем свой, чтобы не паранойить лишний раз.

Часть 0. Базовое программное обеспечение.
В качестве базы возьмем Debian 12. Давайте еще не будем разводить холивар, что дебиан в теории тоже может быть протрояненным (там же системудэ :) ) и что мы всё равно не смотрим его сорсы.
Просто скачайте дебиан 12 с офф сайта, проверьте хэш суммы и установить на виртуалку :)
Не ставьте никакое оконное окружение. Максимум - доставьте ssh. Оконное окружение нам не пригодится, так как эта система будет выступать в качестве роутера.
А написать пару команд для поднятия тора, я думаю Вы в силах.

Установили и запустили дебиан? - Отлично. Логинемся под рутом (так будет проще и быстрее, однако Вы можете проводить все манипуляции под отдельно созданным пользователем при установке, добавив его в группу судо).

Для начала обновите репы: apt update
Поставим необходимый минимум: apt install tor net-tools iptables vim -y

Внесу некоторые комментарии по поводу необходимого минимума:
1) tor - сервис тора. Мы поднимем прокси на локалке и будем туда отправлять трафик
2) net-tools - мне просто в кайф писать ifconfig вместо ip a
3) iptables - пакет, дающий нам возможность внести сетевые правила. Он у нас и будет заниматься редиректом трафика.
4) vim - текстовый редактор. По желанию само собой. Можете nano использовать, можете vi, что удобнее.

Часть 1. Сетевые интерфейсы
Время выключать виртуалку и идти редактировать её хардварную часть.
Вы должны добавить еще два сетевых интерфейса и убрать тот, что был до этого. Один сетевой интерфейс мы будем давать клиентским тачкам. Это и будет нашей изолированной сетью. Другой интерфейс для выхода во внешний мир.
Лично я проворачиваю всё на линуксе и использую связку virt-manager, qemu, kvm. Настройка сетевых интерфейсов будет проходить именно на этом сетапе, но на других сетапах всё плюс-минус тоже самое.
Для начала запустим сети и добавим в автозапуск. # на хостовой машине
Код:
sudo virsh -c qemu:///system net-autostart default
sudo virsh -c qemu"///system net-start default

В гуи вирт-менеджера Edit -> Connection details -> Virtual Networks -> нажать на плюсик.
Ввести название, для примера myroute_tor-external. Mode: NAT. Forward: любой физ девайс.
IPv4 configuration:
network: 10.0.3.0/24
dhcpv4 снять галочку

1.png


Также нам нужен сетевой интерфейс для наших клиентских тачек.
myroute_tor-internal
Mode: Isolated
Все галочки снимаем.
Вот XML для проверки:
XML:
<network>
  <name>myroute_tor-internal</name>
  <bridge name="virbr5" stp="on" delay="0"/>
  <domain name="myroute_tor-internal"/>
</network>
надо отредактировать до такого состояния.

2.png


Там где name у bridge (в xml) поставьте свой по порядку. После создания external сети, напишите ifconfig у себя на хостовой машине и найдите нужный интерфейс с нужной сетью, к нему прибавьте +1. Для удобства.
3.png

(сори, что на скрин попал кусок этой статьи, нет возможности перескринить)
Добавьте 2 нетворк интерфейса на гейтвей.


external1.png

internal1.png


В настройках гейтвея на интерфейсе с external сетью отредактировать XML, если он у вас не совпал с моим. (на мак не обращайте внимание, он при запуске поставится)
external.png


Для интернал интерфейса аналогично.

Проверить сетевые интерфейсы можно через (на хостовой машине): sudo brctl show

Добавили сетевые интерфейсы на роутер? Отлично. Запускаем шарманку. Всё также логинемся из под рута и проверяем сетевые интерфейсы. Это можно сделать через ifconfig, либо, если вы не ставили net-tools, через ip a.
Почему-то в ifconfige у меня не отображался интерфейс. Поэтому я тоже воспользуюсь ip a :).

И так, вы можете видеть свои интерфейсы. Как вы можете заметить на нашем роутере нет интернета. А еще у наших интерфейсов нет ip адресов. А всё почему? потому что нет dhcp и нет настроек под наши интерфейсы. Надо настроить интерфейсы вручную.
Запишем имена наших интерфейсов - enp1s0, enp7s0. (у вас могут быть другие)
Открываем в текстовом редакторе /etc/network/interfaces
Редактируем следующим образом:

Код:
# default
source /etc/network/interface.d/*
auto lo
iface lo inet loopback
######

# это интерфейс для коммуникаций с внешним миром. Он нам даёт интернетик
auto enp1s0 # включать при буте системы
iface enp1s0 inet static # статичная настройка сети. У нас нет dhcp
        address 10.0.3.15
        netmask 255.255.255.0
        gateway 10.0.3.1

auto enps70 # это интерфейс для нашей изолированной сети.
iface enp7s0 inet static
        address 10.152.152.10
        netmask 255.255.192.0

Вот скрин конфига сети:
4.png


Сохраняем, перезапускаем интерфейсы через systemctl restart networking

Если вы всё сделали правильно, то введя команду ip a, вы должны увидеть ipы на сетевых интерфейсах. Также должен появиться интернет.
Если нет интернета, то:
1) systemctl status networking (исправьте ошибку, если есть. Вероятно, могли оконфузиться в конфиге)
2) tcpdump на vnet*. Например, у меня virbr4 это external. Для него brctl show показывает vnet27. sudo tcpdump -i vnet27. Анализируйте пакеты, правьте ошибки. Если оконфузились в конфиге, то смотрите на ARP пакеты, вы, вероятно, ошиблись в ипе.

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

Часть 2. Настройка tor
В нулевой части мы поставили тор. Теперь надо его настроить)

Добавьте в /etc/tor/torrc

Код:
VirtualAddrNetwork 10.192.0.0/10  # это не трогаем. Исходя из документации нужно ставить именно такую маску
AutomapHostsOnResolve 1
DNSPort 10.0.3.15:53530 # заменить ip если у вас другой
TransPort 10.0.3.15:9040 # заменить ip если у вас другой

When providing proxy server service to a network of computers using a tool like dns-proxy-tor, change the IPv4 network to "10.192.0.0/10" or "172.16.0.0/12" and change the IPv6 network to "[FC00::]/7".

Проведите дополнительную настройку, если она вам необходима. Например, уберите какие-то страны из выборки.
Если вас всё устраивает - systemctl start tor.
systemctl status tor должен показать, что всё ок.
netstat -tulpn должен показать примерно такое:
5.png


Конечно хотелось бы понять, за что отвечает каждый порт. Читайте дальше:
22 - ssh. У вас может и не быть, но мне просто удобнее через него администрировать с хостовой машины.
9050 - это дефолтный socks тора. Вы можете в него перенаправить трафик, но только socks. Он не подходит для нашей цели, потому что какое г от нас только не полетит)) Я не выключал его и он доступ только с локалки.
9040 - это transparent proxy. В него можно заливать трафик системы, но ваша система должна поддерживать прозрачные прокси. Винда и большинство дистрибутивов линукса поддерживает это.
53530 - порт для DNS. Тор будет проксировать DNS запросы. На клиенте в качестве DNS сервера указывать будем наш гейт. Т.е клиент будет отсылать запросы на 53 порт нашего гейта, а мы их будем направлять в 10.0.3.15:53530.

Часть 3. Настройка редиректа трафика
Первое, что необходимо сделать - включить редирект трафика с одного интерфейса на другой:
Добавьте эти строчки в файл /etc/sysctl.conf
Код:
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.enp1s0.rp_filter = 0
net.ipv4.conf.enp7s0.rp_filter = 0
Сохраните файл и введите команду: sysctl -p
Должны быть выведены эти строки.

Рекомендую сейчас поставить tcpdump на гейте.
Мы скоро начнем перенаправлять пакеты. Если что-то пойдет не так, то Вы можете посмотреть трафик :)

Команды для iptables:
Код:
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -i enp7s0 -p tcp -j DNAT --to-destination 10.0.3.15:9040
iptables -t nat -A PREROUTING -i enp7s0 -p udp --dport 53 -j DNAT --to-destination 10.0.3.15:53530

На этом этапе гейт готов принимать пакеты на enp7s0 и направлять их в тор. Также умеет перенаправлять DNS запросы в тор. Уже можно подрубать клиента, но клиента подключать будем в 5 главе.

Часть 4. Автоматизация
Хорошо, мы получили рабочий шлюз. Но при перезапуске гейта многие настройки слетают.
Что нам надо сделать?
  1. Включить службу тора в авторан
  2. Подтянуть настройки iptables
С первым пунктом всё ясно - systemctl enable tor.
А что делать со вторым? Есть способ сохранения настроек iptables через iptables-save и загрузки через iptables-restore.
Но лично у меня iptables-restore почему-то не хотел грузить данные. Вероятно, я делал что-то не так.
Поэтому реализуем скриптик по этому пути: /root/iptables_rules.sh
chmod +x /root/iptables_rules.sh
Bash:
#!/bin/bash
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -i enp7s0 -p tcp -j DNAT --to-destination 10.0.3.15:9040
iptables -t nat -A PREROUTING -i enp7s0 -p udp --dport 53 -j DNAT --to-destination 10.0.3.15:53530

И создадим сервис для systemd.
Заходим в /etc/systemd/system
Создаем сервис iptables_rules.service с таким содержимым:

Код:
[Unit]
Description=Autorun iptables

[Service]
ExecStart=/root/iptables_rules.sh

[Install]
WantedBy=multi-user.target


Запускаем и добавляем сервис в авторан:
Bash:
systemctl start iptables_rules
systemctl enable iptables_rules

Ребутаем тачку и проверяем iptables -t nat -S
Видим наши правила. Всё пашет, как надо.

Часть 5. Как подрубиться к шлюзу с клиента
В вирт-манагере добавляем сетевой интерфейс к машине. Сетевой интерфейс с isolated network. Т.е наш myroute_tor-internal. Запускаемся.
Надеюсь, что в качестве клиентской ОС вы используете что-то с гуи. Если без, то инструкции не будет :)
Я покажу на примере Debian 12 с XFCE.
Логинемся в юзверя, ищем программку Advanced Network Configuration. Она вроде как по умолчанию с крысой ставится.
Заходим в настройки нашего wired connection.
Там заходим в IPv4 Settings и делаем такие же настройки, как на картинке.
Не забудьте поставить в /etc/resolv.conf наш гейт в качестве DNS сервера.
Содержимое /etc/resolv.conf:
Код:
nameserver 10.152.152.10
6.png


Для другие десктоп энвайрментов примерно также. Для винды тоже +- также. (если не получается сообразить, то поищите видосы на ютубе, о том как соединить хуникс и винду/кали. Процесс 1 в 1)
Если вы всё-таки используете клиентский линукс без гуи, то настройте руками через /etc/network/interfaces в соответствии с картинкой выше.

Часть 6. Заключение
Мы только что сделали аналог гейтвея whonix. Свой.
В целом это не очень сложный процесс был.
В догонку через iptables можете порезать весь трафик, который идет не в тор с самого гейта. Но я не особо много вижу в этом смысла, потому что тогда становится невозможным обновление ПО на самом гейте. (либо возможно, но через тор, что не очень быстро)
По большей степени статья адресована новичкам, которые не совсем догоняют, как устроен хуникс.
Просьба написать в тред, если Вы видите ошибке в моей статье.
Вместо тора кстати можно использовать любой другой транспарент прокси.
Удачи и до новых встречь.

Всем спасибо за внимание.
Специально для xss.pro
От D3buG
 
Последнее редактирование:
Объясни, как для чайника. У меня отваливается тор или происходит автоматическая смена цепочки. В этот момент такой гейтвей не прокинет хостовой ip на клиента за гейтом? Если при этих настройках это учтено, то ткни носом какая настройка за это отвечает?

Спасибо.
 
Объясни, как для чайника. У меня отваливается тор или происходит автоматическая смена цепочки. В этот момент такой гейтвей не прокинет хостовой ip на клиента за гейтом? Если при этих настройках это учтено, то ткни носом какая настройка за это отвечает?
не очень тебя понял. Если ты имеешь ввиду, что тор на гейте отвалился, то там не пойдет трафик просто.
Твоя виртуалка, которая использует шлюз, отправляет ВСЕ сетевые пакеты туда. На шлюзе iptables перенаправляет в тор.
Конкретно вот эти команды за это отвечают
iptables -t nat -A PREROUTING -i enp7s0 -p tcp -j DNAT --to-destination 10.0.3.15:9040 iptables -t nat -A PREROUTING -i enp7s0 -p udp --dport 53 -j DNAT --to-destination 10.0.3.15:53530
Одна для днс запросов, другая для всего остального.
Т.е у тебя все сетевые пакеты летят на шлюз:9040.
Если у тора нет сети (отвалился коннект), то они дальше не полетят никуда. Потому что они летят в прокси тора, а если он дальше проксировать не может, то куда им лететь?

Если тор не запущен (то есть сервис тора не активен), то у тебя просто не будет интернета на гостевой машине.

В тех настройках iptables, которые я дал в статье, нет опций, чтобы редиректить голый трафик в интернет без проксирования. Так что у тебя либо нет интернета на госте, либо через тор прокси.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Объясни, как для чайника. У меня отваливается тор или происходит автоматическая смена цепочки. В этот момент такой гейтвей не прокинет хостовой ip на клиента за гейтом? Если при этих настройках это учтено, то ткни носом какая настройка за это отвечает?

Спасибо.
идея хуникса и того, что сделал тс в том, что у тебя есть локальная сеть.
Для рабочих машин и роутер.
Представляй это кау в реале.
У тебя есть роутер, в него шнурок от WAN, из него шнурки в LAN.
Если нет настроек на роутере, чтобы пакеты с лана маскарадились в ван, то они будут бегать только по локалке.
Тс, схемок сети не хватило для наглядности))) а так вроде интересно выглядит.
 
TC норм гайдик выдал, допили еще автоматической сменой выходящей ноды тора по списку доверенных/своих, поднятых для контроля отсутствия MITM атаки на выходах, можно по cron'y можно еще как. А так больше хуникс не нужен - вот он, тут. Для начинающих самое то материал
 
По просьбе трудящихся дополню статью на счёт этого пункта
допили еще автоматической сменой выходящей ноды тора по списку доверенных/своих, поднятых для контроля отсутствия MITM атаки на выходах, можно по cron'y можно еще как.

Часть 5.5. Автосмена выходных нод
Чтобы менять ноды тора достаточно в /etc/tor/torrc добавлять
ExitNodes <ip>
После изменения конфига тора его необходимо перезапускать.

Допустим, у вас есть 3 свои ноды тора. Они отображаются на metrics.torproject.org/rs.html и корректно работают.
Я не держу своих нод, поэтому я возьму по ссылке выше (почему-то кстати некоторые ноды не работают, хотя отображаются в онлайне)
Создайте файл с доверенными адресами /etc/tor/allowed_exits и запишите туда IP адреса ваших нод.
Этот файл должен выгледеть примерно так:
Код:
$ cat /etc/tor/allowed_exits
5.9.66.94
107.189.12.3
46.4.66.178
Также вы в этот файл можете добавлять не только IP адреса, но и страны, откуда Вы хотите выходить. Для этого вместо IP адресов вам надо писать коды стран в фигурных скобках.
То есть ваш файл может выглядеть так:
Код:
5.9.66.94
<тут еще ip>
{us}
{de}
{ca}

С входными данными разобрались. Теперь нужно как-то брать рандомную строку из этого файла и помещать в конфиг.
Я прибегну к магии питона.
Создайте файл /etc/tor/set_exits.py и выдайте ему 744 права.
touch /etc/tor/set_exits.py && chmod 744 /etc/tor/set_exits.py
Поместите в него следующий код:
Python:
#!/usr/bin/python3

import os
import random

def main():
    if os.getuid() != 0:
        return
    exit_node = ""
    with open("/etc/tor/allowed_exits", "r") as fd:
        exits = fd.readlines()
        exit_node = random.choice(exits)
    if os.path.exists("/etc/tor/torrc_backup"):
        os.remove("/etc/tor/torrc")
        os.system("cp /etc/tor/torrc_backup /etc/tor/torrc")
    else:
        os.system("cp /etc/tor/torrc /etc/tor/torrc_backup")

    with open("/etc/tor/torrc", "a") as fd:
        fd.write(f"\nExitNodes {exit_node}\n")
    os.system("systemctl restart tor")

if __name__ == "__main__":
    main()
Этот код читает файл с разрешёнными нодами, берёт рандомную строку оттуда и вставляет в /etc/tor/torrc. Ну и перезапускает сервис тора, чтобы применить изменения.
Также делает бэкапы /etc/tor/torrc, чтобы при следующем запуске можно было вставить новую строку и не париться по поводу удаления старой.

На этом этапе мы можете уже запустить его при помощи /etc/tor/set_exits.py и увидеть изменения в /etc/tor/torrc

Теперь запуск этого скрипта необходимо автоматизировать. Сделаем это через cron.
Пишем crontab -e
Выбираем удобный редактор и пишем такой текст:
Код:
*/10 * * * * /etc/tor/set_exits.py
Это строчка говорит кронтабу, чтобы он выполнял наш скрипт каждые 10 минут. Время через которое надо запускать скрипт поставьте на своё усмотрение, но мне кажется, что каждые 10 мин нормальное время.

Собственно на этом всё. Ожидайте 10 минут, и если Вы всё сделали правильно и вам повезёт с рандомом, то IP адрес сменится.
 


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