4.10. Mini Botnet

4.10.1. Assignments

4.10.1.1. Mini Botnet

  • Assignment: Mini Botnet

  • 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.

  2. Run doctests - all must succeed

../../_images/botnet.png

Figure 4.62. Architektura botnet

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

4.10.1.2. Heartbeat Receiver

  • Assignment: Heartbeat Receiver

  • Complexity: medium

  • Lines of code: 45 lines

  • Time: 21 min

English:
  1. Server should accept UDP messages on port 1337

  2. UTC date of packet arrival, IP and backdoor port should be saved to sqlite3 database as fields:

    1. datetime DATETIME,

    2. host TEXT,

    3. port INTEGER.

  3. Run doctests - all must succeed

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.

  3. Uruchom doctesty - wszystkie muszą się powieść

Hints:
  • socketserver.UDPServer

4.10.1.3. Victim

  • Assignment: Victim

  • Complexity: medium

  • Lines of code: 150 lines

  • Time: 34 min

English:
  1. After infection it opens random TCP port (backdoor) from range 1025-65535 and listens for commands

  2. Why such port range?

  3. Every 5 seconds it sends information with its backdoor port and IP to Heartbeat Receiver

  4. After receiving XML message on backdoor port it executes command from XML

  5. Victim should send JSON to attacker in format:

    1. date: datetime (UTC),

    2. host: str,

    3. port: int,

    4. stdout: str,

    5. stderr: str.

  6. Create decorator is_valid_xml, which will check if XML is valid (has correct structure) and only then execute commands

  7. Create decorator log_incoming_requests, which will save to file botnet.log logs in format Request from IP:PORT to execute COMMAND ARGUMENTS for every command executed on victim

  8. Run doctests - all must succeed

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

  8. Uruchom doctesty - wszystkie muszą się powieść

Hints:
  • random

  • logging

  • socket

  • socketserver.TCPServer

  • subprocess.run()

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

  • xml.etree.ElementTree

4.10.1.4. Attacker

  • Assignment: Attacker

  • Complexity: medium

  • Lines of code: 150 lines

  • Time: 34 min

English:
  1. Copy contents of listing from section "Given" to file botnet-commands.xml

  2. Script should be called with command line parameters:

    1. --xml FILENAME, default botnet-commands.xml, optional (if other parameters are given),

    2. --exec COMMAND - optional,

    3. --cat FILENAME - optional,

    4. --ls PATH - optional,

    5. --eval CODE - optional.

  3. Script should send to all bots (victims), which pinged heartbeat server in last hour (IP of victim, backdoor port) commands to execute

  4. Commands are:

    1. from XML file given as parameter (if --xml flag is given),

    2. given as parameter to --exec,

    3. displaying contents of file given as parameter to --cat,

    4. listing contents of directory given as parameter to --ls,

    5. executing Python code and returning results, if --eval is given.

  5. Commands to execute regardless of flag must be sent as XML messages

  6. Date, XML message, and list of hosts to which request was sent should be saved to sqlite3 database as logs

  7. Results, which will come from victims should be saved to sqlite3 database with date of receiving, victim IP, port (backdoor), stdout and stderr

  8. For command line parameters use argparse

  9. Processing requests should be non-blocking, i.e. open thread for every request

  10. Use os.path.join (joining path) and os.walk (listing contents).

  11. Run doctests - all must succeed

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).

  11. Uruchom doctesty - wszystkie muszą się powieść

Given:
Code 4.96. 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