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.