Kaj je shellcode?

Shellcode je zaporedje strojne kode ali izvedljivih navodil, ki se vnese v pomnilnik računalnika z namenom, da prevzame nadzor nad delujočim programom. Pri takem napadu je eden od korakov pridobitev nadzora nad programskim števcem, ki identificira naslednje navodilo, ki ga je treba izvesti. Potek programa se lahko nato preusmeri na vstavljeno kodo. Vsiljiva strojna koda se imenuje koristna obremenitev napada in je element, ki ga običajno omenja izraz shellcode. Ta metoda je bila pogosto uporabljena za odobritev dostopa napadalcem z odpiranjem ukazne lupine operacijskega sistema, zato so napadi z vbrizgavanjem kode na splošno postali znani kot shellcode.

Ranljivost, ki se izkorišča, običajno vključuje način, kako program dodeli pomnilnik, preveri veljavnost vhodnih podatkov in obravnava napake v pomnilniku. Razvijalci programske opreme se lahko tej grožnji običajno izognejo tako, da strogo opredelijo vhodne podatke in zavrnejo nepravilne vrednosti. Če ni potrjeno, bodo morda sprejete vrednosti, ki potrebujejo več prostora za shranjevanje, kot je pomnilnik, dodeljen za to vrednost. To povzroči varnostno oviro, imenovano prelivanje medpomnilnika, kjer se del podatkov zapiše v pomnilniške lokacije, ki mejijo na prostor, ki je dodeljen vrednosti. Ob skrbni manipulaciji lahko ta anomalija omogoči uvedbo vsiljive kode.

Shellcode je običajno napisan v programskem jeziku z nizkostopenjskim sistemskim dostopom, kot je montaža, C ali C++. Odvisno od ciljne ranljivosti pa se lahko isti rezultat doseže z vstavljanjem kode za interpretirani skriptni jezik, kot je PERL, ali bajtno kodo za navidezni stroj, kot je JAVA. Kodo je mogoče vsaditi pred, med ali po ugrabitvi programskega števca. Tako je lahko vsiljiva koda vsebovana v datoteki na ciljnem stroju ali pa se v realnem času prenaša prek omrežne povezave.

Lokalni zlorabi kode lupine so zasnovani tako, da napadalcem omogočijo nadzor nad strojem, do katerega ima fizični dostop. Cilj v tem primeru je lahko na primer ustvariti račun s skrbniškimi pravicami. Podobno, če ima tekoči proces visoko raven privilegijev, bi uspešno izkoriščanje začasno omogočilo enako raven dostopa vsiljivcu.

Procese, ki se izvajajo na oddaljenem računalniku, je mogoče izkoristiti z uporabo standardnih omrežnih protokolov za komunikacijo s ciljnim računalnikom. Lupinska koda za povratno povezavo naroči ciljnemu stroju, naj vzpostavi povezavo z vsiljivčevim računalnikom. Če vsiljivec sproži povezavo, se koda imenuje bindshell, saj poskuša prevzeti nadzor nad omrežno povezavo, imenovano vrata na oddaljenem računalniku. Metoda povratne povezave se bolj uporablja, saj požarni zidovi redko prepovedujejo odhodne povezave.