sWebMachineGun.exe
HTTP 通信を好きなだけ発行できるツール
過去のテキスト
基本概念
基本的には、初期アーキテクチャの説明の「Repeater(sWebMachineGun.exe) ver1.7.0.0 以前」と変化していない。
または、変数の繰り返しとパターンの繰り返しをまとめて、"変数とパターン" の繰り返しとみなしてもよい。
画面例
アプリケーションタブ
タブ外の共通ボタンなど
Execute/Stopボタン
「設定をレジストリに保存して実行」または「停止」
Clearボタン
レスポンスタブの結果をクリアする
Saveボタン
設定をレジストリに保存する
Macroボタン
「マクロについて」を参照
Exitボタン
設定をレジストリに保存して、終了する
ClearCookieボタン
内部的に保存しているクッキー、カスタム認証のトークンをクリアする
Reloadボタン
設定をレジストリに保存して、再起動する
Proxyボタン
HTTP Proxyを経由させる必要のがある場合の設定。
Basic認証とか、Proxyの認証とか・・・なんとなくわかるよね。
.NET Framework は Windows なので、Windows 統合認証用のドメインも指定できるみたいだね。
Certificateボタン
未稿
Loglogボタン
sPortRedirector.exeで説明する
URIとか、パラメータとかをなんとなくいい感じに出力しようとしている
Requestタブ
Settingタブ(置換方法)
置換方法について
- 前方追加
- 変数名=≪ここに置換文字列が埋め込まれる≫値
これは基本形 - 後方付加
- 変数名=値≪ここに置換文字列が埋め込まれる≫
これはNullInjectionなどに使えると思う - 完全置換
- 変数名=≪値自体が書き換わる≫
値としてマクロ文字「%S%」が使える
「`%S%`」だと、値全体をバッククォートで囲むという意味になる
- 文字追加
- 指定の仕方は独特。 こんな感じ「(文字数)(カンマ)(文字)」で指定する
- 名前の後方付加
- 変数名≪ここに置換文字列が埋め込まれる≫=値
- 数値計算
- 使っていないじゃないかな・・・
Settingタブ(変数名の指定方法)
パスに対しても繰り返し処理ができるのだが、その仕様上の注意は、以下を参照
System.Uri クラスの仕様と、sWebMachineGun.exe のパスに関しての仕様上の注意
GeneralSettingタブ(その1)
GeneralSettingタブ(その2)
Judge/RegExタブ
TimeoutCheckタブ
タイムアウト判定モードの際のタイムアウトしたかどうかの判定をここで設定する。
単純文字列の有無でもいいし、正規表現で判定してもよいし、スクリプトで判定してもよい
Scriptタブ
ver4.8.0.0 現在
- Boo 0.9.7
- IronPython 2.7
- IronRuby 1.1
- JScript.NET
- NLua(Lua5.2)
Responseタブ
繰り返しした結果を表示する
簡易的な判定としては、XSS,bSQLi,CrLfInjection 程度
Judge/RegExタブやScriptタブで設定した判定も「SimpleResult」欄に表示される。
ステータスバー
- 「Start」は開始時間
- 「Remain」は大体の残り時間
- 現在置換中のパターン文字列や、対象パラメータ名
- 「数値 Wait... 数値」は、遅延中(待機中)の時間
- 右下の値は、プログレスバーの値/最大値ですが、「現在の位置/(想定される最大の全リクエスト数(+タイムアウトチェックの場合は待機時間を加算[分]))」
簡易判定の bSQLi の仕組み
「何もしない」で「正常系」を取得。置換方法で「InduceError」フラグのあるタイプを「エラー」タイプとして記憶しておき、まず「正常系」と「エラー系」の違いを判断する(レスポンスコードの違い、同じレスポンスコードならコンテンツサイズ)
上記(「正常系」と「エラー系」が異なる)の状態で、「InduceError」フラグのない置換方法が「正常系」に近い(レスポンスコード、同じレスポンスコードの場合は、コンテンツサイズが「正常系」と「エラー系」で近い方)と判定された場合に「bSQLi」としている。
一つのURLに対しては「正常系」は一度取得後に更新しないが、「エラー系」は「InduceError」フラグのある置換方法が登場する度に更新される。
ぶっちゃけ、あまり精度は高くないので、判定としては参考程度かな。
使い方
動作モード(繰り返しの方法)
CSRFトークンについて
GeneralSettingタブから遷移してくる
-
抽出方式を選択して、貼付方式を選択する。という流れ
-
抽出方式、貼付方式ともにプラグイン形式なので、拡張可能
-
抽出方式、貼付方式共に、テキストボックスが2つある
-
1つ目のテキストボックスは、対象の変数名。一般的には、抽出側はHTMLのhiddentダクの名前、貼付側はPOSTの変数名になると思う
-
2つ目のテキストボックスは、その値を XML または JSON と想定して XPath または JPath を記述する事が可能
-
1つ目のテキストボックスが空欄で、2つのテキストボックスの指定があった場合、ボディ全体を対象とする。つまり、抽出側はボディ全体が XML または JSON 形式の場合とか、貼付側は、POST するボディが XML または JSON の場合とか
-
「Double」は、抽出した値を変数名として再度実施する。という事。以前にこういうものがあった。
<input type="hidden" name="csrfname" value="abcdefg">
<input type="hidden" name="abcdefg" value="xzyqwst">
-
抽出方法
- Cookie クッキーヘッダから抽出
- Hidden HTML→hiddenタグから抽出
- HttpHeader HTTPヘッダから抽出
- Regex (最大2回の)正規表現で抽出
- ScriptTag HTML→Scriptタグ中の文字列リテラルから抽出
- Script/言語 指定したスクリプトで抽出する
-
貼付方法
- HttpHeader HTTP ヘッダに貼付する
- None 貼付はしない
- Post/Query Postまたはクエリ文字列に貼付する
- Regex (最大2回)の正規表現で貼付位置を決めて貼付する
- Script/言語 指定したスクリプトで貼付する
CSRFトークン、None について
- 抽出と貼付は**「レスポンスから抽出して、直後のリクエストに貼付」**を想定している
- 貼付方法にある**「None」**は、抽出だけ行いたい場合に使う
- 直後のリクエスト以外で、**マクロ「%csrf≪インデックス≫%%」**の置換対象となる
- 最初のリクエストで抽出だけして、(直後だけでなく)その後に続くレスポンス全てに貼付したい場合に使えると思う
遅延処理について
リクエスト間で、遅延が欲しい場合、指定する
GeneralSettingタブから遷移してくる
説明しなくても、なんとなく分かるよね。
- 乱数発生アルゴリズムを選択して
- 最小遅延時間(ミリ秒)を指定して
- 最大遅延時間(ミリ秒)を指定するだけ
終了時サウンドについて
GeneralSettingタブから遷移してくる
スピーカーをオンにしておけば、繰り返し処理が終了すると、音が出る
- **「Speak」**は指定した文字列をしゃべる。(.NET Framework4 以降の標準音声合成。MS-Office2010以降がインストールされていると日本語エンジンも一覧にでると思う)
- **「Speak」**は、言語エンジンと、発声文字列、ボリュームとレートなので、説明は省略
- **「Sound」**は、wav形式を指定するとその音が繰り返し終了時に流れる
- **「Sound」**は、.NET Framework4 の標準のサウンドクラスを使っているので、wav形式だけだと思う。MP3形式とかにも対応したいけど・・・
カスタム認証について
リクエスト・テンプレートごとに、カスタム認証を設定できる。
WebAPI の診断の時に役立つ。
セレクトボックスを選択して**「DEL」**ボタンで、無選択状態となる
カスタム認証の方式は、プラグイン形式にしているので、拡張可能
ver4.8.0.0 現在で
- OAuth2 (www-form)
- OAuth2 (json)
- PostAccessToken
- WSSE
- WSSE Digest
- Scriptで実装
- Boo 0.9.7
- IronPython 2.7
- IronRuby 1.1
- JScript.NET
- NLua(Lua5.2)
OAuth2 の場合、...既定値でなんとなく設定できると思う
WSSE の場合、...既定値でなんとなく設定できると思う
- 参考リンク : ログイン画面の場合(SSO認証)
デバイスメッセージ(外部連携)
GeneralSettingタブで設定する
例えば、
nページ目にアクセスすると、メールが送信されて、受信したメールの本文の数値をn+1ページ目のリクエストの特定の場所に埋め込んで、セッションを続ける
というのが、「%%msg%」マクロでできる
- 使いたいオブジェクトをチェックすればいい。
- 設定が必要なオブジェクトは、ダブルクリックすると、現在の設定値が上部のテキストボックスにコピーされる
- 「Default」というボタンで、既定の設定値が上部のテキストボックスにコピーされるので、それを参考に設定してもよい
- 設定が終われば「Set!」ボタンで、オブジェクトへ反映させる
- オブジェクトはプラグイン形式なので拡張可能
- 通信するリクエストに「%%msg%」があり、どれかがチェックされていれば、上から順に実行していき、「%%msg%」が置換されてリクエストされるだろう
ver4.8.0.0 現在
- mail メールサーバ(POP3/IMAP4)に接続してメールを受信、メールの本文、題名から正規表現で値を返却、または添付ファイルを返却
- TextRegularExpressions 既に別のオブジェクトが返却した値を、正規表現でさらに整形して返却
- ImageFilter 既に別のオブジェクトが返却したバイナリを画像として読み込み、QRコード/Exif情報を返却(画像やPDFからの文字認識は未実装→「target=OCRは動作しない」→Office2003があれば.NETでもできるらしいorz)または、既に別のオブジェクトが返却したバイナリを音声として読み込み、.NET Framework4 標準の音声認識エンジン(あまり精度は高くない{Coltanaさんを使いたいけどorz})で音声からテキストを抽出して返却
- Clipboard クリップボードを監視して、テキスト/画像/サウンドを返却
- InputMessageDialog 入力ボックスのあるダイアログを表示して一時停止、手動で必要な値を入力すればいいのさ
Android で、SMSをメールに送信する
というアプリを使えば、
nページ目のリクエストで、SMS(Android)にパスコードが送信されて、n+1ページ目にその値を使って認証
というのを自動化できると思うぞ。
- 参考リンク : ログイン画面の場合(多要素認証)
マクロについて
- %%[pP]≪数字≫%
- ページ番号に置換される。
数字は桁数。例えば「%%p3%」は「001」とか「002」とか - %%[cC]≪数字≫%
- セッション番号(カウント数+ターン数)に置換される。
数字は桁数。例えば「%%c3%」は「001」とか「002」とか - %%[gG]≪数字≫%
- グローバルカウント番号に置換される。
設定画面はここ。
数字は桁数。例えば「%%g3%」は「001」とか「002」とか - %s%
- 置換対象文字列
- %s%
- 置換対象文字列上では、変数名
置換方法 - %M%
- マーキング文字
置換方法 - %H%
- ホスト名
置換方法 - %S%
- 変数の値
置換方法→完全置換 - %file≪インデックス≫%
- アップロードファイル(バイナリ)を指定する。アップロードファイルはここで指定する
- %%byte%
- URLデコードされた置換対象文字列
入力する事はないが、結果画面で見かけるかも - %%msg%
- ダイアログからの入力
詳しい説明はここ - %%csrf≪インデックス≫%
- CSRFトークン
設定画面はここ - %%m≪インデックス≫%
- カスタムマクロ
例えば、今日はid=1234の情報使ってください、明日はid=2456の情報使ってください。とかをカスタムマクロ化しておくと、ここだけ変更すればいいので、便利かもね
「C」、「P」や「G」は、全角数字でカウントする事も可能
実践編
- 一つのHTTPリクエスト(一番シンプル)
- 置換したリクエストとは別のレスポンスを検査する
- 置換したリクエストとは別のレスポンスを検査する場合(CSRFトークン)
- 並列な(互いに独立している)複数のリクエストを一斉に検査する
- ログイン画面の場合
- ログイン画面の場合(多要素認証)
- ログイン画面の場合(SSO認証)
- パスワード変更画面1
- パスワード変更画面2
- パスワード変更画面3(分割されたメールアドレス)
- データ作成画面と削除画面1
- データ作成画面と削除画面2(削除画面)
- データ作成画面と削除画面3(残ったデータを削除するための連続実行)(連続してHTTPリクエストを送信する(マクロの使い方))
- レスポンスタブのデータグリッドビューの色分け