loader
Foto

Egy (hamis) Ethernet Frame előállítása Python nyelven

Egy olyan socket-et készítünk el Python nyelven, amelyet Layer 2-es szinten valósítunk meg. Ez a cikk szorosan illeszkedik a jövő évben meghirdetésre kerülő (online) tanfolyamunk egyikébe, amely a penetrációs tesztekről szól. Python nyelven fogunk készíteni különböző olyan kódokat, script-eket, amelyek segítségével penetrációs teszteket, sérülékenységvizsgálatokat tudunk végezni.

Elkészítünk most egy olyan egyszerű akalmazást, amelynek segítségével Layer 2-es szinten egy socket-et tudunk kiküldeni a hálózatra úgy, hogy mi állítjuk be a forrás, illetve a cél MAC címét. Ezeken kívül mi állítjuk be a használni kívánt protokollt is. Látni fogjuk, hogy nem mindegy, hogy milyen értéket kap az EtherType, ugyanis könnyen lehet az, hogy hibás lesz a kiküldött socket.

Nézzük meg az Ethernet frame felépítését, amelyet az első ábrán láthatunk.

kep
1. ábra   Ethernet frame felépítése
 

Látható, hogy először a célállomás MAC címét kell megadni, azután a forrásnak a címét, végül az EtherType értékét, amellyel be tudjuk állítani a használni kívánt protokollt. Tehát az EtherType értékétől függ az, hogy a "Data" területre milyen értékek (pl.: protokoll, stb) kerülnek.

A második ábrán látjuk a frame teljes felépítését.

kep
2. ábra   Egy frame teljes felépítése
 

A cikkünkben egy olyan alkalmazást készítünk el, ahol a Layer 2-esen összeállítunk egy csomagot, és azt kiküldjük. Nem foglalkozunk azzal, hogy a többi rétegen milyen adatok lesznek, hiszen csak az Ethernet frame-nek adunk értékeket. Vegyük észre, hogy olyan protokollt kell(ene) beállítani tehát az EtherType-nál, amely nem ad hibás csomagot. Ki fogjuk próbálni az IP, illetve az ARP protokollokat, végül pedig olyan értéket adunk meg, amely hibátlan adatküldést valósít meg.

Indítsuk el a Linux operációs rendszerünket, és gépeljük be egy file-ba a következő programot.

from socket import *

def sendEth(srcMAC, dstMAC, etherType, payload, interface = "eth0"):

  assert(len(srcMAC) == len(dstMAC) == 6)
  assert(len(etherType) == 2)

  s = socket(AF_PACKET, SOCK_RAW)

  s.bind((interface, 0))
  return s.send(srcMAC + dstMAC + etherType + payload)

if __name__ == "__main__":

  sendEth("\x12\x34\x56\x78\x9A\xBC",
          "\xBC\x9A\x78\x56\x34\x12",
          "\x08\x06",
          "WebElektronika")

 

A "sendEth()" függvény meghívásával fogjuk kiküldeni az általunk összeállított Ethernet frame-et. Ehhez meg kelll adnunk a függvény meghívásakor a forrásnak és a célnak a MAC címeit, az EtherType értékét, illletve a kiküldendő adatot. Ha nem az "eth0" interfészt használjuk fel, akkor a függvény meghívásakor az interfész nevét is meg kell adni paraméterként.
A függvény törzsében először ellenőrizzük az "assert()" segítségével azt, hogy a megadott MAC címek megfelelőek-e. Nem a MAC címek konkrét felépítését ellenőrizzük, hanem csak a byte-ok számát. Szintén csak a byte-ok számát ellenőrizzük az EtherType esetében is.
Ha a függvény paramétereinek a byte száma megfelelő, akkor létre kell hoznunk egy socket-et az adatküldés két résztvevője között. Az "AF_PACKET" (Low-level packet interface) beállítás segítségével alacsony szinten érjük el a hálózati interfészt. A "SOCK_RAW" (RAW socket) használatával a különböző protokollok könnyen alkalmazhatók, amikor előállítjuk (vagy beolvassuk) a hálózati forgalmat.

A send() függvény segítségével kiküldjük a hálózati kártyán keresztül a függvény paraméterében megadott adatot. Első esetben az ARP protokollt alkalmazunk, ezért az EtherType értéke 0x0806, a hálózati forgalom részletét a harmadik ábrán látjuk.

kep
3. ábra   ARP protokollt alkalmazunk
 

Változtasssuk meg most az EtherType értékét 0x0800-ra, hogy az IP protokollt tudjuk alkalmazni. Hangsúlyozzuk, nem "megyünk" a Layer 3-ra, hogy felépítsük az IP fejlécét. Az eredmény a 4. ábrán látható.

kep
4. ábra   IP protokoll alkalmazása
 

Végül alkalmazzunk egy "saját" protokollt, amely nincs is. Az EtherType értéke legyen például 0x1234. Ilyen nem található meg az IEEE szabványban. Az eredmény az 5. ábrán látható.

kep
5. ábra   A "0x1234" protokoll alkalmazása
 

A következő cikkben egy olyan frame-et építünk fel, amely az IP-t használja.

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

Elkezdünk egy sorozatot, amelyhez a Kali Linux használata elengedhetetlen lesz, de természetesen folytatjuk a C# nyelv aszinkron használatának a bemutatását is. Az IT biztonság (amely elég széles területet foglal magába) egyik elengedhetetlen eszköze. . . .

Az nmap (grafikus megjelenítésnél a ZenMap) használata az IT biztonság, illetve az üzemeltetés területén dolgozó szakembereknél szinte elkerülhetetlen. Az ingyenes szoftver segítségével tesztelhetők a számítógépeink, a számítógéphálózatunk, vizsgálha. . . .

A saját informatikai rendszerünk tesztelésénél előfordulhat, hogy meg kell változtatni a MAC címünket. Hogyan tehetjük ezt meg a Kali Linux segítségével? Megnézzük most ezt ebben a cikkben.. . . .