**

* Copyright (c) 2004 Huzeyfe ÖNAL

*

* Bu belgenin telif hakları 'GNU Free Documentation License'

* lisansı şartları altında Huzeyfe ÖNAL’a aittir.

*

* Belgenin en güncel sürümüne http://www.enderunix.org/docs/tcpdump.htm

* adresinden erişebilirsiniz

* İlk baskı: 2004-12-12

* Son güncelleme: 2004-12-12

*

**


 

Tcpdump kullanarak Ağ trafiği izlemek – Bölüm 1

Trafik Nedir? Trafiği izleyerek ne elde edebiliriz, ya da hangi sorunlarımıza çözüm bulabiliriz?

 

Sniffer olarak adlandırılan ve ağ trafiğini izlemek amacıyla  yazılan birçok program vardır, bunlardan UNIX/Linux dünyası için en bilineni ve sık kullanılanı tcpdump’tır, tcpdump ilk olarak UNIX sistemler için yazılmış sonrasında NRG (Network Research Group) tarafından Windows’a da port edilmiştir ve windump olarak adlandırılmıştır. Ben bu yazıyı hazırladığım sırada tcpdump’ın  son versiyonu 3.8 idi, programın son sürümüne ve çeşitli ek bilgilere ulaşmak için ana sayfasını ziyaret edebilirsiniz( http://www.tcpdmp.org). Windows üzerinde kullanmak istiyorsanız http://netgroup-serv.polito.it/winpcap adresinden indireceğiniz ek yazılımı kurup yine http://netgroup-serv.polito.it/windump adresinden edinebileceğiniz ana yazılımı kurmanız gerekmetedir.

 

Promiscious Mode Nedir?

 

Normalde bir ağ arabirimi sadece hedef adresi kendisini gösteren paketlerle ilgilenir, diğer paketleri önemsemez. Promisc modda ise kendisine gelen her paketi kime yollandığına bakmadan kabul eder, hatırlayacak olursak hub tipi ağ aygıtlarındaki iletişim ortak bir havuzda gerçekleşiyordu yani huba bağlı 8 makinemiz varsa bu 8 makine arasındaki her türlü iletişim diğerleri tarafından da izlenebiliyordu,

 

                                                        

                                                                                                                   1-A

 

 

Şekil 1-A da görebileceğiniz gibi HUB ile bağlanmış 4 adet makinemiz var,şimdi şöyle bir senaryo üretelim A makinesi ile B makinesi gizlice haberleşmek istiyor ve A makinesi B ile iletişime geçiyor, A makinesindeki Temel Reis  B makinesindeki Safinaz'a seni seviyorum mesajı yolluyor bu arada C makinesinin yöneticisi olan Kaba Sakal da Temel Reis ile Safinaz arasındaki geçen muhabbeti izlemek istiyor.

 

 Kaba sakal bulundukları ortamın hub olduğunu bildiği için Ethernet kartını promisc moda geçiriyor ve Temel Reis ile Safinaz arasındaki trafiği dinliyor ve internette yaptığı kısa bir araştırma neticesinde Temel Reis ile Safinaz’ın iletişiminde araya girerek Temel Reis’in Safinaz’a yolladığı paketleri istediği gibi değiştirebiliyor. Temel Reis Safinazı kaba sakala kaptırdıktan sonra kendini Ağ güvenliğine adıyor ve yaptığı araştırmalar sonucu sağlam bir switch üzerinde çeşitli kurallar yazarak trafiğini dinlenemeyecek hale getiriyor;)

 

 

 

Ethernet kartları sıfır yapılandırma ile “promisc” özelliğine sahip değildirler,ethernet arabirimimizi normal moddan  “promisc” moda geçirmek için ifconfig komutuna promisc parametresini vermemiz yeterlidir.

 

# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:D0:B7:B6:D1:0C

          inet addr:194.27.72.88  Bcast:194.27.127.255  Mask:255.255.192.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:5228531 errors:0 dropped:0 overruns:0 frame:0

          TX packets:4528739 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:1796789472 (1713.5 Mb)  TX bytes:3725692 (3.5 Mb)

          Interrupt:18 Base address:0x5400 Memory:f6101000-f6101038

 

 

# ifconfig eth0 promisc

 

# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:D0:B7:B6:D1:0C

          inet addr:194.27.72.88  Bcast:194.27.127.255  Mask:255.255.192.0

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:5228715 errors:0 dropped:0 overruns:0 frame:0

          TX packets:4528864 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:1796807077 (1713.5 Mb)  TX bytes:3737015 (3.5 Mb)

          Interrupt:18 Base address:0x5400 Memory:f6101000-f6101038

 

 

Yukarıdaki farklılıktan(PROMISC)da görebileceğimiz gibi ifconfig komutuna promisc parametresini ekleyince özellikler satırında arabirimin “PROMISC” moda geçtiği hamen belirdi.

 

Promisc moddan cıkarmak istediğimizde ise

 

# ifconfig eth0 –promisc

 

komutunu vermemiz yeterlidir.

 

NOTE:! Tcpdump komutu çalıştırıldığında ağ arabirimini otomatik olarak promisc moda geçirir ve tcpdump’ı sonlandırdığınızda yine ağ arabirimini promisc moddan çıkarır.

 

 Karışık bir ağda  tcpdump ile sadece kendi makinenizi ilgilendiren paketleri yakalamanız icap ederse tcpdump'a sadece kendi makinemizle ilgilenmesini söyleyebiliriz. Yani kısaca hedef adresi ben olmayan paketlere karışma demiş oluruz, bu bize amacımıza daha kolay ulaşmamızı sağlar .Tcpdump’in başlatıldığında promisc moda geçmemesini sağlamak için gerekli parametre yazının ilerleyen bölümlerinde detaylıca verilmiştir.

 

 

Kullanımı

 

NOT! Linux/UNIX altında tcpdump programını kullanabilmek için ya root haklarına sahip olmak lazım ya da tcpdump programının suid olarak çalışması lazım

 

NOT! Tcpdump,  paketleri kernel’a giriş-çıkış yapmadan yakalar bu sebeple iptables(Linux için) ile yazdığınız kurallar tcpdump’ı etkilemez.

 

 

 Tcpdump'ın en basit kullanımı parametresiz kullanımdır

# tcpdump

Gibi.

 

Tcpdump ile kullanabileceğimiz Temel Parametreler

 

 

-i / Arabirim Seçimi

 

Sistemimizde  birden fazla arabirim varsa ve biz hangi arabirimini dinlemesini belirtmezsek  tcpdump aktif olan ağ arabirimleri arasında numarası en düşük olanını dinlemeye alır, mesela 3 adet aktif Ethernet ağ arabirimimiz var; eth0, eth1, eth2[Linux için geçerlidir,diğer unix çeşitlerinde farklıdır,Ekler kısmında diğer unixler için neler olabileceği listelenmiştir.] şeklinde  biz bu makinede tcpdump komutunu yalın olarak kullanırsak tcpdump eth0 arabirimini dinlemeye alacaktır.

 

Eğer ilk arabirimi değilde istediğimiz bir arabirimi dinlemek istiyorsak –i parametresi ile bunu belirtebiliriz

 

# tcpdump -i eth2

 

komutu ile sistemimizdeki 3.Ethernet kartını dinlemeye alıyoruz.

 

-n  /İsim Çözümleme

 

Eğer tcpdump ile yakalanan paketlerin dns isimlerinin çözülmesini istemiyorsak

-n parametresini kullanabiliriz,

 

normal kullanım;

     

# tcpdump

 

17:18:21.531930 IP huzeyfe.32829 > erhan.telnet: S 3115955894:3115955894(0) win 5840 <mss 1460,sackOK,timestamp 826880 0,nop,wscale 0>

 

17:18:21.531980 IP erhan.telnet > huzeyfe.32829: R 0:0(0) ack 3115955895 win 0

 

-n parametresi ile kullanım;

 

# tcpdump -n

 

17:18:53.802776 IP 192.168.0.100.32835 > 192.168.0.1.telnet: S 3148097396:3148097396(0) win 5840 <mss 1460,sackOK,timestamp 859156 0,nop,wscale 0>

 

17:18:53.802870 IP 192.168.0.1.telnet > 192.168.0.100.32835: R 0:0(0) ack 3148097397 win 0

 

burada huzeyfe makinesi 192.168.0.100, erhan makinesi 192.168.0.1 IP adresine sahiptir. İsimlerin yanında protocol ve port numaralarınında isimlere çevrimini istemiyorsak –nn parametresini kullanabiliriz

 

# tcpdump –nn

 

yukarıda (-n için)verdiğimiz örnekte – yerine -nn koyarsanız hem isim hemde port çözümlemesi yapılmayacaktır,yani telnet yerine 23 yazacaktır.

 

 

-t /Zaman Damgası Gösterimi

 

Eğer tcpdump'ın daha sade bir çıktı vermesini istiyorsak ekrana yazdığı satırların başındaki timestamp(zaman damgası, hangi paketin hangi zaman aralığında yakalandığını belirtir) kısmını istemediğimizi belirtebiliriz.

 

Timestamp[zaman damgası]leri istemediğim durumlarda – t parametresi ile bunu belirleyebiliriz.

 

Timestamp li çıktı

# tcpdump

15:32:13.479577 cc.kou.edu.tr.200 > 212.174.108.162.29157: . 68:1528(1460) ack             53 win 20440 (DF) [tos 0x10]

15:32:13.479582 cc.kou.edu.tr.200 > 212.174.108.162.29157: P 1528:2456(928) ack 53 win 20440 (DF) [tos 0x10]

 

Timestamp(Zaman damgası)siz çıktı

 

  # tcpdump –t

2.174.108.162.29157 > cc.huzeyfe.net.2000: P 3329:3381(52) ack 11236 win 17520 (DF) [tos 0x20]

cc.huzeyfe.net.2000 > 2.174.108.162.29157: . ack 2289 win 8576 <nop,nop,sack sack 2 {2965:3381}{2393:2861} > (DF) [tos 0x10]

 

 

-w  /Yakalanan paketleri kaydetme

 

Tcpdump’ın yakaladığı paketleri ekradan değilde sonradan incelemek üzere bir uygun bir şekilde  dosyaya yazmasını istersek -w parametresini kullanabiliriz. kaydettiğimiz dosya libpcap uyumlu olduğu için sadece tcpdump ile değil birçok network snifferi tarafından okunup analiz edilebilir.

 

 

# tcpdump -w dosya_ismi

 

 

-r /Kaydedilmiş Paketleri Okuma

 

-w ile kaydettğimiz paketleri okumak içinde -r parametresini kullanabiliriz.

  

# tcpdump -r dosya_ismi

 

not!! -w ile herhangi bir dosyaya kaydederken filtreleme yapabiliriz,yani sadece su tip paketleri kaydet ya da timestampleri kaydetme gibi,aynı şekilde -r ile paketlerie okurken filtre belirtebiliriz.Bu filtrenin -w ile belirlediğimiz filtre ile aynı olma zorunluluğu yoktur.

 

# cd /tmp/

# tcpdump -w log icmp

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

ctrl c

 

# tcpdump -r log -nn

reading from file log, link-type EN10MB (Ethernet)

17:31:01.225007 IP 192.168.0.100 > 192.168.0.1: icmp 64: echo request seq 0

17:31:01.225119 IP 192.168.0.1 > 192.168.0.100: icmp 64: echo reply seq 0

17:31:02.224988 IP 192.168.0.100 > 192.168.0.1: icmp 64: echo request seq 1

17:31:02.225111 IP 192.168.0.1 > 192.168.0.100: icmp 64: echo reply seq 1

 

-c / Yakalanacak paket miktarını belirleme

 

tcpdump'a  -c parametresini vererek ne kadar paket yakalayıp duracağını söyleriz.

 

# tcpdump -i eth0 -c 5

 

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

00:59:01.638353 IP maviyan.net.ssh > 10.0.0.2.1040: P 1010550647:1010550763(116) ack 774164151 win 8576

00:59:01.638783 IP 10.0.0.2.1040 > maviyan.net.ssh: P 1:53(52) ack 116 win 16520

00:59:01.638813 IP maviyan.net.ssh > 10.0.0.2.1040: P 116:232(116) ack 53 win 8576

00:59:01.639662 IP 10.0.0.2.1040 > maviyan.net.ssh: P 53:105(52) ack 232 win 16404

00:59:01.640377 IP maviyan.net.ssh > 10.0.0.2.1040: P 232:380(148) ack 105 win 8576

5 packets captured

5 packets received by filter

0 packets dropped by kernel

 

tcpdump -c sayi ile belirlediğimz sayıda paketi yakaladıktan sonra çalışmasını durduracaktır.

 

 

-s /Yakalanacak paket boyutunu byte cinsinden belirleme

 

-s parametresi ile yakalancak paketlerin boyutunu byte olarak belirleyebiliriz.

 

 -v  /Detaylı Loglama

 

-v parametresi ile tcpump’dan biraz daha detaylı loglama yapmasını isteyebiliriz. Mesela bu parametre ile  tcpdump çıktılarını TTL ve ID değerleri ile birlikte edinebiliriz.

 

 # tcpdump -v

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

17:36:55.161861 IP (tos 0x10, ttl  64, id 17228, offset 0, flags [DF], proto 6, length: 60) huzeyfe.32981 > erhan.ssh: S [tcp sum ok] 4229750775:4229750775(0) win 5840 <mss 1460,sackOK,timestamp 1940667 0,nop,wscale 0>

17:36:55.161940 IP (tos 0x0, ttl  64, id 0, offset 0, flags [DF], proto 6, length: 60) erhan.ssh > huzeyfe.32981: S [tcp sum ok] 3303151192:3303151192(0) ack 4229750776 win 5792 <mss 1460,sackOK,timestamp 2233545 1940667,nop,wscale 0>

 

-p  /Promisc Moddan Kaçış

 

 parametresi ile de sniff yaptığımız arabirimin promisc moddan çıkmasını sağlarız,promisc moddan çıkmak bize ne sağlar? Promisc moddan çıkmakla sadece o arabirime gelen ve o arabirimi ilgilendiren paketler işlenir ki bu paketlerde ya broadcast ya da direct o arabirimin adresi olması lazım. Daha çok tcpdump’ın çalıştığı  makineye ait bir paket analizi  yapmak istediğimiz zaman kullanılabilecek türden bir parametredir.

 

Mesela yerel ağınızda bağlı bulunduğunuz makinede sorun gidermeye çalışıyorsunuz ve bu sebeple tcpdump çalıştırıp makinenizi dinlemeye aldınız fakat o da ne? tüm yerel ağda geçen paketler ekranınızda akıp gidiyor(bağlı bulunduğunuz aygıtın HUB olduğunu göz önüne aldım)işte bu karmaşadan kurtulmak istiyorsak sadece bizim arabirimiz hedefli gelen paketleri almalıyız

 

# tcpdump  -p –i eth0

  

host Parametresi

 

Sadece belli bir host a ait paketlerin izlenmesini istiyorsak host parametresi ile belirtim yapabiliriz.

 

bash-2.05b# tcpdump  host 10.0.0.21

 

bu komutla kaynak ya da hedef ip adresi 10.0.0.21 olan paketlerin alınmasını istiyoruz.

 

dst host  (Hedef Host Belirtimi)

 

dsh host ;hedef host olarak belirtilen adrese ait paketleri yakalar,

 

# tcpdump -i eth0 dst host 10.0.0.1

 

yukarıdaki komutla makinemizin eth0 arabirimine gelen ve hedefi 10.0.0.1 olan tüm paketler yakalanacaktır, burada dikkat etmemiz gereken bir nokta var o da şu:yerel ağımızda 10.0.0.21 makinesinden 10.0.0.1 makinesine bir trafik oluştuğu zaman, dinlemede olan makinemizde(10.0.0.101)hedef adresi 10.0.0.1 olan paketler oluştuğunu göreceksiniz.

 

# tcpdump -i eth0 dst host 10.0.0.1

tcpdump: listening on eth0

10:47:20.526325 10.0.0.21 > 10.0.0.1: icmp: echo request

 

ile de hedef ip si 10.0.0.1 olan ip adreslerini izlemiş oluyoruz.

 

 

src host   (Kaynak Host Belirtimi)

 

src host tanımı ilede kaynak hostu belirterek dinleme yapabiliriz, mesela kaynak hostu 10.0.0.21 olan paketleri (10.0.0.21 makinesinde )dinlemeye alalim.

 

# tcpdump -i eth0 src host 10.0.0.21

 

tcpdump: listening on eth0

10:52:00.620897 10.0.0.21.3409 > baym-cs253.msgr.hotmail.com.1863: P 1541540362:1541540367(5) ack 3598940393 win 17484 (DF)

10:52:01.025286 10.0.0.21.3409 > baym-cs253.msgr.hotmail.com.1863: . ack 9 win 17476 (DF)

10:52:14.758635 10.0.0.21.4013 > 10.0.0.1.telnet: S 3499731684:3499731684(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)

 

sadece ip adresi değil host ismide belirtebiliriz.

bash-2.05b# tcpdump host hotmail.com

dst ve src i aynı komuttada kullanabiliriz.

Örnek,

kaynak ip si 10.1.0.59 hedef hostu 10.1.0.1 olan paketleri izlemek istersek

# tcpdump src host 10.1.0.59 and dst host 10.1.0.1

komutunu verebiliriz.

 

burada dikkatimizi çeken ufak bir değişiklik oldu,src host ve dst host arasına “and” geldi,evet tcpdump ile kompleks  kurallar yazarken sıkça kullanacağımız kelimelerden biri de “and” dir,ilerleyen bölümlerde “and” in yerine hangi dizimler gelebilir onlarıda göreceğiz. Host parametresi ile de aynı şekilde bir sonuca ulaşabiliriz host parametresi ile kaynak ya da hedef hosttan herhangi biri uygunsa paket yakalanır.

 

 

port Parametresi (Port Belirtimi)

 

belirli bir portu dinlemek istediğimizde kullanacağımız parametredir. Host gibi src ve dst oneklerini alabilir.

 

src ile kaynak portu dst ile hedef portu belirtebiliriz . dst ya da src önekini kullanmazsak hem kaynak hemde hedef  portu alır.

 

# tcpdump port 23

 

# tcpdump dst port  23

ile hedef portu 23 olanlar

 

# tcpdump src port  23

ile de kaynak portu 23 olan paketler  izlemeye alınır.

 

 

Aşağıdaki örnekte belirli ip ve belirli port numaralarını içeren paketleri port ve isim çözümleme yapmamasını(-nn)söylüyoruz.

 

# tcpdump -nn host 192.168.2.165 and port 23

tcpdump: listening on eth0

19:20:00.804501 192.168.2.10.1221 > 192.168.2.165.23:

S2565655403:2565655403(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)

 

-e / (Layer 2 paket loglama)

 

Bu komuta ek olarak –e parametresini de verirsek bu sefer tcpdump 2.katmana gore paket yakalama işlemi başlatır yani bu durumda ip adresleri değilde MAC adresleri ile işlem yapılmış olur.

 

# tcpdump –t –nn -e

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

 

00:0b:db:1c:4b:61 > 00:02:44:27:73:79, ethertype IPv4 (0x0800), length 52: IP 192.168.0.100.32768 > 192.168.0.1.33435: UDP, length 10

00:0b:db:1c:4b:61 > 00:02:44:27:73:79, ethertype IPv4 (0x0800), length 52: IP 192.168.0.100.32768 > 192.168.0.1.33436: UDP, length 10

00:02:44:27:73:79 > 00:0b:db:1c:4b:61, ethertype IPv4 (0x0800), length 80: IP 192.168.0.1 > 192.168.0.100: icmp 46: 192.168.0.1 udp port 33436 unreachable

00:0b:db:1c:4b:61 > 00:02:44:27:73:79, ethertype IPv4 (0x0800), length 52: IP 192.168.0.100.32768 > 192.168.0.1.33437: UDP, length 10

 

 

 

Sumele ve hitit veya kapadokya hostları arasında geçen trafiği izlemek için

 

# tcpdump host sumele and \( hitit or kapadokya \)

 

 

Kaynaklar;

 

http://www.firewall.cx

http://www.olympos.org

http://www.tcpdump.org

http://www.huzeyfe.net

http://forum.ceviz.net                                                                                     Huzeyfe ÖNAL   

me@huzeyfe.net

12/12/2004