L'audit Linux peut aider. Il permettra au moins de localiser les utilisateurs et les processus établissant des connexions réseau datagrammes. Les paquets UDP sont des datagrammes.
Commencez par installer le auditd
framework sur votre plate-forme et assurez-vous qu’il auditctl -l
renvoie quelque chose, même s’il indique qu’aucune règle n’est définie.
Ensuite, ajoutez une règle pour regarder l'appel système socket()
et marquez-la pour faciliter la recherche plus tard ( -k
). Je dois supposer que vous utilisez une architecture 64 bits, mais vous pouvez le remplacer b32
par un autre b64
si vous ne l'êtes pas.
auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Vous devez choisir parmi les pages de manuel et les fichiers d’entête pour le construire, mais cela capture essentiellement l’appel système suivant:, socket(PF_INET, SOCK_DGRAM|X, Y)
où le troisième paramètre est non spécifié mais souvent nul. PF_INET
est 2 et SOCK_DGRAM
est 2. Les connexions TCP utiliseraient SOCK_STREAM
ce qui définirait a1=1
. ( SOCK_DGRAM
dans le deuxième paramètre, OR peut être associé à SOCK_NONBLOCK
ou SOCK_CLOEXEC
, d’où la &=
comparaison). C'est -k SOCKET
le mot clé que nous souhaitons utiliser lors de la recherche ultérieure de pistes d'audit. Cela peut être n'importe quoi, mais j'aime rester simple.
Laissez passer quelques instants et passez en revue les pistes d'audit. Vous pouvez éventuellement forcer deux ou trois paquets en envoyant une requête ping à un hôte sur le réseau, ce qui provoquera une recherche DNS, qui utilise UDP, ce qui devrait déclencher notre alerte d'audit.
ausearch -i -ts today -k SOCKET
Et une sortie similaire à la section ci-dessous apparaîtra. Je l'abrévie pour mettre en évidence les parties importantes
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
Dans la sortie ci-dessus, nous pouvons voir que la ping
commande a provoqué l'ouverture du socket. Je pourrais alors exécuter strace -p 14510
le processus s'il fonctionnait toujours. Le ppid
code (ID de processus parent) est également indiqué dans le cas où il s'agirait d'un script qui engendrerait beaucoup l'enfant problématique.
Maintenant, si vous avez beaucoup de trafic UDP, cela ne sera pas suffisant et vous devrez recourir à OProfile ou SystemTap , deux domaines qui dépassent actuellement mon expertise.
Cela devrait aider à préciser les choses dans le cas général.
Lorsque vous avez terminé, supprimez la règle d'audit en utilisant la même ligne que celle utilisée pour la créer, remplacez uniquement -a
par -d
.
auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Vous pouvez utiliser netstat, mais vous avez besoin des bons indicateurs et cela ne fonctionne que si le processus qui envoie les données est toujours actif. Il ne trouvera pas les traces de quelque chose qui est brièvement apparu, qui a envoyé du trafic UDP, puis est parti. Il nécessite également des privilèges root locaux. Cela dit:
Voici comment démarrer un ncat sur mon hôte local et envoyer du trafic UDP au port 2345 sur une machine (non existante) 10.11.12.13:
Voici une sortie de tcpdump prouvant que le trafic est en cours:
Voici le bit utile , en utilisant netstat avec l'indicateur -a (pour afficher les détails du port) et l'indicateur -p pour afficher les détails de l'ID de processus. C'est l'indicateur -p qui nécessite les privilèges root:
Comme vous pouvez le constater, l’identifiant de connexion du pid 9152 est ouvert sur le port 2345 de l’hôte distant spécifié. Netstat gère également cela par le biais de ps et me dit que le nom du processus est
ncat
.J'espère que c'est utile.
la source
grep -w 57550
car plusieurs processus pourraient effectuer des recherches DNS sur le même serveur. Votre méthode ne les distinguerait pas.J'ai eu exactement le même problème et malheureusement
auditd
, je n'ai pas fait grand chose pour moi.Le trafic de certains de mes serveurs me dirigeait vers des adresses DNS Google
8.8.8.8
et8.8.4.4
. Maintenant, mon administrateur réseau a un OCD léger et il voulait nettoyer tout le trafic inutile depuis que nous avons nos caches DNS internes. Il voulait désactiver le port sortant 53 pour tout le monde, sauf pour les serveurs de cache.Donc, après avoir échoué avec
auditctl
, je creuse danssystemtap
. Je viens avec le script suivant:Ensuite, lancez simplement:
Voici le résultat obtenu:
C'est ça! Après avoir changé
resolv.conf
ces PID, les changements n'ont pas été repris.J'espère que cela t'aides :)
la source
Voici une option systemap, utilisant les sondes Netfilter disponibles dans les versions 1.8 et supérieures de stap. Voir aussi
man probe::netfilter.ip.local_out
.la source
Je voudrais utiliser un net-sniffer comme tcpdump ou Wireshark pour afficher les requêtes DNS. Le contenu de la requête peut donner une idée du programme qui les publie.
la source
Sachez que lorsque vous utilisez autitctl, nscd, par exemple, utilise un paramètre légèrement différent dans l'appel système du socket lors d'une requête DNS:
Vous pouvez donc ajouter un filtre supplémentaire, portant le même nom si vous le souhaitez, pour que vous puissiez détecter ces requêtes en plus de celles mentionnées ci-dessus:
Ici, 2050 est un OU au niveau des bits de SOCK_DGRAM (2) et SOCK_NONBLOCK (2048).
Ensuite, la recherche trouvera ces deux filtres avec la même clé
SOCKET
:Les valeurs hexadécimales pour les constantes de socket que j'ai trouvées ici: https://golang.org/pkg/syscall/#pkg-constants
Comme je n'ai aucun point de réputation à commenter, j'ai ajouté ceci.
la source