echo 'keysym XF86Back=Backspace' > ~/.Xmodmap
# A lelki békém érdekében...
Akik közelebbről ismernek tudják, hogy - bár nem vagyok kellően okos hozzá - a kriptográfia a szívem csücske, a mostani MS frissítés pedig egy remek kriptográfiai témájú sebezhetőséget is napvilágra hozott, melyről nem tudom megállni, hogy ne írjak pár sort. A probléma önmagában nem túl bonyolult, de ez jó alkalom ad egy kis kriptográfiai-protokoll gyorstalpalóra, valamint arra, hogy megmutassam, miért olyan marha nagy probléma, ha nem tudunk kellően megjósolhatatlan (ál)véletlenszámot generálni.
A sebezhetőség teljes analízisét az expertek itt találják meg, a többieknek a továbbra érdemes kattintani.
Szóval, aki visszalapozott, már tudhatja, hogy a probléma az SMB protkoll NTLM autentikációt megvalósító részének véletlenszámgenerátorát érnitette. Jó sok volt a rövidítés, de a Wikipedia mindenre tudja a választ. A lényeg a mi szempontunkból az, hogy az NTLM egy kihívás-válasz alapú autentikációs protokoll, magyarul a szerver küld nekem valamilyen véletlen értéket, amit nonce-nak szoktak hívni (Not Only Once - magyarul ezt illene csak egyszer felhasználni, hogy miért az mindjárt kiderül), én meg a saját titkomat (jelszavamat) felhasználva előállítok ebből egy választ. Matekosok kedvéért:
Válasz=NTLM(nonce,titok)
Ebben egyrészt az a jó, hogy ha egy támadó lehallgatja a hálózatot (és miért ne tenné?), akkor nem kaparintja meg a jelszavamat, csak annak valamilyen transzformáltját, amiből (jó esetben) nem tudja visszaállítani a titkomat (hash algoritmusok, ugye). A nonce azért kell, mert nélküle ez a transzformált minden esetben ugyanaz lenne, így visszajátszással (újraküldéssel) bárki bejelentkezhetne, aki egyszer elkapott egy ilyet. Az NTLM esetében viszont a szerver elméletileg minden bejelentkezési kísérletre más nonce-t ad, ami más válaszokat eredményez, így gyakorlatilag a támadó megőszül, mire pont egy olyat dob neki a gép, amire az elkapott válaszok bármelyikét vissza tudná játszani.
És itt keletkezik a baj, ha a gép gyakran dobja ugyanazt a számot, hiszen így a a támadó potenciális várakozási ideje drasztikusan lerövidül. Pontosan ez a helyzet az MS10-012 esetében is, persze a hibakihasználáshoz most is kell trükközni egy kicsit:
A véletlenszámgenerátor akkor "bolondul meg" (pontosabban szedi össze magát), ha egy speciális Flags mezővel ellátott 'SMB Negotiate Protocol Request' üzenetet kap, ilyeneket viszont az elterjedt kliensek nem küldenek. Mi viszont küldhetünk, és küldönk is, jó sokat, mire a célpont szerver hozzánkvág néhány ezer kihívást. Ezután keresünk egy felhasználót, akinek van hozzáférése a szerverhez, és mondjuk megnyittatunk vele egy weboldalt, ami egy halom képet próbálna letölteni egy SMB megosztásról, ami történetesen szintén a mi gépünkön futhat. A felhazsnáló SMB kliense természetesen meg fog próbálkozni a bejelentkezéssel,amihez mi elküldjük neki a célponttól kapott nonce-okat. Ezekre a kliens szépen válaszolni is fog, ezeket a válaszokat a célpont felé újraküldve pedig egy kis szerencsével - hiszen gyakran generálódik ugyanaz a nonce- bejelentkezhetünk a felhasználó nevében a célpont kiszolgálóra.
Ugyanazok a speciális SMB csomagok, amelyek a duplikált kihívásgenerálást előidézték alkalmasak még arra is, hogy segítségükkel megjósoljuk a szerver által kiküldendő nonce-ok értékeit. A véletlenszámgenerátor ugyanis alapvetően három paraméterből táplálkozik:
- Egy belső változó értékéből, amely kezdetben 0, és gyakorlatilag csak a mi speciális üzeneteink hatására inkrementálódik.
- Az adott pillanatig indult folyamatok számából.
- A rendszeridőből, melynek felhasznált értékét visszakapjuk a speciális csomagunk válaszában (ez rámutat, hogy kriptográfiai alkalmazások esetében kritikus lehet pusztán a rendszeridő ismerete is!)
Három paraméterből kettőt tehát gyakorlatilag ismerünk, csak úgy mint a véletlenszámgenerátor algoritmusát (hála a reverse-engineeringnek), így meghatározható egy értékhalmaz, melybe a kövekező nonce-ok értéke várhatóan esni fog (hogy ez pontosan hogyan történik, az a mellékelt forráskódokból derül ki). Erre a halmazra már eljátszható az előzőekben bemutatott, hamis SMB szervert alkalmazó trükk, és készen vagyunk.
Remélem hasznosnak találtátok az írást, ne habozzatok kérdezni/éleményezni a kommentekben! Házifeladat megnézni, hogy a Kerberos protokollt milyen védelmi vonalak erősítik egy hasonló hibával/támadással szemben :)