19 Ocak 2020 Pazar

tcpdump komutu

Giriş
tcpdump aracı Wireshark veya tshark kadar gelişmiş değil. Ancak çoğu Linux'ta kurulu geldiği için öğrenmekte fayda var. 

İsminden sadece tcp trafiğinin analiz edilebildiği sanılmasın, udp ve icmp trafiğini de gösterebiliyor. Hatta tcpdump ile "-e" seçeneği kullanılarak Layer 2 MAC adreslerini görmek bile mümkün.

tcpdump Alternatifleri
1. Wireshark
2. tshark
3. iptables ile loglama
3. Raw Sockets ile loglama
4. PF_RING ile loglama
5. pcap ile loglama  

ip6 seçeneği
Şöyle yaparız.
tcpdump -ni eth3 ip6 -s0
-c seçeneği
Kaç tane paketi işledikten sonra durması gerektiğini belirtir.
Örnek
50 paketi yakalamak için şöyle yaparız.
tcpdump -s0 -i wlan0 -C 50 -w /path/to/ capture-$(date +%a-%d%m%y-%H%M-%S).pcap
dst seçeneği
Hedef ip ve port numarasını görmek için şöyle yaparız.
tcpdump -i eth0 dst port 6005
-e seçeneği
MAC zarfını da yakalar. Şöyle yaparız.
tcpdump -e -i eth0
-ether seçeneği
Belli bir mac adresine göre filtreleme yapabilmeyi
Örnek
Şöyle yaparız
sudo tcpdump ether host aa:bb:cc:11:22:33
-i seçeneği - interface
Kullanılması istenilen arayüzü belirtir.
Örnek
eth0'daki paketleri yakalayıp dosyaya yazmak için şöyle yaparız. -s ile snaplen tanımlanır. 0 verilirse 65535 byte anlamına gelir.
tcpdump -s0 -i eth0 -w eth0_traffic.pcap
-n
Açıklaması şöyle. IP adresini rakam olarak gösterir.
-n  Don’t convert host addresses to names.  This can be used to avoid DNS lookups.
-nn
Açıklaması şöyle
-nn Don’t convert protocol and port numbers etc. to names either.
Örnek
Şöyle yaparız
# tcpdump -nn 'icmp and (src a.b.0.1 or dst a.b.0.1)'
-p seçeneği
Açıklaması şöyle. Gösterilmesi istenen protocol belirtilir
Packet capture utilities can trivially put the network device into promiscuous mode, which is to say that the device accepts everything it receives. In fact, this is usually the default: with tcpdump, you have to specify the -p option in order to not do it.
host seçeneği
Örnek
Şöyle yaparız
tcpdump -i lo -nnvvv host 192.168.1.100 and port 8000
port seçeneği
Ağ arayüzü belirtmezsek default arayüz kullanır. Şöyle yaparız.
tcpdump port 80
Ağ arayüzü ile kullanmak için şöyle yaparız.
tcpdump -i eth0 port 80
udp seçeneği
Şöyle yaparız
tcpdump udp port 53
src seçeneği
Source alanı belirtilen IP olan paketleri yakalamak için şöyle yaparız.
tcpdump -n src host 192.168.1.m2 -w network.pcap
-t seçeneği
tcpdump çıktısından timestamp görmek istemiyorsak -t kullanırız.

-v seçeneği
Çıktının verbose olmasını sağlar.

-vv seçeneği
Çıktının daha da verbose olmasını sağlar. Şöyle yaparız.
tcpdump -nnvvXSs 1514 -i <interface> port 80 -w output.pcap.
-w seçeneği - write
Belirtilen dosyaya yazar.  
Örnek
Şöyle yaparız
tcpdump  -i eth0 'port 443' -vvv -w network.cap
Örnek
Şöyle yaparız
$ tcpdump tcp ‘port 443 or port 80’ -w out-file
-X seçeneği
Gelen paketlerin sadece header alanını değil, içini de gösterir. Açıklaması şöyle
-X When parsing and printing, in addition to printing the headers of each packet, print the data of each packet (minus its link level header).
filtre  Örnekleri
Önce Berkeley Packet Filter (BPF) açıklamasına bakalım
What is BPF?

BPF (or more commonly, the extended version, eBPF) is a language that was originally used exclusively for filtering packets, but it is capable of quite a lot more. On Linux, it can be used for many other things, including system call filters for security, and performance monitoring, as you pointed out. While Windows did add eBPF support, that is not what Windows' perfmon utility uses. Windows only added support for compatibility with non-Windows utilities that rely on OS support for eBPF.

The eBPF programs are not executed in userspace. Instead, the application creates and sends an eBPF program to the kernel, which executes it. It is actually machine code for a virtual processor that is implemented in the form of an interpreter in the kernel, although it can also use JIT compilation to enhance performance considerably. The program has access to some basic interfaces in the kernel, including those related to performance and networking. The eBPF program then communicates with the kernel to provide it the computational results (such as dropping a packet).
BPF bazı kısıtlamalar ile geliyor. Açıklaması şöyle
Restrictions on eBPF programs

In order to protect from denial-of-service attacks or accidental crashes, the kernel first verifies the code before it is compiled. Before being run, the code is subject to several important checks:

  • The program consists of no more than 4096 instructions in total.
  • Backwards jumps cannot occur, with the exception of bounded loops.
  • There are no instructions that are always unreachable.
The upshot is that the verifier must be able to prove that the eBPF program halts. It hasn't found a solution to the halting problem, of course, which is why it only accepts programs that it knows will halt. To do this, it represents the program as a directed acyclic graph. In addition to this, it tries to prevent information leaks and out-of-bounds memory access. The verifier thus further ensures:

  • Pointer comparison cannot be performed.
  • Pointer arithmetic can only be done with a scalar (a value not derived from a pointer).
  • No pointer arithmetic results in a pointer outside of its designated memory space.
Pointers cannot be stored or returned as a value, so the eBPF program is "blind" to them.

The verifier is rather complex and does far more, although it has itself been the source of serious security bugs, at least when the bpf(2) syscall is not disabled for unprivileged users.
BPF kodunu görmek için -d seçeneği kullanılır. Şöyle yaparız
# tcpdump -i eth0 "dst host 192.168.1.0" -d
(000) ldh      [12]
(001) jeq      #0x800           jt 2    jf 4
(002) ld       [30]
(003) jeq      #0xc0a80100      jt 8    jf 9
(004) jeq      #0x806           jt 6    jf 5
(005) jeq      #0x8035          jt 6    jf 9
(006) ld       [38]
(007) jeq      #0xc0a80100      jt 8    jf 9
(008) ret      #262144
(009) ret      #0
Örnek
Şöyle yaparız.
tcpdump -i eth0 "dst host 192.168.1.0"
Örnek
Şöyle yaparız.
tcpdump -i eno1 -v "icmp or arp"
Örnek
udp ve ip alanlarına göre filtrelemek için şöyle yaparız.
tcpdump -i tun1001 "(udp[2:2]==3784) and ip[9] &255==17 and ((udp[8] &0x1f)>0)"
 -vvv -s 0 -XX
Örnek
Şöyle yaparız.
tcpdump -i eth0 'tcp[13] & 16!=0'

Hiç yorum yok:

Yorum Gönder