close

Shellkode

Hop til navigation Hop til søgning

Inden for datalogi er en shellcode et assemblersprogsprogram , der traditionelt kører en shell , såsom Unix-skallen '/bin/sh' eller kommando.com -skallen på DOS- og Microsoft Windows -operativsystemer . En shellcode kan bruges til at udnytte en fejl gennem en udnyttelse , så en hacker eller cracker får adgang til kommandolinjen på en computer , eller mere generelt til at udføre kode .vilkårlig.

Beskrivelse

Skalkodetyper

Der er to forskellige typer shellcode, lokal og ekstern. Forskellen afhænger af den type kontrol, som shellcode-udførelsen giver på målmaskinen, som kan være lokal eller ekstern (hvis det sker over netværket).

Lokal

En lokal shell-kode bruges af en hacker, der har begrænset adgang til maskinen, men som udnytter en sårbarhed i en proces med højere rettigheder, for eksempel et bufferoverløb, kan opnå de samme privilegier, hvis shellcode-udførelsen er vellykket. .

Fjernbetjening

Den eksterne shell-kode bruges i stedet, når en hacker ønsker at udnytte en sårbarhed i en proces på en anden maskine på det lokale netværk eller på et intranet. Hvis Shell-koden udføres korrekt, returnerer den kontrol over målmaskinen over netværket. Eksterne shellkoder bruger normalt standard TCP/IP- socket for at give adgang til målmaskinens shell. Yderligere distinktioner kan klassificeres efter den metode, hvormed forbindelsen etableres. Hvis det er selve shellkoden, der kan etablere forbindelsen, kaldes dette en "reverse shell" eller connect-back shellkode, fordi shellkoden, der kører på den eksterne maskine, forbinder til angriberens maskine. Hvis angriberen derimod skal oprette forbindelsen, kaldes shellkoden bindshell , da shellkoden binder til en bestemt port, som vil blive brugt af angriberen til at forbinde og styre målmaskinen. En tredje, mindre almindelig type shellcode er socket-genbrug shellcode. Denne type shellkode bruges normalt, når en udnyttelse etablerer en forbindelse til den sårbare proces, der ikke lukkes, før shellkoden udføres. Shellkoden kan genbruge denne forbindelse til at kommunikere med angriberen. Socket-genbrugsshellkoden er mere kompleks at implementere, fordi shellkoden skal identificere, hvilken forbindelse den kan bruge (blandt de mulige åbne på maskinen). [1] En firewall kan bruges til at identificere udgående forbindelser lavet af en connect-back shellkode og en bindshells forsøg på indgående forbindelse. Firewallen kan yde yderligere beskyttelse mod en hacker, selvom systemet er sårbart, ved forebyggende at forhindre adgang til den shell, der er oprettet ved at udføre shellkoden. Dette er en af ​​grundene til, at en socket, der genbruger shell-kode, nogle gange bruges, fordi det er vanskeligere at identificere og blokere ikke at oprette nye forbindelser.

Download og udfør

Download og kør er en type ekstern shellcode, der udfører en download og udfører en form for malware på målsystemet. Denne type shellcode opretter ikke en shell, men instruerer maskinen i at downloade en bestemt eksekverbar fil fra netværket, gemme den på disken og derefter køre den. I dag er det almindeligt brugt i drive-by download- angreb , når et offer besøger et ondsindet websted, der forsøger at starte en download og udføre en shellcode for at installere software på offermaskinen. En variation af denne type shellcode er "download og indlæser et bibliotek". [2] [3] Fordelene ved denne teknik er, at shellcode-koden kan være mindre, den kræver ikke oprettelse af en ny proces på målmaskinen, og at shellcode ikke behøver at implementere koden til at rense den målrettede proces , men dette kan gøres fra et bibliotek indlæst i processen.

Iscenesat

Når mængden af ​​data, som en angriber kan injicere i en målproces, er for lille til, at shellkoden kan køre korrekt, kan den køres i etaper. Først udføres et lille stykke shellcode (trin 1). Denne kode dumper en større del af shellkoden (fase 2) ind i processens hukommelse og kører den.

Æggejagt

Æggejagt er en anden type trinvis shellcode. Det bruges, når en angriber har evnen til at indsætte en stor shellkode i en proces, men ikke kan bestemme, hvor i hukommelsen den vil blive placeret. Derefter indsættes en lille æggejagt i processen på et forudsigeligt sted og derefter udføres. Koden søger i hukommelsespladsen efter en større skalkode (ægget) og udfører den.

Omelet

Denne type skalkode ligner æggejagt, men søger efter mindre blokke (æg) og kombinerer dem igen til en større (omelet), som derefter udføres. Denne teknik bruges, når en angriber af en eller anden grund er begrænset til at indsætte små datablokke i processen. [4]

Operation

Shellcode-udførelsesstrategi

En udnyttelse indsætter almindeligvis en shell-kode i målprocessen før eller samtidig med en sårbarhedsudnyttelse, for at få kontrol over programtælleren . Programtælleren er rettet til at pege på den shell-kode, der skal udføres. Injektion af shell-koden sker ofte ved at gemme koden i de data, der sendes over netværket til den sårbare proces, hvilket gør den tilgængelig i en fil, der læses af processen eller gennem kommandolinjen eller miljøvariabler i tilfælde af lokale udnyttelser.

Shellcode-kodning

Da mange processer filtrerer eller begrænser de data, der kan indtastes, skal shellkoden ofte skrives for at overvinde disse begrænsninger, hvilket gør koden lille, fri for null eller alfanumeriske tegn. Der er fundet flere løsninger til at omgå disse begrænsninger:

  • Design- og implementeringsoptimeringer for at reducere størrelsen af ​​shellcode.
  • Implementeringsændringer for at omgå begrænsninger i rækken af ​​bytes, der bruges i shellkoden.
  • Selvmodificerende kode , der ændrer antallet af bytes i sin kode, før de udføres, for at genskabe bytes, der normalt ikke kan indsættes i processen.

Da værktøjer til registrering af indtrængen kan identificere signaturen af ​​simple shellkoder, der sendes over netværket, kodes de og gøres selvdekryptering eller polymorfe for at undgå at blive genkendt.

Procentkodning

Udnytter målretningsbrowsere koder almindeligvis shell-kode ind i en JavaScript-streng ved hjælp af procent- eller URL-kodningsnotation, escaping "\ uXXXX" eller ved hjælp af entity . Nogle udnyttelser gør yderligere sløring af den strengkodede shellcode for at undgå at blive opdaget af IDS -værktøjer . For eksempel på en IA-32- arkitektur har to (ingen betjening) instruktioner NOPdenne form, før de kodes.

90 kr
90 kr

De er kodet i en streng med procent-kodning. (ved at bruge unescape () metoden til afkodning)

unescape ("% u9090");

Det er derefter kodet i notationen "\ uXXXX":

"\ u9090";

Og endelig i entitetskodningen.

"& # x9090;"

eller

"& # 37008;"

Shellcode Null-Free

Mange shell-koder er skrevet uden at bruge null- bytes , fordi de er designet til at blive indsat i målprocessen gennem en null-termineret streng. Når en null-termineret streng kopieres, vil kopien indeholde det første null-tegn , men bytes efter dette vil ikke blive behandlet. Når shell-koden, der indeholder nullen, indtastes på denne måde, vil kun en del af shell-koden blive indsat, hvilket gør den ude af stand til at udføre senere. For at producere en nul- fri shellkode , der starter med en, der indeholder nul-bytes, kan maskininstruktioner, der indeholder nuller, erstattes med instruktioner, der producerer den samme effekt, men som ikke har nogen null-bytes. For eksempel på en IA-32- arkitektur kunne denne udskiftning udføres:

B8 01000000     MOV EAX, 1 // Indstil EAX register til 0x000000001

denne sætning indeholder nuller som en del af det bogstavelige (1 er udvidet som 0x000000001) med disse sætninger:

33C0            XOR EAX, EAX // Indstil EAX-registret til 0x000000000
40              INC EAX // Øg EAX-værdien til 0x00000001

som har samme effekt, men kræver færre bytes til kodning og er null bytes fri.

Alfanumeriske og printbare skalkoder

Under visse omstændigheder kan en målproces filtrere alle bytes fra den indtastede shellkode, som ikke kan udskrives eller alfanumerisk. Under disse forhold bliver rækken af ​​instruktioner, der kan bruges til at skrive en shell-kode, meget begrænset. En løsning på dette problem er blevet offentliggjort af Rix i Phrack 57 [5] , hvor det er vist, hvordan det er muligt at konvertere enhver type kode til en alfanumerisk. En udbredt teknik er at skabe selvmodificerende kode, fordi dette tillader koden at ændre sine egne bytes til at inkludere andre, der ikke er inkluderet blandt de tilladte, og for at udvide rækken af ​​brugbare instruktioner. Med denne form for trick kan en selvmodificerende dekoder i starten oprettes ved kun at bruge bytes inden for det tilladte område. Når den udgående shellcode går i eksekvering, kan dekoderen ændre sin kode for at kunne bruge enhver påkrævet instruktion for at tillade den at fungere korrekt og samtidig fortsætte med at afkode den originale shellcode. Efter at have foretaget afkodningen, overfører dekoderen kontrol til shell-koden, så den kan køre normalt. Det er blevet vist, hvordan det er muligt at skabe shell-koder af vilkårlig kompleksitet, der ligner normal engelsk tekst. [6]

Unicode tegnsikker shellcode

Mange moderne programmer bruger strengkodning i Unicode-format for at tillade tekstinternalisering. Ofte konverterer disse programmer input-ASCII-strengene, før de behandles. Unicode-strenge kodet i UTF-16 bruger to bytes til at afkode hvert tegn (eller fire bytes for nogle specialtegn). Når en ASCII - streng konverteres til UTF-16, indsættes en nulbyte efter hver byte af den originale streng. Obscu viste i Phrack 61 [7] at det er muligt at skrive shell-koder, der kan udføres korrekt selv efter denne transformation. Der er programmer, der automatisk kan ændre hver shellcode til en kodet af UTF-16 og er baseret på samme princip som en selvmodificerende dekoder, der afkoder den originale shellcode.

Platforme

Mange shell-koder er skrevet i maskinkode på grund af det lave niveau, hvor sårbarheden bliver udnyttelig. Shellkoden er ofte skabt til at angribe en specifik kombination af processor, operativsystem og service pack, som almindeligvis omtales som en platform. For nogle udnyttelser er det på grund af de begrænsninger, der pålægges af målprocessen, nødvendigt at oprette en specifik shell-kode. Det er dog ikke altid muligt for en shellocde at arbejde for flere exploits, service packs, operativsystemer og muligvis processorer. [8] En alsidighed kan gives ved at oprette forskellige versioner af shellcode, baseret på de forskellige platforme, der skal angribes, og ved at skabe en header, der identificerer den korrekte version for platformen i brug. Når den udføres, opfører koden sig forskelligt efter platform og er i stand til at udføre den korrekte version af shellkoden.

Noter

  1. ^ BHA, Shellcode / Socket-reuse , på blackhatlibrary.net , 6. juni 2013. Hentet 7. juni 2013 .
  2. ^ Skylined, Download og LoadLibrary shellcode udgivet , på skypher.com , 11. januar 2010. Hentet 19. januar 2010 (arkiveret fra originalen 23. januar 2010) .
  3. ^ Skylined, Download og LoadLibrary shellcode til x86 Windows , på code.google.com , 11. januar 2010. Hentet 19. januar 2010 .
  4. ^ Skylined, w32 SEH omelet shellcode , på skypher.com , 16. marts 2009. Hentet 19. marts 2009 (arkiveret fra originalen 23. marts 2009) .
  5. ^ Rix, Writing ia32 alphanumeric shellcodes , phrack.org , Phrack, 8. november 2001. Hentet 29. februar 2008 .
  6. ^ Joshua Mason, Small, Sam, Monrose, Fabian og MacManus, Greg, engelsk Shellcode ( PDF ), cs.jhu.edu , november 2009. Hentet 10. januar 2010 .
  7. ^ Obscou, Building IA32 'Unicode-Proof' Shellcodes , phrack.org , Phrack, 13. august 2003. Hentet 29. februar 2008 .
  8. ^ Eugene, Architecture Spanning Shellcode , phrack.org , Phrack, 11. august 2001. Hentet 29. februar 2008 .

Relaterede emner

Eksterne links