3.10. Mini Botnet

3.10.1. Assignments

3.10.1.1. Mini Botnet

  • Assignment: Mini Botnet

  • Filename: None

  • Complexity: medium

  • Lines of code: 45 lines

  • Time: 21 min

  1. Stwórz mini botnet o architekturze podanej na obrazku. Mini botnet składa się z trzech części:

    1. Heartbeat Receiver - server przyjmujący informacje o ofiarach (czy wciąż żyją i jakie mają backdoory),

    2. Victim - ofiara,

    3. Attacker - atakujący.

../../_images/botnet.png

Figure 3.44. Architektura botnet

Hints:
  • Do weryfikacji czy port jest otwarty możesz użyć telnet albo netcat

3.10.1.2. Heartbeat Receiver

English:

TODO: English Translation

Polish:
  1. Server ma przyjmować komunikaty UDP na porcie 1337

  2. Datę UTC przyjścia pakietu, IP i port backdoora zapisuje do bazy danych sqlite3 jako pola:

    1. datetime DATETIME,

    2. host TEXT,

    3. port INTEGER.

Hints:
  • socketserver.UDPServer

3.10.1.3. Victim

English:

TODO: English Translation

Polish:
  1. Po zainfekowaniu otwiera randomowy port TCP (backdoor) z przedziału 1025-65535 na którym nasłuchuje komunikatów

  2. Dlaczego taki zakres portów?

  3. Co 5 sekund wysyła informację ze swoim numerem portu backdoor oraz swoim adresem IP do Heartbeat Receiver

  4. Po otrzymaniu komunikatu XML na port backdoora wykonuje operację w nim zawarte

  5. Ofiara ma przesyłać JSON atakującemu w formacie:

    1. date: datetime (UTC),

    2. host: str,

    3. port: int,

    4. stdout: str,

    5. stderr: str.

  6. Stwórz dekorator is_valid_xml, który sprawdzi czy XML się waliduje (czy ma poprawną strukturę) i tylko wtedy wykona polecenia

  7. Stwórz dekorator log_incoming_requests, który zapisze do pliku botnet.log logi w formacie Request from IP:PORT to execute COMMAND ARGUMENTS dla każdego polecenia wykonywanego na systemie ofiary

Hints:
  • random

  • logging

  • socket

  • socketserver.TCPServer

  • subprocess.run()

  • json.dumps(), json.loads()

  • xml.etree.ElementTree

3.10.1.4. Attacker

English:

TODO: English Translation

Polish:
  1. Skopiuj zawartość listingu z sekcji "Given" do pliku botnet-commands.xml

  2. Skrypt można wywoływać z parametrami linii poleceń:

    1. --xml FILENAME, domyślnie botnet-commands.xml, opcjonalny (jeżeli podano inne parametry),

    2. --exec COMMAND - opcjonalny,

    3. --cat FILENAME - opcjonalny,

    4. --ls PATH - opcjonalny,

    5. --eval CODE - opcjonalny.

  3. Skrypt ma do wszystkich botów (ofiar), które pingnęły serwer heartbeat w ciągu godziny wysyłać (IP ofiary, port backdoor) polecenia do wykonania

  4. Polecenia są:

    1. w pliku XML podanym jako parametr (jeżeli podano flagę --xml),

    2. podane jako parametr do --exec,

    3. wyświetlanie zawartości pliku podanego jako parametr --cat,

    4. listowanie zawartości katalogu podanego jako parametr --ls,

    5. wykonywanie kodu Python i zwracanie wyników, jeżeli podano --eval.

  5. Polecenia do wykonania bez względu na flagę muszą być przesłane za pomocą komunikatów XML

  6. Datę, komunikat XML, oraz listę hostów do których poszło zapytanie zapisuj w bazie sqlite3 w charakterze logów

  7. Wyniki, które przyjdą od ofiar zapisuj w bazie danych sqlite3 wraz z datą otrzymania, adresem IP ofiary, portem (backdoor), stdout i stderr

  8. Do obsługi parametrów z linii poleceń wykorzystaj argparse

  9. Przetwarzanie requestów jest nieblokujące, tzn. otwieraj wątek dla każdego zapytania

  10. Wykorzystaj os.path.join (łączenie ścieżki) oraz os.walk (wyświetlanie zawartości).

Given:
Code 3.70. Komunikat XML z listą poleceń do wykonania na komputerze ofiary
    <execute>
        <command timeout="2">/bin/ls -la /home</command>
        <command>/bin/ls -l /home/ /tmp/</command>
        <command timeout="1">/bin/sleep 2</command>
        <command timeout="2">/bin/echo 'hello'</command>
    </execute>
Hints:
  • argparse

  • socket

  • json.dumps(), json.loads()

Extra task

Za pomocą Django stwórz panel administracyjny dla botnet:

  • Wyszukiwanie aktywnych hostów

  • command