Shellcode

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În informatică, un shellcode este un program de limbaj de asamblare care rulează în mod tradițional un shell , cum ar fi shell - ul Unix '/ bin / sh' sau shell-ul command.com pe sistemele de operare DOS și Microsoft Windows . Un shellcode poate fi folosit pentru a exploata un bug printr-un exploit , permițând unui hacker sau cracker să aibă acces la linia de comandă a unui computer sau, mai general, să execute cod arbitrar.

Descriere

Tipuri de cod de shell

Există două tipuri diferite de shellcode, local și la distanță. Distincția depinde de tipul de control pe care îl oferă executarea shellcode-ului pe mașina țintă, care poate fi locală sau la distanță (dacă se întâmplă prin rețea).

Local

Un shellcode local este folosit de un atacator care are acces limitat la mașină, dar care exploatează o vulnerabilitate a unui proces cu privilegii mai mari, de exemplu un buffer overflow, poate obține aceleași privilegii dacă executarea shellcode-ului are succes.

la distanta

Shellcode-ul la distanță este folosit în schimb atunci când un atacator dorește să exploateze o vulnerabilitate a unui proces al unei alte mașini din rețeaua locală sau de pe un intranet. Dacă Shellcode este executat corect, acesta returnează controlul mașinii țintă prin rețea. Codurile shell de la distanță utilizează în mod normal standardul de soclu TCP / IP pentru a permite accesul la shell-ul mașinii țintă. Alte distincții pot fi clasificate în funcție de metoda prin care se stabilește conexiunea. Dacă shellcode-ul în sine poate stabili conexiunea, acest lucru se numește „shell invers” sau cod de shell de conectare , deoarece codul de shell care rulează pe mașina la distanță se conectează la mașina atacatorului. Dacă, pe de altă parte, atacatorul trebuie să creeze conexiunea, shellcode-ul se numește bindshell , deoarece shellcode se leagă de un anumit port, care va fi folosit de atacator pentru a conecta și controla mașina țintă. Un al treilea tip de cod de shell, mai puțin obișnuit, este codul de shell reutilizat prin socket . Acest tip de shellcode este de obicei utilizat atunci când un exploit stabilește o conexiune la procesul vulnerabil care nu este închis înainte de executarea shellcode-ului. Shellcode-ul poate reutiliza această conexiune pentru a comunica cu atacatorul. Socket-ul de reutilizare a shellcode-ului este mai complex de implementat, deoarece shellcode-ul trebuie să identifice ce conexiune poate folosi (dintre cele posibile deschise pe aparat). [1] Un firewall poate fi utilizat pentru a identifica conexiunile de ieșire realizate de un shellcode de conectare și o tentativă de conexiune de intrare a unui bindshell. Paravanul de protecție poate oferi protecție suplimentară împotriva unui atacator, chiar dacă sistemul este vulnerabil, prin prevenirea preventivă a accesului la shell-ul creat prin executarea shellcode-ului. Acesta este unul dintre motivele pentru care se utilizează uneori un soclu care reutilizează shellcode-ul, deoarece nu creează conexiuni noi este mai dificil de identificat și blocat.

Descărcați și executați

Descărcarea și executarea este un tip de shellcode la distanță care efectuează o descărcare și execută o formă de malware pe sistemul țintă. Acest tip de shellcode nu creează un shell, dar instruiește mașina să descarce un anumit fișier executabil din rețea, să îl salveze pe disc și apoi să îl ruleze. În zilele noastre, este folosit în mod obișnuit în atacurile de descărcare drive-by , atunci când o victimă vizitează un site rău intenționat care încearcă să inițieze o descărcare și să execute un shellcode pentru a instala software pe computerul victimei. O variantă a acestui tip de shellcode este „descărcați și încărcați o bibliotecă”. [2] [3] Avantajele acestei tehnici constau în faptul că codul shellcode poate fi mai mic, nu necesită crearea unui nou proces pe mașina țintă și că codul shell nu trebuie să implementeze cod pentru curățarea procesului vizat, dar acest lucru se poate face dintr-o bibliotecă încărcată în proces.

În scenă

Când cantitatea de date pe care un atacator o poate injecta într-un proces țintă este prea mică pentru ca shellcode-ul să ruleze corect, aceasta poate fi rulată în etape. În primul rând, se execută o mică bucată de shellcode (etapa 1). Acest cod aruncă o parte mai mare din shellcode (faza 2) în memoria procesului și îl rulează.

Vanatoare de oua

Egg-hunt este un alt tip de cod shell shell. Este folosit atunci când un atacator are capacitatea de a introduce un shellcode mare într-un proces, dar nu poate determina unde va fi plasat în memorie. Apoi, o mică vânătoare de ouă este introdusă în proces într-o locație previzibilă și apoi executată. Codul caută în spațiul de memorie un cod shell mai mare (oul) și îl execută.

Omletă

Acest tip de shellcode este similar cu vânătoarea de ouă, dar caută blocuri mai mici (ouă) și le recombină într-unul mai mare (omletă) care se execută ulterior. Această tehnică este utilizată atunci când un atacator este limitat, dintr-un anumit motiv, la inserarea unor blocuri mici de date în proces. [4]

Operațiune

Strategia de execuție Shellcode

Un exploit inserează în mod obișnuit un cod shell în procesul țintă înainte sau în același timp cu apariția unui exploat de vulnerabilitate, pentru a obține controlul asupra contorului programului . Contorul programului este îndreptat spre a indica codul shell care urmează să fie executat. Injectarea codului shell se face adesea prin stocarea codului în datele trimise prin rețea către procesul vulnerabil, făcându-l disponibil într-un fișier care este citit de proces sau prin linia de comandă sau variabilele de mediu în cazul exploatărilor locale.

Codificare Shellcode

Deoarece multe procese filtrează sau limitează datele care pot fi introduse, deseori codul shell trebuie scris pentru a depăși aceste restricții, făcând codul mic, lipsit de valori nul sau de caractere alfanumerice. S-au găsit mai multe soluții pentru a ocoli aceste restricții:

  • Proiectare implementare și optimizări pentru a reduce dimensiunea shellcode-ului.
  • Modificări de implementare pentru a ocoli limitările din gama de octeți utilizați în shellcode.
  • Cod auto-modificat care modifică numărul de octeți ai codului său înainte de a-i executa, pentru a recrea octeți care nu pot fi în mod normal introduși în proces.

Deoarece instrumentele de detectare a intruziunilor pot identifica semnătura codurilor simple de shell trimise prin rețea, acestea sunt codificate și realizate cu autodecriptare sau polimorfe pentru a evita recunoașterea.

Codificare procentuală

Exploatările care vizează browserele codifică în mod obișnuit codul shell într-un șir JavaScript folosind notație de codare procentuală sau codare URL, scăpând de „\ uXXXX” sau folosind entitate . Unele exploatări fac o ofensare suplimentară a codului shell codat cu șir pentru a evita detectarea de către instrumentele IDS . De exemplu, pe o arhitectură IA-32 , două instrucțiuni NOP (fără operație) au acest formular înainte de a fi codate.

 90 NOP
90 NOP

Acestea sunt codificate într-un șir cu procentaj de codificare. (folosind metoda unescape () pentru decodare)

 unescape („% u9090”);

Apoi este codificat în notația „\ uXXXX”:

 "\ u9090";

Și în cele din urmă în codificarea entității.

 "& # x9090;"

sau

 "& # 37008;"

Null-Shellcode

Multe coduri de shell sunt scrise fără a utiliza octeți nuli , deoarece sunt concepute pentru a fi inserate în procesul țintă printr-un șir terminat nul. Când este copiat un șir terminat nul, copia va include primul caracter nul , dar octeții care urmează nu vor fi procesați. Atunci când codul shell care conține nul este introdus în acest mod, doar o porțiune din shellcode va fi inserată, ceea ce îl face imposibil de executat ulterior. Pentru a produce un shellcode fără zero, începând cu unul care conține octeți nul, instrucțiunile mașinii care conțin zero pot fi înlocuite cu instrucțiuni care produc același efect, dar nu au octeți nul. De exemplu, pe o arhitectură IA-32 această înlocuire ar putea fi efectuată:

 B8 01000000 MOV EAX, 1 // Setați registrul EAX la 0x000000001

această declarație conține zerouri ca parte a literalului (1 este extins ca 0x000000001) cu aceste declarații:

 33C0 XOR EAX, EAX // Setați registrul EAX la 0x000000000
40 INC EAX // Creșteți valoarea EAX la 0x00000001

care au același efect, dar necesită mai puțini octeți pentru codificare și sunt nule octeți liberi.

Coduri shell alfanumerice și imprimabile

În anumite circumstanțe, un proces țintă poate filtra toți octeții din shellcode-ul introdus care nu pot fi printate sau alfanumerice. În aceste condiții, gama de instrucțiuni care pot fi utilizate pentru a scrie un shellcode devine foarte limitată. O soluție la această problemă a fost publicată de Rix în Phrack 57 [5] unde se arată cum este posibil să se convertească orice tip de cod într-unul alfanumeric. O tehnică utilizată pe scară largă este de a crea cod auto-modificat, deoarece acest lucru permite codului să-și modifice propriii octeți pentru a include alții care nu sunt printre cei permiși și pentru a extinde gama de instrucțiuni utilizabile. Cu acest tip de truc, un decodor auto-modificabil poate fi creat inițial folosind numai octeți în intervalul permis. Când rulează shellcode-ul de ieșire, decodificatorul își poate modifica propriul cod pentru a putea utiliza orice instrucțiune necesară pentru a-i permite să funcționeze corect și, în același timp, să decodeze codul shell original. După efectuarea decodificării, decodificatorul transferă controlul către shellcode, astfel încât să poată rula normal. S-a arătat cum este posibil să se creeze coduri shell de complexitate arbitrară care seamănă cu textul normal în limba engleză. [6]

Cod shell shell Unicode-proof

Multe programe moderne folosesc codarea șirurilor în format Unicode pentru a permite internalizarea textului. De multe ori aceste programe convertesc șirurile ASCII de intrare înainte de a le prelucra. Șirurile Unicode codate în UTF-16 folosesc doi octeți pentru a decoda fiecare caracter (sau patru octeți pentru unele caractere speciale). Când un șir ASCII este convertit în UTF-16, un octet zero este inserat după fiecare octet al șirului original. Obscu arătat în Phrack 61 [7] că este posibil să se scrie shellcodes care poate executa în mod corect , chiar și după această transformare. Există programe care pot schimba automat fiecare shellcode într-unul codificat de UTF-16 și se bazează pe același principiu ca un decodor auto-modificator care decodează shellcode-ul original.

Platforme

Multe coduri shell sunt scrise în codul mașinii datorită nivelului scăzut la care vulnerabilitatea devine exploatabilă. Shellcode-ul este adesea creat pentru a ataca o combinație specifică de procesor, sistem de operare și service pack, care sunt denumite în mod obișnuit o platformă. Pentru unele exploatări, datorită constrângerilor impuse de procesul țintă, este necesar să se creeze un shellcode specific. Cu toate acestea, nu este întotdeauna posibil ca un shellocde să funcționeze pentru exploatări multiple, service pack-uri, sisteme de operare și, eventual, procesoare. [8] O versatilitate poate fi dată de crearea diferitelor versiuni ale shellcode-ului, pe baza diverselor platforme care urmează să fie atacate și prin crearea unui antet care identifică versiunea corectă pentru platforma utilizată. Când este executat, codul se comportă diferit în funcție de platformă și este capabil să execute versiunea corectă a shellcode-ului.

Notă

  1. ^ BHA, Shellcode / Socket-reuse , pe blackhatlibrary.net , 6 iunie 2013. Accesat pe 7 iunie 2013 .
  2. ^ SkyLined, Download and LoadLibrary shellcode lansat , pe skypher.com , 11 ianuarie 2010. Accesat la 19 ianuarie 2010 (arhivat din original la 23 ianuarie 2010) .
  3. ^ SkyLined, Descărcare și LoadLibrary shellcode pentru x86 Windows , la code.google.com , 11 ianuarie 2010. Accesat la 19 ianuarie 2010 .
  4. ^ SkyLined, cod de coajă de omletă w32 SEH , la skypher.com . Accesat la 19 martie 2009. Arhivat din original la 23 martie 2009 .
  5. ^ Rix, Writing ia32 alhanumeric shellcodes , phrack.org , Phrack , 8 noiembrie 2001. Accesat la 29 februarie 2008 .
  6. ^ Joshua Mason, Small, Sam, Monrose, Fabian și MacManus, Greg, English Shellcode ( PDF ), cs.jhu.edu , noiembrie 2009. Accesat la 10 ianuarie 2010 .
  7. ^ Obscou, Building IA32 'Unicode-Proof' Shellcodes , phrack.org , Phrack , 13 august 2003. Adus pe 29 februarie 2008 .
  8. ^ Eugene, Architecture Spanning Shellcode , phrack.org , Phrack , 11 august 2001. Accesat la 29 februarie 2008 .

Elemente conexe

linkuri externe

Securitate IT Portal de securitate IT : accesați intrările Wikipedia care se ocupă cu securitatea IT