Ahogy ígértem, belenézünk kicsit a Hacktivtiy Hack the Vendor játékának megoldásába, mindenki okulására.
Az első szemrevételezett feladat az ingyenmenet.hu klónozott oldalán történő minél több pont megszerzése volt. Hogy a szorgoskezű kattintgatók próbálkozásainak gátat szabjanak, a szervezők adminisztrátori engedélyezéshez kötötték a pontok szerzését, így a feladat lényegében adminisztrátori jogosultság megszerzése lett.
Gyengébbek kedvéért: A cikk célja, hogy bemutasson egy hack mögött rejlő gondolatmenetet. Nem a Drupalt, vagy annak valamelyik hivatalos kiegészítő modulját törtük fel. A Drupal nem lesz kevésbé biztonságos rendszer attól, mert nyílt a forráskódja, vagy mert olyan jelszóemlékeztető funkciót használ amilyet. A probléma kulcsa egy nem megfelelően implementált "házi készítésű" modul, minden egyéb puszta körülmény, amit mellesleg egy hacker adott esetben képes a saját céljára felhasználni. Ó Uram, szabadíts meg a hülyéktől!
A célpont egy Drupal alapú oldal volt, ami egy biztonsági szempontból is igen jól megtervezett rendszer, melynek alapkomponenseiben emlékeim szerint nem fedeztek fel komolyabb sebezhetőséget az elmúlt években. Ennek tudatában a támadási felületet le lehett szűkíteni a kiegészítő modulokra, melyeket nem a hivatalos fejlesztőgárda tart kézben (gyk. nem a drupal.org-on hosztolódnak, nem látta őket a biztonsági csapat stb.).
Nem kellett sokat keresgélni: az oldalsó keresőpanel az első SQL injection próbálkozásokra kézségesen szolgáltatta vissza a teljes elszállt lekérdezéseket. Innentől kezdve gyerekjáték volt kilistázni a felhasználók tábláját, benne a jelszavakkal, melyeket azonban - mint minden jó tartalomkezelő esetében - hash-elve tárolnak.
Miután sem a helyi gépen futtatott alap szintű brute-force, sem a GI John nem hozott rövid időn belül eredményt, más megoldáson kezdtünk gondolkozni. Aikon felvetette, hogy mi lenne, ha megpróbálnánk a jelszóemlékeztető segítségével egyszerűen mi magunk beállítani a jelszót?
Hamar kerestünk egy drupalos oldalt, ahová van regisztrált fiókunk, és kértünk egy emlékeztetőt, mire a rendszer valami ehhez hasonló linket dobott a postafiókunkba:
http://drupalsite.hu/user/reset/<a>/<b>/<c>
ahol <a> és <b> ránézésre a felhasználói azonosító és egy időbélyeg (feltehetően a kiküldés pillanatának időpontja) voltak, <c> pedig egy 32 karakter hosszú hexa érték, feltehetően egy MD5 hash. Így hát, mint az őrült elkezdtünk a hash eredete után nyomozni, de ez egy olyan összetettségű rendszer esetében, mint a Drupal nem is olyan egyszerű, vagy legalábbis egész napos sörözés, meg a BalaBites felesek után kicsit nehezebben sikerült felkutatni azt a kódrészt, amit most két perc alatt megtaláltam :)
A fenti URL-ből látható, hogy a user modul végzi a jelszóvisszaállítási feladatokat, a modul könyvtárában pedig a "reset" kifejezésre keresve azonnal feltűnik a user_pass_reset_url() függvény, amely a következő képpen néz ki:
function user_pass_reset_url($account) {
$timestamp = time();
return url("user/reset/$account->uid/$timestamp/". user_pass_rehash($account->pass, $timestamp, $account->login), array('absolute' => TRUE));
}
Látható, hogy sejtésünk helyes volt, vagyis az első két paraméter a felhasználónév és a emlékeztetőkérés időpontja, a keresett hash-t pedig a user_pass_rehash() függvény generálja:
function user_pass_rehash($password, $timestamp, $login) {
return md5($timestamp . $password . $login);
}
Ezek után nem volt más dolgunk, mint a fenti SQL injection segítségével lekérdezni a felhasználói rekordhoz tartozó pass és login értékeket, és megkondtruálni a jelszóvisszaállító URL-t.
Azaz mégsem: a pontos timestamp még hiányzik az egyenletből, de a user_pass_reset() függvény alapján úgy látszik, hogy ezt maga a rendszer is az URL-ből szedi, és csak néhány alapvető ellenőrzést hajt végre rajta. Hogy ezt a paramétert pontosan honnan szedtük eredetileg, arra őszintén szólva már nem emlékszem, de ez jó alkalom egy kis kísérletezésre :)
Végül a fenti adatok ismeretében sikerült megtalálnunk azt a paraméterhármast, amelyet a rendszer elküldött a valódi admin e-mail címére. A reset URL-t felépítve .szépen meg is jelent az új jelszót bekérő form, ahol választottunk egy igen fantáziadús jelszót magunknak :) És itt jön a tanulság: bár az adatbázishoz csak olvasási jogunk volt, ezt sikerült végül írásira váltani, hiszen pusztán olvasási műveletekkel sikerült adminisztrátori hozzáférést szereznünk. Ha a Drupal automatikusan új jelszót generálna, amit kiküldene a megfelelő e-mail címre, ez nem lenne lehetséges.
Remélem tanulságos volt a történet, még egyszer köszönjük az ingyenmenet.hu felajánlását, folytatás következik!
P1ngW1n 2009.09.26. 15:25:31
Szintén benne volt az adatbázisban, szóval ugyan úgy, ahogy a hash kikértétek ki lehetett kérni ezt a timestamp-et is :)
EQ · http://rycon.hu 2009.09.26. 17:46:34
matx 2009.09.26. 18:00:14
gphilip · http://search-download.com 2009.09.26. 18:04:14
Más kérdés, hogy a többi - nevesebb - szponzor mennyire díjaz egy ilyet, és ez mennyire árt a rendezvény jövőjét illetően...
Update-re nem adott lehetőséget az injection?
buherator · http://buhera.blog.hu 2009.09.26. 18:11:17
buherator · http://buhera.blog.hu 2009.09.26. 18:12:44
gphilip · http://search-download.com 2009.09.26. 18:17:18
A gond az, hogy pl lehet, hogy a Microsoft jövőre nem adja a nevét egy prostikkal foglalkozó oldal mellé... :-(
buherator · http://buhera.blog.hu 2009.09.26. 18:30:38
gphilip · http://search-download.com 2009.09.26. 18:44:30
Én speciel nem hirdetnék egy ilyen tematikájú oldallal egy rendezvényen, szerintem ezt a fajta presztízskonfliktust nem szabad lebecsülni, jövőre jobban kell szűrni a támogatókat.
Sajnos nem a kisujjamból szoptam, belső MS infó, hogy ezt nem kimondottan csipázták, de szerintem a többi nagy sem... :-)
De nem gond, ennek a posztnak nem is ez volt a lényege...
P1ngW1n 2009.09.26. 20:33:33
"Egy Hacktivity-n ugyanis követelmény a lazaság és a közvetlenség"
Forrás: computerworld.hu/hacktivity-2009.html
Tény, hogy a Hacktivity-n javallta oldottabban zajlanak az események ( pláne az esti sörözgetés ), mint egy normál öltönyös rendezvényen. És ez szerintem jól is van így.. Ha ez most a többi támogató szemét csípi, akkor nézze meg még1x, hogy hova került..
Személyes véleményem amúgy, hogy ez a fajta esti kikapcsolódás meg bőven belefért.. Jóka lel lehetett hülyülni, és közben ment a brainstorming is nem gyengén
llyes Edit (törölt) 2009.09.26. 22:50:16
Nem kellett sokat keresgélni: az oldalsó keresőpanel az első SQL injection próbálkozásokra kézségesen szolgáltatta vissza a teljes elszállt lekérdezéseket. Innentől kezdve gyerekjáték volt kilistázni a felhasználók tábláját, benne a jelszavakkal, melyeket azonban - mint minden jó tartalomkezelő esetében - hash-elve tárolnak. "
Ez egy elég félrevezető leírás. Az oldalsó keresőpanelt nem egy kiegészítő modullal állították elő -- én legalábbis az utóbbi években nem láttam olyan kiegészítőt, ami nem a Drupal alapcsomag részét képező, nagyon biztonságos Form API-t használta.
Ez egy Drupal alapú oldal, amihez amatőrök nulla hozzáértéssel odatoldottak valamit. Ilyen alapon azt is lehetett volna írni, hogy feltörtünk egy PHP-alapú, vagy MySQL-alapú, vagy Apache által kiszolgált, stb. rendszert.
llyes Edit (törölt) 2009.09.26. 23:01:28
nevergone 2009.09.26. 23:58:49
_2501 2009.09.27. 03:02:35
A szöcske és a sáska elkülönítése igen könnyű feladat, mégis sokan összetévesztik őket. Az egyetlen döntő különbség az, hogy a sáska csápjai rövidek, míg a szöcskének hosszabbak mint a test fele, de gyakran még ennél is hosszabbak lehetnek. További lényeges eltérés amit érdemes megemlíteni, hogy a szöcskék között vannak ragadozó fajok, amik meglepetést okozhatnak nekünk a begyűjtés során. Életmódjuk hasonló a sáskákéhoz, ezért az ő begyűjtésük is kézzel a legcélszerűbb. A nagytestű ragadozó fajok, mint például a Zöld lombszöcske (Tettigonia viridissima) vagy a Szemölcsevő szöcske (Decticus verrucivorus) fájdalmasan megharaphatják az embert, ezért érdemes őket hátulról közvetlenül a tor felől megfogni. A másik probléma a ragadozó étrendű szöcskékkel, hogy a tároló dobozban megehetik fajtársaikat vagy más begyűjtött fajokat, ennek kiküszöbölésére érdemes ilyenkor még több növényt tenni melléjük vagy egyesével elhelyezni őket.
Tisztelettel,
_2501
llyes Edit (törölt) 2009.09.27. 09:45:08
Elég belenézni a HTML forráskódba, azonnal látszik, hogy a kérdéses oldalsó panelt a közmondásos "szomszéd Pistike" készítette és nem egy magára valamit is adó Drupal fejlesztő.
EQ · http://rycon.hu 2009.09.27. 12:24:33
nevergone 2009.09.27. 12:56:30
A "hivatalos fejlesztőgárda" kifejezést nem értem pontosan, bárki küldhet be pl. javítást, ha az megfelelő minőségű és átmegy a tesztetek, bekerülhet a hivatalos változatba.
Szántó Gábor · http://choirs.oftheworld.club 2009.09.27. 13:00:56
_2501 2009.09.27. 13:01:36
Nem olyan nagy baj az ha nem veszünk el a részletekben.
nevergone 2009.09.27. 13:33:20
Szóval a kettő mégsem ugyanaz a kategória.
buherator · http://buhera.blog.hu 2009.09.27. 13:37:42
"A célpont egy Drupal alapú oldal volt, ami egy _biztonsági szempontból is igen jól megtervezett rendszer_, melynek _alapkomponenseiben emlékeim szerint nem fedeztek fel komolyabb sebezhetőséget az elmúlt években_. Ennek tudatában a támadási felületet le lehett szűkíteni a kiegészítő modulokra, melyeket _nem a hivatalos fejlesztőgárda tart kézben_."
Elnézést, nem vagyok olyan szinten jártas a Drupal terminológiában (főleg a magyarban nem) mint te, de ez a poszt egyrészt nem a Drupalról szól, másrészt azt hiszem mindenki számára egyértelmű, hogy itt egy "saját modulról" van szó (amely megnevezés szintén félrevezető lehet, hiszen azt a modult sem én írtam :P). Hogy véletlenül se gázoljak a Drupal közösség lelkébe, azért kiírok egy pontosítást.
llyes Edit (törölt) 2009.09.27. 14:11:04
Kiegészítő moduloknak ezeket nevezzük: drupal.org/project/modules Ahogy nevergone írta, ezek nem "hivatalos" modulok, de általában jó színvonalúak. A webhelyen megjelenő "lyukas" űrlapot nem ezen modulok egyikével állították elő, ráadásul a fejlesztés során a Drupal űrlapkezelőjét is hanyagolták, ami nagyon alapvető hiba. Az egésznek a Drupalhoz gyakorlatilag semmi köze, bármelyik rendszerbe be lehet tolni egy olyan programot, ami sebezhetővé teszi.
EQ · http://rycon.hu 2009.09.27. 14:27:47
nevergone 2009.09.27. 14:38:31
buherator · http://buhera.blog.hu 2009.09.27. 14:41:17
A Drupalt egy biztonsági szempontból is nagyon jó rendszernek tartom, komolyan bánnám, ha miattam esne csorba a hírnevén.
nevergone 2009.09.27. 14:43:58
drupal.hu/node/8430
weblabor.hu/blogmarkok/102967
Így kapásból.
buherator · http://buhera.blog.hu 2009.09.27. 14:56:37
Megnéztem a linkeket, meg gugliztam hozzá kicsit, és azt kell mondjam, siralmas a helyzet... Beraktam egy hosszabb szájbarágót, így remélem a gyengébb képességűeknek is világos lesz miről van itt szó.
llyes Edit (törölt) 2009.09.27. 16:00:11
Az utóbbi években nem hallottunk arról, hogy _rendesen karbantartott_ oldalt az alapcsomagon keresztül feltörtek volna. Kiegészítő modul esetében 1 spam küldésre aktívan kihasznált exploitról lehetett hallani.
Ha Drupal rendszert feltörnek, az _nagy valószínűséggel_ szakszerűtlen hozzátoldás, vagy rosszul konfigurált rendszer www.google.hu/search?hl=en&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=pCF&q=%22You+may+post+PHP+code.+You+should+include+%3C%3Fphp+%3F%3E+tags.%22&btnG=Search vagy a titkárnő monitorjára ragasztott admin jelszó eredménye. :)
Még egyszer köszönöm a cikk kiegészítését.
llyes Edit (törölt) 2009.09.27. 16:01:14
_2501 2009.09.27. 16:32:44
llyes Edit (törölt) 2009.09.27. 17:01:19
De most már tényleg túl van tárgyalva a téma.
Hunger 2009.09.27. 18:07:40
Ez nem cikk, hanem egy blogbejegyzés, HTH
Pasq 2009.09.27. 19:46:58
Szep megoldas mindenesetre.
r@ek (törölt) 2009.09.27. 21:03:37
Regi szep telnetes idok.. ;-)
HoaxSpecialist · http://hacker.blog.hu 2009.09.27. 23:09:02
Igazabol nekem az kiesett az a resze az estenek hogy sikerult feltorni a democms-t, de gratu Buheranak, es akik dolgoztak vele, azt tudom hogy voltatok egy paran :)) Mi lett Cintiaval? Elvittetek egyaltalan "romantikus vacsorazni" ? :D
udv, B
nevergone 2009.09.28. 00:05:13
|Z| 2009.09.30. 11:52:18
gyrgyvrs 2009.10.10. 17:51:14
buherator · http://buhera.blog.hu 2009.10.10. 18:01:54
A Drupalos fejlesztőkkel egyébként azóta folyamatban van egy agyalás a Drupal 7 jelszóvisszaállító funkciójának megerősítésére (hardening != bugfix)