開発者ドキュメント

Ubuntu18.04でRadamsaをインストールしてファジングテストプログラムとネットワークサービスに使用する方法

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

序章

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

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

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

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

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

前提条件

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

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

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

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

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

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

  1. sudo apt update

次に、ソースコードを実行可能バイナリにコンパイルするために必要なgccgitmake、および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!

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

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

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

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

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

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

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

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

何らかの形式の構造化データまたは非構造化データを取得し、それを使用して何かを実行し、結果を出力するという一般原則に従っている限り、他の同様のプログラムを使用できます。 たとえば、この例は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"
  ]
}

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

  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に保存します。

次に、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パッケージに付属している組み込みの開発サーバーを使用して行うことができます。 Webサーバーをテストするには、curlも必要です。

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.

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

  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クライアントをテストしたりします。

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

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

whoisをまだ使用できない場合は、aptを使用してインストールできます。

  1. sudo apt install whois

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

  1. whois example.com > whois.txt

次に、このwhois応答のファジーバージョンを提供するサーバーとしてRadamsaを設定する必要があります。 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をセットアップし、それを使用してコマンドラインアプリケーション、ネットワークサービス、およびネットワーククライアントをファズしました。 これで、独自のアプリケーションをファジングテストするために必要な基礎知識が得られました。これにより、アプリケーションの堅牢性と攻撃に対する耐性が向上することを願っています。

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

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

モバイルバージョンを終了