14. Mini Botnet

14.1. Assignment

14.1.1. Mini Botnet

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

    • Heartbeat Receiver - server przyjmujący informacje o ofiarach (czy wciąż żyją i jakie mają backdoory),
    • Victim - ofiara,
    • Attacket - atakujący.
../_images/botnet.png

Fig. 14.1. Architektura botnet

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

14.1.2. Heartbeat Receiver

  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:

    • datetime DATETIME,
    • host TEXT,
    • port INTEGER.
About:
  • Filename: botnet_heartbeat_receiver.py
  • Lines of code to write: 45 lines
  • Estimated time of completion: 30 min
Hints:
  • socketserver.UDPServer

14.1.3. Victim

  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 Receivera

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

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

    • date: datetime (UTC),
    • host: str,
    • port: int,
    • stdout: str,
    • stderror: 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

About:
  • Filename: botnet_victim.py
  • Lines of code to write: 150 lines
  • Estimated time of completion: 75 min
Hints:
  • random
  • logging
  • socket
  • socketserver.TCPServer
  • subprocess.run()
  • json.dumps(), json.loads()
  • xml.etree.ElementTree

14.1.4. Attacker

  1. Skopiuj zawartość Code Listing 14.1. do pliku botnet-commands.xml

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

    • --xml FILENAME, domyślnie botnet-commands.xml, opcjonalny (jeżeli podano inne parametry),
    • --exec COMMAND - opcjonalny,
    • --cat FILENAME - opcjonalny,
    • --ls PATH - opcjonalny,
    • --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ą:

    • w pliku XML podanym jako parametr (jeżeli podano flagę --xml),
    • podane jako parametr do --exec,
    • wyświetlanie zawartości pliku podanego jako parametr --cat,
    • listowanie zawartości katalogu podanego jako parametr --ls,
    • 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).

Code Listing 14.1. 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 'juz wstalem'</command>
    </execute>
About:
  • Filename: botnet_attacker.py
  • Lines of code to write: 150 lines
  • Estimated time of completion: 75 min
Hints:
  • argparse
  • socket
  • json.dumps(), json.loads()
Zadanie z gwiazdką:
 

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

  • Wyszukiwanie aktywnych hostów
  • command