Wir verpacken den gesamten Betriebssystemverkehr in Tor



Alles, was in diesem Artikel beschrieben wird, ist als Toroxy- Tool implementiert , das auf GitHub verfügbar ist
In jüngster Zeit war die Online-Anonymität Gegenstand heftiger Debatten. Es ist kein Geheimnis, dass Daten über Besuche von Internetressourcen von einem lokalen Gerät auf verschiedenen Ebenen gesammelt werden können, um ein „Modell“ des Benutzers zu erstellen, das später gegen ihn verwendet werden kann (oder könnte ). Daher ist es nicht verwunderlich, dass immer mehr aktive Internetnutzer von der Notwendigkeit von Proxy- und Anonymisierungsmechanismen überzeugt werden. In dieser Hinsicht gibt es immer mehr neue VPN-Clients, aber wie die Praxis zeigt, können nicht alle wirklich vertrauenswürdig sein: Entweder funktioniert nicht alles sofort, dann wird nur der HTTP-Verkehr anonymisiert, dann ist die Qualität der Implementierung lahm, oder und Entwickler sündigen, indem sie Daten über ihre Benutzer zusammenführen.

In diesem Artikel werden wir versuchen, unser eigenes Tool mit einer Benutzeroberfläche aus einer Reihe von Softwarekomponenten zusammenzustellen, um den Datenverkehr des lokalen Systems vollständig zu anonymisieren und Lecks in den "Abhör" -Kanälen in jeder Phase der Arbeit zu verhindern.

Unser Hauptziel wird es sein, aus vorgefertigten Werkzeugen ein zuverlässiges Dienstprogramm zu „bauen“. Offensichtlich ist die Idee, in angemessener Zeit ein qualitativ hochwertiges Werkzeug von Grund auf neu zu erstellen, mit Fehlern behaftet. Daher ist es schneller und zuverlässiger, vorgefertigte Komponenten auszuwählen und sie dann richtig anzuschließen!

Was sollte ein Tool können?

  1. Leiten Sie den gesamten Datenverkehr des Zielsystems zu den Zwischenknoten (vorzugsweise mehreren) um, um die Quelle zuverlässig zu maskieren
  2. Verfolgen Sie mögliche Verstöße gegen die Anonymität, korrigieren Sie sie und melden Sie sie mithilfe von UI-Benachrichtigungen

Ausgewählte Komponenten zum Erstellen des Werkzeugs:

  • tor
  • iptables
  • python3
  • systemd

Durch das Mischen aller Komponenten in einer Shell namens "Linux" können wir definitiv etwas Wertvolles erreichen, das zum Erreichen des Endziels beiträgt.

Komponente 1: Tor


Um diese Komponente herum wird der Rest der Tool-Infrastruktur aufgebaut. Tor bietet einen Mechanismus, der Teil eines VPN-Clients ist - einen Mechanismus zum Umschließen des Datenverkehrs durch Zwischenknoten, die für einen externen Beobachter anonym sind (in der Standardkonfiguration solcher Knoten 3).

Standardmäßig beginnt der Tor-Client aus den Standard-Batch-Repositorys nach der Installation mit dem Abhören von Port 9050, der alle Clients akzeptiert, die Socken können. Das Problem ist, dass zusätzlich zum Sockenverkehr in unserem System eine Reihe anderer Daten von Anwendungen auftreten können, die mit diesem Protokoll nicht funktionieren. In dieser Hinsicht müssen Sie zunächst innerhalb des lokalen Systems ein Fenster in das Tor-Netzwerk für jede neue Netzwerkverbindung schneiden. Dies geschieht ganz einfach durch Erhöhen des transparenten Proxys in der Torrc- Konfiguration:

/etc/tor/torrc ... TransPort 9040 #           python ControlPort 9051 ... 

Besonderes Augenmerk sollte auf den UDP-Verkehr gelegt werden. Tatsache ist, dass das Zwiebel-Routing-Prinzip auf dem Konzept eines „Streams“ basiert, der, wie Sie wissen, nur in TCP existiert. Durch das Senden eines UDP-Pakets über Tor kann das Zielsystem keine Antwort empfangen, da das Antwortpaket den Rückweg nicht findet. Trotz dieser Besonderheit haben wir weiterhin die Möglichkeit, DNS-Abfragen, von denen bekannt ist, dass sie über UDP ausgeführt werden, zu anonymisieren und gleichzeitig die .onion-Auflösung einzuschließen:

 /etc/tor/torrc ... AutomapHostsOnResolve 1 DNSPort 53 ... 

In diesem Fall ist der Zugriff auf Tor innerhalb des Loopbacks offen.

Komponente 2: Iptables


Da es unsere Aufgabe ist, die wahre Verkehrsquelle vor einem externen Beobachter innerhalb des gesamten Systems zu verbergen und das Fenster in Tor bereits geöffnet ist, bleibt nur der gesamte Verkehr in diesem Fenster zu verpacken. Die mit dem Linux-Kernel gelieferte System-Firewall hilft uns dabei:

 #  tcp iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $TRANS_PORT #   udp (dns only) iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #       iptables -A OUTPUT -j REJECT ip6tables -A OUTPUT -j REJECT 

Zu diesem Zeitpunkt erhalten wir ein funktionierendes Dienstprogramm, das den gesamten ausgehenden Datenverkehr zuverlässig verschleiert. Dies ist jedoch nur die halbe Arbeit.

Komponente 3: Python + Desktop Evironment UI


Jedes Mal ist die manuelle Konfiguration über die Konsole (selbst wenn ein Bash-Skript ausgeführt wird) ziemlich anstrengend. Daher ist es an der Zeit, ein kleines Dienstprogramm zu schreiben, das uns im Folgenden speziell hilft:

  1. Automatische Konfiguration
  2. Ändern Sie Ihre Identität innerhalb von Tor jederzeit
  3. Überwachung der Integrität von iptables-Regeln und Umschreiben bei Verstößen
  4. Verfolgung Ihrer aktuellen Identität (IP)
  5. Benachrichtigung der beiden vorhergehenden Absätze mit grafischen Benachrichtigungen

Beim ersten Start lädt das Dienstprogramm alle erforderlichen Komponenten selbst herunter und konfiguriert bei nachfolgenden Starts Tor in Verbindung mit iptables, wie oben beschrieben.

Wenn Sie Ihre externe IP-Adresse ändern möchten, interagieren Sie mit dem Tor-9051-Service-Port, der zu Beginn geöffnet war, um die IP-Änderung zu automatisieren:

 with Controller.from_port(port = 9051) as controller: controller.authenticate() controller.signal(Signal.NEWNYM) 

Das Integritäts-Tracking kann recht banal implementiert werden (wir machen es auf dem Knie), indem die iptables-Regelstruktur regelmäßig gelesen und ihre SHA256-Summe überprüft wird:

 def rulesOk(self): RULES_CHECKSUM_CMD = "{ iptables-save && ip6tables-save; } | sed s/\-\-uid\-owner\\\\s[0-9]\\\\+\\\\s//g | grep -viE '^#' | grep -viE '^\:' | sort | uniq | sha256sum | cut -d' ' -f 1" checkSum = getoutput(RULES_CHECKSUM_CMD).strip() alright = checkSum == Strings.RULES_CHECKSUM_CORRECT_HASH if not alright: rules = getoutput('iptables-save && ip6tables-save') self.lastSnapshotFileName = "/tmp/broken-rules-%s.log" % time.strftime("%d-%m-%Y_%I-%M-%S") open(self.lastSnapshotFileName, "w").write(rules) return False else: return True 

Wenn es Inkonsistenzen mit der erwarteten Prüfsumme gibt, können Sie den Speicherauszug für iptables-Regeln in /tmp/broken-rules-%d-%m-%Y_%I-%M-%S.log für weitere Verfahren /tmp/broken-rules-%d-%m-%Y_%I-%M-%S.log . Wenn sich herausstellt, dass
 rulesOk() == False 
Dadurch wird ein Umschreiben der Regeltabelle für iptables eingeleitet.

Die Überwachung der aktuellen IP erfolgt durch ständigen Zugriff auf eine externe Ressource, die den IP-Client ident.me , ident.me . B. ident.me .

Nun, schließlich werden wir DE UI verwenden, um Probleme mit den Regeln oder Änderungen der IP zu melden. Jede grafische Umgebung ist in gewisser Weise einzigartig, insbesondere wenn die Benutzeroberfläche aus dem Daemon-Prozess verwendet wird. Auf den meisten Linux-Systemen zeigt der von Python aufgerufene Bash-Code jedoch erfolgreich Benachrichtigungen an:

 # root UI eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)" export DISPLAY=:0 for USR in `ls /home && echo root` do # ubuntu gnome + root UI export XAUTHORITY=/home/$USR/.Xauthority notify-send -u {0} '{1}' '{2}' # ubuntu parallels for UID in `ls /run/user/` do su $USR -c "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus notify-send -u {0} '{1}' '{2}'" done done 

Indem wir all dies in einem Python-Skript mit 200 Zeilen kombinieren, erhalten wir das, was wir erreicht haben. So sieht beispielsweise eine Benachrichtigung aus, dass unsere Identität aktualisiert wurde:

Bild

Und so sieht die Benachrichtigung aus, dass die Integrität der Iptables-Regeln verletzt wurde, was auf den Dump-Dump hinweist, der den Verstoß enthält:

Bild

Komponente 4: systemd


Und schließlich möchten wir definitiv eine einmalige Einrichtung vornehmen und nicht an unsere Sicherheit in der Zukunft denken, und daher kommen Autorun und Dienste zur Rettung. Linux verfügt über mehrere Standard-Daemon-Verwaltungssubsysteme: systemd, sysV, init. In unserem Fall fiel die Wahl aufgrund der Flexibilität der Konfiguration auf systemd.

Angenommen, das im vorherigen Schritt geschriebene Python-Skript heißt "toroxy" und befindet sich in /usr/bin/ . Dann erfolgt die automatische Ausführung und anschließende Überwachung mit einer gewissen Flexibilität zur Steuerung des Dämons wie folgt:

 [Unit] Description=Toroxy After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root # service toroxy start ExecStart=/usr/bin/toroxy service # service toroxy stop ExecStop=/usr/bin/toroxy stop # service toroxy reload ExecReload=/usr/bin/toroxy switch [Install] #   init 3,       UI     Tor WantedBy=multi-user.target 

Fast alles ist bereit für den "industriellen" Betrieb. Der letzte Schliff, den ich dem Tool hinzufügen möchte, um die Zuverlässigkeit zu erhöhen, ist die automatische Initialisierung der iptables-Regeln beim Systemstart (wie Sie wissen, werden die iptables-Regeln beim Neustart zurückgesetzt) ​​mit iptables-persistent:

 iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6 netfilter-persistent start && netfilter-persistent save 

Fazit


Deshalb haben wir unser eigenes Tool aus einer Kombination verschiedener Komponenten zusammengestellt, die mit einem relativ hohen Maß an Zuverlässigkeit eine kontinuierliche Anonymität des Linux-Benutzers im Netzwerk gewährleisten können. Abschließend sollte gesagt werden, dass alles, was in diesem Artikel beschrieben wird, als Toroxy- Tool implementiert ist , das auf GitHub verfügbar ist.

Source: https://habr.com/ru/post/de472606/


All Articles