Elektronika.lt

Elektronika.lt - elektronikos, informacinių ir
ryšių technologijų portalas

Adresas: http://www.elektronika.lt
El. paštas: info@elektronika.lt
 Atspausdinta iš: http://www.elektronika.lt/teorija/kompiuterija/737/ip-spoofing/spausdinti/

„IP spoofing“

Publikuota: 2005-03-13 14:36
Tematika: Kompiuterija
Skirta: Mėgėjams
Aut. teisės: ©eSecurity.lt
Inf. šaltinis: eSecurity.lt

„IP spoofing“ – tai aukšto lygio interneto ataka. Yra dvi rūšys: „aklas“ ir „neaklas“. Straipsnyje aprašomas sudėtingesnis – „aklas“ „spoofing“.


Įvadas

„IP spoofing“ – tai aukšto lygio interneto ataka. Yra dvi rūšys: „aklas“ ir „neaklas“ „spoofing“. „Neaklas“ – tai, kai pro tavo kabelį keliauja IP paketai (pvz., LAN). Jis daug paprastesnis nei „aklas“ „spoofing“, todėl jo neaptarinėsime.

Terminai

TCP – Transmission Control Protocol.
SYN – Synchronize. TCP protokolo žymė, naudojama „paprašyti“ prisijungimo iš kito hosto.
ACK – Acknowledgment. Atsakymas į „prašymą“ prisijungti.
PSH – Push. Naudojamas duomenų perdavimui.
SEQ – Sequence. Tam tikri numeriai (apie juos vėliau).
ISN – initial sequence number (inicialinis SEQ numeris, naudojamas užmezgant ryšį).
hostas A – „blogietis“
serveris B – patikimas hostas
serveris C – atakuojamas serveris (gali būti, kad ir Jūsų serveris)

Teorija

Kad suprastumėte, kas čia vyks, patariame perskaityti RFC: 793 (www.rfc-editor.org).

Trumpa teorija:
pats TCP protokolas naudojamas duomenų perdavimui, todėl vadinamas patikimu protokolu, sudarytas iš 32 bitų antraštės. Jame yra daug įvairios informacijos apie pati paketą tačiau mus domina tik kai kurios žymės ir pats protokolo veikimo principas.

Savo paketų patikimumui užtikrinti yra naudojami SEQ numeriai. Numeriai yra nuo 0 iki 4 294 967 295. Kiekvienas bitas siunčiamas per susijungimą turi savo SEQ numerį. ACK numeris nurodo kokio kito SEQ numerio bus tikimasi ir taip pat patvirtina visus siustus iki dabar numerius minus 1.

Duomenų mainams (siuntimui/parsisiuntimui) iš pradžių turi būti įvykdytas taip vadinamas trijų pusių pasisveikinimas (angl. „3-way handshake“). Visa schema atrodytų šitaip (taip vyksta praktiškai visi susijungimai per TCP protokolą), pvz.,:


hostas	  žymė	hostas 
  A    ----SYN---->	   B
  A   <---SYNACK-->       B
  A    ----ACK --->	   B 

Kas čia įvyko:
Hostas A nusiuntė paketą su SYN žyme (ir tam tikru ISN numeriu) hostui B. Hostas B siunčia paketą su SYN ir ACK įjungtomis žymėmis, kur SYN yra hosto A siunčiamas ISN numeris (pridedant 1), o ACK hosto B numeris (pridedant 1), kurio jis lauks. Hostas A gavęs šį paketą, žino hosto B siųstą ISN numerį. Tuomet prie tos reikšmės prideda 1 ir siunčia hostui B, kuris jo laukia. 3 pusių pasisveikinimas įvykdytas, galima siųsti duomenis.

Svarbu suprasti kaip parenkami SEQ numeriai. Tai yra pamatas įsilaužėliui, norinčiam sėkmingai įvykdyti ataką. ISN numeris kiekvieną sekundę yra padidinamas 128000 vienetų. Jei nevyksta jokio prisijungimo kas 9,32 valandas, jis (ISN) „perstartuojamas“ (skaičiuojama iš naujo). Taip pat kas kiekvieną prisijungimą ISN padidinamas 64000 vienetų.

Ataka

Patikimu hostu (angl. „trust host“) čia vadinamas hostas, kuris gali pasinaudoti rsh (ar rlogin) ir paleidinėti komandas neįvesdamas slaptažodžio. Svarbiausią vaidmenį čia atlieka jų IP adresai, kuriais jie pasitiki. Taigi, jei serveris mano kad paketai ateina iš „patikimo“ hosto, tuomet jis įvykdys prašomas komandas.

Didžiausias atakos minusas yra tas, kad viskas vyks „aklai“, t. y. įsilaužėlis nematys ką ir kaip atsakinėja serveris (kokį ISN jis siunčia). Tačiau žinodamas kaip veikia ISN, jis _galės_ numatyti ,koks tai bus skaičius.

Taip pat įsilaužėliui svarbu surasti kokiu hostu serveris „pasitiki“. Tai galima padaryti pasinaudojus „showmount –e“ ir žiūrėti į kokius hostus yra eksportuojami failai. Arba bandant spėti nuskanavus potinklį (jei yra keletas hostų su 513 atidarytu portu, didelė tikimybė, kad jie vienas kitu „pasitiki“).

Suradęs hostą, kuriuo serveris „pasitiki“, įsilaužėlis pasistengs tą hostą trumpam „išjungti“. Gali būti, kad jis bandys pasinaudoti SYN „floodu“. Praktiškai kiekvienas servisas turi tam tikrą prisijungimo skaičių limitą, vadinamu „backlog“. Kai jis prisipildo, kiti bandymai prisijungti kurį laiką tyliai ignoruojami. Norėdamas užkimšti pasirinktą hosto portą, įsilaužėlis pasiųs keliasdešimt SYN paketų (ir nurodys išgalvotus IP) į to hosto portą (čia q neegzistuojantis IP):


hostas A(q) ---SYN----> serveris B
hostas A(q) ---SYN----> serveris B
hostas A(q) ---SYN----> serveris B
hostas A(q) ---SYN----> serveris B
..............

q  <----SYNACK --- serveris B
q  <----SYNACK --- serveris B
q  <----SYNACK --- serveris B
q  <----SYNACK --- serveris B
.....

Serveris B nusiųs SYNACK paketus ir kurį laiką lauks atsakymų. Įsilaužėliui bus svarbu, kad q būtų neegzistuojantis, kitu atveju, kitas hostas gavęs netikėtą SYNACK paketą tuoj pat išsiųs RST (nutrauks susijungimą) serveriui B ir „floodas“ nepavyks. Visa esmė yra ta, kad įvykdomi tik 2 iš 3 etapų (pasiunčiamas ISN, serveris patvirtina gautą ISN ir pasiunčia savo ISN. 3 etapas niekada neturėtų būti įvykdomas, jei kitas hostas (q) neegzistuoja).

Serveris B nusiuntęs SYNACK paketą, kurį laiką lauks atsakymo (keletą minučių) ir to laiko įsilaužėliui užteks sėkmingai įvykdyti ataką prieš serverį A. Pats „backlog“ dydis priklauso nuo atakuojamo serviso (ir OS). Pvz., 80 portui galima nusiųsti 129 paketus, kad jis užsikimštų (bandyta ant rh61).

Kaip įsilaužėlis nustatinės ISN. Mes žinome, kad kiekvieną sekundę ISN padidėja 128000 vienetais ir taip pat 64000 vienetais per susijungimą. ISN galima paskaičiuoti šitaip:

$isn = SEQ + n*128000 + 64000 + 1

kur SEQ paskutinis gautas SEQ numeris iš serverio, n – sekundžių skaičius, 64000 – kadangi įsilaužėlis imituos serverio B jungimąsi prie serverio A. Ir 1, nes serveriui siųs atsakymą 1 didesniu (ACK).

Ataka:


hostasA(serveris B) ---SYN ---> serveris C
 
 serveris B <---SYNACK --- serveris C
 
 hostasA(serveris B) ---ACK---> serveris C
 
 hostasA(serveris B) ---PSH---> serveris C

Paaiškinimas:
Hostas A siunčia paketą, kurio „source“ adresas yra serveris B į 513 (login) portą serveriui C. Serveris C atsako į paketą ir siunčią SYN/ACK serveriui B. Kadangi serveris B dar neatsigavęs po „DoS“, tai tą paketą jis ignoruoja. Palaukus porą sekundžių, hostas A siunčia _spėjamą_ ack numerį serveriui C (SEQ+n*128000+64000+1). Po to siunčiami duomenys pvz., rsh serveris C „echo + + >>/root/.rhosts“ ir daroma „# rsh -l root serveris C /bin/sh“ jei viskas pasisekė, gaunamas „shellas“.

Jei nieko nesupratote, skaitykite rfc793 ir apie tai, kaip Mitnick nulaužė Shimomurą. Mokinkitės ne iš savų, o iš svetimų klaidų, kad išvengtumėte nemalonumų. Tekstas parašytas ne tam, kad išmoktumėte įsilaužinėti į svetimus serverius, o kad suprastumėt kaip viskas vyksta ir, kad susirūpintumėte saugumu.

‡ 1999–2024 © Elektronika.lt LTV.LT - lietuviškų tinklalapių vitrina Valid XHTML 1.0!