著者は、 Electronic Frontier Foundation Inc を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

セキュリティの脅威はますます高度化するため、開発者とシステム管理者は、アプリケーションのセキュリティを防御およびテストする際に積極的なアプローチを取る必要があります。

クライアントアプリケーションまたはネットワークサービスのセキュリティをテストするための一般的な方法は、ファジングです。これには、無効または不正な形式のデータをアプリケーションに繰り返し送信し、その応答を分析することが含まれます。 これは、破損したデータや実際の攻撃など、予期しない入力に対してアプリケーションがどの程度回復力があり、堅牢であるかをテストするのに役立ちます。

Radamsa は、ユーザー指定の入力データに基づいてテストケースを生成できるオープンソースのファジングツールです。 Radamsaは完全にスクリプト化可能であり、これまでのところ、Gzipなどの実際のアプリケーションの脆弱性を見つけることに成功しています。

このチュートリアルでは、Radamsaをインストールして使用し、独自のテストケースを使用してコマンドラインおよびネットワークベースのアプリケーションをファジングします。

警告: Radamsaは侵入テストツールであり、特定のシステムまたはアプリケーションの脆弱性または弱点を特定できる可能性があります。 Radamsaで見つかった脆弱性を、あらゆる形態の無謀な行動、危害、または悪意のある悪用に使用してはなりません。 脆弱性は、影響を受けるアプリケーションのメンテナに倫理的に報告する必要があり、明示的な許可なしに公開しないでください。

前提条件

このガイドを開始する前に、次のものが必要です。

  • Ubuntu 18.04を使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu18.04サーバー。これには、sudo非rootユーザーと、非必須ポートをブロックするファイアウォールが含まれます。
  • テストするコマンドラインまたはネットワークベースのアプリケーション。たとえば、Gzip、Tcpdump、Bind、Apache、jq、またはその他の任意のアプリケーション。 このチュートリアルの目的の例として、jqを使用します。

警告: Radamsaは、アプリケーションまたはシステムを不安定に実行したり、クラッシュさせたりする可能性があるため、専用サーバーなど、これに備えた環境でのみRadamsaを実行してください。 また、システムに対してファジングテストを実行する前に、システムの所有者から書面による明示的な許可を得ていることを確認してください。

これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。

ステップ1—Radamsaをインストールする

まず、Radamsaをダウンロードしてコンパイルし、システムでの使用を開始します。 Radamsaのソースコードは、GitLab公式リポジトリで入手できます。

ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映することから始めます。

  1. sudo apt update

次に、をインストールします gcc, git, make、 と wget ソースコードを実行可能なバイナリにコンパイルするために必要なパッケージ:

  1. sudo apt install gcc git make wget

インストールを確認した後、 apt 指定されたパッケージとそれらに必要なすべての依存関係をダウンロードしてインストールします。

次に、GitLabでホストされているリポジトリからクローンを作成して、Radamsaのソースコードのコピーをダウンロードします。

  1. git clone https://gitlab.com/akihe/radamsa.git

これにより、というディレクトリが作成されます radamsa、アプリケーションのソースコードが含まれています。 ディレクトリに移動して、コードのコンパイルを開始します。

  1. cd radamsa

次に、を使用してコンパイルプロセスを開始できます make:

  1. make

最後に、コンパイルされたRadamsaバイナリを $PATH:

  1. sudo make install

これが完了したら、インストールされているバージョンをチェックして、すべてが機能していることを確認できます。

  1. radamsa --version

出力は次のようになります。

Output
Radamsa 0.6

あなたが見たら radamsa: command not found エラーが発生した場合は、必要なすべての依存関係がインストールされていること、およびコンパイル中にエラーが発生していないことを再確認してください。

Radamsaをインストールしたので、Radamsaがどのように機能し、何に使用できるかを理解するために、いくつかのサンプルテストケースの生成を開始できます。

ステップ2—ファジングテストケースの生成

Radamsaがインストールされたので、これを使用してファジングテストケースを生成できます。

テストケースは、テストしているプログラムへの入力として使用されるデータです。 たとえば、Gzipなどのアーカイブプログラムをファジングテストしている場合、テストケースは解凍しようとしているファイルアーカイブである可能性があります。

注: Radamsaは、極端な繰り返し、ビットフリップ、制御文字の挿入など、さまざまな予期しない方法で入力データを操作します。 これにより、ターミナルセッションが中断または不安定になる可能性があるため、続行する前にこれに注意してください。

まず、簡単なテキストをRadamsaに渡して、何が起こるかを確認します。

  1. echo "Hello, world!" | radamsa

これにより、入力されたデータが操作(またはファズ)され、テストケースが出力されます。次に例を示します。

Output
Hello,, world!

この場合、Radamsaは間に余分なコンマを追加しました Helloworld. これは重要な変更のようには見えないかもしれませんが、一部のアプリケーションでは、これによりデータが正しく解釈されない場合があります。

同じコマンドを実行して、もう一度試してみましょう。 異なる出力が表示されます。

Output
Hello, '''''''wor'd!

今回は、複数の一重引用符(')を上書きしたものを含め、文字列に挿入されました lworld. この特定のテストケースでは、リスト内のさまざまなデータを区切るために一重引用符または二重引用符がよく使用されるため、アプリケーションで問題が発生する可能性が高くなります。

もう一度試してみましょう:

Output
Hello, $+$PATH\u0000`xcalc`world!

この場合、Radamsaはシェルインジェクション文字列を挿入しました。これは、テストしているアプリケーションのコマンドインジェクションの脆弱性をテストするのに役立ちます。

Radamsaを使用して入力文字列をファジー化し、一連のテストケースを作成しました。 次に、Radamsaを使用してコマンドラインアプリケーションをファズします。

ステップ3—コマンドラインアプリケーションのファジング

このステップでは、Radamsaを使用してコマンドラインアプリケーションをファズし、発生したクラッシュについて報告します。

各プログラムをファジングするための正確な手法は大きく異なり、さまざまな方法がさまざまなプログラムに最も効果的です。 ただし、このチュートリアルでは、次の例を使用します。 jq、JSONデータを処理するためのコマンドラインプログラムです。

何らかの形式の構造化データまたは非構造化データを取得し、それを使用して何かを実行し、結果を出力するという一般原則に従っている限り、他の同様のプログラムを使用できます。 たとえば、この例はGzip、Grep、bc、trなどでも機能します。

まだお持ちでない場合 jq インストール済み、を使用してインストールできます apt:

  1. sudo apt install jq

jq これでインストールされます。

ファジングを開始するには、Radamsaへの入力として使用するサンプルJSONファイルを作成します。

  1. nano test.json

次に、次のサンプルJSONデータをファイルに追加します。

test.json
{
  "test": "test",
  "array": [
    "item1: foo",
    "item2: bar"
  ]
}

このファイルは次を使用して解析できます jq JSON構文が有効であることを確認したい場合:

  1. jq . test.json

JSONが有効な場合、 jq ファイルを出力します。 それ以外の場合は、エラーが表示され、必要に応じて構文を修正するために使用できます。

次に、Radamsaを使用してテストJSONファイルをファズし、それをに渡します jq. これは原因になります jq 元の有効なJSONデータではなく、ファジング/操作されたテストケースを読み取るには:

  1. radamsa test.json | jq

RadamsaがJSONデータを構文的に有効な方法でファジー化した場合、 jq データを出力しますが、Radamsaがそれに加えた変更はすべて含まれます。

または、RadamsaによってJSONデータが無効になる場合は、 jq 関連するエラーが表示されます。 例えば:

Output
parse error: Expected separator between values at line 5, column 16

別の結果は次のようになります jq ファジングされたデータを正しく処理できず、クラッシュまたは誤動作を引き起こします。 これは、バッファオーバーフローやコマンドインジェクションなどのセキュリティの脆弱性を示している可能性があるため、ファジングで本当に探しているものです。

このような脆弱性をより効率的にテストするために、 Bashスクリプトを使用して、テストケースの生成、ターゲットプログラムへの受け渡し、関連する出力のキャプチャなど、ファジングプロセスを自動化できます。

名前の付いたファイルを作成します jq-fuzz.sh:

  1. nano jq-fuzz.sh

正確なスクリプトの内容は、ファジングしているプログラムのタイプと入力データによって異なりますが、 jq および他の同様のプログラムでは、次のスクリプトで十分です。

スクリプトをにコピーします jq-fuzz.sh ファイル:

jq-fuzz.sh
#!/bin/bash
while true; do
  radamsa test.json > input.txt
  jq . input.txt > /dev/null 2>&1
  if [ $? -gt 127 ]; then
    cp input.txt crash-`date +s%.%N`.txt
    echo "Crash found!"
  fi
done

このスクリプトには、 while コンテンツを繰り返しループさせます。 スクリプトがループするたびに、Radamsaはに基づいてテストケースを生成します test.json に保存します input.txt.

The input.txt その後、テストケースが実行されます jq、すべての標準出力とエラー出力がにリダイレクトされます /dev/null ターミナル画面がいっぱいにならないようにします。

最後に、の終了値 jq チェックされます。 終了値がより大きい場合 127、これは致命的な終了(クラッシュ)を示します。入力データは、後日確認できるように、という名前のファイルに保存されます。 crash- その後に、Unix秒とナノ秒単位の現在の日付が続きます。

スクリプトを実行可能としてマークし、実行を設定して、ファズテストを自動的に開始します jq:

  1. chmod +x jq-fuzz.sh
  2. ./jq-fuzz.sh

あなたは発行することができます CTRL+C スクリプトを終了するためにいつでも。 次に、を使用してクラッシュが検出されたかどうかを確認できます。 ls 作成されたクラッシュファイルを含むディレクトリリストを表示します。

より複雑な入力ファイルを使用すると、ファジング結果の品質が向上する可能性があるため、JSON入力データを改善することをお勧めします。 大きなファイルや繰り返しデータが多いファイルの使用は避けてください。理想的な入力ファイルは、サイズが小さいにもかかわらず、できるだけ多くの「複雑な」要素が含まれているファイルです。 たとえば、優れた入力ファイルには、文字列、整数、ブール値、リスト、オブジェクトなど、すべての形式で保存されたデータのサンプルと、可能な場合はネストされたデータが含まれます。

Radamsaを使用してコマンドラインアプリケーションをファズしました。 次に、Radamsaを使用して、ネットワークサービスへのリクエストをファズします。

ステップ4—ネットワークサービスへのファジングリクエスト

Radamsaは、ネットワーククライアントまたはサーバーとして機能するネットワークサービスをファズするためにも使用できます。 このステップでは、Radamsaを使用してネットワークサービスをファズし、Radamsaをクライアントとして機能させます。

ファジングネットワークサービスの目的は、特定のネットワークサービスが、不正な形式や悪意のあるデータを送信するクライアントに対してどの程度回復力があるかをテストすることです。 WebサーバーやDNSサーバーなどの多くのネットワークサービスは通常インターネットに公開されているため、攻撃者の一般的な標的になります。 不正な形式のデータの受信に対して十分な耐性がないネットワークサービスは、クラッシュするか、さらに悪いことにオープン状態で失敗し、攻撃者が暗号化キーやユーザーデータなどの機密データを読み取る可能性があります。

ネットワークサービスをファジングするための具体的な手法は、問題のネットワークサービスによって大きく異なりますが、この例では、Radamsaを使用して静的HTMLコンテンツを提供する基本的なWebサーバーをファジングします。

まず、テストに使用するWebサーバーを設定する必要があります。 これは、付属の組み込み開発サーバーを使用して行うことができます。 php-cli パッケージ。 あなたも必要になります curl Webサーバーをテストするため。

お持ちでない場合 php-cli および/または curl インストール済み、を使用してそれらをインストールできます apt:

  1. sudo apt install php-cli curl

次に、Webサーバーファイルを保存するディレクトリを作成し、そこに移動します。

  1. mkdir ~/www
  2. cd ~/www

次に、サンプルテキストを含むHTMLファイルを作成します。

  1. nano index.html

ファイルに以下を追加します。

index.html
<h1>Hello, world!</h1>

これで、PHPWebサーバーを実行できます。 別のターミナルセッションを使用しているときにWebサーバーのログを表示できる必要があるため、別のターミナルセッションを開き、サーバーにSSHで接続します。

  1. cd ~/www
  2. php -S localhost:8080

これにより、次のようなものが出力されます。

Output
PHP 7.2.24-0ubuntu0.18.04.1 Development Server started at Wed Jan 1 16:06:41 2020 Listening on http://localhost:8080 Document root is /home/user/www Press Ctrl-C to quit.

これで、元のターミナルセッションに戻って、Webサーバーが使用して動作していることをテストできます。 curl:

  1. curl localhost:8080

これにより、サンプルが出力されます index.html 以前に作成したファイル:

Output
<h1>Hello, world!</h1>

Webサーバーはローカルでのみアクセス可能である必要があるため、ファイアウォールでポートを開かないでください。

テストWebサーバーをセットアップしたので、Radamsaを使用してファジングテストを開始できます。

まず、Radamsaの入力データとして使用するサンプルHTTPリクエストを作成する必要があります。 これを保存する新しいファイルを作成します。

  1. nano http-request.txt

次に、次のサンプルHTTPリクエストをファイルにコピーします。

http-request.txt
GET / HTTP/1.1
Host: localhost:8080
User-Agent: test
Accept: */*

次に、Radamsaを使用して、このHTTPリクエストをローカルWebサーバーに送信できます。 これを行うには、RadamsaをTCPクライアントとして使用する必要があります。これは、接続するIPアドレスとポートを指定することで実行できます。

  1. radamsa -o 127.0.0.1:8080 http-request.txt

注: TCPクライアントとしてRadamsaを使用すると、不正な形式のデータや悪意のあるデータがネットワーク経由で送信される可能性があることに注意してください。 これは問題を引き起こす可能性があるため、テストが許可されているネットワークにのみアクセスするように十分に注意するか、できればローカルホストの使用に固執してください(127.0.0.1) 住所。

最後に、ローカルWebサーバーの出力ログを表示すると、リクエストを受信したことがわかりますが、無効/不正な形式であるため、ほとんどの場合、リクエストは処理されていません。

出力されたログは、2番目のターミナルウィンドウに表示されます。

Output
[Wed Jan 1 16:26:49 2020] 127.0.0.1:49334 Invalid request (Unexpected EOF) [Wed Jan 1 16:28:04 2020] 127.0.0.1:49336 Invalid request (Malformed HTTP request) [Wed Jan 1 16:28:05 2020] 127.0.0.1:49338 Invalid request (Malformed HTTP request) [Wed Jan 1 16:28:07 2020] 127.0.0.1:49340 Invalid request (Unexpected EOF) [Wed Jan 1 16:28:08 2020] 127.0.0.1:49342 Invalid request (Malformed HTTP request)

最適な結果を得て、クラッシュが確実に記録されるようにするには、手順3で使用したものと同様の自動化スクリプトを作成することをお勧めします。 さらに複雑な入力ファイルの使用も検討する必要があります。このファイルには、追加のHTTPヘッダーなどの追加が含まれている場合があります。

TCPクライアントとして機能するRadamsaを使用してネットワークサービスをファジーしました。 次に、Radamsaがサーバーとして機能するネットワーククライアントをファズします。

ステップ5—ファジングネットワーククライアントアプリケーション

このステップでは、Radamsaを使用してネットワーククライアントアプリケーションのファジングテストを行います。 これは、ネットワークサービスからの応答を傍受し、クライアントが受信する前にそれらをファジングすることによって実現されます。

この種のファジングの目的は、ネットワーククライアントアプリケーションがネットワークサービスから不正な形式または悪意のあるデータを受信することに対する回復力をテストすることです。 たとえば、Webサーバー(ネットワークサービス)から不正な形式のHTMLを受信するWebブラウザー(クライアント)をテストしたり、DNSサーバーから不正な形式のDNS応答を受信したDNSクライアントをテストしたりします。

ファジングコマンドラインアプリケーションまたはネットワークサービスの場合と同様に、各ネットワーククライアントアプリケーションをファジングするための正確な手法はかなり異なりますが、この例では使用します whois、これは単純なTCPベースの送受信アプリケーションです。

The whois アプリケーションは、WHOISサーバーにリクエストを送信し、応答としてWHOISレコードを受信するために使用されます。 WHOISはTCPポートを介して動作します 43 クリアテキストであるため、ネットワークベースのファジングテストに適しています。

まだお持ちでない場合 whois 利用可能で、を使用してインストールできます apt:

  1. sudo apt install whois

まず、サンプルを取得する必要があります whois 入力データとして使用するための応答。 あなたは作ることによってこれを行うことができます whois 要求し、出力をファイルに保存します。 テストしているときに、ここで任意のドメインを使用できます whois サンプルデータを使用してローカルでプログラムする:

  1. whois example.com > whois.txt

次に、これのファジーバージョンを提供するサーバーとしてRadamsaを設定する必要があります whois 応答。 Radamsaがサーバーモードで実行されたら、ターミナルを引き続き使用できる必要があるため、別のターミナルセッションを開いて、サーバーへのSSH接続を行うことをお勧めします。

  1. radamsa -o :4343 whois.txt -n inf

RadamsaはTCPサーバーモードで実行され、ファジーバージョンの whois.txt サーバーに接続するたびに、受信した要求データに関係なく。

これで、テストに進むことができます whois クライアントアプリケーション。 あなたは普通にする必要があります whois 選択したドメインをリクエストします(サンプルデータと同じである必要はありません)が、 whois ローカルのRadamsaサーバーを指しています:

  1. whois -h localhost:4343 example.com

応答はサンプルデータになりますが、Radamsaによってあいまいになります。 Radamsaが実行されている限り、ローカルサーバーにリクエストを送信し続けることができ、毎回異なるファジー応答を提供します。

ファジングネットワークサービスと同様に、このネットワーククライアントのファジングテストの効率を向上させ、クラッシュが確実にキャプチャされるようにするには、手順3で使用したものと同様の自動化スクリプトを作成することをお勧めします。

この最後のステップでは、Radamsaを使用してネットワーククライアントアプリケーションのファジングテストを実施しました。

結論

この記事では、Radamsaをセットアップし、それを使用してコマンドラインアプリケーション、ネットワークサービス、およびネットワーククライアントをファズしました。 これで、独自のアプリケーションをファジングテストするために必要な基礎知識が得られました。これにより、アプリケーションの堅牢性と攻撃に対する耐性が向上することを願っています。

ラダムサをさらに探索したい場合は、ラダムサを確認することをお勧めします README ツールの使用方法の詳細な技術情報と例が含まれているため、詳細にファイルします。

また、バイナリアプリケーションを非常に高速かつ正確にテストするために設計された高度なファジングツールであるAmerican Fuzzy Lop(AFL)などの他のファジングツールも確認することをお勧めします。