close

Shellcode

Přejít na navigaci Přejít na hledání

V informatice je shell kód program v assembleru , který tradičně spouští shell , jako je unixový shell '/bin/sh' nebo shell command.com v operačních systémech DOS a Microsoft Windows . Shellcode může být použit ke zneužití chyby prostřednictvím exploitu , což umožní hackerovi nebo crackerovi získat přístup k příkazové řádce počítače nebo obecněji spustit libovolný kód .

Popis

Shellcode Types

Existují dva různé typy shell kódu, místní a vzdálený. Rozdíl závisí na typu kontroly, kterou vykonávání shell kódu poskytuje na cílovém počítači, který může být místní nebo vzdálený (pokud se tak děje přes síť).

Místní

Lokální shell kód používá útočník, který má omezený přístup k počítači, ale který zneužívá zranitelnost v procesu s vyššími oprávněními, například přetečením vyrovnávací paměti, může získat stejná oprávnění, pokud je spuštění shell kódu úspěšné.

Dálkové

Vzdálený shell kód se místo toho používá, když chce útočník zneužít zranitelnost procesu jiného počítače v místní síti nebo na intranetu. Pokud je kód Shell proveden správně, vrátí kontrolu nad cílovým počítačem přes síť. Vzdálené shell kódy normálně používají standardní TCP/IP socket k umožnění přístupu k shellu cílového stroje. Další rozlišení lze klasifikovat podle způsobu, kterým je spojení navázáno. Pokud je to samotný kód shellu, který může navázat spojení, nazývá se to "reverzní shell" nebo shell kód se zpětnou vazbou, protože kód shellu běžící na vzdáleném počítači se připojuje k počítači útočníka. Pokud na druhou stranu útočník potřebuje vytvořit spojení, shell kód se nazývá bindshell , protože shell kód se váže na určitý port, který útočník použije k připojení a ovládání cílového stroje. Třetím, méně běžným typem shell kódu je shell kód pro opakované použití zásuvky . Tento typ shell kódu se obvykle používá, když exploit naváže spojení se zranitelným procesem, které není uzavřeno před spuštěním shell kódu. Shell kód může toto spojení znovu použít ke komunikaci s útočníkem. Implementace shell kódu pro opětovné použití Socketu je složitější, protože kód shellu musí identifikovat, které připojení může použít (mezi možnými, které jsou otevřené na počítači). [1] Firewall lze použít k identifikaci odchozích připojení vytvořených shell kódem zpětného připojení a pokusem o příchozí připojení bindshell. Firewall může poskytnout dodatečnou ochranu proti útočníkovi, i když je systém zranitelný, tím, že preventivně zabrání přístupu k shellu vytvořenému spuštěním shell kódu. To je jeden z důvodů, proč se někdy používá soket znovu používající shell kód, protože nevytváření nových spojení je obtížnější identifikovat a blokovat.

Stáhnout a spustit

Stáhnout a spustit je typ vzdáleného shell kódu, který provede stažení a spustí nějakou formu malwaru v cílovém systému. Tento typ shell kódu nevytváří shell, ale instruuje stroj, aby stáhl určitý spustitelný soubor ze sítě, uložil jej na disk a poté jej spustil. V současné době se běžně používá při útokech typu drive-by download , kdy oběť navštíví škodlivý web, který se pokusí zahájit stahování a spustit shell kód pro instalaci softwaru na počítač oběti. Variantou tohoto typu shell kódu je „stáhnout a načíst knihovnu“. [2] [3] Výhodou této techniky je, že kód shellkódu může být menší, nevyžaduje vytváření nového procesu na cílovém stroji a že kód shellu nemusí implementovat kód pro čištění cíleného process , ale to lze provést z knihovny načtené do procesu.

Inscenováno

Když je množství dat, které může útočník vložit do cílového procesu, příliš malé na to, aby kód shellu fungoval správně, lze jej spustit ve fázích. Nejprve se provede malý kousek kódu shellu (fáze 1). Tento kód uloží větší část kódu shellu (fáze 2) do paměti procesu a spustí jej.

Hon na vejce

Egg-hunt je další typ fázovaného shell kódu. Používá se, když má útočník schopnost vložit velký shell kód do procesu, ale nemůže určit, kam v paměti bude umístěn. Poté je do procesu na předvídatelném místě vložen malý lov vajec a poté proveden. Kód hledá v paměti větší kód skořápky (vejce) a provede jej.

Omeleta

Tento typ skořápkového kódu je podobný lovu vajec, ale vyhledává menší bloky (vejce) a rekombinuje je do většího (omeleta), který se pak provede. Tato technika se používá, když je útočník z nějakého důvodu omezen na vkládání malých bloků dat do procesu. [4]

Operace

Strategie provádění Shellcode

Exploit obvykle vloží kód shellu do cílového procesu před nebo současně s výskytem zneužití zranitelnosti, aby získal kontrolu nad počítadlem programu . Čítač programu je nasměrován tak, aby ukazoval na shell kód, který má být proveden. Vložení kódu shellu se často provádí uložením kódu v datech odesílaných přes síť zranitelnému procesu a jeho zpřístupněním v souboru, který proces čte, nebo prostřednictvím příkazového řádku nebo proměnných prostředí v případě lokálních exploitů.

Kódování Shellcode

Vzhledem k tomu, že mnoho procesů filtruje nebo omezuje data, která lze zadat, musí být často zapsán shell kód, aby se tato omezení překonala, takže kód je malý, neobsahuje nuly nebo alfanumerické znaky. Bylo nalezeno několik řešení, jak tato omezení obejít:

  • Optimalizace návrhu a implementace pro snížení velikosti kódu shellu.
  • Změny implementace, aby se obešly omezení v rozsahu bajtů použitých v kódu shellu.
  • Samoupravující kód , který upravuje počet bajtů svého kódu před jejich provedením, aby znovu vytvořil bajty, které nelze normálně vložit do procesu.

Protože nástroje detekce narušení mohou identifikovat podpis jednoduchých shell kódů zasílaných přes síť, jsou zakódovány a vyrobeny tak, aby se samy dešifrovaly nebo byly polymorfní , aby nebyly rozpoznány.

Kódování procent

Využívá cílené prohlížeče běžně zakóduje shell kód do řetězce JavaScript pomocí kódování procent nebo zápisu kódování URL, escapování "\ uXXXX" nebo pomocí entity . Některé exploity dále znejasňují řetězec kódovaný shell kód, aby se vyhnuly detekci nástroji IDS . Například na architektuře IA-32 mají dvě (bez operace) instrukce NOPpřed kódováním tento tvar.

90 NOP
90 NOP

Jsou zakódovány do řetězce s procentuálním kódováním. (pro dekódování pomocí metody unescape ())

unescape ("% u9090");

Poté je zakódován v zápisu "\ uXXXX":

"\ u9090";

A konečně v kódování entity.

"& # x9090;"

nebo

"& # 37008;"

Shellcode Null-Free

Mnoho shell kódů je zapsáno bez použití null bajtů , protože jsou navrženy tak, aby byly vloženy do cílového procesu prostřednictvím řetězce ukončeného nulou. Když je zkopírován řetězec ukončený nulou, kopie bude obsahovat první znak null , ale následující bajty nebudou zpracovány. Když je shell kód obsahující null zadán tímto způsobem, bude vložena pouze část shell kódu, takže jej nebude možné provést později. Chcete-li vytvořit shell kód bez nuly začínající kódem, který obsahuje nulové bajty, lze strojové instrukce, které obsahují nuly, nahradit instrukcemi, které produkují stejný efekt, ale nemají žádné nulové bajty. Například na architektuře IA-32 by tato náhrada mohla být provedena:

B8 01000000     MOV EAX, 1 // Nastavte registr EAX na 0x000000001

tento příkaz obsahuje nuly jako součást literálu (1 je rozšířena jako 0x000000001) s těmito příkazy:

33C0            XOR EAX, EAX // Nastavte registr EAX na 0x000000000
40              INC EAX // Zvyšte hodnotu EAX na 0x00000001

které mají stejný účinek, ale vyžadují méně bajtů pro kódování a jsou bez nulových bajtů.

Alfanumerické a tisknutelné shell kódy

Za určitých okolností může cílový proces odfiltrovat ze zadaného kódu shellu všechny bajty, které nelze vytisknout nebo nejsou alfanumerické. Za těchto podmínek je rozsah instrukcí, které lze použít k zápisu shell kódu, velmi omezený. Řešení tohoto problému publikoval Rix v Phrack 57 [5] , kde je ukázáno, jak je možné převést jakýkoli typ kódu na alfanumerický. Široce používanou technikou je vytváření samomodifikačního kódu, protože to umožňuje kódu modifikovat své vlastní bajty tak, aby zahrnoval další, které nejsou zahrnuty mezi povolené, a rozšířit rozsah použitelných instrukcí. S tímto druhem triku lze zpočátku vytvořit samomodifikační dekodér pouze pomocí bajtů v povoleném rozsahu. Když se odchozí shell kód spustí, dekodér může upravit svůj kód tak, aby byl schopen použít jakoukoli požadovanou instrukci, která mu umožní správně fungovat a zároveň pokračovat v dekódování původního kódu shellu. Po provedení dekódování dekodér předá řízení shell kódu, takže může běžet normálně. Bylo ukázáno, jak je možné vytvořit shell kódy libovolné složitosti, které se podobají normálnímu anglickému textu. [6]

Unicode znakově odolný shell kód

Mnoho moderních programů používá kódování řetězců formátu Unicode, které umožňují internalizaci textu. Tyto programy často konvertují vstupní řetězce ASCII před jejich zpracováním. Řetězce Unicode zakódované v UTF-16 používají k dekódování každého znaku dva bajty (nebo čtyři bajty pro některé speciální znaky). Při převodu řetězce ASCII na UTF-16 se za každý bajt původního řetězce vloží nulový bajt. Obscu ukázal v Phrack 61 [7] , že je možné psát shellkódy, které se mohou správně spustit i po této transformaci. Existují programy, které dokážou automaticky změnit každý shell kód na kód kódovaný UTF-16 a jsou založeny na stejném principu jako samomodifikující dekodér, který dekóduje původní shell kód.

Platformy

Mnoho shell kódů je napsáno ve strojovém kódu kvůli nízké úrovni, na které se zranitelnost stává zneužitelnou. Shell kód je často vytvořen k útoku na konkrétní kombinaci procesoru, operačního systému a servisního balíčku, které se běžně označují jako platforma. Pro některé exploity je kvůli omezením daným cílovým procesem nutné vytvořit specifický shell kód. Není však vždy možné, aby shellocde fungoval pro více exploitů, servisních balíčků, operačních systémů a možná i procesorů. [8] Všestrannost může být dána vytvořením různých verzí shell kódu, založených na různých platformách, které mají být napadeny, a vytvořením hlavičky, která identifikuje správnou verzi pro používanou platformu. Při spuštění se kód chová odlišně podle platformy a je schopen spustit správnou verzi shell kódu.

Poznámky

  1. ^ BHA, Shellcode / Socket-reuse , na blackhatlibrary.net , 6. června 2013. Staženo 7. června 2013 .
  2. ^ Vydán kód shellu SkyLined , Download and LoadLibrary , na skypher.com , 11. ledna 2010. Získáno 19. ledna 2010 (z originálu archivováno 23. ledna 2010) .
  3. ^ SkyLined, Download and LoadLibrary shell code for x86 Windows , na code.google.com , 11. ledna 2010. Staženo 19. ledna 2010 .
  4. ^ SkyLined , w32 SEH omelet shellcode , na skypher.com , 16. března 2009. Získáno 19. března 2009 (archivováno z originálu 23. března 2009) .
  5. ^ Rix, Writing ia32 alfanumerických kódů shellu , phrack.org , Phrack, 8. listopadu 2001. Získáno 29. února 2008 .
  6. ^ Joshua Mason, Small, Sam, Monrose, Fabian a MacManus, Greg, English Shellcode ( PDF ), cs.jhu.edu , listopad 2009. Staženo 10. ledna 2010 .
  7. ^ Obscou, Building IA32 'Unicode-Proof' Shellcodes , phrack.org , Phrack, 13. srpna 2003. Získáno 29. února 2008 .
  8. ^ Eugene, Architecture Spanning Shellcode , phrack.org , Phrack, 11. srpna 2001. Získáno 29. února 2008 .

Související položky

Externí odkazy