GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich feststellen, welcher Prozess UDP-Verkehr unter Linux verursacht?

Lösung 1:

Linux-Auditing kann helfen. Es wird zumindest Benutzer und Prozesse lokalisieren, die Datagramm-Netzwerkverbindungen herstellen. UDP-Pakete sind Datagramme.

Installieren Sie zuerst auditd Framework auf Ihrer Plattform und stellen Sie sicher, dass auditctl -l gibt etwas zurück, auch wenn es sagt, dass keine Regeln definiert sind.

Fügen Sie dann eine Regel hinzu, um den Systemaufruf socket() zu überwachen und markieren Sie es, um es später leichter wiederzufinden (-k ). Ich muss davon ausgehen, dass Sie sich auf einer 64-Bit-Architektur befinden, aber Sie können b32 ersetzen anstelle von b64 wenn nicht.

auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

Sie müssen Manpages und Header-Dateien durchsuchen, um dies zu erstellen, aber was es erfasst, ist im Wesentlichen dieser Systemaufruf:socket(PF_INET, SOCK_DGRAM|X, Y) , wobei der dritte Parameter nicht spezifiziert, aber häufig Null ist. PF_INET ist 2 und SOCK_DGRAM ist 2. TCP-Verbindungen würden SOCK_STREAM verwenden was a1=1 setzen würde . (SOCK_DGRAM im zweiten Parameter kann mit SOCK_NONBLOCK ODER-verknüpft werden oder SOCK_CLOEXEC , daher der &= Vergleich.) Der -k SOCKET ist unser Schlüsselwort, das wir verwenden möchten, wenn wir später Audit-Trails suchen. Es kann alles sein, aber ich halte es gerne einfach.

Lassen Sie einen Moment verstreichen und sehen Sie sich die Audit-Trails an. Optional könnten Sie ein paar Pakete erzwingen, indem Sie einen Host im Netz anpingen, wodurch eine DNS-Suche erfolgt, die UDP verwendet, was unseren Audit-Alarm auslösen sollte.

ausearch -i -ts today -k SOCKET

Und eine Ausgabe ähnlich der im folgenden Abschnitt wird angezeigt. 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 ping Befehl bewirkte, dass der Socket geöffnet wurde. Ich könnte dann strace -p 14510 ausführen auf den Prozess, falls er noch lief. Die ppid (Elternprozess-ID) wird ebenfalls aufgelistet, falls es sich um ein Skript handelt, das das problematische Kind häufig erzeugt.

Nun, 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 Dinge im allgemeinen Fall einzugrenzen.

Wenn Sie fertig sind, entfernen Sie die Überwachungsregel, indem Sie dieselbe Zeile verwenden, mit der Sie sie erstellt haben, ersetzen Sie nur -a mit -d .

auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

Lösung 2:

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 wird keine Spuren von etwas finden, das kurzzeitig zum Leben erwacht ist, UDP-Verkehr gesendet hat und dann verschwunden ist. Es erfordert auch lokale Root-Rechte. Das heißt:

Hier starte ich ein ncat auf meinem lokalen Host und sende UDP-Datenverkehr an Port 2345 auf einer (nicht vorhandenen) Maschine 10.11.12.13:

[[email protected]]$ ncat -u 10.11.12.13 2345 < /dev/urandom

Hier ist eine tcpdump-Ausgabe, die beweist, dass der Datenverkehr läuft:

[[email protected] ~]# tcpdump -n -n port 2345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:41:32.391750 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.399723 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.401817 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.407051 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.413492 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.417417 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192

Hier ist der nützliche Teil , verwenden Sie netstat mit dem Flag -a (um Portdetails anzuzeigen) und dem Flag -p, um Prozess-ID-Details anzuzeigen. Es ist das Flag -p, das Root-Rechte erfordert:

[[email protected] ~]# netstat -apn|grep -w 2345
udp        0      0 192.168.3.11:57550          10.11.12.13:2345            ESTABLISHED 9152/ncat     

Wie Sie sehen können, wird PID 9152 so gefingert, dass eine Verbindung zu Port 2345 auf dem angegebenen Remote-Host offen ist. Netstat führt das hilfreicherweise auch durch ps und teilt mir mit, dass der Prozessname ncat ist .

Hoffentlich ist das von Nutzen.

Lösung 3:

Ich hatte genau das gleiche Problem und leider auditd hat mir nicht viel gebracht.

Ich hatte Datenverkehr von einigen meiner Server, der zu den Google-DNS-Adressen 8.8.8.8 ging und 8.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 nach dem Scheitern mit auditctl , grabe ich in systemtap . Ich komme mit dem folgenden Skript:

# cat >> udp_detect_domain.stp <<EOF
probe udp.sendmsg {
  if ( dport == 53 && daddr == "8.8.8.8" ) {
    printf ("PID %5d (%s) sent UDP to %15s 53\n", pid(), execname(), daddr)
  }
}
EOF

Dann einfach ausführen:

stap -v udp_detect_domain.stp

Dies ist die Ausgabe, die ich erhalten habe:

PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3506 (python) sent UDP to  8.8.8.8 53

Das ist es! Nach dem Ändern von resolv.conf diese PIDs haben die Änderungen nicht übernommen.


Hoffe das hilft :)

Lösung 4:

Hier ist eine Systemtap-Option, die die Netfilter-Sonden verwendet, die in Stap-Version 1.8 und höher verfügbar sind. Siehe auch man probe::netfilter.ip.local_out .

# stap -e 'probe netfilter.ip.local_out {
  if (dport == 53) # or parametrize
      printf("%s[%d] %s:%d\n", execname(), pid(), daddr, dport)
}'
ping[24738] 192.168.1.10:53
ping[24738] 192.168.1.10:53
^C

Lösung 5:

Ich würde einen Net-Sniffer wie tcpdump oder Wireshark verwenden, um die DNS-Anfragen anzuzeigen. Der Inhalt der Abfrage kann Aufschluss darüber geben, welches Programm sie ausgibt.


Linux
  1. So bestimmen Sie, welcher Prozess in Linux auf die Festplatte schreibt

  2. Wie können Sie den Chipsatz eines USB-Geräts unter Linux identifizieren?

  3. Wie kann ich unter Linux feststellen, welcher Prozess meinem Prozess ein Signal gesendet hat?

  4. Woher weiß ich, welcher Prozess Swap verwendet?

  5. Wie kann ich feststellen, welcher Prozess eine Datei in Linux geöffnet hat?

So beenden Sie einen Zombie-Prozess unter Linux

So beenden Sie einen Prozess in Linux

Wie man einen Prozess unter Linux beendet

Wie finden Sie heraus, welcher Prozess eine Datei in Linux verwendet?

Wie kann ich eine Dump-Datei eines laufenden Prozesses in Linux erstellen?

Wie kann ich Malware identifizieren, die Chrome-Erweiterungen in Linux enthält?