tcpdump - atvirojo kodo programinė įranga skirtas stebėti duomenų perdavimą vykdomą iš/į Jūsų serverį. Ši programinė įranga neturi vartotojo sąsajos, todėl galimi patikrinimai atliekami naudojantis komandine eilute (terminalu). Naudojantis įvairiomis komandomis galima stebėti TCP/IP bei kitų paketų perdavimą, kuriame dalyvauja Jūsų serveris.
Šioje pamokoje apžvelgsime įrankio diegimą bei komandas, kurios padės aptikti žalingą veiklą vykdoma į/iš Jūsų serverio.
0. Preliminarūs reikalavimai:
- Linux serveris naudojantis vieną iš mūsų siūlomų operacinių sistemų šablonų (CentOS, Debian, Ubuntu).
- Papildomas sistemos naudotojas turintis
sudo teises. Instrukciją, kaip sukurti tokį naudotoją rasite kitoje mūsų
pamokoje.
1. Diegimas
Diegimo komanda CentOS operacinėje sistemoje:
Diegimo komanda Ubuntu ir Debian operacinėse sistemose:
2. Bazinė informacija
Prieš pradėdant tikrinti srautą rekomenduojame susipažinti su tcpdump komandų sintakse. Taigi, pradeda su šiuo pavyzdžiu:
sudo tcpdump venet0 -nn -s0 -v port 80
sudo - parametras reikalingas paleisti
root teisių reikalaujančias komandas, būnant prisijungus prie papildomo naudotojo;
tcomdump - parametras nurodantis, kad kreipiatės į tcpdump programinę įrangą;
venet0 - mūsų serveriuose naudojamas virtualizacijos modelis;
-nn - parametrai pateikiantis indormacija apie serverių pavadinimus bei prievadus. Šis parametras taip pat padeda matyti didelius duomenų srautus, tačiau toks informacijos pateikimas gali sulėtėti atsakymo gavimą;
-s0 - parametras, kuriuo galima apibrėžti norimo dydžio parametrus. -s0 nustato limitą į neribotą - naudokite jei norite stebėti visą srautą;
-v - parametras apibrėžiantis pateikiamos informacijos detalumą. Naudojami -v ir -vv parametrai padidina pateikiamos informacijos kiekį. Pateikiama daugiau su konkrečia protokolu susijusios informacijos.
port 80 - apribrėžiamas konkretus prievadas. Šiuo atveju 80, kuris priklauso HTTP tarnybai.
ASCII teksto pateikimas
Pridedant -A parametrą bus pateikiamas informacija naudojant ascii standartą. Tai leis lengviau suprasti pateikiamą informaciją bei galimybę išsifiltruoti reikiamą rezultatą naudojant grep komandą. Komanda, kuri rodytų ir ASCII formato bei šešioliktainę informaciją yra -X - gali būti naudojama vietoje -A.
sudo tcpdump -A -s0 port 80
Filtravimas pagal protokolą
UDP srauto išrinkimas gali būti atliekamas naudojant udp parametrą. Taip pat galima naudoti protocol 17 vietoje udp. Bus pateikiamas toks pat rezultatas. Jeigu norite filtruoti TCP srautą, taip galite naudoti tcp arba protocol 6. Pavyzdžiui:
sudo tcpdump -i eth0 udp
sudo tcpdump -i eth0 proto 17
Filtravimas pagal Host naudojant IP adresą
Naudojant parametrą host ir IP adresą yra fiksuojamas srautas į konkretų host'ą ir iš konkretaus IP adreso. Pavyzdžiui:
sudo tcpdump -i eth0 host 10.10.1.1
Jeigu norite matyti tik paketus keliaujančius į vieną pusę, naudokite src (srautas einantis iš konkretaus IP) arba dst (srautas einantis į konkretų IP). Pavyzdžiui:
sudo tcpdump -i eth0 dst 10.10.1.20
Išrašų perkėlimas į failą
Srauto generavimo išrašai gali būti saugomi
pcap formatu tam, kad vėliau juos galima būtų įkelti į programinę įrangą patogiai analizei. Šiuo atveju rekomenduojame pasinaudoti
Wireshark programine įranga.
sudo tcpdump -i eth0 -s0 -w test.pcap
Srauto duomenų pateikimas su grep
Nenaudojant papildomų parametrų kaip -l ar -c ne visada gausite struktūrizuotą atsakymą su grep filtravimu. Todėl rekomenduojame naudoti tokią komandą:
sudo tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'
Papildomas filtravimas
Taip pat su visomis išvardintomis komandomis galite naudoti ir papildomus filtravimo parametrus, pavyzdžiui:
and or &&
or or ||
not or !
3. Komandų pavyzdžiai
HTTP User Agents informacija
HTTP User Agent informcija gali būti pateikiama naudojant šią komandą:
sudo tcpdump -nn -A -s1500 -l | grep "User-Agent:"
Naudojant egrep filtravimą ir papildomas reikšmes galime gauti User Agent ir Host informaciją atliekant vieną užklausą. Pavyzdžiui:
sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
HTTP GET ir POST užklausų atrinkimas
Bandydami giliau ieškoti įrašų, galite apibrįžti tik paketus su GET komanda. Pavyzdžiui:
sudo tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
Taip pat, galim nurodyti, kad būtų ieškomos tik POST užklausos. Pastebime, kad pačių paketų informacija gali būti nepateikiama naudojant šį filtravimą. Tikėtina, kad POST užklausos bus išskirstytos per kelis TCP duomenų paketus.
:~$ sudo tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
Naudojamos šešioliktainės išraiškos atitinka GET ir POST užklausas ASCII formatu. Išraiška tcp[((tcp[12:1] & 0xf0) >> 2):4] visų pirma nustato vietą, kurioje yra reikalingi bitai ir tada parenka 4 bitus, kuriuos mes norime matyti.
HTTP užklausų URL išfiltravimas
Tam, kad galima būtų gauti URL adresą visų pirma turime išsifiltruoti Host ir HTTP užklausų vietas atskiriant iš viso srauto. Nenorodant konkretaus prievado su parametru port 80 galime rasti užklausas vykdytas iš visų galimų prievadų kaip 443 ir pan.
sudo tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
tcpdump: listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
POST /wp-login.php HTTP/1.1
Host: dev.example.com
GET /wp-login.php HTTP/1.1
Host: dev.example.com
GET /favicon.ico HTTP/1.1
Host: dev.example.com
GET / HTTP/1.1
Host: dev.example.com
HTTP slaptažodžių aptikimas POST užklausose
Galime aptikti bandymus atspėti slaptažodžius. Įvedant
Host: parametrą matysite kur slaptažodžiai buvo naudoti
.sudo tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:25:54.799014 IP 10.10.1.30.39224 > 10.10.1.125.80: Flags [P.], seq 1458768667:1458770008, ack 2440130792, win 704, options [nop,nop,TS val 461552632 ecr 208900561], length 1341: HTTP: POST /wp-login.php HTTP/1.1
.....s..POST /wp-login.php HTTP/1.1
Host: dev.example.com
.....s..log=admin&pwd=notmypassword&wp-submit=Log+In&redirect_to=http%3A%2F%2Fdev.example.com%2Fwp-admin%2F&testcookie=1
ICMP paketų, kurie nėra standartiniai ECHO/REPLY pateikiamas
Filtravimas vykdomas su
icmp paketais, kurie nėra standartiniai paketai naudojami
ping paketuose. Tokių paketų naudojimas gali vesti į bandymą įsilaužti.
sudo tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:37:04.041037 IP 10.10.1.189 > 10.10.1.20: ICMP 10.10.1.189 udp port 36078 unreachable, length 156
SMTP/POP3 laiškų analizė
Šioje užklausoje mes ištrauksime laiškų gavėjus. Taip pat įmanoma išsifiltruoti laiškų tekstą bei antraštes.
sudo tcpdump -nn -l port 25 | grep -i 'MAIL FROM\|RCPT TO'
FTP komandų ir prisijungimų informacija
Naudojant žemiau pateiktą komandą galėsite matyti
USER ir
PASS informacija bei naudotas FTP komandas, tokias kaip
LIST,
CWD,
PASSIVE.sudo tcpdump -nn -v port ftp or ftp-data
Prievado skenavimo aptikimas
Pateiktame pavyzdyje galite matyti srautą vykdomą iš vieno šaltinio į vieną lokaciją. Parametrai Flags [S] ir Flags [R] gali būti pastebimi prie skirtingų atsitiktinai parinktų prievadų, kas ir rodo, kad bandoma atrasti neapsaugotą prievadą.
tcpdump -nn
21:46:19.693601 IP 10.10.1.10.60460 > 10.10.1.199.5432: Flags [S], seq 116466344, win 29200, options [mss 1460,sackOK,TS val 3547090332 ecr 0,nop,wscale 7], length 0
21:46:19.693626 IP 10.10.1.10.35470 > 10.10.1.199.513: Flags [S], seq 3400074709, win 29200, options [mss 1460,sackOK,TS val 3547090332 ecr 0,nop,wscale 7], length 0
21:46:19.693762 IP 10.10.1.10.44244 > 10.10.1.199.389: Flags [S], seq 2214070267, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.693772 IP 10.10.1.199.389 > 10.10.1.10.44244: Flags [R.], seq 0, ack 2214070268, win 0, length 0
21:46:19.693783 IP 10.10.1.10.35172 > 10.10.1.199.1433: Flags [S], seq 2358257571, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.693826 IP 10.10.1.10.33022 > 10.10.1.199.49153: Flags [S], seq 2406028551, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.695567 IP 10.10.1.10.55130 > 10.10.1.199.49154: Flags [S], seq 3230403372, win 29200, options [mss 1460,sackOK,TS val 3547090334 ecr 0,nop,wscale 7], length 0
21:46:19.695590 IP 10.10.1.199.49154 > 10.10.1.10.55130: Flags [R.], seq 0, ack 3230403373, win 0, length 0
21:46:19.695608 IP 10.10.1.10.33460 > 10.10.1.199.49152: Flags [S], seq 3289070068, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695622 IP 10.10.1.199.49152 > 10.10.1.10.33460: Flags [R.], seq 0, ack 3289070069, win 0, length 0
21:46:19.695637 IP 10.10.1.10.34940 > 10.10.1.199.1029: Flags [S], seq 140319147, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695650 IP 10.10.1.199.1029 > 10.10.1.10.34940: Flags [R.], seq 0, ack 140319148, win 0, length 0
21:46:19.695664 IP 10.10.1.10.45648 > 10.10.1.199.5060: Flags [S], seq 2203629201, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695775 IP 10.10.1.10.49028 > 10.10.1.199.2000: Flags [S], seq 635990431, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695790 IP 10.10.1.199.2000 > 10.10.1.10.49028: Flags [R.], seq 0, ack 635990432, win 0, length 0
DNS užklausų ir atsakymų aptikimas
Išeinančios DNS užklausos į Google viešus DNS serverius ir A įrašo atsakymai būtų matomi naudojant šią komandą:
sudo tcpdump -i wlp58s0 -s0 port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp58s0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:19:06.879799 IP test.53852 > google-public-dns-a.google.com.domain: 26977+ [1au] A? play.google.com. (44)
14:19:07.022618 IP google-public-dns-a.google.com.domain > test.53852: 26977 1/0/1 A 216.58.203.110 (60)
Nesaugių (plaintext) slaptažodžių aptikimas
Su šia komanda mes peržiūrėime standratinius plain text protokolus ir ieškome visų naudotojo vardų bei slaptažodžių. Įvedant parametrą -B5 prie grep komandos gausime 5 eilutes, kuriose rasime visą informaciją apie konkretų slaptažodį.
sudo tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5
'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '
Apibendrinimas
Šie
tcpdump pavyzdžiai, patarimai ir komandos yra skirti suteikti jums pagrindinį supratimą apie galimybes. Priklausomai nuo to, kokio rezultato siekiate, yra daugybė būdų, kuriais galite gilintis ar derinti įvairius filtravimo metodus norint gauti norimą atsakymą.
Tcpdump derinimas su Wireshark prograimine įranga yra labai naudingas, ypač kai norite įsigilinti į visas aplikacijos sluoksnių sesijas, nes dekoderiai tada gali surinkti visą reikiamą srautą ir pateikti jį patogiu būdu.