NASsoljunk!

Nem, kedves olvasó, nem nyitott a PR-Audit gasztro-blogot, jelen bejegyzés nem sütikről és tortákról, hanem a D-Link DNS-323 típusú NAS-ról fog szólni. Elnézést, ha valakinek ezzel csalódást okoztam 🙂

cakeisalie
No, de csapjunk is a lecsóba (no pun intended)!

Egészen pontosan a kütyü webes kezelőfelületéről, illetve a felületen egy pentest során talált két sebezhetőségről lesz szó. Mindkét sebezhetőség authentikációhoz kötött, de elegendő hozzá egy normál felhasználó, nincs szükség adminra.

A bejelentkező oldalon két lehetőség van: “Configuration” és “Applications”.

login

Az elsőhöz admin jogok kellenek, itt lehet beállításokat eszközölni a NAS-on. A teszt során ehhez nem fértem hozzá, be kellett érnem a másik lehetőséggel, ami bármilyen felhasználó számára elérhető, és másolásokat, biztonsági mentéseket időzíthetünk vele. Legalábbis annak szánták D-Link-ék. Én tetszőleges fájlfeltöltésre, illetve közvetlen parancsfuttatásra használtam 🙂

Az alábbi screenshoton ez a felület látható:

schedule

 

Meg kell adni, hogy honnan (FTP, web, vagy SAMBA share), hová, és mikor akarunk menteni. Amennyiben a forrás authentikációt igényel, azt is itt adhatjuk meg. Van még egy “Type” beállítás, de az nálam nem működött, nem vettem észre, hogy bármi változott volna a működésben, amikor állítgattam. A “hová” az, ami érdekes számunkra. A szövegdobozba kattintva rögtön felugrik egy ablak, ahol a NAS-on található megosztáson (Volume_1) lévő mappák látszanak. Itt kattintgatva kiválaszthatjuk a célmappát.

normal_tree

 

Az érdekességek akkor kezdődnek, amikor beállunk egy intercepting proxy-val a böngésző és a szerver közé. Egy mappát lenyitva (+ gomb) a következő kérés megy el a szerver felé:

params

 

OK, itt legalább két dolog van, amivel kb. mindenki bepróbálkozik, aki minimálisan képben van webhack témában: az fNEW_DIR-t átírja valami másra (pl. /), illetve az f_file-t átírja 1-re. Az fNEW_DIR-t /-re, /etc-re átírva elszáll a webszerver (!!!), csak pár perc múlva áll helyre. Ez önmagában érdekes, elképzelhető, hogy ezzel is lehet kezdeni valamit – én nem néztem, mert mint látni fogjuk, vannak kényelmesebb módszerek is az eszköz pwn-olására az ARM-os webszerver exploitálásánál.

Tehát közvetlenül a /-t, /etc-t, stb. megadva nem jutunk előbbre, de azért ilyen könnyen nem adjuk fel, próbálkozunk másik módszerrel. Igen, directory traversal. A /mnt/Volume_1/../.. értéket már elfogadja az eszköz, és vígan böngészhetjük az egész fájlrendszert.

Persze csak a mappákat látjuk, de ezen segíthetünk az f_file paraméter 1-re állításával.

 

hacked_tree

Miután kiválasztottuk a forrásfájlt és a célmappát, már csak el kell menteni az időzítést, és a megadott időben, vagy a zöld nyílra kattintáskor meg is történik a másolás.

Én egy FTP szerverről töltöttem fel egy proof.txt-t az eszköz /web/path direktorijába. Az eredmény az alábbi képen látható:

proof

 

Tehát összefoglalva: az eszköz teljes fájlrendszerét látjuk (a fájlokat olvasni nem tudjuk!), és bárhova írhatunk bármit. Pl. kicserélhetjük az /etc/shadow-t, vagy a kezelőfelület oldalait.

Ez utóbbit kipróbáltam. A D-Link oldaláról letölthető firmware-t kicsomagoltam, a benne található initrd-t mount-oltam, majd az abban találhat image.cfs squashfs fájlt szintén mount-oltam (tiszta Matrjoska baba 🙂 ). A web_page direktoriban található maga az oldal – ki hitte volna. A teszt céljából a web_page/state/log.asp oldalt választottam ki, aminek az elérése admin jogokhoz kötött. Egy részlet a fájlból:

logasp_snippet

 

A 15. sorban található check_login(1) hívást kicseréltem check_login(0)-ra, majd a fájlt feltöltöttem a NAS-ra test.asp néven. Voila, az oldalt megnyitva olvashatjuk a rendszer-, illetve FTP naplókat:

logs

 

A további lehetőségeken való agyalást az olvasóra bízom. Egy-két megjegyzés:

  • A kezelőfelületet egy GoAhead beágyazott webszerver szolgálja ki, web-es shell ráhegesztésével nem nagyon éri meg szöszölni.
  • A felmásolt fájlokon a jogosultságok nem maradnak meg, így pl. a cgi-bin-be, vagy az “at” spool-jába hiába írkálunk, nem lesznek futtathatók az állományok.
  • Binárisok esetén figyeljünk, hogy ARM alapú a rendszer!
  • Igazából ez az egész nem is lényeges, mert mindjárt látjuk, hogy parancsokat is tudunk futtatni 🙂

A második sebezhetőség egy OS command injection. A letöltések időzítését – Linux alapú rendszerről lévén szó – az “at” program végzi. A webszerver binárisát IDA-val megpiszkálva az is kiderül, hogy a “-f” kapcsolóval, tehát fájlból dolgozik az “at”. Az előbb mutatott módszerrel átvizsgálva a fájlrendszert kiderül, hogy időzítéskor a /web direktoriban SCHEDULE# nevû fájlok jönnek létre a következő tartalommal:

schedule_file

 

Az időzített letöltéseket tetszőleges időpontban is indíthatjuk a play gombra kattintással. Ekkor az alkalmazás a /goform/right_now_d funkciót hívja meg a következő paraméterezéssel:

rightnow

 

Tehát a meghívott funkció megkapja az at job ID-jét, a SCHEDULE# fájl nevét, illetve a letöltés paramétereit. Az ID valószínûleg a job, a SCHEDULE# pedig a fájl törléséhez kell a másolás befejezése után. Tehát elvileg lefut egy “atrm [job ID]”, illetve egy “rm -f SCHEDULE#”. Ismét segítségül hívva IDA-t kiderül, hogy az atrm parancs kb. a következő kóddal hívódik meg:

sprintf(&cmd, “/bin/atrm %d”, jobid);
system(cmd);

Ebből ugy látszik, hogy a job ID-ba nem tudunk injektálni, mert számként értelmeződik. Marad tehát a SCHEDULE#. A következő képernyőmentésen látható módon küldtem el a kérést a webszervernek:

cmdexec

Az eredmény, amin jól látszik, amit eddig is sejthettünk, hogy minden, amit csinálunk, root-ként hajtódik végre.

cmdexec_result

 

Összefoglalva: a bejegyzésben bemutattam két 0-day sebezhetőséget, amik a D-Link DNS-323 típusú eszközét érintik. Az eszköz nem mai darab, már nem is forgalmazzák, a support 2013. május 5-én lejár, így ezek a hibák valószínûleg nem lesznek javítva. A eszköz utóda, a DNS-325 már egy teljesen áttervezett webes felülettel rendelkezik, így ezek a hibák ilyen formában ott biztosan nem találhatók meg. Persze ez korántsem jelenti azt, hogy az már teljesen biztonságos 🙂

Főkép: https://knowyourmeme.com/