Linux-Auditing kann helfen. Zumindest werden Benutzer und Prozesse lokalisiert, die Datagramm-Netzwerkverbindungen herstellen. UDP-Pakete sind Datagramme.
Installieren Sie zunächst das auditd
Framework auf Ihrer Plattform und stellen Sie sicher, dass auditctl -l
etwas zurückgegeben wird, auch wenn darin angegeben ist, dass keine Regeln definiert sind.
Fügen Sie dann eine Regel hinzu, um den Systemaufruf zu beobachten, socket()
und markieren Sie ihn, um ihn später leichter zu finden ( -k
). Ich muss davon ausgehen, dass Sie auf einer 64-Bit-Architektur sind, aber Sie können b32
anstelle der ersetzen, b64
wenn Sie nicht sind.
auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Sie müssen Manpages und Header-Dateien durchsehen, um dies zu erstellen, aber was es erfasst, ist im Wesentlichen dieser Systemaufruf:, socket(PF_INET, SOCK_DGRAM|X, Y)
bei dem der dritte Parameter nicht spezifiziert ist, aber häufig Null. PF_INET
ist 2 und SOCK_DGRAM
ist 2. TCP-Verbindungen würden verwenden, SOCK_STREAM
die gesetzt würden a1=1
. ( SOCK_DGRAM
Im zweiten Parameter kann ODER mit SOCK_NONBLOCK
oder angegeben werden SOCK_CLOEXEC
, daher der &=
Vergleich.) Dies -k SOCKET
ist unser Schlüsselwort, das wir später bei der Suche nach Prüfpfaden verwenden möchten. Es kann alles sein, aber ich halte es gerne einfach.
Lassen Sie einige Momente verstreichen und überprüfen Sie die Audit-Trails. Optional können Sie ein paar Pakete erzwingen, indem Sie einen Host über das Internet anpingen. Dadurch wird eine DNS-Suche durchgeführt, die UDP verwendet und unsere Überwachungswarnung auslösen sollte.
ausearch -i -ts today -k SOCKET
Die Ausgabe ähnelt dem folgenden Abschnitt. Ich kürze es ab, um die wichtigen Teile hervorzuheben
type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET
In der obigen Ausgabe können wir sehen, dass der ping
Befehl das Öffnen des Sockets verursachte. Ich könnte dann strace -p 14510
den Prozess ausführen , wenn er noch läuft. Die ppid
(übergeordnete Prozess-ID) wird auch aufgeführt, wenn es sich um ein Skript handelt, das das Problemkind häufig hervorbringt.
Wenn Sie viel UDP-Verkehr haben, wird dies nicht gut genug sein und Sie müssen auf OProfile oder SystemTap zurückgreifen , die beide derzeit außerhalb meines Fachwissens liegen.
Dies sollte helfen, die Situation im Allgemeinen einzugrenzen.
Wenn Sie fertig sind, entfernen Sie die Überwachungsregel, indem Sie dieselbe Zeile verwenden, mit der Sie sie erstellt haben, und ersetzen Sie sie nur -a
durch -d
.
auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Sie können netstat verwenden, aber Sie benötigen die richtigen Flags und es funktioniert nur, wenn der Prozess, der die Daten sendet, noch aktiv ist. Es werden keine Spuren von etwas gefunden, das kurz zum Leben erweckt wurde, UDP-Verkehr gesendet hat und dann verschwunden ist. Es erfordert auch lokale Root-Rechte. Das gesagt:
Hier ist, wie ich eine ncat auf meinem lokalen Host starte und UDP-Datenverkehr an Port 2345 auf einem (nicht vorhandenen) Computer 10.11.12.13 schicke:
Hier einige tcpdump-Ausgaben, die beweisen, dass der Datenverkehr läuft:
Hier ist das nützliche Bit , das netstat mit dem Flag -a (um Portdetails anzuzeigen) und dem Flag -p verwendet, um Prozess-ID-Details anzuzeigen. Es ist das -p-Flag, für das Root-Rechte erforderlich sind:
Wie Sie sehen, hat PID 9152 eine Verbindung zu Port 2345 auf dem angegebenen Remote-Host. Netstat führt dies auch mithilfe von ps aus und teilt mir mit, dass der Prozessname lautet
ncat
.Hoffentlich ist das von Nutzen.
quelle
grep -w 57550
da mehrere Prozesse DNS-Suchvorgänge auf demselben Server ausführen können. Ihre Methode würde sie nicht unterscheiden.Ich hatte genau das gleiche Problem und habe leider
auditd
nicht viel für mich getan.Ich hatte Datenverkehr von einigen meiner Server in Richtung Google DNS-Adressen
8.8.8.8
und8.8.4.4
. Jetzt hat mein Netzwerkadministrator eine leichte Zwangsstörung und wollte den gesamten unnötigen Datenverkehr bereinigen, da wir unsere internen DNS-Caches haben. Er wollte den ausgehenden Port 53 für alle außer diesen Cache-Servern deaktivieren.Also, nachdem
auditctl
ich versagt habe , beschäftige ich mich mitsystemtap
. Ich habe folgendes Skript erstellt:Dann einfach ausführen:
Dies ist die Ausgabe, die ich bekam:
Das ist es! Nach dem Ändern
resolv.conf
dieser PIDs wurden die Änderungen nicht übernommen.Hoffe das hilft :)
quelle
Hier ist eine Systemtap-Option, die die in Stap Verson 1.8 und höher verfügbaren Netfilter-Probes verwendet. Siehe auch
man probe::netfilter.ip.local_out
.quelle
Ich würde einen Net-Sniffer wie tcpdump oder wireshark verwenden, um die DNS-Anforderungen anzuzeigen. Der Inhalt der Abfrage kann eine Vorstellung davon geben, welches Programm sie ausgibt.
quelle
Beachten Sie, dass nscd bei Verwendung von autitctl beispielsweise bei einer DNS-Abfrage einen etwas anderen Parameter im Socket-Systemaufruf verwendet:
Um sicherzustellen, dass Sie diese Abfragen zusätzlich zu den oben genannten abfangen, können Sie einen zusätzlichen Filter mit demselben Namen hinzufügen, wenn Sie möchten:
Hier ist 2050 ein bitweises ODER von SOCK_DGRAM (2) und SOCK_NONBLOCK (2048).
Die Suche findet dann beide Filter mit demselben Schlüssel
SOCKET
:Die Hex-Werte für die Socket-Konstanten habe ich hier gefunden: https://golang.org/pkg/syscall/#pkg-constants
Da ich keine zu kommentierenden Reputationspunkte habe, habe ich dies hinzugefügt.
quelle