Shellcode - Shellcode
I hacking , en shellcode er et lille stykke kode, der bruges som nyttelast i udnyttelsen af en software sårbarhed . Det kaldes "shellcode", fordi det typisk starter en kommandoskal, hvorfra angriberen kan styre den kompromitterede maskine, men ethvert stykke kode, der udfører en lignende opgave, kan kaldes shellcode. Fordi funktionen af en nyttelast ikke er begrænset til blot at gyde en skal, har nogle antydet, at navnet shellcode er utilstrækkeligt. Forsøg på at erstatte udtrykket har imidlertid ikke opnået bred accept. Shellcode skrives almindeligvis i maskinkode .
Når du opretter shellcode, er det generelt ønskeligt at gøre det både lille og eksekverbart, hvilket gør det muligt at bruge det i så mange forskellige situationer som muligt. At skrive god shellcode kan være lige så meget en kunst, som det er en videnskab. I samlingskoden kan den samme funktion udføres på en lang række måder, og der er en vis variation i længderne af opcodes, der kan bruges til dette formål; gode shellcode -forfattere kan sætte disse små opcodes i brug til at oprette mere kompakt shellcode. Nogle nåede den mindst mulige størrelse, samtidig med at de bevarede stabiliteten.
Typer af shellcode
Shellcode kan enten være lokal eller fjern , afhængigt af om den giver en angriber kontrol over den maskine, den kører på (lokal) eller over en anden maskine via et netværk (fjernbetjening).
Lokal
Lokal shellcode bruges af en angriber, der har begrænset adgang til en maskine, men kan udnytte en sårbarhed, f.eks. Et bufferoverløb , i en højere privilegeret proces på den pågældende maskine. Hvis den udføres vellykket, giver shellkoden angriberen adgang til maskinen med de samme højere rettigheder som den målrettede proces.
Fjern
Fjernbetjening shellcode bruges, når en hacker ønsker at målrette en sårbar proces, der kører på en anden maskine på et lokalt netværk , intranet , eller et eksternt netværk . Hvis den er vellykket udført, kan shellkoden give angriberen adgang til målmaskinen på tværs af netværket. Fjerntliggende shellcodes normalt bruger standard TCP / IP socket -forbindelser for at tillade hacker adgang til skallen på målet maskinen. Sådan shellcode kan kategoriseres baseret på, hvordan denne forbindelse er konfigureret: Hvis shellcode etablerer forbindelsen, kaldes den en "reverse shell" eller en connect-back shellcode, fordi shellcode forbinder tilbage til angriberens maskine. På den anden side, hvis angriberen opretter forbindelsen, kaldes shellkoden en bindshell, fordi shellkoden binder til en bestemt port på offerets maskine. Der er en ejendommelig shellcode, der hedder bindshell random port, der springer over bindingsdelen og lytter til en tilfældig port, der er tilgængelig af operativsystemet . På grund af det blev den tilfældige bindshell -port den mindste og stabile bindshell -shellkode til x86_64, der er tilgængelig til denne dato. En tredje, meget mindre almindelig type, er shell - kode genanvendelse . Denne type shellcode bruges undertiden, når en exploit etablerer en forbindelse til den sårbare proces, der ikke lukkes, før shellcode køres. Skalkoden kan derefter genbruge denne forbindelse til at kommunikere med angriberen. Socket-genbrug af shellcode er mere detaljeret, da shell-koden skal finde ud af, hvilken forbindelse der skal genbruges, og maskinen kan have mange åbne forbindelser.
En firewall kan bruges til at opdage udgående forbindelser, der er foretaget ved tilslutning af shell-kode samt indgående forbindelser foretaget af bindshells. De kan derfor tilbyde en vis beskyttelse mod en angriber, selvom systemet er sårbart, ved at forhindre angriberen i at oprette forbindelse til skallen, der er oprettet af skalkoden. Dette er en af grundene til, at socket-genbrug af shellcode nogle gange bruges: det opretter ikke nye forbindelser og er derfor sværere at opdage og blokere.
Download og udfør
Download og eksekver er en type fjernskalcode, der downloader og udfører en eller anden form for malware på målsystemet. Denne type shellcode afføder ikke en skal, men instruerer snarere maskinen i at downloade en bestemt eksekverbar fil fra netværket, gemme den på disk og udføre den. I dag er det almindeligt brugt i drive-by download- angreb, hvor et offer besøger en ondsindet webside, der igen forsøger at køre en sådan download og udføre shellcode for at installere software på offerets maskine. En variant af denne type shellcode downloader og indlæser et bibliotek . Fordelene ved denne teknik er, at koden kan være mindre, at den ikke kræver, at shell -koden skal afføde en ny proces på målsystemet, og at shell -koden ikke behøver kode for at rydde op i den målrettede proces, da dette kan udføres af bibliotek indlæst i processen.
Iscenesat
Når mængden af data, som en angriber kan injicere i målprocessen, er for begrænset til at udføre nyttig shellcode direkte, kan det være muligt at udføre det i etaper. Først udføres et lille stykke shellcode (trin 1). Denne kode downloader derefter et større stykke shellcode (fase 2) i processens hukommelse og udfører det.
Æggejagt
Dette er en anden form for iscenesat shellcode, som bruges, hvis en angriber kan injicere en større shellcode i processen, men ikke kan afgøre, hvor i processen den ender. Små ægjagt - shellkode injiceres i processen på et forudsigeligt sted og udføres. Denne kode søger derefter procesens adresserum efter den større shellcode ( ægget ) og udfører den.
Omelet
Denne type shellcode ligner æg-jagt- shellcode, men leder efter flere små blokke af data ( æg ) og rekombinerer dem til en større blok ( omeletten ), der efterfølgende udføres. Dette bruges, når en angriber kun kan injicere et antal små blokke af data i processen.
Shellcode -eksekveringsstrategi
En udnyttelse vil normalt injicere en shellcode i målprocessen før eller samtidig med at den udnytter en sårbarhed til at få kontrol over programtælleren . Programtælleren justeres til at pege på shell -koden, hvorefter den bliver udført og udfører sin opgave. Injektion af shellkoden udføres ofte ved at gemme shellkoden i data, der sendes over netværket til den sårbare proces, ved at levere den i en fil, der læses af den sårbare proces eller gennem kommandolinjen eller miljøet i tilfælde af lokale bedrifter.
Shellcode -kodning
Fordi de fleste processer filtrerer eller begrænser de data, der kan injiceres, skal shellcode ofte skrives for at tillade disse begrænsninger. Dette inkluderer at gøre koden lille, null-fri eller alfanumerisk . Der er fundet forskellige løsninger for at omgå sådanne begrænsninger, herunder:
- Design og implementeringsoptimeringer for at reducere størrelsen af shellkoden.
- Implementeringsændringer for at omgå begrænsninger i byteintervallet, der bruges i shellkoden.
- Selvmodificerende kode, der ændrer et antal bytes i sin egen kode, før de udføres for at genskabe bytes, der normalt er umulige at injicere i processen.
Da indtrængningsdetektering kan registrere signaturer af simple skalkoder, der sendes over netværket, er det ofte kodet, selvdekrypteret eller polymorft for at undgå detektion.
Kodning i procent
Udnytter denne target browsere almindeligt koder shellcode i et JavaScript streng under anvendelse af procent-kodende , escape der koder for "\ uXXXX" eller enhed koder . Nogle bedrifter tilslører også den kodede shellcode -streng yderligere for at forhindre detektering af IDS .
For eksempel om IA-32- arkitekturen ser to NOP(ingen betjenings) instruktioner sådan ud, først ukodet:
90 NOP 90 NOP
| procent-kodning |
unescape("%u9090")
|
|---|---|
| unicode bogstaveligt |
"\u9090"
|
| HTML/XML -enhed |
"邐" eller "邐"
|
Denne instruktion bruges i NOP dias .
Nul-fri skalkode
De fleste shellcodes skrives uden brug af nul bytes, fordi de er beregnet til at blive sprøjtet ind i en target proces gennem nulafsluttet strenge . Når en null-afsluttet streng kopieres, vil den blive kopieret til og med den første null, men efterfølgende bytes af shellkoden vil ikke blive behandlet. Når shellcode, der indeholder nuller, injiceres på denne måde, ville kun en del af shellcode blive injiceret, hvilket gør den ude af stand til at køre med succes.
For at producere null-fri shellcode fra shellcode, der indeholder null- bytes, kan man erstatte maskininstruktioner, der indeholder nuller, med instruktioner, der har samme effekt, men er fri for nulls. For eksempel på IA-32- arkitekturen kunne man erstatte denne instruktion:
B8 01000000 MOV EAX,1 // Set the register EAX to 0x000000001
som indeholder nuller som en del af det bogstavelige ( 1 udvides til 0x00000001 ) med disse instruktioner:
33C0 XOR EAX,EAX // Set the register EAX to 0x000000000 40 INC EAX // Increase EAX to 0x00000001
som har samme effekt, men tager færre bytes at kode og er fri for nuller.
Alfanumerisk og udskrivbar shellcode
Under visse omstændigheder filtrerer en målproces enhver byte fra den injicerede shellkode, der ikke er en udskrivbar eller alfanumerisk karakter. Under sådanne omstændigheder bliver rækkevidden af instruktioner, der kan bruges til at skrive en shellcode, meget begrænset. En løsning på dette problem blev offentliggjort af Rix i Phrack 57, hvor han viste, at det var muligt at omdanne enhver kode til alfanumerisk kode. En teknik, der ofte bruges, er at oprette selvmodificerende kode, fordi dette tillader koden at ændre sine egne bytes til at omfatte bytes uden for det normalt tilladte område og derved udvide det område af instruktioner, den kan bruge. Ved hjælp af dette trick kan der oprettes en selvmodificerende dekoder, der i første omgang kun bruger bytes i det tilladte område. Shell -kodens hovedkode er kodet, også kun ved hjælp af bytes i det tilladte område. Når output -shellkoden køres, kan dekoderen ændre sin egen kode for at kunne bruge enhver instruktion, den kræver for at fungere korrekt, og fortsætter derefter med at afkode den originale shellcode. Efter afkodning af shellkoden overfører dekoderen kontrol til den, så den kan udføres som normalt. Det er blevet vist, at det er muligt at oprette vilkårligt kompleks shellcode, der ligner normal tekst på engelsk.
Unicode -bevis shellkode
Moderne programmer bruger Unicode -strenge til at tillade internationalisering af tekst. Ofte vil disse programmer konvertere indgående ASCII -strenge til Unicode, før de behandles. Unicode-strenge, der er kodet i UTF-16, bruger to bytes til at kode hvert tegn (eller fire bytes for nogle specialtegn). Når en ASCII - streng ( Latin-1 generelt) transformeres til UTF-16, indsættes en nulbyte efter hver byte i den originale streng. Obscou beviste i Phrack 61, at det er muligt at skrive shellcode, der kan køre med succes efter denne transformation. Der findes programmer, der automatisk kan kode enhver shellcode til alfanumerisk UTF-16-proof shellcode, baseret på det samme princip om en lille selvmodificerende dekoder, der afkoder den originale shellcode.
Platforme
De fleste shellcode er skrevet i maskinkode på grund af det lave niveau, hvor sårbarheden udnyttes, giver en angriber adgang til processen. Shellcode oprettes derfor ofte for at målrette mod en bestemt kombination af processor , operativsystem og service pack , kaldet en platform . For nogle bedrifter skal der på grund af de begrænsninger, som målprocessen sætter shell -koden, oprettes en meget specifik shellcode. Det er imidlertid ikke umuligt for en shellcode at fungere for flere exploits, service packs, operativsystemer og endda processorer. Sådan alsidighed opnås sædvanligvis ved at oprette flere versioner af shellkoden, der er målrettet mod de forskellige platforme og oprette et overskrift, der forgrener sig til den korrekte version til den platform, koden kører på. Når den udføres, opfører koden sig forskelligt for forskellige platforme og udfører den rigtige del af shellkoden til den platform, den kører på.
Shellcode analyse
Shellcode kan ikke udføres direkte. For at analysere, hvad en shellcode forsøger at gøre, skal den indlæses i en anden proces. En almindelig analyseteknik er at skrive et lille C -program, der indeholder shellkoden som en bytebuffer, og derefter bruge en funktionsmarkør eller bruge inline assembler til at overføre eksekvering til den. En anden teknik er at bruge et onlineværktøj, såsom shellcode_2_exe, til at integrere shell-koden i en færdiglavet eksekverbar husk, som derefter kan analyseres i en standardfejlfinding. Der findes også specialiserede værktøjer til analyse af shellkode, f.eks. IDefense sclog -projektet, der oprindeligt blev udgivet i 2005 som en del af Malcode Analyst Pack. Sclog er designet til at indlæse eksterne shellcode -filer og udføre dem inden for en API -logningsramme. Der findes også emuleringsbaserede værktøjer til analyse af shellkode, f.eks. Den sctest -applikation, der er en del af cross -platform libemu -pakken. Et andet emuleringsbaseret shellkode -analyseværktøj, bygget op omkring libemu -biblioteket, er scdbg, som indeholder en grundlæggende fejlfindingsskal og integrerede rapporteringsfunktioner.
Se også
- Alfanumerisk kode
- Computersikkerhed
- Bufferoverløb
- Udnyttelse (computersikkerhed)
- Bunkeoverløb
- Metasploit -projekt
- Shell (computing)
- Skal skovle
- Stack bufferoverløb
- Sårbarhed (computing)
Referencer
- ^ Foster, James C .; og Price, Mike (12. april 2005). Sockets, Shellcode, Porting & Coding: Reverse Engineering Exploits og Tool Coding for Security Professionals . Elsevier videnskab og teknologi bøger. ISBN 1-59749-005-9.
- ^ Chris Anley; Jack Koziol (2007). Shellcoders håndbog: opdagelse og udnyttelse af sikkerhedshuller (2. udgave). Indianapolis, IN: Wiley. ISBN 978-0-470-19882-7. OCLC 173682537 .
- ^ Gupta, Sunil (2019), "Buffer Overflow Attack", Ethical Hacking-Orchestrating Attacks , Berkeley, CA: Apress, doi : 10.1007/978-1-4842-4340-4_12 , ISBN 978-1-4842-4340-4
- ^ Foster, James C. (2005). Bufferoverløbsangreb: opdag, udnyt, forhindr . Rockland, MA: Syngress. ISBN 1-59749-022-9. OCLC 57566682 .
- ^ "Tiny Execve sh - Assembly Language - Linux/x86" . GitHub . Hentet 2021-02-01 .
- ^ BHA (6. juni 2013). "Shellcode/Socket-genbrug" . Hentet 2013-06-07 .
- ^ SkyLined (11. januar 2010). "Download og LoadLibrary shellcode frigivet" . Arkiveret fra originalen den 23. januar 2010 . Hentet 2010-01-19 .
- ^ SkyLined (11. januar 2010). "Download og LoadLibrary -shellkode til x86 Windows" . Hentet 2010-01-19 .
- ^ Skape (9. marts 2004). "Sikkert søgeproces Virtuelt adresserum" (PDF) . nologin . Hentet 2009-03-19 .
- ^ SkyLined (16. marts 2009). "w32 SEH omelet shellcode" . Skypher.com. Arkiveret fra originalen den 23. marts 2009 . Hentet 2009-03-19 .
- ^ JavaScript store unescape IBM internet sikkerhedssystemer
- ^ Rix (8. november 2001). "Skrivning af alfanumeriske shell -koder ia32" . Phrack . Hentet 2008-02-29 .
- ^ Mason, Joshua; Lille, Sam; Monrose, Fabian; MacManus, Greg (november 2009). "Engelsk Shellcode" (PDF) . Hentet 2010-01-10 .
- ^ Obscou (13. august 2003). "Bygger IA32 'Unicode-Proof' Shellcodes" . Phrack . Hentet 2008-02-29 .
- ^ Eugene (11. august 2001). "Arkitektur, der spænder over Shellcode" . Phrack . Hentet 2008-02-29 .
eksterne links
- Shell-Storm Database med shellcodes Multi-Platform.
- En introduktion til bufferoverløb og shellcode
- Basics of Shellcoding (PDF) En oversigt over x86 shellcoding af Angelo Rosiello
- En introduktion til shellcode -udvikling
- Indeholder x86 og ikke-x86 shellcode-prøver og en online-grænseflade til automatisk shellcode-generering og kodning, fra Metasploit-projektet
- et shellcode -arkiv, sorteret efter operativsystem .
- Microsoft Windows og Linux shellcode design tutorial går fra grundlæggende til avanceret .
- Windows og Linux shellcode -vejledning, der indeholder trinvise eksempler .
- Design af shellcode demystificeret
- ALPHA3 En shellcode encoder, der kan omdanne enhver shellcode til både Unicode og ASCII, store og blandede, alfanumeriske shellcode.
- Skrive Small shellcode af Dafydd Stuttard Et whitepaper, der forklarer, hvordan man gør shellcode så lille som muligt ved at optimere både design og implementering.
- Skrivning af IA32 Restricted Instruction Set Shellcode Decoder Loops af SkyLined Et whitepaper, der forklarer, hvordan man opretter shellcode, når de tilladte bytes i shellcode er meget begrænsede.
- BETA3 Et værktøj, der kan kode og afkode shellcode ved hjælp af en række forskellige kodninger, der normalt bruges i exploits.
- Shellcode 2 Exe - Online konverter til at integrere shellcode i exe husk
- Sclog - Opdateret build af iDefense sclog shellcode analyseværktøj (Windows)
- Libemu - emuleringsbaseret shellcode -analysebibliotek (*nix/Cygwin)
- SCDBG - shellcode -fejlfinding bygget op omkring libemu -emuleringsbibliotek (*nix/Windows)