Exploit Shellcode

 

V hackingu , je shell kód je malý kousek kódu používá jako užitečného zatížení při využití softwarové zranitelnosti . To je nazýváno "shell kód", protože to obvykle začíná na příkazové prostředí , ze kterého útočník může ovládat ohrožena stroj, ale každý kus kódu, který plní podobné úkoly lze nazvat shell kódu. Vzhledem k tomu, funkce užitečného zatížení není omezen na pouze tření shell, někteří navrhli, že jméno shell kód je nedostatečná. Nicméně, pokusy o nahrazení termín ještě nezískalo široké přijetí. Shell kód je obyčejně psán ve strojovém kódu .

Druhy shell kód
Shell kód může být buď lokální nebo vzdálená , v závislosti na tom, zda to dává kontrolu nad strojem útočník běží na (místní) nebo přes jiném počítači v síti (dálkové).

Místní
Místní shell kód je používán útočník, který má omezený přístup ke stroji, ale může zneužít chybu, například přetečení vyrovnávací paměti , ve vyšší privilegované procesu na tomto stroji. Pokud úspěšně proveden, bude shell kód poskytne přístup útočníkovi stroji se stejnými vyššími oprávněními jako cílený proces.

Remote
Vzdálený shell kód se používá, když útočník chce zaměřit na zranitelné proces běžící na jiném počítači v lokální síti nebo intranetu . Pokud úspěšně proveden, shell kódu může poskytnout přístup útočníkovi cílovém počítači v síti. Vzdálené shellcodes normálně používat standardní TCP / IP socket připojení k umožnění přístupu útočníkovi plášti na cílovém počítači. Takový shell kód mohou být rozděleny podle toho, jak je toto spojení sestavou: v případě, že shell kód může navázat toto spojení, to je nazýváno "reverzní shell" nebo connect-back shellcode protože shellkód připojí zpět ke stroji útočníka. Na druhé straně, v případě, že ú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, na kterém útočník může připojit k jeho ovládání. Třetí typ, mnohem méně časté, je zásuvka-opětovné shellcode. Tento typ shell kódu je někdy používán při exploit naváže připojení k zranitelné procesu, který není uzavřen před spuštěním shell kód. Shell kód pak může znovu použít toto připojení ke komunikaci s útočníkem. Socket opětovné využití shell kód je složitější, protože shell kód potřebuje zjistit, jakou připojení k opětovnému použití a stroj může mít mnoho spojení otevřené.

Firewall mohou být použity k detekci odchozí spojení provedené connect-back shellcodes a pokus přijmout příchozí připojení ze strany bindshells. Proto může nabídnout nějakou ochranu před útočníkem, a to iv případě, že systém je zranitelný tím, že brání útočníkovi získat přístup k plášti vytvořenou shell kódu. To je jeden z důvodů, proč zásuvka opětovné využití shell kódu je někdy používán: protože nevytváří nová připojení, a proto je těžší odhalit a blokovat.

Stahovat a spouštět
Stahovat a spouštět je typ dálkového shell kód, který stahování a spustí nějakou formu malware v cílovém systému. Tento typ shell kódu nebude plodit skořápku, ale spíše pokyn stroj ke stažení určitý spustitelný soubor mimo síť, uložit na disk a spustit jej. V dnešní době, to je běžně používané v drive-by download útoky, kde oběť navštíví škodlivý webové stránky, která zase pokusí spustit takovou stáhnout a spustit shell kód, aby mohl nainstalovat software na počítači oběti. Variace tohoto typu stažení shell kódu a načte z knihovny .Výhody této techniky je, že kód může být menší, že nevyžaduje, aby shell kód k potěru nový proces v cílovém systému, a že shell kód není vyčistit cílený proces, protože to může být provedeno pomocí knihovny načten do procesu je třeba kód.

Představený
Když je množství dat, které útočník může aplikovat do cílového procesu je příliš omezený provádět užitečné shell kód přímo, může být možné jej provést v několika etapách. Za prvé, malý kousek shell kódu (etapa 1) je proveden. Tento kód poté stáhne větší kus shell kódu (stupeň 2) do paměti procesu a spustí jej.

Egg-hon
To je další forma představený shell kód, který je použit v případě, že útočník může aplikovat větší shell kód do procesu, ale nemůže určit, kde se v procesu, který skončí. Malá vejce lov shellcode se vstřikuje do procesu v předvídatelném umístění a popraven. Tento kód pak prohledává adresový prostor procesu pro větší shell kód (dále jen vaječný ) a spustí jej.

Omeleta
Tento typ shell kódu je podobná jako vejce hon shell kódu, ale vypadá pro více malých bloků dat ( vejce ) a recombines je do jednoho většího bloku (dále jen omeleta ), který je následně popraven. To se používá v případě, že útočník může aplikovat pouze určitý počet malých bloků dat do procesu.

Provedení shellcode strategie
Exploit bude běžně aplikovat shell kód do cílového procesu před nebo současně, protože využívá zranitelnost k získání kontroly nad pult programu . Pult programu je upravena tak, aby odkazovaly na shell kódu, po kterém dostane popraven a plní svůj úkol. Vstřikování shell kódu se často provádí uložením shell kód v dat odeslaných prostřednictvím sítě nechráněným procesu tím, že mu budou dodávat v souboru, který je čten zranitelné procesu nebo prostřednictvím příkazového řádku nebo životní prostředí v případě místních využije.

Kódování shellcode
Protože většina procesů filtr nebo omezit data, která může být aplikován, shellkód často potřebuje být psán s cílem umožnit těmto omezením. To zahrnuje vytváření kódu malý, null bez poplatku, nebo alfanumerický . Bylo zjištěno, že různá řešení, jak obejít tato omezení, včetně:

Návrhy a realizace optimalizace zmenšit velikost shell kódu.
Změny implementační obejít omezení v rozsahu bajtů použitých v shell kódu.
Self-modifikovat kód , který upravuje určitý počet bajtů vlastního kódu před spuštěním je znovu vytvořit bajtů, které jsou za normálních okolností nemožné vnést do procesu.
Vzhledem k tomu, detekce narušení může detekovat podpisy jednoduchých shellcodes odesílány přes síť, to je často kódován, dělal self-dešifrování nebo polymorfní , aby se zabránilo odhalení.

URL kódování
Exploity, které se zaměřují prohlížečů běžně kódovat shell kód v řetězci JavaScriptu pomocí procent-kódování , uniknout sekvenci kódující "\ uXXXX" nebo kódování entit .Některé využije také poplést kódované shell kód řetězec dále, aby se zabránilo odhalení IDS .

Například na IA-32 architektury, tady je návod, jak dva NOP(ne-operation) návod bude vypadat, první nekódované:

90 NOP
90 NOP
Pak zakódován do řetězce pomocí procent-kódování (pomocí unescape()funkce pro dekódování):

unescape ( "% u9090");
Vedle zakódován do řetězce pomocí "\ uXXXX" -encoding:

"\ U9090";
A konečně zakódován do řetězce pomocí kódování entit:

"& # X9090;"
nebo

"& # 37008;"
Null bez shellcode
Většina shellcodes jsou psány bez použití nulových bajtů, protože jsou určeny k vstřikuje do cílového procesu přes null-ukončena řetězců . Je-li řetězec null zakončený zkopírování bude kopírovat až do a včetně nebudou zpracovány první nulu ale následné bajtů shell kódu. Je-li shell kód, který obsahuje hodnoty Null injekčně tímto způsobem, pouze část shell kódu by být aplikován, takže je schopen úspěšně spuštěna.

K výrobě null bez shell kód z shell kód, který obsahuje null bajtů, je možné nahradit strojové instrukce, které obsahují nuly s pokyny, které mají stejný účinek, ale jsou bez nul. Například na IA-32 architektury, kdo by mohl nahradit tento pokyn:

B8 01000000 MOV EAX, 1 // Nastaví registr EAX do 0x000000001
který obsahuje samé nuly jako součást doslovný ( 1 expanduje 0x00000001 ) s těmito pokyny:

33C0 XOR EAX, EAX // Nastaví registr EAX do 0x000000000
40 INC EAX // Zvýšení EAX 0x00000001
které mají stejný účinek, ale trvat méně bajty kódovat a jsou bez nul.

Alfanumerická vytisknutelný shellcode
Viz také: alfanumerický kód
Za určitých okolností bude cílový proces filtrování jakýkoliv byte ze vstřikovaného shell kód, který není pro tisk nebo alfanumerický znak. Za těchto okolností je rozsah instrukcí, které mohou být použity k napsat shell kód se stává velmi omezené. Řešení tohoto problému, byl publikován v Rix Phracku 57 , ve které ukázaly, že to bylo možné změnit jakýkoli kód do alfanumerickým kódem. Technika často používá, je vytvořit samo-modifikace kódu, protože to umožňuje, aby kód modifikovat své vlastní bajtů obsahovat bajtů mimo normálně povolený rozsah, čímž se rozšiřuje rozsah instrukcí se může použít. Při použití tohoto triku, self-modifikující dekodér může být vytvořen, který zpočátku používá pouze bajtů v povoleném rozsahu. Hlavní kód shell kódu je zakódováno, také pouze s použitím bajtů v povoleném rozsahu. Když je výstup shell kód spustit, může dekodér upravit svůj vlastní kód, aby bylo možné použít jakýkoli pokyn, kterou potřebuje, aby správně fungovaly a pak pokračuje dekódovat původní shell kód. Po dekódování shell kódu převádí dekodér řízení do něj, takže může být proveden jako obvykle. Bylo prokázáno, že je možné vytvořit libovolně komplexní shell kód, který vypadá jako normální text v anglickém jazyce.

Unicode důkaz shellcode
Moderní programy používají Unicode řetězce, aby internacionalizace textu. Často se tyto programy převodu příchozích ASCII řetězce na Unicode před jejich zpracováním. Řetězce Unicode zakódované v UTF-16 pouze dva bajty k zakódování každého znaku (nebo čtyři byty pro některé speciální znaky). Když ASCII je řetězec transformován do UTF-16, nulový bajt po bajtu v každém původní řetězec vložen. Obscou prokázána v Phracku 61 [10] , že je možné zapisovat shell kód, který lze úspěšně spustit po této transformaci. Programy, které mohou automaticky kódují jakýkoli shell kód do alfanumerické UTF-16 proti shell kódu existují, založený na stejném principu malého sebe modifikující dekodér, který dekóduje původní shell kód.

Platformy
Většina shell kód je napsán v strojovém kódu kvůli nízké úrovni, na níž zranitelnost zneužívána dává přístup útočníkovi procesu. Shell kód je proto často vytvořen s cílem zaměřit jednu specifickou kombinaci procesoru , operační systém a service pack , který se nazývá platforma . U některých činů, z důvodu omezení uvedených na shell kódu do cílového procesu, musí být vytvořen velmi specifický shellcode. Nicméně, to není nemožné, aby jeden shellcode pracovat pro více využije, servisní balíčky, operačních systémů a dokonce i zpracovatelů. Taková všestrannost se běžně dosáhnout vytvořením více verzí shell kódu, které se zaměřují na různé platformy a vytvoření hlavičku, která větve na správnou verzi pro platformu kód běží dál. Když je spuštěn, kód se chová odlišně pro různé platformy a spustí pravou část shell kódu pro platformu to pokračuje dál.

Shellcode Analýza
Shellcode nelze provést přímo. Aby bylo možné analyzovat, co shell kód se pokouší dělat to musí být vložen do jiného procesu. Jeden obyčejný analytická technika je psát malý C program, který slouží jako shell kódu jako byte vyrovnávací paměti, a pak použít ukazatel funkce nebo použít inline assembler přenést výkon na to. Jinou technikou je použití on-line nástroj, jako je například shellcode_2_exe, vložit shell kód do předem vyrobené spustitelný slupky, která pak mohou být analyzovány ve standardním ladicí. Specializované analytické nástroje shellcode také existují, jako je iDefense sclog projektu, který byl původně vydán v roce 2005 jako součást Malcode Analyst Pack. Sclog je navržen tak, aby načtení externích shell kódu souborů a spouštět je v rámci rámce logovací API. Emulace na základě analýzy shellcode nástroje také existovat jako je sctest aplikace, která je součástí příčného platformy libemu obalu. Další emulace založená analýza shellcode nástroj, postavený kolem knihovny libemu, je scdbg který obsahuje základní ladicí shell a integrované zpravodajské funkce.