GNU/Linux >> Znalost Linux >  >> Linux

Prohlédněte si možnosti binárních souborů ELF pomocí tohoto nástroje s otevřeným zdrojovým kódem

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.


Linux
  1. Sdílení souborů s otevřeným zdrojovým kódem s tímto nástrojem Linux

  2. Můj příběh o Linuxu:překonání jazykových bariér pomocí open source

  3. 3 užitečné věci, které můžete dělat s nástrojem IP v Linuxu

  1. Přenášejte soubory mezi telefonem a Linuxem pomocí tohoto open source nástroje

  2. Provádějte forenzní analýzu paměti Linuxu pomocí tohoto nástroje s otevřeným zdrojovým kódem

  3. Zaměstnavatelé zvýšit nábor IT profesionálů s open source dovednostmi

  1. Získejte statistiky využití paměti pomocí tohoto nástroje příkazového řádku systému Linux

  2. Získejte přístup ke svému iPhone v systému Linux pomocí tohoto nástroje s otevřeným zdrojovým kódem

  3. Udržujte více linuxových distribucí na USB pomocí tohoto open source nástroje