Tweets by @buherablog
profile for buherator at IT Security Stack Exchange, Q&A for IT security professionals

A BitBetyár Blog

Túljártál a nagyokosok eszén? Küldd be a mutatványodat! (e-mail a buherator gmailkomra jöhet)

Full-Disclosure / Névjegy / Coming out


Promó

H.A.C.K.

Címkék

0day (110) adobe (87) adobe reader (21) anonymous (26) apple (60) az olvasó ír (49) blackhat (20) botnet (22) bug (200) buherablog (44) buhera sörözés (39) bukta (49) deface (38) dns (22) dos (29) esemény (82) facebook (26) firefox (64) flash (33) gondolat (31) google (59) google chrome (36) hacktivity (37) hírek (117) incidens (224) internet explorer (88) iphone (35) java (50) jog (22) kína (21) kriptográfia (68) kultúra (21) linux (24) malware (43) microsoft (142) móka (48) mozilla (23) office (26) oracle (40) os x (43) patch (197) php (20) politika (31) privacy (58) programozás (22) safari (34) sql injection (62) windows (85) xss (77) Címkefelhő

Licensz

Creative Commons Licenc

Így kell (Safarit) hackelni

2007.09.05. 17:30 | buherator | Szólj hozzá!

Gareth Heyes készített egy terjedelmes leírást, melyben részletesen leírja, hogy hogyan talált és használt ki egy addig ismeretlen hibát a Safari béta verziójában.

Bár alapvetően lusta ember vagyok, azért megpróbálom a lehető legkevesebb kihagyással tolmácsolni Gareth írását, mivel annak nem csak tanító, de nevelő hatása is figyelemre méltó.  Következzen a cikk:

A kezdet

Amikor hackelek, mindig a legegyszerűbb támadási lehetőséggel [vektorral - erre nem nagyon ismerek magyar szót] kezdem, innen indulok ki, és ha úgy érzem, hogy már túl bonyolult a kód, inkább újrakezdem az egészet, mint hogy órákat szenvedjekk JavaScriptek debugolásával. Erre több okom is van: minden lehetőséget megtartok referenciának, a kód folyamatosan fejlődik, én pedig minden pillanatban tisztában vagyok vele, hogy mi történik. A saját kódod megértése alapvető fontosságú, mivel minden apró részletét ismerned kell, hátha később ezek válnak fontossá.

Tehát nekiestem egy üres HTML dokumentumnak, ahogy máskor is amikor unatkozom, és belebotlottam egy érdekes viselkedésbe a document objektummal kapcsolatban. Rájöttem, hogy létrehozhatok egy document nevű objektumot, amiben referenciát tárolhatok az eredeti document objektumra., valahogy így:

i=document.getElementById;
var document;
document={};

Ez rossz. Persze mondhatjátok, hogy "áá, ez nem is a valódi document objektum!", ami igaz, de megtanultam az évek alatt, hogy a böngészők/weboldalak/webalkalmazások átverése nem nehéz, ez pedig egy sebezhetőség, ami csak arra vár hogy kihasználják, csak mélyebbre kell ássak...Észrevettem ezt a viselkedést Safari és IE alatt is, és arra gondoltam, hogy meg el tudnám-e hitetni a böngészővel, hogy egy iframe ugyanazon a domainen van mint maga az oldal. Ez fontos, most már kitűztem egy célt magam elé, és erre tudok összpontosítani.

A böngésző átverése

A document objektumnak védettnek kellene lennie (figyeltek ott a gyártónál?), az hogy mindenki manipulálhatja rossz. Folytattam a document exploitomat, hozzáadva egy domain tulajdonságot, hogy elhitessem a böngészővel, hogy a dokumentum az amazon.com domainhez tartozik:

i=document.getElementById;
var document;
document={};
document.domain='www.amazon.co.uk';

Azt vártam, hogy a böngésző majd hibát jelez, mivel ez veszélyes. De a böngésző jó kedvében volt, úgyhogy azt gondoltam, muhahaha, közel vagyok! Rosszul gondoltam. Kipróbáltam ezt a kódot:

function attack() {
   alert(document.domain);
}
<iframe src="http://www.amazon.co.uk/" onload="attack();" id="iframe" name="iframe"></iframe>
<script type="text/javascript">
d = document;
w = window.frames;
</script>
<script type="text/javascript">
var document;
document = {};
document.domain = 'www.amazon.co.uk';
var window;
window={};
</script>

Ez visszaadta azt amit vártam, a domaint amit megadtam neki (IE és Safari alatt), a következő lépés tehát az volt, hogy kinyerjek adatot az iframe-ből hozzáférést adva ezzel bármyely oldalnak bármely másikhoz. Érdemes megjegyezni, hogy a először IE alatt, majd Safarin is teszteltem, mivel tudtam, hogy a két böngésző ugyanúgy viselkedett, és ez növelte az esélyeimet arra hogy exploitot találjak valmelyikben.

Továbbfejlesztettem a támadást, hogy hozzáférjek az információhoz:

window.frames = w;
document.getElementById = d.getElementById;
document.getElementsByTagName = d.getElementsByTagName;

Most tehát eltároltam a getElementById a getElementsByTagName referenciáit az erdeti document objektumból, valamint a window.frames-t is. Ezekkel akartam adatot gyűjteni, megnyitottam a lecsiszolt támadó függvényemet és..."ACCESS DENIED" :( Safariban is megpróbáltam,d e ugyanezt a hibaüzenetet kaptam. Kezdhetem előröl, gondoltam. Lehet, hogy nem is lehetséges a dolog. Álljunk csak meg! Bármi lehetséges, hogy tudnám továbbfejleszteni a kódomat? Hmmm, nyitottam egy új ablakot és beszúrtam ezt a kódot az URL helyére:

javascript:for(i in document) document.write(i + document[i] + '<br>')

Ez végigmegy a document objektum összes tulajdonságán és metódusán. Kipróbáltam helyi, és távoli dokumentumentumokkal és összehasonlítottam az eredményt. Ha egyszerűen lemásolom a célpont oldalhoz tartozó adatokat, talán el tudom hitetni a böngészővel, hogy a távoli oldalon van, miközben valójában nincs. Egy új, továbbfejlesztett document objektummal álltam elő:

var document;
document = {};
document.domain = 'www.amazon.co.uk';
document.URL = 'http://www.amazon.co.uk';
document.referrer = 'http://www.amazon.co.uk';
document.documentURI = 'http://www.amazon.co.uk';
document.location = 'http://www.amazon.co.uk';
document.protocol = 'HyperText Transfer Protocol';
document.URLEncoded = 'http://www.amazon.co.uk';

Újra próbáltam Ie-vel. Semmi. Adjam fel, kezd egy kicsit unalmassá válni? Próbáljuk meg Safarival, hátha az IE összehasonlítja a címet az URL-lel, a Safari viszont nem. A kapkodásban egyszerűen rákattintottam a fájl ikonjára, ahelyett, hogy a helyi teszt szerveren futtattam volna. Hátradőltem a székemben, gondoltam úgysem fog működni. Aztán hirtelen megjelent egy pop-up valami HTML kóddal. Nem működhetett. Ez biztos az eredeti dokumentumból származik. Várjunk csak...ez az Amazon kódja! Működik :) jó érzés ha ilyesmi történik, ha rájössz, hogy a több óra kódolás nem volt hiába, hogy tudod: elérted a célod!

Néhányan értik, néhányan nem

Rájöttem, hogy az expoloit amit készítettem csak helyi, és nem működik külső domaineken. De ez nem számított, mert tudtam, hogy át lehet úgy írni a kódot, hogy távolról is működjön.  Ez egyfajta gondolkodásmód, gyakran látok embereket akik azt mondják, hogy "Igen, de ez csak egy /local exploit/, és csak ilyen körülmények között működik, szóval én ezt nem tartom komoly hibának". Amit mondaniuk kellene, az ez: "Ó, egy helyi exploit. Gyorsan kijavítom MIELŐTT komollyá válik". Soha nem fogsz tudni kihasználni semmit, ha az előbbi módon gondolkodsz. A szoftvereid is tele lesznek hibákkal ha úgy gondolkodsz.

Volt egy ilyen vitán egy Apple-s fickóval, aki figyelmen kívül hagyta a bejelentésemet, mivel az nem komoly. Nem komoly? Gondoltam viccelnek. Rendben van Apple, ha nem gondolod hogy ez probléma, csak várj...

Az exploit fejlődése

Új célt tűztem ki magam elé: meg akartam cáfolni a fickót. Tudjuk hogy lehetséges, ez a srác nyilvánvalóan nem ért a webes biztonságtechnikához. Szórakozzunk egy kicsit! Szóval elvégeztem néhány kísérletet, hogy futtatni tudjam a kódot bármilyen domainen. Az első ötletem az volt, hogy csinálok egy automatikusan elinduló letölthető fájlt. De ahelyett, hogy elkezdett volna futnia  helyi webszerver domainjén, nem volt hajlandó elindulni.

OK, akkor legyen az új cél hogy a fájl letöltődjön ahelyett hogy elkezdene a böngészőben futni. A Safari azért viselkedett úgy ahogy, mert a HTML fájlok nem "safe" fájlok (ez egyébként micsoda szemétre való megoldás). Hogy a fájl letöltődjön, el kellett hitetnem a böngészővel, hogy nem tartalmaz HTML kódot.

<body onLoad="alert(window.frames.iframe.document.getElementsByTagName('body')[0].innerHTML);
alert(window.frames.iframe.document.cookie);">
<p>test</p><iframe src="http://www.amazon.co.uk/" id="iframe" name="iframe"></iframe>
</body>

Ezt a hibát "Nem is jelentős hibának" neveztem el, egy kis szarkasztikus utalással Apple-ös "barátunkra". Ez a kód működött :D Letöltötte a fájlt, de nem indította el automatikusan :( A felhasználónak kellet volna megnyitnia ahhoz hogy fusson. Így hát elgondolkoztam egy módszeren amivel futásra bírhatom. (Látjátok, hogy mindig csak egy célt tűzök ki magam elé, az utána következőket pedig figyelmen kívül hagyom amíg az elsővel nem vagyok kész).  Ezen gondolkoztam és a helyi fájlok futtatásához lyukadtam ki, szóval meg kellett volna próbálnom futtatni egy helyi fájlt a letöltésekhez tartozó  könyvtár nevének kitalálásával. A Safari úgy védi ezeket az elérési utakat, hogy ne lehessen hozzájuk férni.

Így hát feladtam, de a probléma még mindig ott motoszkált a fejlemben, mert ez a fickó nagyon felidegesített, és be akartam bizonyítani hogy nincs igaza, mivel a böngészőknek nem szabadna hagyni hogy a hely filerendszerből távoli domainek legyenek hozzáférhetők. Éppen a gépemmel szórakoztam, mikor megérkezett az Apple szoftverfrissítés az új Safari beta-val. Király, gondoltam, biztosan kijavítottáka  hibát, amiről az Apple-ös gyerekkel beszéltem. Installáltam, és megnyitottam a helyi exploitomat. Működött! Majd' megőrültem, miért nem javították? Jól van Apple, most megmutatom. Átgondoltam az összes kiindulópontomat, és arra próbáltam rájönni, hogy hogyan futtathatnám ezta  kódot helyi kontextusban egy távoli domain-ről.

Auztán beurott, about:blank! Fel tudtam használni a kód egy részét amit a "Nem is jelentős hiba" exploitjához írtam, és be tudatm szúrni az about:blank dokumentumba! Ahogy mondani szokás, a többi már történelem :D

A kész exploit

Remélem élveztétek a cikket! Ha igen, kérlek adjatok valami visszajelzést, és megfontolom hogy máskor is jelentkezem hasonló terjedelmű írásokkal. Kérlek ne használjátok az itt leírtakat rossz célokra. Használátok arra, hogy tanuljatok!

Eddig tartott Gareth cikke, remélem akire ráfér, már kezdi kapisgálni, hogy a hackelés nem a hugica jelszavának lelopásáról, meg a szomszéd cég honlapjának defaceeléséről szól.

Címkék: safari

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.