Shellcode - Shellcode

A hackelés , a shellcode egy kis darab használt kód a hasznos teher a kizsákmányolás egy szoftver biztonsági rés . Azért hívják "shellcode" -nak, mert általában parancsparancsot indít, amelyből a támadó irányíthatja a feltört gépet, de bármely hasonló feladatot végrehajtó kódrész shellcode -nak nevezhető. Mivel a hasznos terhelés funkciója nem korlátozódik pusztán egy héj létrehozására, egyesek szerint a shellcode név nem elegendő. A kifejezés helyettesítésére tett kísérletek azonban nem kaptak széles körű elfogadást. A Shellcode -ot általában gépi kódban írják .

A shellcode létrehozásakor általában kívánatos, hogy kicsi és végrehajtható legyen, ami lehetővé teszi a lehető legszélesebb helyzetekben történő használatát. A jó shellcode írása ugyanolyan művészet lehet, mint tudomány. Az összeszerelési kódban ugyanez a funkció sokféleképpen elvégezhető, és az opcódok hosszúsága némileg változatos lehet erre a célra; A jó shellcode írók felhasználhatják ezeket a kis opkódokat kompaktabb shellcode létrehozásához. Néhányan elérték a lehető legkisebb méretet, miközben megtartották a stabilitást.

A shellcode típusai

A Shellcode lehet helyi vagy távoli , attól függően, hogy a támadónak felügyeletet biztosít a gépen, amelyen fut (helyi), vagy egy másik gépen keresztül a hálózaton keresztül (távoli).

Helyi

A helyi shellcode-t olyan támadó használja, akinek korlátozott hozzáférése van egy géphez, de kihasználhat egy biztonsági rést, például egy puffertúlcsordulást , az adott gép magasabb jogosultságú folyamatában. Sikeres végrehajtás esetén a shellcode ugyanazt a magasabb jogosultságot biztosít a támadónak a géphez, mint a célzott folyamat.

Távoli

A távoli shellcode -t akkor használják, ha a támadó egy sebezhető folyamatot akar megcélozni, amely egy másik számítógépen fut a helyi hálózaton , az intraneten vagy a távoli hálózaton . Sikeres végrehajtás esetén a shellcode hozzáférést biztosít a támadónak a célgéphez a hálózaton keresztül. A távoli héjkódok általában szabványos TCP/IP socket kapcsolatokat használnak, hogy a támadó hozzáférhessen a célgép burkolatához. Ilyen shellcode lehet osztályozni alapján, hogy ez a kapcsolat létre: ha az shellcode létrehozza a kapcsolatot, ez az úgynevezett „fordított shell”, vagy egy connect-back shellcode mert a shellcode összeköt vissza a támadó gép. Másrészt, ha a támadó létrehozza a kapcsolatot, akkor a shellcode -t bindshell -nek hívják, mert a shellcode az áldozat gépének egy bizonyos portjához kötődik . Van egy sajátos shellsode, a bindshell random port, amely kihagyja a kötési részt, és az operációs rendszer által elérhető véletlenszerű porton hallgat . Emiatt a bindshell véletlenszerű port lett a legkisebb és legstabilabb bindshell shellcode az x86_64 számára, amely eddig elérhető. A harmadik, sokkal kevésbé gyakori típus a socket-reuse shellcode. Ezt a típusú shellcode -t néha akkor használják, amikor egy exploit kapcsolatot létesít a sebezhető folyamattal, amely nem záródik be a shellcode futtatása előtt. A shellcode ezt követően újra felhasználhatja ezt a kapcsolatot a támadóval való kommunikációhoz. Az aljzat újrafelhasználó shellcode-ja bonyolultabb, mivel a shellcode-nak meg kell találnia, hogy melyik kapcsolatot használja újra, és a gépnek sok kapcsolata lehet nyitva.

A tűzfal használható a connect-back shellcode által létrehozott kimenő kapcsolatok, valamint a bindshells által létrehozott bejövő kapcsolatok észlelésére. Ezért bizonyos védelmet nyújthatnak a támadókkal szemben, még akkor is, ha a rendszer sebezhető, megakadályozva, hogy a támadó csatlakozzon a shellcode által létrehozott shellhez. Ez az egyik oka annak, hogy néha használnak socket újrafelhasználó shellcode-t: nem hoz létre új kapcsolatokat, ezért nehezebb észlelni és blokkolni.

Töltse le és hajtsa végre

A letöltés és végrehajtás egy távoli shellcode típus, amely letölti és végrehajtja a rosszindulatú programok valamilyen formáját a célrendszeren. Ez a típusú shellcode nem hoz létre héjat, hanem arra utasítja a gépet, hogy töltsön le egy bizonyos futtatható fájlt a hálózatról, mentse a lemezre és hajtsa végre. Manapság általánosan használják a drive-by letöltési támadásokban, amikor az áldozat meglátogat egy rosszindulatú weboldalt, amely viszont megpróbál futtatni egy ilyen letöltést, és végrehajtja a shellcode-ot, hogy szoftvert telepítsen az áldozat gépére. Az ilyen típusú shellcode egy változata letölt és betölt egy könyvtárat . Ennek a technikának az az előnye, hogy a kód kisebb lehet, nem kell a shellcode -nak új folyamatot létrehoznia a célrendszeren, és hogy a shellcode -nak nincs szüksége kódra a célzott folyamat tisztításához, mivel ezt a könyvtár betöltve a folyamatba.

Színpadi

Ha a támadó által a célfolyamatba befecskendezhető adatmennyiség túlságosan korlátozott ahhoz, hogy közvetlenül végrehajthassa a hasznos shellcode -t, akkor lehetséges, hogy szakaszosan hajtja végre. Először egy kis darab shellcode -ot (1. szakasz) hajtanak végre. Ez a kód ezután letölt egy nagyobb darab shellcode -ot (2. szakasz) a folyamat memóriájába, és végrehajtja azt.

Tojásvadászat

Ez a szakaszos shellcode egy másik formája , amelyet akkor használnak, ha a támadó be tud fecskendezni egy nagyobb shellcode -t a folyamatba, de nem tudja meghatározni, hogy a folyamat hová kerül. Kis tojásvadászat héjkódot jósolnak be a folyamatba egy előre látható helyre, és végrehajtják. Ez a kód ezután megkeresi a folyamat címterében a nagyobb héjkódot (a tojást ), és végrehajtja azt.

Omlett

Ez a típusú héjkód hasonló a tojásvadászat héjkódjához, de több kis adatblokkot ( tojást ) keres, és újra egyesíti őket egy nagyobb blokkba (az omlett ), amelyet később végrehajtanak. Ezt akkor használják, ha a támadó csak néhány kis adatblokkot tud befecskendezni a folyamatba.

Shellcode végrehajtási stratégia

A kihasználás általában héjkódot juttat be a célfolyamatba, mielőtt vagy azzal egy időben, amikor kihasznál egy sebezhetőséget a programszámláló feletti ellenőrzés megszerzéséhez . A programszámláló úgy van beállítva, hogy a shellcode -ra mutasson, majd végrehajtásra kerül és elvégzi a feladatát. A shellcode befecskendezése gyakran úgy történik, hogy a shellcode -ot a sebezhető folyamatnak a hálózaton keresztül küldött adataiban tárolja, és egy olyan fájlban adja meg, amelyet a sebezhető folyamat olvas, vagy helyi kihasználás esetén a parancssorban vagy a környezetben.

Shellcode kódolás

Mivel a legtöbb folyamat szűri vagy korlátozza a befecskendezhető adatokat, a shellcode -ot gyakran meg kell írni, hogy lehetővé tegye ezeket a korlátozásokat. Ez magában foglalja a kód kicsi, nullmentes vagy alfanumerikus létrehozását . Különféle megoldásokat találtak az ilyen korlátozások kiküszöbölésére, többek között:

  • Tervezés és megvalósítás optimalizálása a shellcode méretének csökkentése érdekében.
  • Végrehajtási módosítások a shellcode -ban használt bájtok tartományának korlátozásának kiküszöbölésére.
  • Önmódosító kód, amely módosítja saját kódjának számos bájtját, mielőtt végrehajtja azokat, hogy újra létrehozzon olyan bájtokat, amelyeket általában lehetetlen beilleszteni a folyamatba.

Mivel a behatolásérzékelés képes észlelni a hálózaton keresztül küldött egyszerű héjkód aláírásait, az észlelés elkerülése érdekében gyakran kódolják, önfejtővé vagy polimorfossá teszik.

Százalékos kódolás

A böngészőket célzó kiaknázások általában kódolást kódolnak JavaScript-karakterláncban százalékos kódolás , menekülési szekvencia kódolás "\ uXXXX" vagy entitás kódolás segítségével . Néhány kihasználás a kódolt shellcode karakterláncot tovább zavarja, hogy megakadályozza az IDS általi észlelést .

Például az IA-32 architektúrán NOPígy néz ki két (művelet nélküli) utasítás, először kódolatlanul:

90             NOP
90             NOP
Kódolt kettős NOP-ok:
százalékos kódolás unescape("%u9090")
unicode literál "\u9090"
HTML/XML entitás "邐" vagy "邐"

Ezt az utasítást a NOP diák használják .

Null-mentes shellcode

A legtöbb shellcode null bájt használata nélkül van írva, mert azokat egy célfolyamatba kívánják beinjektálni null végű karakterláncokon keresztül . Ha egy null végű karakterláncot másol, akkor a rendszer az első null-ig bezárólag másolja, de a shellcode következő bájtjait nem dolgozzuk fel. Ha a null -okat tartalmazó shellcode -t ilyen módon fecskendezik be, akkor a shellcode -nak csak egy része kerül befecskendezésre, ami nem teszi lehetővé a sikeres futást.

Termelni null-mentes shellcode származó shellcode tartalmazó null bájt, egy helyettesítheti gépi utasításokat tartalmazó nullákat az utasításokat, amelyeket ugyanaz a hatása, de mentes a nullákat. Például az IA-32 architektúrán helyettesítheti ezt az utasítást:

B8 01000000    MOV EAX,1          // Set the register EAX to 0x000000001

amely a literál részeként nullákat tartalmaz ( 1 kibővül 0x00000001 -re ) az alábbi utasításokkal:

33C0           XOR EAX,EAX        // Set the register EAX to 0x000000000
40             INC EAX            // Increase EAX to 0x00000001

amelyek ugyanolyan hatásúak, de kevesebb bájtot igényelnek a kódoláshoz, és mentesek a nulláktól.

Alfanumerikus és nyomtatható shellcode

Bizonyos körülmények között a célfolyamat minden olyan bájtot kiszűr a befecskendezett shellcode -ból, amely nem nyomtatható vagy alfanumerikus karakter. Ilyen körülmények között a shellcode írásához használható utasítások köre nagyon korlátozott lesz. Erre a problémára adott megoldást Rix a Phrack 57 -ben, amelyben megmutatta, hogy bármilyen kód alfanumerikus kódgá alakítható. Gyakran használt technika az önmódosító kód létrehozása, mivel ez lehetővé teszi, hogy a kód saját bájtjait módosítsa úgy, hogy azok a normál megengedett tartományon kívül eső bájtokat is tartalmazzanak, ezáltal bővítve a használható utasítások körét. Ezzel a trükkel egy önmódosító dekódoló hozható létre, amely kezdetben csak a megengedett tartományban lévő bájtokat használja. A shellcode fő kódja kódolt, szintén csak a megengedett tartományban lévő bájtok használatával. A kimeneti shellcode futtatásakor a dekódoló módosíthatja saját kódját, hogy képes legyen használni a megfelelő működéshez szükséges utasításokat, majd folytatja az eredeti shellcode dekódolását. A shellcode dekódolása után a dekóder átadja neki az irányítást, így a szokásos módon végrehajtható. Kimutatták, hogy tetszőlegesen összetett shellcode -t lehet létrehozni, amely normál angol nyelvű szövegnek tűnik.

Unicode -biztos shellcode

A modern programok Unicode karakterláncokat használnak a szöveg nemzetközivé tételéhez. Ezek a programok gyakran konvertálják a bejövő ASCII karakterláncokat Unicode -ba, mielőtt feldolgozzák őket. Az UTF-16 kódolású Unicode karakterláncok két bájtot használnak minden karakter kódolására (vagy négy bájt bizonyos speciális karakterek esetén). Amikor egy ASCII ( általában latin-1 ) karakterláncot UTF-16-ba alakítanak át, az eredeti karakterlánc minden bájta után nulla bájt kerül beillesztésre. Obscou a Phrack 61 -ben bebizonyította, hogy lehetséges olyan shellcode írása, amely sikeresen futtatható ezen átalakítás után. Léteznek olyan programok, amelyek automatikusan képesek bármilyen shellcode kódolására alfanumerikus UTF-16-hiteles shellcode-ba, ugyanazon elv alapján, mint egy kis önmódosító dekódoló, amely dekódolja az eredeti shellcode-ot.

Platformok

A legtöbb shellcode gépi kódba van írva, mivel a kihasznált biztonsági rés alacsony szintje hozzáférést biztosít a támadónak a folyamathoz. A Shellcode -ot ezért gyakran úgy hozzák létre, hogy a processzor , az operációs rendszer és a szervizcsomag egy bizonyos kombinációját célozzák meg , amelyet platformnak neveznek . Bizonyos kihasználásokhoz a célfolyamat által a shellcode -ra vonatkozó korlátozások miatt egy nagyon specifikus shellcode -ot kell létrehozni. Azonban nem lehetetlen, hogy egy shellcode többféle kihasználás, szervizcsomag, operációs rendszer és akár processzor esetén is működjön. Ezt a sokoldalúságot általában úgy éri el, hogy a shellcode több verzióját hozza létre, amelyek a különböző platformokat célozzák meg, és létrehoz egy fejlécet, amely a megfelelő verzióra ágazik a platformon, amelyen a kód fut. Futtatáskor a kód másként viselkedik a különböző platformokon, és végrehajtja a shellcode megfelelő részét annak a platformnak, amelyen fut.

Shellcode elemzés

A Shellcode nem hajtható végre közvetlenül. Ahhoz, hogy elemezni tudjuk, hogy egy shellcode milyen kísérletet tesz erre, be kell tölteni egy másik folyamatba. Az egyik gyakori elemzési technika az, hogy írunk egy kis C programot, amely bájtpufferként tárolja a shellcode -ot, majd függvénymutatót vagy inline assemblert használunk a végrehajtás átvitelére. Egy másik technika egy online eszköz, például a shellcode_2_exe használata a héjkód beágyazásához egy előre elkészített végrehajtható héjba, amelyet ezután egy standard hibakeresőben lehet elemezni. Léteznek speciális shellcode elemző eszközök is, például az iDefense sclog projekt, amelyet eredetileg 2005 -ben adtak ki a Malcode Analyst Pack részeként. Az Sclog célja a külső shellcode fájlok betöltése és végrehajtása egy API naplózási kereten belül. Emuláció alapú shellcode elemző eszközök is léteznek, mint például az sctest alkalmazás, amely a cross -platform libemu csomag része. Egy másik, emuláción alapuló shellcode elemző eszköz, amely a libemu könyvtár köré épül, az scdbg, amely tartalmaz egy alapvető hibakeresési héjat és integrált jelentési funkciókat.

Lásd még

Hivatkozások

  1. ^ Foster, James C .; és Price, Mike (2005. április 12.). Aljzatok, Shellcode, hordozás és kódolás: Fordított mérnöki hasznosítások és eszközkódolás a biztonsági szakemberek számára . Elsevier Tudományos és Technológiai Könyvek. ISBN 1-59749-005-9.
  2. ^ Chris Anley; Jack Koziol (2007). A shellcoder kézikönyve: biztonsági lyukak felfedezése és kiaknázása (2. kiadás). Indianapolis, IN: Wiley. ISBN 978-0-470-19882-7. OCLC  173682537 .
  3. ^ 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
  4. ^ Foster, James C. (2005). Puffertúlcsordulási támadások: észlelni, kihasználni, megakadályozni . Rockland, MA: Színésznő. ISBN 1-59749-022-9. OCLC  57566682 .
  5. ^ "Tiny Execve sh - Összeállítási nyelv - Linux/x86" . GitHub . Letöltve 2021-02-01 .
  6. ^ BHA (2013. június 6.). "Shellcode/Socket-reuse" . Letöltve: 2013-06-07 .
  7. ^ SkyLined (2010. január 11.). "Letöltés és LoadLibrary shellcode megjelent" . 2010. január 23 -án archiválva az eredetiből . Letöltve: 2010-01-19 .
  8. ^ SkyLined (2010. január 11.). "Letöltés és LoadLibrary shellcode for x86 Windows" . Letöltve: 2010-01-19 .
  9. ^ Skape (2004. március 9.). "Biztonságos keresési folyamat virtuális címtér" (PDF) . nologin . Letöltve: 2009-03-19 .
  10. ^ SkyLined (2009. március 16.). "w32 SEH omlett héjkód" . Skypher.com. 2009. március 23 -án archiválva az eredetiből . Letöltve: 2009-03-19 .
  11. ^ JavaScript nagy, unescape IBM internetes biztonsági rendszerek
  12. ^ Rix (2001. november 8.). "Ia32 alfanumerikus héjkódok írása" . Phrack . Letöltve: 2008-02-29 .
  13. ^ Mason, Joshua; Kicsi, Sam; Monrose, Fabian; MacManus, Greg (2009. november). "Angol Shellcode" (PDF) . Letöltve: 2010-01-10 .
  14. ^ Obscou (2003. augusztus 13.). "IA32" Unicode-Proof "Shellcodes építése" . Phrack . Letöltve: 2008-02-29 .
  15. ^ Eugene (2001. augusztus 11.). "Architektúra kiterjedő héjkód" . Phrack . Letöltve: 2008-02-29 .

Külső linkek