Shellcode
Binnen de informatiebeveiliging is shellcode een klein programma of een relatief korte serie instructies die een aanvaller probeert uit te voeren op een computer die gekraakt wordt. De shellcode is onderdeel van een exploit, dus het geautomatiseerd kraken van een systeem op basis van bijvoorbeeld een programmeerfout. Naast de shellcode bestaat een exploit veelal ook uit een mechanisme om de shellcode op de computer die gekraakt wordt aan te brengen, wat injectie wordt genoemd. Regelmatig wordt shellcode ook "egg" genoemd.

De naam "shellcode" is afkomstig van het feit, dat veelal door hackers gepoogd wordt een shell te krijgen op een machine waarmee men interactief controle hierover krijgt. Op Windowssystemen zijn de DOS box (command.com) of Windows shell (cmd.exe) voorbeelden van shells. Op unix- en linuxsystemen zijn sh, csh en bash hier voorbeelden van. Het begrip shellcode is echter algemener, en ook als bijvoorbeeld zonder dat er een shell wordt gebruikt informatie van een systeem gestolen kan worden met een dergelijk klein programma, wordt dit shellcode genoemd.

Er bestaan twee types shellcode, "local shellcode" en "remote shellcode". Bij lokale shellcode heeft een hacker al beperkte toegang tot een systeem, en kan hij door middel van de shellcode zorgen dat hij meer privileges krijgt, of zelfs het hele systeem overnemen. Bij remote shellcode heeft de hacker nog geen toegang tot de computer die hij wil kraken, en injecteert hij shellcode via een netwerk zoals het Internet.

Shellcode kan door een ervaren hacker zelf worden geschreven, of het kan door bijvoorbeeld een script kiddie door software zoals Metasploit worden gegenereerd of eenvoudig van het Internet worden gedownload. Het type programmeerfout dat de uitvoering van shellcode doorgaans mogelijk maakt, is de bufferoverloop (Engels: buffer overflow).

De meeste shellcode wordt in machinetaal geschreven, de laagste programmeertaal die dan ook het dichtst bij de processor zit. Specialistische kennis over de instructieset van een specifieke processor, bijvoorbeeld de x86 processor, is nodig voor het ontwikkelen van shellcode. De instructieset geeft aan, welke commando's door de processor kunnen worden begrepen en uitgevoerd. Een programmeertaal die iets hoger is dan machinetaal is assembleertaal. De binaire instructies van machinetaal, ook wel "opcodes" genoemd, en die vaak hexadecimaal worden weergegeven, kunnen door een disassembler worden vertaald in assembleertaal. In plaats van de hexadecimale getallen van de machinetaal worden instructies daarin bijvoorbeeld weergegeven als 'xor', 'push' en 'mov', wat voor de meeste mensen leesbaarder is.

De detectie van shellcode kan handmatig of geautomatiseerd plaatsvinden. Handmatige detectie vergt ervaring en kan tijdrovend zijn. Voor de x86 instructieset op Windowsmachines kan een debugger als OllyDbg hierbij helpen. Op Unix- en Linuxsystemen kan een debugger zoals gdb bij de handmatige detectie inzicht geven in wat de shellcode doet. Een voorbeeld van software die de automatische detectie van shellcode verzorgt, bijvoorbeeld voor het gebruik in honeypots, is libemu.

Van bestaande shellcode worden databases bijgehouden, zoals het shellcode-archief dat onderdeel vormt van het Metasploit Project. Er is shellcode die zichzelf wijzigt, wat detectie veel moeilijker maakt. Deze zogenaamde polymorfische shellcode kan met programma's zoals admutate worden vervaardigd. Verder is een deel van de shellcode vaak versleuteld, doorgaans met XOR-encryptie.

Indien bij shellcode gebruikgemaakt wordt van een NOP sled, een reeks NOPs, instructies waarbij de processor in feite geen operatie hoeft uit te voeren, is dit doorgaans eenvoudig te detecteren door bijvoorbeeld een intrusion detection system. Veelal weten hackers het gebruik van dit soort NOP sleds te voorkomen.
Q189900
informatiebeveiliging
Concept
Q11287
exploit
Concept
Q18109
shell
Concept
Q479783
DOS box
MISC
None
Windows shell
UNK
None
sh
UNK
None
csh
UNK
Q189248
bash
MEDIA
Q75
Internet
Concept
Q1147445
Metasploit
MISC
Q19423
bufferoverloop
Concept
Q55813
machinetaal
Concept
Q272683
instructieset
Concept
Q182933
x86
Concept
Q165436
assembleertaal
Concept
Q3913
binair
Concept
Q82828
hexadecimaal
Concept
Q279650
disassembler
Concept
Q193231
debugger
Concept
Q1141018
OllyDbg
MISC
None
gdb
UNK
Q911932
honeypots
Concept
None
libemu
UNK
Q1147445
Metasploit Project
MISC
None
admutate
UNK
Q1791410
NOP
ORG
Q745881
intrusion detection system
MISC
Q1152477
Shellcode
Concept
+86^^http://www.w3.org/2001/XMLSchema#decimal
86
NUMBER
+86^^http://www.w3.org/2001/XMLSchema#decimal
86
NUMBER
instance of