Ich möchte das Ergebnis der Paketerfassung mit tcpdump lesen, aber ich möchte es mit einem Programm lesen, anstatt es mit Wireshark zu überprüfen. Ich konnte es mit einer Java-Bibliothek namens pkts laden. Notieren Sie sich also, was ich getan habe.
Ich möchte eine Liste der Kommunikationszieldomänen aus dem ersten SYN-Paket und der DNS-Antwort des TCP-Handshakes abrufen, daher stelle ich den Filter wie folgt ein
#Extrahieren Sie Pakete, die eine der folgenden Bedingungen erfüllen
# -Das SYN-Flag ist gesetzt und das ACK-Flag ist nicht gesetzt
# -Der Quellport ist 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
Ich habe eine Java-Bibliothek namens pkts verwendet. Einige der einfachen Implementierungsbeispiele sind wie folgt.
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());
}
}
}
Im Fall von IPv4 oder UDP können die Informationen des Header-Teils durch Erfassen des Pakets erfasst werden.
if (packet.hasProtocol(Protocol.IPv4)) {
IPv4Packet ipv4Packet = (IPv4Packet) packet.getPacket(Protocol.IPv4);
String srcIP = ipv4Packet.getSourceIP();
String dstIP = ipv4Packet.getDestinationIP();
}
Wenn Sie den Inhalt von Payload lesen möchten, können Sie ihn mit der folgenden Methode als Byte-Array abrufen.
UDPPacket udpPacket = (UDPPacket) packet.getPacket(Protocol.UDP);
Buffer buffer = udpPacket.getPayload();
byte[] bytes = buffer.getArray();
Der Teil, der als DNS-Paket analysiert werden soll, muss von Ihnen unter Bezugnahme auf das DNS-Paketformat geschrieben werden. Im Fall von DNS ist dies etwas problematisch, da der Domänenteil und die Anzahl der Antworten variabel sind. Here ist eine sehr lose implementierte Version, die darauf abzielt, Zeichen einzulesen, ohne sich um das Format kümmern zu müssen.
Recommended Posts