Pokud je vaším primárním pracovním prostředím Linux, pak možná znáte Executable and Linkable Format (ELF), hlavní formát souborů používaný pro spustitelné soubory, knihovny, výpisy jádra a další v Linuxu. Napsal jsem články týkající se nativních linuxových nástrojů pro pochopení binárních souborů ELF, počínaje tím, jak jsou binární soubory ELF sestaveny, a poté následují některé obecné tipy, jak analyzovat binární soubory ELF. Pokud nejste obeznámeni s ELF a spustitelnými soubory obecně, doporučuji nejprve přečíst tyto články.
Představujeme Capa
Capa je open source projekt společnosti Mandiant (společnost zabývající se kybernetickou bezpečností). Vlastními slovy projektu capa detekuje schopnosti ve spustitelných souborech . Ačkoli primární cíl Capa je neznámý a možná jde o škodlivé spustitelné soubory, příklady v tomto článku spouštějí Capa na každodenních linuxových nástrojích, abyste viděli, jak tento nástroj funguje.
Vzhledem k tomu, že většina malwaru je založena na systému Windows, starší verze Capa podporovaly pouze formát souboru PE, což je dominantní spustitelný formát systému Windows. Počínaje verzí 3.0.0 však byla přidána podpora pro soubory ELF (díky Intezeru).
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Co jsou schopnosti?
Co znamená pojem schopnosti vlastně znamená, zejména v kontextu spustitelných souborů? Programy nebo software splňují určité výpočetní potřeby nebo řeší problém. Abychom to zjednodušili, naše požadavky se mohou lišit od hledání souboru, čtení/zápisu do souboru, spuštění programu, protokolování některých dat do souboru protokolu, otevření síťového připojení atd. Poté použijeme programovací jazyk podle našeho výběru s konkrétní pokyny ke splnění těchto úkolů a sestavení programu. Výsledné binární nebo spustitelné soubory pak tyto úkoly provádějí jménem uživatele, takže výsledný spustitelný soubor je schopný provádění výše uvedených úkolů.
Při pohledu na zdrojový kód je snadné identifikovat, co program dělá nebo jaký je jeho záměr. Jakmile je však program zkompilován jako spustitelný soubor, zdrojový kód se převede do strojového jazyka a již není součástí výsledného spustitelného souboru (pokud není zkompilován s informacemi o ladění). Stále to můžeme pochopit, když se podíváme na ekvivalentní pokyny pro sestavení podložené určitou znalostí linuxového API (glibc/systémová volání), ale je to obtížné. Existují nástroje jako dekompilátory, které se snaží převést sestavení na pseudokód toho, co mohl být původní zdrojový kód. Není to však zápas jeden na jednoho a je to pouze pokus o nejlepší úsilí.
Proč jiný nástroj?
Pokud máme více nativních linuxových nástrojů pro analýzu binárních souborů, proč potřebujeme další? Stávající nástroje pomáhají vývojářům při odstraňování problémů a ladění problémů, které mohou nastat během vývoje. Jsou často prvním krokem pro počáteční analýzu neznámých binárních souborů, ale nejsou dostatečné.
Někdy není potřeba zdlouhavé rozebírání nebo dlouhý pseudokód, ale jen rychlé shrnutí schopností vidět v binárním systému na základě jeho použití API. Škodlivé binární soubory a malware často využívají některé techniky antianalýzy nebo reverzace, které činí takovéto nativní nástroje bezmocnými.
Primárním publikem Capa jsou výzkumníci malwaru nebo bezpečnosti, kteří často narazí na neznámé binární soubory, pro které není dostupný zdrojový kód. Potřebují zjistit, zda se jedná o malware nebo neškodný spustitelný soubor. Prvním prvním krokem je zjistit, co může spustitelný soubor udělat, než přejde na dynamickou analýzu. Toho lze dosáhnout pomocí některých předdefinovaných sad pravidel porovnaných s populárním rámcem (který prozkoumáme níže). Nativní nástroje Linuxu nebyly navrženy pro takové použití.
Získání Capa
Zde si stáhněte předem vytvořený program Capa Linux. Musíte použít verzi 3.0.0 nebo vyšší. Capa je naprogramován v Pythonu, ale stažený program není .py
soubor, který může interpret Pythonu spustit. Místo toho je to spustitelný soubor ELF, který se spouští přímo z příkazového řádku Linuxu.
$ pwd
/root/CAPA
$
$ wget -q https://github.com/mandiant/capa/releases/download/v3.0.2/capa-v3.0.2-linux.zip
$
$ file capa-v3.0.2-linux.zip
capa-v3.0.2-linux.zip: Zip archive data, at least v2.0 to extract
$
$ unzip capa-v3.0.2-linux.zip
Archive: capa-v3.0.2-linux.zip
inflating: capa
$
$ ls -l capa
-rwxr-xr-x. 1 root root 41282976 Sep 28 18:29 capa
$
$ file capa
capa: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1da3a1d77c7109ce6444919f4a15e7e6c63d02fa, stripped
Možnosti příkazového řádku
Capa přichází s řadou možností příkazového řádku. Tento článek navštíví několik z nich, počínaje obsahem nápovědy:
$ ./capa -h
usage: capa [-h] [--version] [-v] [-vv] [-d] [-q] [--color {auto,always,never}] [-f {auto,pe,elf,sc32,sc64,freeze}]
[-b {vivisect,smda}] [-r RULES] [-s SIGNATURES] [-t TAG] [-j]
sample
The FLARE team's open-source tool to identify capabilities in executable files.
<< snip >>
$
Tento příkaz použijte ke kontrole, zda je spuštěna požadovaná verze Capa (v3 a vyšší):
$ ./capa --version
capa v3.0.2-0-gead8a83
Výstup Capa a rámec MITER ATT&CK
Výstup Capa může být trochu ohromující, takže jej nejprve spusťte na jednoduchém nástroji, jako je pwd
. pwd
příkaz na Linuxu vytiskne aktuální pracovní adresář a jedná se o běžný příkaz. Vezměte prosím na vědomí, že pwd
může být pro vás vestavěný shell (žádný samostatný spustitelný soubor) v závislosti na distribuci, kterou používáte. Identifikujte jeho cestu pomocí which
nejprve příkaz a poté poskytněte úplnou cestu k Capa. Zde je příklad:
$ which pwd
/usr/bin/pwd
$
$ file /usr/bin/pwd
/usr/bin/pwd: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=ec306ddd72ce7be19dfc1e62328bb89b6b3a6df5, for GNU/Linux 3.2.0, stripped
$
$ ./capa -f elf /usr/bin/pwd
loading : 100%| 633/633 [00:00<00:00, 2409.72 rules/s]
matching: 100%| 76/76 [00:01<00:00, 38.87 functions/s, skipped 0 library functions]
+------------------------+------------------------------------------------------------------------------------+
| md5 | 8d50bbd7fea04735a70f21cca5063efe |
| sha1 | 7d9df581bc3d34c9fb93058be2cdb9a8c04ec061 |
| sha256 | 53205e6ef4e1e7e80745adc09c00f946ae98ccf6f8eb9c4535bd29188f7f1d91 |
| os | linux |
| format | elf |
| arch | amd64 |
| path | /usr/bin/pwd |
+------------------------+------------------------------------------------------------------------------------+
+------------------------+------------------------------------------------------------------------------------+
| ATT&CK Tactic | ATT&CK Technique |
|------------------------+------------------------------------------------------------------------------------|
| DISCOVERY | File and Directory Discovery:: T1083 |
+------------------------+------------------------------------------------------------------------------------+
+-----------------------------+-------------------------------------------------------------------------------+
| MBC Objective | MBC Behavior |
|-----------------------------+-------------------------------------------------------------------------------|
| FILE SYSTEM | Writes File:: [C0052] |
+-----------------------------+-------------------------------------------------------------------------------+
+------------------------------------------------------+------------------------------------------------------+
| CAPABILITY | NAMESPACE |
|------------------------------------------------------+------------------------------------------------------|
| enumerate files on Linux (2 matches) | host-interaction/file-system/files/list |
| write file on Linux | host-interaction/file-system/write |
+------------------------------------------------------+------------------------------------------------------+
Spusťte Capa pomocí -f elf
argument, který říká, že spustitelný soubor k analýze je ve formátu souboru ELF. Tato volba může být vyžadována pro neznámé binární soubory; Capa je však dokonale schopen detekovat formát sám o sobě a provést analýzu, takže tuto možnost můžete v případě potřeby přeskočit. Na začátku uvidíte zprávu o načítání/párování, když Capa načte svá pravidla z backendu a poté analyzuje spustitelný soubor a porovná tato pravidla s ním. Přeskočte toto zobrazení přidáním -q
možnost ke všem příkazům.
Výstup Capa je rozdělen do různých sekcí. První část jednoznačně identifikuje binární soubor pomocí hash md5, sha1 nebo sha256, za nímž následuje operační systém, formát souboru a informace o architektuře. Tyto informace jsou často kritické při práci se spustitelnými soubory. V následujících částech Capa používá taktiku a techniku ATT&CK, aby odpovídala schopnostem.
MITRE ATT&CK nejlépe vystihují vlastní slova projektu:
MITER ATT&CK® je globálně dostupná znalostní báze o taktice a technikách protivníka založená na pozorováních v reálném světě.
Chcete-li se o ATT&CK dozvědět více, podívejte se na rámec MITER ATT&CK zde.
Výstup Capa v následujících dvou částech můžete porovnat s výstupem rámce MITER ATT&CK. Tuto část v tomto článku přeskočím.
Nakonec v sekci Schopnosti můžete vidět dvě konkrétní schopnosti uvedené v seznamu:
enumerate files on Linux
write file on Linux
Porovnejte to s povahou pwd
program, který potřebuje zobrazit aktuální adresář. Zde se shoduje s první schopností (nezapomeňte, že koncept všeho je v Linuxu soubor). A co druhá část, která říká zápis souboru ? Určitě jsme nenapsali pwd
výstup do libovolného souboru. Pamatujte však na pwd
potřebuje zapsat aktuální umístění adresáře do terminálu; jak jinak bude výstup vytištěn? Pokud si stále nejste jisti, jak to funguje, spusťte následující příkaz a porovnejte výstup. Pokud neznáte strace
nebo co to dělá, mám článek, který to popisuje zde. Zaměřte se na zápis systémové volání ke konci článku, kde je pwd
spustitelný soubor potřebuje zapsat cestu k adresáři (řetězec) do 1 , což znamená standardní out. V našem případě je to terminál.
$ strace -f /usr/bin/pwd
execve("/usr/bin/pwd", ["/usr/bin/pwd"], 0x7ffd7983a238 /* 49 vars */) = 0
brk(NULL)
<< snip >>
write(1, "/root/CAPA\n", 11/root/CAPA
) = 11
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
Spuštění Capa na různých linuxových nástrojích
Nyní, když víte, jak spouštět Capa, velmi doporučuji, abyste si to vyzkoušeli na různých každodenních linuxových nástrojích. Při výběru inženýrských sítí se snažte být co nejrozmanitější. Vyberte například nástroje, které pracují se systémy souborů nebo příkazy úložiště, jako je ls
, mount
, cat
, echo
, atd. Dále přejděte na síťové nástroje, jako je netstat
, ss
, telnet
atd., kde najdete síťové možnosti spustitelného souboru. Rozšiřte jej na rozsáhlejší programové démony jako sshd
zobrazíte možnosti související s kryptoměnami, následované systemd
, bash
, atd.
Pozor, nenechte se příliš vyděsit, pokud uvidíte pravidla, která odpovídají malwaru pro tyto nativní nástroje. Například při analýze systemd Capa ukázal shody pro COMMAND AND CONTROL na základě schopnosti přijímat data ze sítě. Tuto schopnost mohou používat originální programy pro legitimní případy, zatímco malware by ji mohl využít ke škodlivým účelům.
Spuštění v režimu ladění
Pokud chcete vidět, jak Capa najde všechny tyto schopnosti ve spustitelném souboru, zadejte -d
příznak, který na obrazovce zobrazuje další informace, které mohou pomoci pochopit jeho vnitřní fungování. Použijte tato data a hledejte vodítka ve zdrojovém kódu na GitHubu.
$ ./capa -q /usr/sbin/sshd -d
První věc, které si všimnete, je, že Capa ukládá pravidla do dočasného adresáře a čte je odtud:
DEBUG:capa:reading rules from directory /tmp/_MEIKUG6Oj/rules
Výstup ladění ukazuje, že z tohoto adresáře byla načtena různá pravidla. Jako příklad se podívejte, jak se pokusil identifikovat název hostitele počítače:
DEBUG:capa:loaded rule: 'get hostname' with scope: function
S těmito informacemi je snadné vyhledat pravidlo. Jednoduše přejděte na rules
adresář a grep
pro konkrétní název pravidla jako v příkladu níže. Pravidlo je uvedeno v souboru .yml.
$ grep -irn "name: get hostname" *
rules/host-interaction/os/hostname/get-hostname.yml:3: name: get hostname
Zkontrolujte -api
sekce, kde jsou uvedena různá rozhraní API. Capa hledá gethostname
Využití API (v Linuxu) a můžete vidět i ekvivalent pro Windows.
$ cat _MEIKUG6Oj/rules/host-interaction/os/hostname/get-hostname.yml
rule:
meta:
name: get hostname
namespace: host-interaction/os/hostname
<< snip >>
features:
- or:
- api: kernel32.GetComputerName
- api: kernel32.GetComputerNameEx
- api: GetComputerObjectName
- api: ws2_32.gethostname
- api: gethostname
Více informací o tomto specifickém systémovém volání na Linuxu můžete najít pomocí manuálové stránky.
$ man 2 gethostname
GETHOSTNAME(2) Linux Programmer's Manual GETHOSTNAME(2)
NAME
gethostname, sethostname - get/set hostname
<< snip >>
Podrobné použití
Dalším dobrým způsobem, jak zjistit, které API Capa hledá, je použití podrobného režimu, jak je uvedeno níže. Tento jednoduchý příklad ukazuje použití opendir
, readdir
a fwrite
API:
$ ./capa -q /usr/bin/pwd -vv
enumerate files on Linux (2 matches)
<< snip >>
api: opendir @ 0x20052E8
api: readdir @ 0x2005369, 0x200548A
write file on Linux
<< snip >>
os: linux
or:
api: fwrite @ 0x2002CB5
Vlastní pravidla
Stejně jako u jiných dobrých nástrojů vám Capa umožňuje rozšířit ji přidáním vlastních pravidel. Tato nápověda byla také uvedena ve výstupu ladění, pokud jste si všimli.
$ capa --signature ./path/to/signatures/ /path/to/executable
Pouze konkrétní pravidla
Můžete také hledat konkrétní pravidla, místo aby se Capa snažil vyhovět každému pravidlu. To provedete přidáním -t
příznak následovaný přesným názvem pravidla:
$ ./capa -t "create process on Linux" /usr/sbin/sshd -q -j
Zobrazte název pravidla ze souborů .yml v rules
adresář. Například:
$ grep name rules/host-interaction/process/create/create-process-on-linux.yml
name: create process on Linux
Výstupní formát
Nakonec Capa umožňuje výstup ve formátu JSON pomocí -j
vlajka. Tento příznak pomáhá rychle spotřebovat informace a napomáhá automatizaci. Tento příklad příkazu vyžaduje, aby byl nainstalován příkaz jq:
$ ./capa -t "create process on Linux" /usr/sbin/sshd -q -j | jq .
Sbalit
Capa je důstojným doplňkem k tolik potřebným nástrojům pro spustitelné soubory ELF. Říkám velmi potřebné protože nyní pravidelně vidíme případy linuxového malwaru. Nástroje na Linuxu musí dohnat, aby se s těmito hrozbami vypořádaly. Můžete si hrát s Capou a zkoušet to na různých spustitelných souborech a také si napsat vlastní pravidla a přidat je upstream ve prospěch komunity.