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.
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
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.