Lire la capture de paquets obtenue par tcpdump avec Java

Je veux lire le résultat de la capture de paquets avec tcpdump, mais je veux le lire avec un programme au lieu de le vérifier avec Wireshark. J'ai pu le charger en utilisant une bibliothèque Java appelée pkts, alors notez ce que j'ai fait.

La commande qui a effectué la capture

Je veux obtenir une liste des domaines de destination de communication à partir du premier paquet SYN et de la réponse DNS de la poignée de main TCP, donc j'ai défini le filtre comme suit

#Extraire les paquets qui remplissent l'une des conditions suivantes
# -L'indicateur SYN est défini et l'indicateur ACK n'est pas défini
# -Le port source est 53(DNS)
sudo tcpdump -s 0 -i en0 -nn -w tcpdump.pcap \('(tcp[tcpflags] & tcp-syn)' != 0 and '(tcp[tcpflags] & tcp-ack) ==0'\) or src port 53

Comment lire en Java

J'ai utilisé une bibliothèque Java appelée pkts. Certains des exemples simples de mise en œuvre sont les suivants.

final Pcap pcap = Pcap.openStream("tcpdump.pcap");
pcap.loop(new PacketHandler() {
  @Override
  public boolean nextPacket(Packet packet) throws IOException {
    if (packet.hasProtocol(Protocol.UDP)) {
      System.out.println(packet.getPacket(Protocol.UDP).getPayload());
    }
  }  
}

Dans le cas d'IPv4 ou UDP, les informations de la partie d'en-tête peuvent être acquises en acquérant le paquet.

if (packet.hasProtocol(Protocol.IPv4)) {
  IPv4Packet ipv4Packet = (IPv4Packet) packet.getPacket(Protocol.IPv4);
  String srcIP = ipv4Packet.getSourceIP();
  String dstIP = ipv4Packet.getDestinationIP();
}

Si vous souhaitez lire le contenu de Payload, vous pouvez l'obtenir sous forme de tableau d'octets par la méthode suivante.

UDPPacket udpPacket = (UDPPacket) packet.getPacket(Protocol.UDP);
Buffer buffer = udpPacket.getPayload();
byte[] bytes = buffer.getArray();

La partie à analyser en tant que paquet DNS doit être écrite par vous-même en référence au format de paquet DNS. Dans le cas du DNS, c'est un peu gênant car la partie domaine et le nombre de réponses sont variables. Ici est une implémentation très grossière visant uniquement à lire en caractères sans se soucier du format.

Lien référencé

Recommended Posts

Lire la capture de paquets obtenue par tcpdump avec Java
[Java] Lire les fichiers dans src / main / resources
[Java] Jugement en saisissant des caractères dans le terminal
Lire JSON en Java
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
Lire des fichiers binaires en Java 1
Lire l'entrée standard en Java
Lire des fichiers binaires dans Java 2
Corrigez le code de caractère en Java et lisez à partir de l'URL
Accéder à l'interface réseau avec Java
Devinez le code de caractère en Java
Lire le fichier de propriétés Java en C #
Spécifiez l'emplacement Java dans eclipse.ini
Lire CSV en Java (annotation Super CSV)
Décompressez le fichier zip en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Appelez la super méthode en Java
Structure de l'application Web par Java et flux de traitement dans la couche de présentation
[Java] L'histoire selon laquelle le tableau attendu n'a pas été obtenu par la méthode String.split.
Obtenez le résultat de POST en Java
Carte en double triée par clé en Java
Référence Java à comprendre dans la figure
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
J'ai essayé le nouveau yuan à Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Organisation des notes dans la tête (Java-Arrangement)
Essayez d'appeler le service CORBA sur Java 11+
Quelle est la méthode principale en Java?
Lire Felica en utilisant RC-S380 (PaSoRi) en Java
Lire le fichier xlsx en Java avec Selenium
Comment obtenir la date avec Java
L'histoire reçue par Java SE11 silver
L'histoire de l'écriture de Java dans Emacs
Entrée de la console en Java (comprendre le mécanisme)
Trier par plusieurs champs dans la classe
[Java] Différentes méthodes pour acquérir la valeur stockée dans List par traitement itératif
[Java] Réécrire les fonctions créées par moi-même dans le passé à partir de java.io.File avec NIO.2.
Analyser en Java les chaînes de date et d'heure formatées par la fonction asctime du langage C
Mémo de support temporaire lorsque le nom du paramètre de méthode de la classe Java ne peut pas être obtenu par réflexion dans le projet de plug-in Eclipse
Concernant les modificateurs transitoires et la sérialisation en Java
Empêcher les erreurs dans le nom de l'enregistreur en copiant
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
À propos de la confusion observée dans les serveurs Java de démarrage
L'histoire de la fabrication d'un Othello ordinaire à Java
Lire une chaîne dans un fichier PDF avec Java
À propos de l'idée des classes anonymes en Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Une histoire sur le JDK à l'ère de Java 11
Mémo organisé dans la tête (syntaxe Java --Control)
Le type d'intersection introduit dans Java 10 est incroyable (?)
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
Ressentez le passage du temps même à Java
Organisation des notes dans la tête (Java - édition d'instance)
Capture et sauvegarde de l'installation de sélénium en Java
Ajouter, lire et supprimer des commentaires Excel à l'aide de Java
Mémo organisé dans la tête (Java - type de données)
Afficher "Hello World" dans le navigateur à l'aide de Java
Afficher "Hello World" dans le navigateur à l'aide de Java