GNU/Linux >> Linux の 問題 >  >> Linux

このオープンソースツールを使用してELFバイナリの機能を検査します

Linuxが主要な作業環境である場合は、Linuxで実行可能ファイル、ライブラリ、コアダンプなどに使用される主要なファイル形式であるExecutable and Linkable Format(ELF)に精通している可能性があります。 ELFバイナリを理解するためのネイティブLinuxツールをカバーする記事を書きました。まず、ELFバイナリの構築方法から始めて、ELFバイナリの分析方法に関する一般的なヒントをいくつか紹介します。 ELFと実行可能ファイル全般に精通していない場合は、最初にこれらの記事を読むことをお勧めします。

Capaの紹介

Capaは、Mandiant(サイバーセキュリティ会社)のオープンソースプロジェクトです。プロジェクト自身の言葉で言えば、capaは実行可能ファイルの機能を検出します 。 Capaの主なターゲットは不明であり、悪意のある実行可能ファイルである可能性がありますが、この記事の例では、ツールがどのように機能するかを確認するために、日常のLinuxユーティリティでCapaを実行しています。

ほとんどのマルウェアはWindowsベースであるため、以前のCapaバージョンは、主要なWindows実行可能形式であるPEファイル形式のみをサポートしていました。ただし、v3.0.0以降、ELFファイルのサポートが追加されました(Intezerのおかげです)。

その他のLinuxリソース

  • Linuxコマンドのチートシート
  • 高度なLinuxコマンドのチートシート
  • 無料のオンラインコース:RHELの技術概要
  • Linuxネットワーキングのチートシート
  • SELinuxチートシート
  • Linuxの一般的なコマンドのチートシート
  • Linuxコンテナとは何ですか?
  • 最新のLinux記事

機能とは何ですか?

機能の概念は何ですか 特に実行可能ファイルのコンテキストでは、実際にはどういう意味ですか?プログラムまたはソフトウェアは、特定のコンピューティングニーズを満たすか、問題を解決します。簡単にするために、要件は、ファイルの検索、ファイルの読み取り/書き込み、プログラムの実行、ログファイルへのデータのログ記録、ネットワーク接続のオープンなど、さまざまです。次に、選択したプログラミング言語を使用します。これらのタスクを実行し、プログラムをコンパイルするための特定の手順。結果のバイナリまたは実行可能ファイルは、ユーザーに代わってこれらのタスクを実行するため、結果の実行可能ファイルは対応になります。 上記のタスクを実行します。

ソースコードを見ると、プログラムが何をしているのか、またはその意図が何であるのかを簡単に特定できます。ただし、プログラムが実行可能ファイルとしてコンパイルされると、ソースコードは機械語に変換され、結果の実行可能ファイルの一部ではなくなります(デバッグ情報を使用してコンパイルされた場合を除く)。 Linux API(glibc /システムコール)の知識に裏打ちされた同等のアセンブリ命令を見ると、それでもある程度理解できますが、それは困難です。アセンブリを元のソースコードであった可能性のある擬似コードに変換しようとするデコンパイラのようなツールは存在します。ただし、これは1対1の一致ではなく、最善の努力にすぎません。

なぜ別のツールなのですか?

バイナリを分析するためのネイティブLinuxツールが複数ある場合、なぜ別のツールが必要なのですか?既存のツールは、開発中に発生する可能性のある問題のトラブルシューティングとデバッグを支援します。多くの場合、これらは未知のバイナリの初期分析の最初のステップですが、十分ではありません。

必要なのは、長い逆アセンブルや長い擬似コードではなく、APIの使用法に基づいたバイナリで見られる機能の簡単な要約である場合があります。多くの場合、悪意のあるバイナリやマルウェアは、そのようなネイティブツールを無力にするいくつかの分析防止または逆転防止技術を採用しています。

Capaの主な対象者は、ソースコードが利用できない未知のバイナリに遭遇することが多いマルウェアまたはセキュリティの研究者です。彼らはそれがマルウェアなのか良性の実行可能ファイルなのかを特定する必要があります。最初の最初のステップは、動的分析に移行する前に実行可能ファイルで何ができるかを調べることです。これは、一般的なフレームワーク(以下で説明します)と照合されたいくつかの事前定義されたルールセットを使用して実行できます。ネイティブLinuxツールはそのような用途向けに設計されていません。

容量の取得

ビルド済みのCapaLinuxプログラムをここからダウンロードします。 v3.0.0以降を使用する必要があります。 CapaはPythonでプログラムされていますが、ダウンロードされたプログラムは.pyではありません。 Pythonインタープリターが実行できるファイル。代わりに、Linuxコマンドラインから直接実行されるELF実行可能ファイルです。

$ 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

コマンドラインオプション

Capaには、さまざまなコマンドラインオプションが付属しています。この記事では、ヘルプコンテンツから始めて、それらのいくつかを訪問します。

$ ./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 >>
$
>

次のコマンドを使用して、必要なバージョンのCapa(v3以降)が実行されているかどうかを確認します。

$ ./capa --version
capa v3.0.2-0-gead8a83

Capa出力とMITREATT&CKフレームワーク

Capaの出力は少々圧倒される可能性があるため、最初にpwdなどの単純なユーティリティで実行します。 。 pwd Linuxのコマンドは、現在の作業ディレクトリを出力し、一般的なコマンドです。 pwdに注意してください 使用しているディストリビューションによっては、シェルが組み込まれている場合があります(個別の実行可能ファイルはありません)。 whichを使用してパスを特定します 最初にコマンドを実行してから、Capaへの完全なパスを指定します。次に例を示します:

$ 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                   |
+------------------------------------------------------+------------------------------------------------------+

-f elfを使用してCapaを実行します 分析する実行可能ファイルがELFファイル形式であることを示す引数。このオプションは、不明なバイナリに必要な場合があります。ただし、Capaはそれ自体でフォーマットを完全に検出して分析を実行できるため、必要に応じてこのオプションをスキップできます。最初に、Capaがバックエンドからルールをロードし、実行可能ファイルを分析してそれらのルールを照合すると、読み込み/照合メッセージが表示されます。 -qを追加して、これを表示しないようにします すべてのコマンドのオプション。

Capa出力はさまざまなセクションに分かれています。最初のセクションでは、md5、sha1、またはsha256ハッシュと、それに続くオペレーティングシステム、ファイル形式、およびアーキテクチャ情報を使用して、バイナリを一意に識別します。この情報は、実行可能ファイルを扱うときに重要になることがよくあります。次のセクションでは、CapaはATT&CKの戦術とテクニックを使用して機能を一致させます。

MITRE ATT&CKは、プロジェクト自身の言葉で最もよく説明されています:

MITERATT&CK®は、実世界の観測に基づいた敵の戦術と技術に関するグローバルにアクセス可能な知識ベースです。

ATT&CKの詳細については、こちらのMITRE ATT&CKフレームワークを参照してください。

次の2つのセクションのCapaの出力を、MITRE ATT&CKフレームワークの出力と一致させることができます。この記事ではこの部分をスキップします。

最後に、[機能]セクションで、2つの特定の機能が一覧表示されています。

enumerate files on Linux
write file on Linux

これをpwdの性質と比較してください プログラム。現在のディレクトリを表示する必要があります。ここでは、最初の機能と一致します(すべての概念はLinuxのファイルであることを忘れないでください)。 ファイルの書き込みという2番目の部分はどうですか ?私たちは確かにpwdを書いていません 任意のファイルに出力します。ただし、pwdを覚えておいてください 現在のディレクトリの場所を端末に書き込む必要があります。他にどのように出力が印刷されますか?それでもこれがどのように機能するかわからない場合は、次のコマンドを実行して出力を照合します。 straceに慣れていない場合 またはそれが何をするのか、私はここでそれをカバーする記事を持っています。 書き込みに焦点を当てる pwdが記事の終わりに向かってシステムコール 実行可能ファイルは、ディレクトリパス(文字列)を 1に書き込む必要があります 、これは標準出力の略です。私たちの場合、それがターミナルです。

$ 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 +++

さまざまなLinuxユーティリティでCapaを実行する

Capaの実行方法がわかったので、日常のさまざまなLinuxユーティリティで試してみることを強くお勧めします。ユーティリティを選択するときは、可能な限り多様化するようにしてください。たとえば、lsなどのファイルシステムまたはストレージコマンドで動作するユーティリティを選択します。 、mountcatecho 、など。次に、netstatなどのネットワークユーティリティに移動します。 、sstelnet 、など、実行可能ファイルのネットワーク機能があります。 sshdのようなより広範なプログラムデーモンに拡張します 暗号関連の機能を確認し、続いてsystemdbash 、など。

注意点として、これらのネイティブユーティリティのマルウェアに一致するルールが表示されても、あまり気にしないでください。たとえば、systemdを分析すると、Capaは、ネットワークからデータを受信する機能に基づいて、COMMANDANDCONTROLの一致を示しました。この機能は、本物のプログラムで正当な場合に使用される可能性がありますが、マルウェアは悪意のある目的で使用される可能性があります。

デバッグモードで実行

Capaが実行可能ファイルでこれらすべての機能を見つける方法を確認したい場合は、-dを指定してください。 フラグ。内部の動作を理解するのに役立つ可能性のある追加情報を画面に表示します。このデータを使用して、GitHubのソースコードで手がかりを探してください。

$ ./capa -q /usr/sbin/sshd -d

最初に気付くのは、Capaがルールを一時ディレクトリに保存してそこから読み取ることです:

DEBUG:capa:reading rules from directory /tmp/_MEIKUG6Oj/rules

デバッグ出力は、このディレクトリからさまざまなルールをロードしたことを示しています。例として、マシンのホスト名を特定する方法を確認してください。

DEBUG:capa:loaded rule: 'get hostname' with scope: function

この情報があれば、ルールを簡単に調べることができます。 rulesに移動するだけです ディレクトリとgrep 以下の例のような特定のルール名の場合。ルールは.ymlファイルに記述されています。

$ grep -irn "name: get hostname" *
rules/host-interaction/os/hostname/get-hostname.yml:3:    name: get hostname

-apiを確認してください さまざまなAPIがリストされているセクション。 Capaはgethostnameを探します APIの使用法(Linuxの場合)。そこにリストされている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

Linuxでのこの特定のシステムコールの詳細については、manページを使用してください。

$ man 2 gethostname

GETHOSTNAME(2)                          Linux Programmer's Manual                               GETHOSTNAME(2)

NAME
       gethostname, sethostname - get/set hostname

<< snip >>

詳細な使用法

以下に示すように、どのAPIのCapaが探しているかを識別するもう1つの良い方法は、冗長モードを使用することです。この簡単な例は、opendirの使用法を示しています 、readdir 、および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

カスタムルール

他の優れたツールと同様に、Capaでは独自のルールを追加して拡張できます。このヒントは、気付いた場合はデバッグ出力にも表示されます。

$ capa --signature ./path/to/signatures/ /path/to/executable

特定のルールのみ

Capaにすべてのルールを一致させようとする代わりに、特定のルールを探すこともできます。これを行うには、-tを追加します フラグの後に正確なルール名が続く:

$ ./capa -t "create process on Linux" /usr/sbin/sshd -q -j 

rules内の.ymlファイルからルール名を表示します ディレクトリ。例:

$ grep name rules/host-interaction/process/create/create-process-on-linux.yml
    name: create process on Linux

出力フォーマット

最後に、Capaでは-jを使用してJSON形式で出力できます 国旗。このフラグは、情報をすばやく消費し、自動化を支援します。このコマンド例では、jqコマンドがインストールされている必要があります。

$ ./capa -t "create process on Linux" /usr/sbin/sshd -q -j | jq .

まとめ

Capaは、ELF実行可能ファイルに非常に必要とされているツールへの価値のある追加です。私は非常に必要なと言います Linuxマルウェアの事例が今では定期的に見られるからです。 Linux上のツールは、これらの脅威に対処するために追いつく必要があります。 Capaをいじって、さまざまな実行可能ファイルで試してみることができます。また、コミュニティの利益のために、独自のルールを作成してアップストリームに追加することもできます。


Linux
  1. このLinuxツールとのオープンソースファイル共有

  2. このオープンソースツールを使用してLinuxメモリフォレンジックを実行します

  3. 私のLinuxストーリー:オープンソースで言語の壁を打ち破る

  1. このオープンソースツールを使用して、携帯電話とLinux間でファイルを転送します

  2. LinuxのIPツールでできる3つの便利なこと

  3. オープンソーススキルを持つITプロフェッショナルの採用を増やすための雇用主

  1. このLinuxコマンドラインツールでメモリ使用統計を取得する

  2. このオープンソースツールを使用して、Linux上のiPhoneにアクセスします

  3. このオープンソースツールを使用して、USB上に複数のLinuxディストリビューションを保持します