
RevSuitは、ペネトレーションにおいてターゲットホストからの接続を受信するために設計された、柔軟で強力なリバースコネクションプラットフォームです。
英語 |简体中文
RevSuitは、ペネトレーションテストにおいてターゲットホストからの接続を受信するために設計された、柔軟で強力なリバースコネクションプラットフォームです。現在、HTTP、DNS、RMI、LDAP、MySQL、FTPプロトコルをサポートしています。
柔軟性:
強力さ:
最新リリースを直接ダウンロードするか、以下の手順でビルドします:
git clone https://github.com/Li4n0/revsuit.git
cd revsuit/frontend && yarn install && yarn build
cd ../ && go build ./cmd/revsuit/revsuit.go
RevSuitは初回実行時にデフォルトの設定ファイルを生成します。必要に応じて設定ファイルを変更し、再実行してください。設定ファイルの詳細な説明は、設定ノートにあります。
IP位置情報を確認するには、IP位置データベースを使用する必要があります。デフォルトではQQwryがデータソースとして使用され、GeoIPを使用するように設定を変更することもできます。選択したデータベースがカレントディレクトリにないか、データベースが1週間以上更新されていない場合、RevSuitは自動的に最新のデータベースをダウンロードします。ダウンロードに失敗した場合、IpAreaフィールドは常にnullになります。
$ ./revsuit
2021/05/16 22:55:10 [ INFO] Downloading qqwry.dat...
____ _____ _ __
/ __ \___ _ __/ ___/__ __(_) /_
/ /_/ / _ \ | / /\__ \/ / / / / __/
/ _, _/ __/ |/ /___/ / /_/ / / /_
/_/ |_|\___/|___//____/\__,_/_/\__/
vBeta0.1
https://revsuit.pro
2021/05/16 22:55:22 [ INFO] Starting HTTP Server at :80, token:your_token
2021/05/16 22:55:22 [ INFO] Start to listen FTP PASV port at :2020, PasvIP is 10.9.8.7
2021/05/16 22:55:22 [ INFO] Starting FTP Server at :21
2021/05/16 22:55:22 [ INFO] Starting MySQL Server at :3306
2021/05/16 22:55:22 [ INFO] Starting RMI Server at :1099
2021/05/16 22:55:22 [ INFO] Starting DNS Server at :53
実行後、HTTPサーバーの/revsuit/admin/パスにアクセスし、トークンを入力してコントロールパネルにアクセスできます。
HTTPルールの作成を例として説明します:
いくつかの注意点は以下の通りです:
nameとflagFormatは一意です。FlagFormatは正規表現構文を使用し、プロトコルによってflagFormatがマッチするフィールドは異なります。ルール作成時に詳細を確認するには、対応するヒントを参照してください。flagFormat内で正規表現の名前付きグループを設定でき、マッチンググループの結果もテンプレート変数として使用されます。以下に示すように、HTTPプロトコルの組み込みテンプレート変数とカスタムテンプレート変数を使用し、test_create_ruleという名前のルールを作成します:

次に、ルールを満たすリクエストを行い、レスポンスを確認します。

リクエストは同時にプラットフォームにログとして記録されます。

新しい接続をオフィスソフトウェアで通知したい場合は、設定ファイルで該当ソフトウェアのwebhookアドレスを設定し、対応するルールのNoticeスイッチをオンにしてください。現在サポートされているソフトウェアは、dingtalk, wechat, lark, slackの4種類のみです。(DiscordとTelegramのサポートは計画中です。)
プラットフォームを移行したりデータを削除する場合、ルールを再作成するのは面倒です。そのため、プラットフォームはルールのインポートとエクスポートをサポートしています。
この機能のエントリポイントはSettings>RULESにあります。
ルールはインポート・エクスポートのためにyaml形式で保存されます。以下のような形式です:
http:
- name: test_create_rule
flag_format: (?P<what>\w+)\?
rank: 0
push_to_client: false
notice: false
response_status_code: "302"
response_headers:
Location: ${query.url}
response_body: ${header.say} ${what}
- name: other_rule
flag_format: other
rank: 1
push_to_client: false
notice: true
response_status_code: "200"
response_headers: { }
response_body: Hello Revsuit!
dns:
... ...
RevSuitは私のスキャナープロジェクトから分割されたもので、そのためスキャナーとのネイティブな連携が機能します。
RevSuitの観点からは、スキャナーをクライアントと呼びます。
RevSuitはHTTP Server-sent Events(SSE)を使用して、クライアントとの一方向通信チャネルを確立します。
チャネルのAPIは/revsuit/api/events?messageです。クライアントはまずヘッダーにToken: your tokenを追加し、その後APIにアクセスしてチャネルを確立します。プラットフォームが新しい接続を受信すると、ルールによってキャプチャされたflagがこのチャネルを介してクライアントに渡されます。

以下は、Golangのsseライブラリを使用した簡単なデモです。
上記のように、RevSuitは複数のクライアントをサポートしており、接続状態の各クライアントはflagのプッシュを受信するため、分散スキャニングが可能です。
すべてのクライアントがすべてのflagプッシュを受信したくない場合は、sse接続を作成する際にFlag-Filterリクエストヘッダーを使用して、そのクライアントに受信させたいflagの形式(正規表現)を設定できます:

RevSuitはクライアント接続がない場合、flagをキューに一時保存し、クライアントが接続したときに送信します。これにより、クライアントの切断によって脆弱性を見逃す心配がありません。(これは特に遅延トリガー型の脆弱性の発見に役立ちます。)
実際の脆弱性スキャンシナリオでは、単一の脆弱性ポイントに対して多数の異なるペイロードを送信し、それらすべてが有効である可能性があります。その結果、リバースリンクプラットフォームは多くのリクエストを受信しますが、それらはすべて同じ脆弱性に起因します。同じ脆弱性に対してクライアントが多数のflagを受信したくない場合は、ルールのflagFormatのflagGroup機能を利用できます。
FlagGroupは、ルールのflagFormatフィールド内の匿名グループによってマッチされたコンテンツです。プラットフォームはグループ化でマッチしたコンテンツをチェックし、flagGroupが初めてキャプチャされたときにのみ、クライアントにフラグをプッシュします。
例えば、SSRFスキャンを考えます。
まず、以下のようなルールを作成します:
http:
- name: ssrf
flag_format: (ssrf[a-z0-9]{6})[0-9]{1,3}
rank: 0
push_to_client: false
notice: false
response_status_code: "200"
response_headers: { }
response_body: "Here is a SSRF!"
ターゲットがhttps://www.testvuln.com?url=api.com&p=uselessで、SSRF用に5つのペイロードがあるとします。スキャナーが送信する最終的なリクエストは['https://www.testvuln.com?url=http://revsuit.com/ssrfa98oni1&p=useless','https://www.testvuln.com?url=http://revsuit.com/ssrfa98oni2&p=useless', ... ,'https://www.testvuln.com?url=//revsuit.com/ssrfa98oni5&p=useless']のようになります。これらはすべて攻撃に成功する可能性があります。
しかし、ルールのflagFormatで匿名グループが使用されているため、プラットフォームは接続されたflagGroup(この場合はssrfa98oni)を照会し、最初に出現したときにのみflagをクライアントにプッシュします。そのため、クライアントはssrfa98oni1という1つのフラグのみを受信します。これにより、ターゲットのurlパラメータが脆弱であることがすでに証明されます。
実際のペネトレーションテストシナリオでは、RevSuitのさまざまなモジュールを組み合わせてマッチングさせることで、特定のタスクを簡単かつ迅速に実行できます。以下はJava WebにおけるBlind XXEの例で、RevSuitのHTTPモジュールとFTPモジュールをテンプレート変数と組み合わせて使用し、ポートスキャンを迅速に完了する方法を示しています。
まず、evil.dtdを返すHTTPルールを作成し、dtdの内容をカスタマイズしてRevSuitのFTPサービスに接続するようにし、テンプレート変数を使用してスキャン対象のHostとPortをFTPのユーザー名とパスワードを介してFTPに渡します。

次に、ユーザー名とパスワードのテンプレート変数からスキャン対象のHostとポートを受信し、Pasv Addressに設定するFTPルールを作成します。

次に、BurpSuitを使用してスキャンを開始します。evil.dtd URLのhostとportパラメータを設定して、ポートスキャンのターゲットを指定します。

実行結果は以下の通りです:

これは、Passive Addressにアクセスできない場合、FTP接続がクラッシュするためです。接続が正常に終了するかどうかに基づいて、ポートが開いているかどうかを判断できます。この例では、ポート8005と8080が開いていることを正常に検出しました。
より詳細なwikiを準備中です。準備が整うまでは、ご自身で探索してください。
Issueを提出するか、Weixinで連絡してください: TGk0bjA2Cg==
このプロジェクトは以下の優れたプロジェクトのコードを参考にしています:
このプロジェクトの開発中に受けたすべての助けとアドバイスについて、友人@E99p1antに感謝します。
@Apache License 2.0