Ma arvan, et kõigepealt tasub mõista, mida tähendab OS-is protsessi käivitamine.
Linuxis on see
PROT_READ | mõju PROT_WRITE | MMAP_PRIVATE
süsteemikõnel
mmap ()
. Täpsemalt ei kopeerita protsesse täielikult mällu - koodisegmendid on, samas kui ülejäänud on kaardistatud failisüsteemiga. Kui mõnda neist lehtedest mälus muudetakse, kopeeritakse need kõigepealt mällu. Seda nimetatakse ka "koopia kirjutamiseks". Siit järeldub, et jooksva protsessi muudatusi ei kirjutata automaatselt kettale
mmap ()
(või Windowsi samaväärse) kaudu.
Lõpptulemusena peaksite ette kujutama, et tegelikult on kaks asja: kettal oleva programmi koopia (edaspidi kettapilt) ja mälus oleva protsessi koopia, mis asub selle virtuaalse mälu liivakastis (edaspidi "aadressiruum").
Protsessi aadressiruum ei ohusta ainult programmi ennast - see sisaldab ka jagatud teeke (DLL) ja paljudel juhtudel sisaldab pool virtuaalsest aadressiruumist OS-i asju, mida saate ei jõua (vaadake režiimi 2GB jagatud vs 4GB / 4GB. Kas olete kunagi mõelnud, miks Windowsis protsessid piirduvad 2GB-ga? Sellepärast). Programmi andmed, nagu virn ja "kuhja", on olemas ka virtuaalses aadressiruumis - mõlemad sisaldavad programmi andmeid.
Nii et nüüd on meil taust, siin on kaks võimalust protsessi muuta:
Käitusaja muudatused
See on tegelikult vähem modifikatsioone, kui võite arvata - tavaliselt on teie eesmärk kasutada kehva kodeeringut ja kasutada sisestusmeetodit, et saada protsessiaadressiruumi spetsiaalselt loodud sisend, mida tavaliselt nimetatakse "shell-koodiks", mille eesmärk anda kaugründajale terminaliviip (seega "kest"). See pole siiski ainus toiming, mida saate teha - saate teha kõike, alates kaugfailide allalaadimisest kuni registrisätete muutmiseni. Kui te ei käivita administraatori viipasid kaugkastidele, siis on teie eesmärk tõenäoliselt pakkuda suuremat kasulikku koormust, kui mahub sisendpuhvrisse ja täidate selle (allalaaditavate failide kasutamine toimib sel viisil brauseri pistikprogramme kasutades).
Sellel tehnikal on mitmeid variante, kuid kõik need hõlmavad hukkamisvoo muutmist, et juhtuks midagi tahtmatut ja ründajale tavaliselt kasulikku. Kopeerimisel kirjutamise seadistamise tulemusel jääb käivitatava faili kettal olev pilt puutumata, kuid on tõenäoline, et teete krahhi äsja ekspluateeritud protsessiga või tekitate mõne tõrke. Vaikne ärakasutamine on keeruline, kuid mitte võimatu.
Miks kõik mainivad DLL-i süstimist?
Noh, selgub, et mõned programmid on kirjutatud koos turvalisusega osana nende arendusprotsessist ja me ei saa neile mingeid prügi sisestada ja panna neid seda täitma. Seega on vaja muid tehnikaid. DLL Injection ehk Linuxis kasutatav LD_PRELOAD
on protsess, mille abil jagatud objekt laaditakse enne kõiki teisi igasse või ainult ühe protsessi aadressiruumi. See annab teile koodi sihtprotsessi virtuaalsesse mällu, mis võib seejärel programmi teatud osi "haakida" (ümber suunata). Selle õpetusi on üsna lihtne leida. Seejärel saate protsessi enda huvides ära kasutada. Siiski vajate enamasti DLL-i kettal.
Selgub, et sellest ei piisanud nendele toredatele inimestele metasploitis, kellel on välja töötatud meetermõõtur, shellkood, mis on võimeline DLL-i mällu alla laadima ja siis seda süstima süsteemi.
Kettapiltide muutmine
Tõenäoliselt kasutate süsteemi sisenemiseks ülaltoodud tehnikat või selle variante ja edastate tõenäoliselt kasuliku koormuse kusagil ja veenduge, et see täidetakse. Kuid midagi muud, mida saate teha, on tegelikult kirjutada uus kettapilt, mida on muudetud teie valitud koormusega, üle süsteemi installitud teadaoleva programmi. Et seda edukalt teha, peate originaalkoodi hoolikalt ümber töötama ja oma ekspluateerimise lisama. Potentsiaalseid probleeme on kolm:
- Kui teete mõne vea, kukub programm tõenäoliselt kokku.
- Kui sihite väga muutlikku komponenti, on teil probleeme sihtmärgiga. Kas teie modifitseerimine töötab kõigil juhtudel ja kõigis stsenaariumides?
- Mõned programmid on spetsiaalselt loodud vastupanu katsetele neid ümber töötada või neid lappida. See on mängutööstuses üsna levinud praktika, et vältida ketaste kopeerimist. Te ei pruugi arvata, et kasutate midagi sel viisil kirjutatud. Sel juhul kutsun teid üles lugema vanilli skype 1. osa ja 2. osa jõupingutusi. Selgub, et skype'i autorid ei taha, et see oleks vastupidine. Selle kaitsetaseme tõttu on käivitatava faili edukalt muutmine palju raskem.
Tuuma lappimine - mis see on?
Paigutus on natuke paaritu sõna, mida kasutada. Tuumale rakendatuna tähendab see tavaliselt tuumalõime aadressiruumis olevate andmestruktuuride muutmist, et midagi varjata või saavutada mõni muu eesmärk, näiteks jälgimine.
Kuid ka tuumadel endal on kettapilte, seega on võimalik tuuma komponente, sealhulgas draivereid, sellisel viisil lappida. Jällegi on kettapiltide muutmine keeruline, kuid mitte võimatu.
Püsivuse ja uuesti installimise nõude kohta
Püsivus nõuab mingil hetkel kettale kirjutamist. Kui arvuti taaskäivitub, peate oma pahavara kuhugi salvestama. Protsessi (või tuuma) aadressiruumi kasutuskood kaob, nagu kogu RAM on taaskäivitamise vahel, nii et kui soovite jätkata taaskäivitamist, peate koodi uuesti laadima. See hõlmab juurkomplekte, mis peavad tagama ka nende uuesti laadimise.
Teil pole tehniliselt vaja opsüsteemi uuesti installida, isegi kui kriitilisi osi on muudetud - piisab vaid nende kriitiliste osade asendamisest. puhaste versioonidega (st Windowsi installiplaadilt). Miski pahavara kohta ei nõua, et peate uuesti installima. Kõik on seotud sellega, kui palju peate valima ja kui suure tõenäosusega olete kogu halva koodi eemaldanud. Sellisena on turvalisem uuesti installida. Seda ma teeksin ja soovitaksin ka kellelgi teisel.
Öelge mulle, et on mingeid kaitsemehhanisme ?!
Jah. Authenticode on loodud selleks, et vältida vana programmi muudatuste avastamata jäämist. Kerneli plaasterkaitse ( wikipedia) ( KKK) kaitseb kerneli andmestruktuure draiverite modifitseerimise eest. W ^ X, ASLR, Stack Canaries, Non Executable Stack jne kaitsevad töötavaid programme ilmsete muudatuste eest. Ükski neist pole täiuslik, kuid õigesti kasutatuna muudab see ekspluateerimise raskemaks.