Skallkode
I informatikk er en shellcode et assembly- språkprogram som tradisjonelt kjører et shell , for eksempel Unix-skallet '/bin/sh' eller command.com -skallet på DOS- og Microsoft Windows - operativsystemer . En shellcode kan brukes til å utnytte en feil gjennom en utnyttelse , slik at en hacker eller cracker får tilgang til kommandolinjen til en datamaskin , eller mer generelt for å kjøre kode . vilkårlig.
Beskrivelse
Skjellkodetyper
Det finnes to forskjellige typer shellcode, lokal og ekstern. Skillet avhenger av typen kontroll som kjøringen av skallkoden gir på målmaskinen, som kan være lokal eller ekstern (hvis det skjer over nettverket).
Lokal
En lokal skallkode brukes av en angriper som har begrenset tilgang til maskinen, men som utnytter en sårbarhet i en prosess med høyere rettigheter, for eksempel en bufferoverflyt, kan få de samme rettighetene hvis utføringen av skallkoden er vellykket. .
Ekstern
Den eksterne skallkoden brukes i stedet når en angriper ønsker å utnytte en sårbarhet i en prosess på en annen maskin på det lokale nettverket eller på et intranett. Hvis Shellcode er utført på riktig måte, returnerer den kontroll over målmaskinen over nettverket. Eksterne skallkoder bruker normalt standard TCP/IP -socket for å gi tilgang til målmaskinens skall. Ytterligere distinksjoner kan klassifiseres i henhold til metoden som forbindelsen etableres på. Hvis det er selve skallkoden som kan etablere forbindelsen, kalles dette et "omvendt skall" eller tilbakekoblingsskallkode , fordi skallkoden som kjører på den eksterne maskinen kobles til angriperens maskin. Hvis angriperen derimot trenger å opprette forbindelsen, kalles shellcode bindshell , da shellcode binder seg til en bestemt port, som vil bli brukt av angriperen for å koble til og kontrollere målmaskinen. En tredje, mindre vanlig type shellcode er socket-reuse shellcode. Denne typen skallkode brukes vanligvis når en utnyttelse etablerer en forbindelse til den sårbare prosessen som ikke lukkes før skallkoden kjøres. Skallkoden kan gjenbruke denne tilkoblingen for å kommunisere med angriperen. Socket gjenbruk shellcode er mer kompleks å implementere, fordi shellcode må identifisere hvilken tilkobling den kan bruke (blant de mulige som er åpne på maskinen). [1] En brannmur kan brukes til å identifisere utgående tilkoblinger laget av en tilbakekoblingsshellkode og et bindshells forsøk på inngående tilkobling. Brannmuren kan gi ekstra beskyttelse mot en angriper, selv om systemet er sårbart, ved å forhindre tilgang til skallet som er opprettet ved å kjøre skallkoden. Dette er en av grunnene til at en socket som gjenbruker shellcode noen ganger brukes, fordi det å ikke opprette nye tilkoblinger er vanskeligere å identifisere og blokkere.
Last ned og utfør
Last ned og kjør er en type ekstern skallkode som utfører en nedlasting og utfører en form for skadelig programvare på målsystemet. Denne typen skallkode lager ikke et skall, men instruerer maskinen til å laste ned en bestemt kjørbar fil fra nettverket, lagre den på disk og deretter kjøre den. I dag er det ofte brukt i drive-by-nedlastingsangrep , når et offer besøker et ondsinnet nettsted som prøver å starte en nedlasting og kjøre en shellcode for å installere programvare på offermaskinen. En variant av denne typen skallkode er "last ned og laster et bibliotek". [2] [3] Fordelene med denne teknikken er at shellcode-koden kan være mindre, den krever ikke opprettelse av en ny prosess på målmaskinen, og at shellcode ikke trenger å implementere koden for å rense målmaskinen. prosess , men dette kan gjøres fra et bibliotek som er lastet inn i prosessen.
Iscenesatt
Når mengden data som en angriper kan injisere i en målprosess er for liten til at shellcode kan kjøres riktig, kan den kjøres i etapper. Først blir et lite stykke skallkode (trinn 1) utført. Denne koden dumper en større del av skallkoden (fase 2) inn i prosessens minne og kjører den.
Eggjakt
Eggjakt er en annen type faset skallkode. Den brukes når en angriper har muligheten til å sette inn en stor skallkode i en prosess, men ikke kan bestemme hvor i minnet den skal plasseres. Deretter blir en liten eggjakt satt inn i prosessen på et forutsigbart sted og deretter utført. Koden søker i minneplassen etter en større skallkode (egget) og utfører den.
Omelett
Denne typen skallkode ligner på eggjakt, men søker etter mindre blokker (egg) og kombinerer dem til en større (omelett) som deretter utføres. Denne teknikken brukes når en angriper av en eller annen grunn er begrenset til å sette inn små blokker med data i prosessen. [4]
Operasjon
Shellcode-utførelsesstrategi
En utnyttelse setter vanligvis inn en shellcode i målprosessen før eller samtidig som en sårbarhetsutnyttelse oppstår, for å få kontroll over programtelleren . Programtelleren er rettet til å peke på skallkoden som skal utføres. Å injisere skallkoden gjøres ofte ved å lagre koden i dataene som sendes over nettverket til den sårbare prosessen, og gjøre den tilgjengelig i en fil som leses av prosessen eller gjennom kommandolinjen eller miljøvariabler i tilfelle lokale utnyttelser.
Skjellkodekoding
Siden mange prosesser filtrerer eller begrenser dataene som kan legges inn, må ofte skallkoden skrives for å overvinne disse begrensningene, noe som gjør koden liten, fri for null eller alfanumeriske tegn. Det er funnet flere løsninger for å omgå disse restriksjonene:
- Design- og implementeringsoptimaliseringer for å redusere størrelsen på skallkode.
- Implementeringsendringer for å omgå begrensninger i rekkevidden av byte som brukes i skallkoden.
- Selvmodifiserende kode som endrer antall byte i koden før de utføres, for å gjenskape byte som normalt ikke kan settes inn i prosessen.
Siden inntrengningsdeteksjonsverktøy kan identifisere signaturen til enkle skallkoder som sendes over nettverket, blir de kodet og gjort selvdekryptering eller polymorfe for å unngå å bli gjenkjent.
Prosentkoding
Utnytter målrettingsnettlesere koder vanligvis shellcode inn i en JavaScript-streng ved hjelp av prosentkoding eller URL-kodingsnotasjon, escape "\ uXXXX" eller ved hjelp av entitet . Noen utnyttelser gjør ytterligere tilsløring av den strengkodede skallkoden for å unngå å bli oppdaget av IDS -verktøy . For eksempel, på en IA-32- arkitektur har to (ingen-operasjon) instruksjoner NOPdette skjemaet før de kodes.
90 NOK 90 NOK
De er kodet i en streng med prosentkoding. (ved å bruke unescape ()-metoden for dekoding)
unescape ("% u9090");
Den blir deretter kodet i notasjonen "\ uXXXX":
"\ u9090";
Og til slutt i enhetskodingen.
"& # x9090;"
eller
"& # 37008;"
Shellcode Null-Free
Mange shell-koder er skrevet uten å bruke null - byte , fordi de er designet for å settes inn i målprosessen gjennom en null-terminert streng. Når en nullterminert streng kopieres, vil kopien inkludere det første nulltegnet , men bytene etter dette vil ikke bli behandlet. Når skallkoden som inneholder null er skrevet inn på denne måten, vil bare en del av skallkoden bli satt inn, noe som gjør at den ikke kan kjøres senere. For å produsere en nullfri skallkode som starter med en som inneholder nullbyte, kan maskininstruksjoner som inneholder nuller erstattes med instruksjoner som gir samme effekt, men som ikke har nullbyte. For eksempel på en IA-32- arkitektur kan denne erstatningen utføres:
B8 01000000 MOV EAX, 1 // Sett EAX register til 0x000000001
denne setningen inneholder nuller som en del av bokstaven (1 utvides som 0x000000001) med disse setningene:
33C0 XOR EAX, EAX // Sett EAX-registeret til 0x000000000 40 INC EAX // Øk EAX-verdien til 0x00000001
som har samme effekt, men krever færre byte for koding og er null-byte gratis.
Alfanumeriske og utskrivbare skallkoder
Under visse omstendigheter kan en målprosess filtrere ut alle byte fra den angitte skallkoden som ikke er utskrivbare eller alfanumeriske. Under disse forholdene blir utvalget av instruksjoner som kan brukes til å skrive en shellcode svært begrenset. En løsning på dette problemet er publisert av Rix i Phrack 57 [5] hvor det er vist hvordan det er mulig å konvertere en hvilken som helst type kode til en alfanumerisk. En mye brukt teknikk er å lage selvmodifiserende kode, fordi dette lar koden modifisere sine egne byte for å inkludere andre som ikke er inkludert blant de tillatte og for å utvide utvalget av brukbare instruksjoner. Med denne typen triks kan en selvmodifiserende dekoder i utgangspunktet opprettes ved å bruke bare byte innenfor det tillatte området. Når den utgående skallkoden går i kjøring, kan dekoderen modifisere koden for å kunne bruke hvilken som helst nødvendig instruksjon for å la den fungere korrekt og samtidig fortsette å dekode den originale skallkoden. Etter å ha utført dekodingen, overfører dekoderen kontrollen til skallkoden, slik at den kan kjøre normalt. Det er vist hvordan det er mulig å lage skallkoder med vilkårlig kompleksitet som ligner vanlig engelsk tekst. [6]
Unicode tegnsikker skallkode
Mange moderne programmer bruker strengkoding i Unicode-format for å tillate internalisering av tekst. Ofte konverterer disse programmene ASCII-inndatastrengene før de behandles. Unicode-strenger kodet i UTF-16 bruker to byte for å dekode hvert tegn (eller fire byte for noen spesialtegn). Når en ASCII -streng konverteres til UTF-16, settes en null byte inn etter hver byte av den opprinnelige strengen. Obscu viste i Phrack 61 [7] at det er mulig å skrive skallkoder som kan utføres riktig selv etter denne transformasjonen. Det finnes programmer som automatisk kan endre hver skallkode til en kodet av UTF-16 og er basert på samme prinsipp som en selvmodifiserende dekoder som dekoder den originale skallkoden.
Plattformer
Mange shell-koder er skrevet i maskinkode på grunn av det lave nivået hvor sårbarheten kan utnyttes. Skallkoden lages ofte for å angripe en spesifikk kombinasjon av prosessor, operativsystem og oppdateringspakke, som ofte refereres til som en plattform. For noen utnyttelser, på grunn av begrensningene som er pålagt av målprosessen, er det nødvendig å lage en spesifikk skallkode. Det er imidlertid ikke alltid mulig for en shellocde å fungere for flere utnyttelser, oppdateringspakker, operativsystemer og muligens prosessorer. [8] En allsidighet kan gis ved å lage ulike versjoner av skallkoden, basert på de ulike plattformene som skal angripes og lage en header som identifiserer riktig versjon for plattformen som er i bruk. Når den kjøres, oppfører koden seg forskjellig etter plattform og er i stand til å kjøre den riktige versjonen av skallkoden.
Merknader
- ^ BHA, Shellcode / Socket-reuse , på blackhatlibrary.net , 6. juni 2013. Hentet 7. juni 2013 .
- ^ Skylined, Last ned og LoadLibrary shellcode utgitt , på skypher.com , 11. januar 2010. Hentet 19. januar 2010 (arkivert fra originalen 23. januar 2010) .
- ^ Skylined, Last ned og LoadLibrary-skallkode for x86 Windows , på code.google.com , 11. januar 2010. Hentet 19. januar 2010 .
- ^ Skylined, w32 SEH omelett shellcode , på skypher.com , 16. mars 2009. Hentet 19. mars 2009 (arkivert fra originalen 23. mars 2009) .
- ^ Rix, Writing ia32 alphanumeric shellcodes , phrack.org , Phrack, 8. november 2001. Hentet 29. februar 2008 .
- ^ Joshua Mason, Small, Sam, Monrose, Fabian og MacManus, Greg, English Shellcode ( PDF ), cs.jhu.edu , november 2009. Hentet 10. januar 2010 .
- ^ Obscou, Building IA32 'Unicode-Proof' Shellcodes , phrack.org , Phrack, 13. august 2003. Hentet 29. februar 2008 .
- ^ Eugene, Architecture Spanning Shellcode , phrack.org , Phrack, 11. august 2001. Hentet 29. februar 2008 .
Relaterte elementer
- Bufferoverløp
- Heap overflow
- IT-sikkerhet
- montering
- selvmodifiserende kode
- inntrengningsdeteksjonssystem
Eksterne lenker
- Shell-Storm.org Multi-plattform shellcodes database.
- https://web.archive.org/web/20080302111910/http://www.metasploit.com/shellcode/ Inneholder x86 og ikke - x86 shellcode eksempler og et online grensesnitt for automatisk generering og koding av shellcode.
- http://www.vividmachines.com/shellcode/shellcode.html Veiledning om skallkoder i Windows og Linux med trinnvise eksempler.
- http://www.orkspace.net/software/libShellCode/ åpen kildekode - bibliotek for automatisk opprettelse av ShellCode. Den kan brukes til å lage dynamiske ShellCodes i en utnyttelse eller til å lage statiske ShellCodes ved bruk av en grensesnitt .