まったり技術ブログ

主にWebエンジニア向けのセキュリティブログ。たまに開発も

【WordPress】CVE-2020-25286 "最近のコメント"から保護されているコメントの閲覧可能

f:id:motikan2010:20200929215339p:plain

はじめに

 本記事では先日(2020/9/13)に公表された WordPress 本体の脆弱性である CVE-2020-25286 について簡単に調べてみました。

 まずNVDには CVE-2020-25286 について下記の説明があります。

In wp-includes/comment-template.php in WordPress before 5.4.2, comments from a post or page could sometimes be seen in the latest comments even if the post or page was not public.

 この説明から「公開されていない記事・固定ページのコメントが閲覧される脆弱性」であることが分かります。

 本記事では、どのような条件下で脆弱性が再現するのかを確認していきます。

CVSS 3.1 (Base Score: 5.3)

 ちなみに本脆弱性の CVSS はこのような評価となっています。

 システムへの影響は 機密性 のみです。
漏れる可能性があるのはコメントだけですので 低 と評価されています。

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

攻撃元区分(AV:Attack Vector) ネットワーク(N)
攻撃条件の複雑さ(AC:Attack Complexity) 低(L)
必要な特権レベル(PR:Privileges Required) 不要(N)
ユーザ関与レベル(UI:User Interaction) 不要(N)
スコープ(S:Scope) 変更なし(U)
機密性への影響(C:Confidentiality Impact) 低(L)
完全性への影響(I:Integrity Impact) なし(N)
可用性への影響(A:Availability Impact) なし(N)

脆弱性の確認

 検証で利用する WordPress のバージョンは 5.4.1 です。ちなみに修正版は 5.4.2 です。

下準備

 WordPress 5.4.1 を下記のサイトからダウンロードし、展開します。 リリース | WordPress.org 日本語

 WordPressの自動更新を無効化するために、ディレクトリ直下にあるwp-config.phpを開き下記の一行を追加します。
この設定がないと自動的に修正版にアップデートされてしまいます。

define( 'AUTOMATIC_UPDATER_DISABLED', true );

 そしてサイトにアクセスし、初期設定(DB設定、管理ユーザ設定、サイト設定)を完了させます。

脆弱性を再現

 ここからは脆弱性を再現させるために、「パスワード保護された記事(= 公開されていない記事)の作成」と「その記事に対してのコメント書き込み」を行っていきます。

1. パスワード保護の記事を作成

 管理者アカウントでパスワード保護された記事を作成します。
「秘密の記事」というタイトルで作成します。

 右サイドバーからパスワード保護の有無の設定ができますので、「表示状態:パスワード保護」の状態で公開します。

f:id:motikan2010:20200929195706p:plain:w600

2. パスワード保護された記事へコメントを書き込み

 「1.」で作成した記事へアクセスして、パスワードを入力する必要があることも確認します。

 パスワードを入力して、記事が表示されたらコメントを書き込みます。

 「⚠️これは秘密記事へのコメントです⚠️」とコメントを書き込みました。
このコメントはパスワードを知っている人のみが閲覧できるものです。脆弱性が再現することでこのコメントが誰でも見れる状態になってしまいます。

f:id:motikan2010:20200929195712p:plain:w600

3. 未認証ユーザでコメントの確認

 次は、未認証のユーザでパスワード保護された記事へアクセスしてみます。

 このユーザはパスワードを知らない前提ですので、記事を表示させることもできなく、「2.」で書き込んだコメントも閲覧することはできません

この脆弱性は このようなパスワード保護されたコメントが表示されてしまう脆弱性 となっていますが、どこに表示されるのでしょうか?

 NVD の説明にこの記載があり、"最新のコメント"部分に表示されることが分かります。

seen in the latest comments

f:id:motikan2010:20200929195718p:plain:w600

 "最新のコメント"は下部のウィジットに表示されるはずだったので確認してみます。

f:id:motikan2010:20200929195723p:plain:w600

 しかし、公開されている記事と共にコメントの内容の表示はありませんでした

4.「最新のコメント」ブロックを追加

 少し調べてみると記事本文中に「最新のコメント」ブロックを追加できることが判明したので、このブロックを公開記事である「Hello world!」というタイトルに追加します。

 この記事は公開記事なので誰でも記事の内容を閲覧することができます。

f:id:motikan2010:20200929195728p:plain:w600

 追加するとした下画像のようになりました。

 先ほど確認した"最新のコメント"と異なりコメントの内容も表示されていることが分かります。

 この状態で公開します。

f:id:motikan2010:20200929195733p:plain:w600

5. 未認証ユーザでコメントの確認

 未認証ユーザで先ほど編集した「Hello world!」へアクセスします。
前にも記載しましたが、この記事は誰でも内容を閲覧することができます。

 記事の内容には最近のコメントの一覧が表示されるようになっており、その中にはパスワード保護された記事に書き込んだコメントの内容も表示されてしまっています
(⚠️これは秘密記事へのコメントです⚠️という内容が見れてしまっています)

f:id:motikan2010:20200929195739p:plain:w600

 脆弱性があることでこの事象が再現しました。

 最後にパッチを当ててこの事象が再現しないことを確認します。

6. 修正版にアップデード

 パッチを当てるために、Wordpressを現時点の最新版(5.5.1)にアップデートします。

 アップデートが完了したら、再度未認証ユーザで先ほどの記事にアクセスし、コメントの内容を閲覧できるか確認してみます。

f:id:motikan2010:20200929195742p:plain:w600

 パスワード保護された記事のコメントには「パスワード保護」と表示されるようになり、元のコメントが閲覧できなく脆弱性は修正されたことが確認できました。

 この脆弱性の修正内容を確認してみても、パスワード保護されている記事のコメントはダミーテキストを表示するようにしていることからこの挙動は正しそうです。
f:id:motikan2010:20200929211923p:plain

まとめ

 一覧に表示される情報にも気を配る。普段目にしないような機能なら見逃し注意。
今回のWordPressに限らず、一覧を表示するプラグインなどを利用する場合は意図していなかった情報が表示される挙動があるかもしれないと頭に入れていた方がいいかも。

 本脆弱性は、普段使われない機能(埋め込み「最新のコメント」) + 最新5件(デフォルト) なので、影響を受ける可能性は非常に少ないと思ってたり。

参考

更新履歴

  • 2020年9月29日 新規作成

インシデント対応ツール『GRR Rapid Response』【YARA編】

f:id:motikan2010:20200910215835p:plain
Yaraといったら「Passion Yara」

  • はじめに
  • 動作確認
    • YARAルールでプロセスを特定
  • まとめ
  • 更新履歴

はじめに

 GRR Rapid Response (以下GRR)について軽く説明、GRR はGoogleが開発しているインシデント対応ツールであり、主にフォレンジックを行うために利用されます。

 このツールの特徴としては、フォレンジック対象(GRRクライアント)のサーバにログインすることなく、GRRサーバからフォレンジックを実施することが可能です。
 GRRクライアントを増やす場合は、対象サーバにエージェントをインストールするだけで完了です。

 前回はこのツールを利用して、プロセス情報やブラウザの閲覧履歴の取得を行いました。
今回はGRRドキュメントに「YARA」の記載がありましたので、この機能を試してみます。

 ドキュメントには以下の説明があり、GRRのYARA機能にはプロセスメモリの解析ができそうです。

Live remote memory analysis using YARA library.

 GRRの導入はこちらを参照ください。
blog.motikan2010.com

続きを読む

インシデント対応ツール『GRR Rapid Response』【構築編】

f:id:motikan2010:20200909213042p:plain
  • はじめに ~ GRR Rapid Response とは? ~
    • GRRクライアント 機能
    • GRRサーバ 機能
    • GRRの開発リポジトリ
  • 環境構築
    • 環境
    • GRR Rapid Responseサーバの構築
      • MySQL インストール
      • GRR Rapid Response インストール
      • GRRサーバの起動の確認
    • GRRクライアントの作成
      • エージェント(debパッケージ)の取得・インストール
      • エージェントの起動の確認
  • 動作確認
    • Listenしているプロセス一覧の取得
    • ブラウザの閲覧履歴を取得
  • まとめ
  • 更新履歴

はじめに ~ GRR Rapid Response とは? ~

 「GRR Rapid Response」(以下、GRR)はGoogleが開発しているインシデント対応ツールであり、主にフォレンジック作業を支援するツールとなります。

 このツールの特徴として、フォレンジック対象のサーバにログインすることなく、フォレンジック作業を行うことができることがあります。

f:id:motikan2010:20200911202437p:plain:w700

What is GRR? — GRR documentation

GRRクライアント 機能

  • クライアントは LinuxOS XWindows に対応
  • YARAライブラリを使用したライブリモートメモリフォレンジック
  • 「ファイル」と「Windowsレジストリ」の強力な検索やダウンロード機能
  • SleuthKit(TSK)を使用したOSレベルおよびrawファイルシステムアクセス
  • インターネット展開用に設計された安全な通信インフラストラクチャ
  • クライアントのCPU、メモリ、IOの使用状況、および自分で課した制限の詳細な監視

GRRサーバ 機能

  • ほとんどのインシデント対応およびフォレンジックタスクを処理する、完全な対応機能
  • エンタープライズハンティング(一連のマシン全体の検索)のサポート
  • 何百ものデジタルフォレンジックアーティファクトの高速でシンプルなコレクション
  • AngularJS Web UIとRESTful JSON API、Python、PowerShell、Goのクライアントライブラリ
  • さまざまなフォーマットや出力プラグインをサポートするデータエクスポート機能
  • 大規模なデプロイメントを処理できる完全にスケーラブルなバックエンド
  • スケジューリングによるタスクの自動実行
  • 多数のラップトップで動作するように設計された、クライアントの将来のタスクスケジューリングを可能にする非同期設計

GRRの開発リポジトリ

 GRR Rapid Response はOSSであり、コードはGItHubで管理されています。

github.com

環境構築

 GRRは「フォレンジック対象となるGRRクライアント」と「フォレンジックに必要な情報を取得するGRRサーバ」で運用されます。
 今回はGRRクライアントは1台で作業を進めていきます。

f:id:motikan2010:20200909233612p:plain
続きを読む

『不信なPoCは実行するな』というお話【セキュリティ】

f:id:motikan2010:20200526225913p:plain:w600

はじめに ~ 脆弱性PoCの収集リポジトリ ~

 私は脆弱性のPoCが自動的に収集しているリポジトリを公開していますが、先日このようなIssueが作成されました。

そのIssueの内容を端的に言うと「収集しているPoCにマルウェアが混ざってるでボケェ!!」というもの。

f:id:motikan2010:20200526205425p:plain:w600

正体はマルウェアだったリポジトリ

 ここでは「CVE-2020-0883」「CVE-2020-0910」の2つの脆弱性があげられており、それぞれ「thelostworldFree/CVE-2020-0883」「inetshell/CVE-2020-0910」リポジトリのことを指していると考えられます。

 実際にこの2つのリポジトリ内のコードを確認してみます。異なる脆弱性のPoCですが、Pythonコードがほぼ同じであり非常に怪しいリポジトリであることが分かります。

f:id:motikan2010:20200526221446p:plain

 そのコードの詳細はテンセント社のブログで紹介されていたのでそちらを参照ください。(中国語ですが・・・)

上記の2つとは別の脆弱性(CVE-2020-0796 : Microsoft SMBv3の脆弱性)で説明されていますが、コードの動作内容は同じなので問題ないです。

cloud.tencent.com

 (※以下、Google翻訳を駆使して理解できた内容です。)
 この記事を簡単に説明すると、

・この怪しいコードは実行時に指定した「検査対象となるホスト」情報を54[.]184[.]20[.]69に送信するような動作したそうです。
・そして送信されたホスト情報に対して外部かSMBパケットが送信されたそうです。

 明らかに脆弱性検証コードの動作ではなく、黒なコードであったことが確認できます。

まとめ ~ 無闇にPoCを実行してはイカン!! ~

 つまり何が言いたいかというと、信用できないPoCを安易に実行してはいけないということです。
今エンジニアとして働いている私にとっては当然のことではありますが、学生の頃は適当に見つけたPoCを実行するようなことがありました。(不思議と.exe等の実行ファイルは怪しんでいましたが...)
そんなPoCの内容を一切確認しない人を標的としているんでしょうね。

 そんな感じでPoCを実行するときは、コードをしっかり確認した方がいいよという記事でした。

軽くコードを見るだけでも分かる場合がほとんどです(今回の様に不明な難読化をしていたり)。
ちなみにコードを読んでもよく分からん時はとりあえず実行しないようにしています(or 死んでもいい環境で動かしたり)。

 下画像のようにIssue内で「このリポジトリが怪しい」ということを教えてくれる場合もあるようです。
f:id:motikan2010:20200526224312p:plain:w600

 感覚的となりますが、他PoCリポジトリよりスター数が多いリポジトリは正当なPoCリポジトリと判断して良さそうです。

更新履歴

  • 2020年5月26日 新規作成

【Azure】Azure CLIでApplication Gateway WAFを操作 - カスタムルール編

f:id:motikan2010:20200424002556p:plain:w500

はじめに

 本記事では Application Gateway WAF のポリシーやカスタムルールの制御(作成・削除など)を azコマンド経由で実行する方法を説明します。

Azure CLI(azコマンド)で Application Gateway WAF を操作

1. WAFポリシー

$ az network application-gateway waf-policy -h

Group
    az network application-gateway waf-policy : Manage application gateway web application firewall
    (WAF) policies.

Subgroups:
    custom-rule    : Manage application gateway web application firewall (WAF) policy custom rules.
    managed-rule   : Manage managed rules of a waf-policy. Visit: https://docs.microsoft.com/en-
                     us/azure/web-application-firewall/afds/afds-overview.
    policy-setting : Defines contents of a web application firewall global configuration.

Commands:
    create         : Create an application gateway WAF policy.
    delete         : Delete an application gateway WAF policy.
    list           : List application gateway WAF policies.
    show           : Get the details of an application gateway WAF policy.
    update         : Update an application gateway WAF policy.
    wait           : Place the CLI in a waiting state until a condition of the application gateway
                     WAF policy is met.

1-1. WAFポリシーの作成 (create サブコマンド)

 createサブコマンドのヘルプ

$ az network application-gateway waf-policy create -h

Command
    az network application-gateway waf-policy create : Create an application gateway WAF policy.

Arguments
    --name -n           [Required] : The name of the application gateway WAF policy.
    --resource-group -g [Required] : Name of resource group. You can configure the default group
                                     using `az configure --defaults group=<name>`.
    --location -l                  : Location. Values from: `az account list-locations`. You can
                                     configure the default location using `az configure --defaults
                                     location=<location>`.
    --tags                         : Space-separated tags: key[=value] [key[=value] ...]. Use '' to
                                     clear existing tags.

Examples
    Create an application gateway WAF policy. (autogenerated)
        az network application-gateway waf-policy create --name MyApplicationGatewayWAFPolicy
        --resource-group MyResourceGroup
$ az network application-gateway waf-policy create \
--name TestPolicy \
--resource-group testResourceGroup

1-2. WAFポリシーの詳細表示 (show サブコマンド)

 showサブコマンドのヘルプ

$ az network application-gateway waf-policy show \
  --resource-group 'testResourceGroup' \
  --name 'TestPolicy'

----- 出力 -----
{
  "applicationGateways": null,
  "customRules": [],
  "etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
  "httpListeners": null,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testResourceGroup/providers/Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies/TestPolicy",
  "location": "japaneast",
  "managedRules": {
    "exclusions": [],
    "managedRuleSets": [
      {
        "ruleGroupOverrides": [],
        "ruleSetType": "OWASP",
        "ruleSetVersion": "3.0"
      }
    ]
  },
  "name": "TestPolicy",
  "pathBasedRules": null,
  "policySettings": {
    "fileUploadLimitInMb": 100,
    "maxRequestBodySizeInKb": 128,
    "mode": "Detection",
    "requestBodyCheck": true,
    "state": "Disabled"
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "testResourceGroup",
  "resourceState": null,
  "tags": null,
  "type": "Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies"
}
---------------

2. カスタムルール

$ az network application-gateway waf-policy custom-rule -h

Group
    az network application-gateway waf-policy custom-rule : Manage application gateway web
    application firewall (WAF) policy custom rules.

Subgroups:
    match-condition : Manage application gateway web application firewall (WAF) policies.

Commands:
    create          : Create an application gateway WAF policy custom rule.
    delete          : Delete an application gateway WAF policy custom rule.
    list            : List application gateway WAF policy custom rules.
    show            : Get the details of an application gateway WAF policy custom rule.
    update          : Update an application gateway WAF policy custom rule.

2-1. カスタムルールの作成 (create サブコマンド)

 createサブコマンドのヘルプ

$ az network application-gateway waf-policy custom-rule create -h

Command
    az network application-gateway waf-policy custom-rule create : Create an application gateway WAF
    policy custom rule.

Arguments
    --action            [Required] : Action to take.  Allowed values: Allow, Block, Log.
    --name -n           [Required] : Name of the WAF policy rule.
    --policy-name       [Required] : The name of the application gateway WAF policy.
    --priority          [Required] : Rule priority. Lower values are evaluated prior to higher
                                     values.
    --resource-group -g [Required] : Name of resource group. You can configure the default group
                                     using `az configure --defaults group=<name>`.
    --rule-type         [Required] : Type of rule.  Allowed values: Invalid, MatchRule.

 ポリシー「TestPolicy」にカスタムルール「TestCustomRule」を作成。

$ az network application-gateway waf-policy custom-rule create \
  --action 'Block' \
  --name 'TestCustomRule' \
  --policy-name 'TestPolicy' \
  --priority '50' \
  --resource-group 'testResourceGroup' \
  --rule-type 'MatchRule'

----- 出力 -----
{
  "action": "Block",
  "etag": null,
  "matchConditions": [],
  "name": "TestCustomRule",
  "priority": 50,
  "ruleType": "MatchRule",
  "skippedManagedRuleSets": []
}
---------------

2-2. カスタムルールの削除 (delete サブコマンド)

 deleteサブコマンドのヘルプ

$ az network application-gateway waf-policy custom-rule delete -h

Command
    az network application-gateway waf-policy custom-rule delete : Delete an application gateway WAF
    policy custom rule.

Arguments

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : Name of the WAF policy rule.
    --policy-name       : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.

 リソースグループ「testResourceGroup」のポリシー「TestPolicy」内のカスタムルール「TestCustomRule」を削除。

$ az network application-gateway waf-policy custom-rule delete \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule'

2-3. カスタムルールの一覧 (list サブコマンド)

 listサブコマンドのヘルプ

$ az network application-gateway waf-policy custom-rule list \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy'

----- 出力 -----
[
  {
    "action": "Block",
    "etag": null,
    "matchConditions": [
      {
        "matchValues": [
          "hoge",
          "fuga"
        ],
        "matchVariables": [
          {
            "selector": null,
            "variableName": "QueryString"
          },
          {
            "selector": null,
            "variableName": "PostArgs"
          }
        ],
        "negationConditon": false,
        "operator": "Contains",
        "transforms": [
          "Lowercase",
          "RemoveNulls"
        ]
      }
    ],
    "name": "TestCustomRule",
    "priority": 50,
    "ruleType": "MatchRule",
    "skippedManagedRuleSets": []
  }
]
---------------

2-4. カスタムルールの詳細 (show サブコマンド)

 カスタムルールを指定して詳細を確認することができます。

 showサブコマンドのヘルプ

$ az network application-gateway waf-policy show -h

Command
    az network application-gateway waf-policy show : Get the details of an application gateway WAF
    policy.

Arguments

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.

Global Arguments
    --debug             : Increase logging verbosity to show all debug logs.
    --help -h           : Show this help message and exit.
    --only-show-errors  : Only show errors, suppressing warnings.
    --output -o         : Output format.  Allowed values: json, jsonc, none, table, tsv, yaml,
                          yamlc.  Default: json.
    --query             : JMESPath query string. See http://jmespath.org/ for more information and
                          examples.
    --verbose           : Increase logging verbosity. Use --debug for full debug logs.

Examples
    Get the details of an application gateway WAF policy. (autogenerated)
        az network application-gateway waf-policy show --name MyApplicationGatewayWAFPolicy
        --resource-group MyResourceGroup

 カスタムルール「TestCustomRule」の詳細を出力してみます。

$ az network application-gateway waf-policy custom-rule show \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule'

----- 出力 -----
{
  "action": "Block",
  "etag": null,
  "matchConditions": [
    {
      "matchValues": [
        "hoge",
        "fuga"
      ],
      "matchVariables": [
        {
          "selector": null,
          "variableName": "QueryString"
        },
        {
          "selector": null,
          "variableName": "PostArgs"
        }
      ],
      "negationConditon": false,
      "operator": "Contains",
      "transforms": [
        "Lowercase",
        "RemoveNulls"
      ]
    }
  ],
  "name": "TestCustomRule",
  "priority": 50,
  "ruleType": "MatchRule",
  "skippedManagedRuleSets": []
}
--------------------

2-5. カスタムルールの更新 (update サブコマンド)

$ az network application-gateway waf-policy custom-rule update -h

Command
    az network application-gateway waf-policy custom-rule update : Update an application gateway WAF
    policy custom rule.

Arguments
    --action            : Action to take.  Allowed values: Allow, Block, Log.
    --priority          : Rule priority. Lower values are evaluated prior to higher values.
    --rule-type         : Type of rule.  Allowed values: Invalid, MatchRule.

Generic Update Arguments
    --add               : Add an object to a list of objects by specifying a path and key value
                          pairs.  Example: --add property.listProperty <key=value, string or JSON
                          string>.
    --force-string      : When using 'set' or 'add', preserve string literals instead of attempting
                          to convert to JSON.
    --remove            : Remove a property or an element from a list.  Example: --remove
                          property.list <indexToRemove> OR --remove propertyToRemove.
    --set               : Update an object by specifying a property path and value to set.  Example:
                          --set property1.property2=<value>.

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : Name of the WAF policy rule.
    --policy-name       : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.

3. マッチ条件

$ az network application-gateway waf-policy custom-rule match-condition -h

Group
    az network application-gateway waf-policy custom-rule match-condition : Manage application
    gateway web application firewall (WAF) policies.

Commands:
    add    : A match condition to an application gateway WAF policy custom rule.
    list   : List application gateway WAF policy custom rule match conditions.
    remove : Remove a match condition from an application gateway WAF policy custom rule.

3-1. マッチ条件を追加 (add サブコマンド)

$ az network application-gateway waf-policy custom-rule match-condition add -h

Command
    az network application-gateway waf-policy custom-rule match-condition add : A match condition to
    an application gateway WAF policy custom rule.

Arguments
    --match-variables [Required] : Space-separated list of variables to use when matching. Variable
                                   values: RemoteAddr, RequestMethod, QueryString, PostArgs,
                                   RequestUri, RequestHeaders, RequestBody, RequestCookies.
    --operator        [Required] : Operator for matching.  Allowed values: BeginsWith, Contains,
                                   EndsWith, Equal, GeoMatch, GreaterThan, GreaterThanOrEqual,
                                   IPMatch, LessThan, LessThanOrEqual, Regex.
    --values          [Required] : Space-separated list of values to match.
    --negate                     : Match the negative of the condition.  Allowed values: false,
                                   true.
    --transforms                 : Space-separated list of transforms to apply when matching.
                                   Allowed values: HtmlEntityDecode, Lowercase, RemoveNulls, Trim,
                                   UrlDecode, UrlEncode.

Resource Id Arguments
    --ids                        : One or more resource IDs (space-delimited). It should be a
                                   complete resource ID containing all information of 'Resource Id'
                                   arguments. If provided, no other 'Resource Id' arguments should
                                   be specified.
    --name -n                    : Name of the WAF policy rule.
    --policy-name                : The name of the application gateway WAF policy.
    --resource-group -g          : Name of resource group. You can configure the default group using
                                   `az configure --defaults group=<name>`.
    --subscription               : Name or ID of subscription. You can configure the default
                                   subscription using `az account set -s NAME_OR_ID`.

 実際に以下の表のマッチ条件を作成してみます。

マッチ条件
Match variable ["QueryString", "PostArgs"]
Operator "Contains"
Match values ["hoge", "fuga"]
Transformations ["Lowercase", "RemoveNulls"]
$ az network application-gateway waf-policy custom-rule match-condition add \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule' \
  --match-variables 'QueryString' 'PostArgs' \
  --operator 'Contains' \
  --values 'hoge' 'fuga' \
  --transforms 'Lowercase' 'RemoveNulls'

-----  出力 -----
{
  "matchValues": [
    "hoge",
    "fuga"
  ],
  "matchVariables": [
    {
      "selector": null,
      "variableName": "QueryString"
    },
    {
      "selector": null,
      "variableName": "PostArgs"
    }
  ],
  "negationConditon": null,
  "operator": "Contains",
  "transforms": [
    "Lowercase",
    "RemoveNulls"
  ]
}
---------------

 Azureのダッシュボード から作成されたことが確認できました。
f:id:motikan2010:20200424004319p:plain:w300

3-2. マッチ条件の一覧 (list サブコマンド)

$ az network application-gateway waf-policy custom-rule match-condition list \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule'

----- 出力 -----
[
  {
    "matchValues": [
      "hoge",
      "fuga"
    ],
    "matchVariables": [
      {
        "selector": null,
        "variableName": "QueryString"
      },
      {
        "selector": null,
        "variableName": "PostArgs"
      }
    ],
    "negationConditon": false,
    "operator": "Contains",
    "transforms": [
      "Lowercase",
      "RemoveNulls"
    ]
  }
]
---------------

3-3. マッチ条件を削除 (remove サブコマンド)

$ az network application-gateway waf-policy custom-rule match-condition remove -h

Command
    az network application-gateway waf-policy custom-rule match-condition remove : Remove a match
    condition from an application gateway WAF policy custom rule.

Arguments
    --index  [Required] : Index of the match condition to remove.

Resource Id Arguments
    --ids               : One or more resource IDs (space-delimited). It should be a complete
                          resource ID containing all information of 'Resource Id' arguments. If
                          provided, no other 'Resource Id' arguments should be specified.
    --name -n           : Name of the WAF policy rule.
    --policy-name       : The name of the application gateway WAF policy.
    --resource-group -g : Name of resource group. You can configure the default group using `az
                          configure --defaults group=<name>`.
    --subscription      : Name or ID of subscription. You can configure the default subscription
                          using `az account set -s NAME_OR_ID`.
$ az network application-gateway waf-policy custom-rule match-condition remove \
  --resource-group 'testResourceGroup' \
  --policy-name 'TestPolicy' \
  --name 'TestCustomRule' \
  --index 0

【PR】Githubスターが100超えたから紹介【セキュリティ】

f:id:motikan2010:20200306023529p:plain:w600
  • はじめに
  • 「PoC-in-GitHub」とはどのようなリポジトリ? 👉 オススメ度:★★★
  • その他リポジトリも紹介させて!
    • NVD情報を保存している「NVD-Database」 👉 オススメ度:★
    • CVEをリスト化している「CVE-Easy-List」 👉 オススメ度:★★★★
    • CVEのExploitがリスト化されている「NVD-Exploit-List-Ja」 👉 オススメ度:★★
  • おまけ
    • 裏方アカウント
    • 脆弱性をリスト化することによる副作用
  • まとめ
  • 更新履歴

はじめに

 先日私が作成したGitHubリポジトリのスター数が100を超えました!

圧倒的感謝!(-人-)謝謝

 3桁になったのは初めてのことであり嬉しいので、どのようリポジトリであるのかを紹介することにします。
ついでに他のリポジトリも紹介させて! +私自身のリポジトリ確認頻度でオススメ度を決めています。

人によってはきっと役に立つはず。

 100個を超えたことに気づいている様子が以下のツイートです。

ちなみに100個目の記念スター⭐️は自分自身で付けようと思っていましたが、就寝中であり付けられませんでした。

続きを読む

【Webセキュリティ】Apache Dubbo の脆弱性をやる(CVE-2019-17564)

f:id:motikan2010:20200214224225p:plain
  • はじめに
    • Apache Dubbo とは
      • 脆弱性について
    • 影響を受けるバージョン
    • 解決策
  • 検証環境の準備
    • Apache ZooKeeper を起動
    • アプリケーションの修正と起動
  • 脆弱性の検証
    • ysoserial を使ってペイロードを生成
    • ペイロードの中身を確認
    • ペイロードの送信
    • 修正版 2.7.5 で試してみる
  • 参考
  • 更新履歴

はじめに

 2020年2月10日にApache Dubbo の脆弱性が公表されました。
CVE-2019-17564が登録されたのは2019年10月14日のようです。

 本脆弱性の内容を一言で言うと、「安全でないデシリアライゼーションのJava版」です。

 こちらのメールにて Dubboプロジェクトチーム に対して本脆弱性が伝えられています。
https://www.mail-archive.com/dev@dubbo.apache.org/msg06225.html

 CVE STALKER のデイリーランキングでは7位になっています。
f:id:motikan2010:20200214001856p:plain:w600

続きを読む

【Python】Waitress の ReDoS をやってみる(CVE-2020-5236)

f:id:motikan2010:20200205224320p:plain
いらすとや産のPython

  • はじめに
    • Waitress とは
  • 検証
    • 検証バージョン
    • 環境構築
    • ReDoS をしてみる
      • 脆弱なバージョン 1.4.2
      • パッチ適用バージョン 1.4.3
      • 脆弱性が存在しないバージョン 1.4.1
  • 脆弱性を掘り下げる
    • 修正コミット
    • 修正前 と 修正後 の正規表現
      • 簡単に負荷の大きい正規表現を試す
    • 遅い原因を考えてみる
  • 参考
    • 本脆弱性の情報
    • ReDoSの情報
  • 更新履歴

はじめに

 GitHub Advisory Database - CVE-2020-5236緊急度が Critical(最も危険) となっていたので調べてみました。

f:id:motikan2010:20200205214545p:plain:w700
GitHub アドバイザリ - CVE-2020-5236

 影響を受ける Waitress のバージョンは1.4.2のみです。
リリースのタイムラインは以下のようになっています。2020年1月中に導入した人はバージョンを確認してみたほうがよいでしょう。(※本脆弱性以外にも過去のバージョンには他の脆弱性が見つかっているようでした。)

  • 1.4.2 2020年 1月 2日 リリース
  • 1.4.3 2020年 2月 2日 リリース

Waitress — waitress 1.4.3 documentation

Waitress とは

 あまり耳にしないソフトウェアだと思う「Waitress」は何かと言うと、「WSGI サーバ」らしい。

 WSGI サーバとは何ぞやというと、

Web Server Gateway Interface (WSGI; ウィスキー) は、プログラミング言語Pythonにおいて、WebサーバとWebアプリケーション(もしくはWebアプリケーションフレームワーク)を接続するための、標準化されたインタフェース定義である。

by Wikipedia

つまり、
  Django や Bottle といったPython言語のWebアプリケーションフレームを動作させる為のアプリケーションサーバとのこと。
 Ruby界隈で例えると Unicorn に近い役割を持っているWebサーバだと思う。

 WSGI サーバーについてのより詳しい内容は以下の記事が参考になりました。
WSGIアプリケーションとは?WebフレームワークからWSGIサーバーまで - Make組ブログ

 今回脆弱性が発見された「Waitress」はそのようなソフトウェアの1つということです。

 どのくらい普及しているのかというと、GitHub の 約12,800個のリポジトリで利用されていることから、そこそこ普及しているWebサーバだと思います。

f:id:motikan2010:20200205215037p:plain:w700
2020/2/5 現在

 そんな Waitress から ReDoS(Regular expression Denial of Service) の脆弱性が発見されました。
本脆弱性の再現には特別な設定等は必要なく、さらに攻撃方法が容易ということで簡単に再現してしまうことから緊急度が Critical となっていると思います。

github.com

続きを読む

【Webセキュリティ】依存ライブラリのセキュリティチェックツール(SCA)を使ってみる

f:id:motikan2010:20200129012730p:plain
  • はじめに
  • 言語別 ツール一覧
    • PHP
      • sensiolabs / security-checker
        • 使い方
        • 脆弱性データベース
        • Web版
    • Ruby
      • rubysec / bundler-audit
        • 使い方
      • 脆弱性データベース - rubysec / ruby-advisory-db
    • Python
      • pyupio / safety
        • 脆弱性データベース
        • 使い方
        • 詳細情報レポートの取得。 --full-report オプション
    • Java
      • jeremylong / DependencyCheck
      • Gradle用 jeremylong/dependency-check-gradle
    • JavaScript
      • Npm標準ツール - npm-audit
        • 脆弱なパッケージをアップデートする " npm audit fix " コマンド
  • まとめ
  • 更新履歴

はじめに

 まず「依存ライブラリのセキュリティチェックツール」とは?ということですが、このようなツールの呼び方が定まっていないため本記事ではこのような呼び方にしています。
(強いて言えば、Software Composition Analysツールと呼ばれているツール群)

これらのツールの特徴として、動作しているアプリケーションが依存しているライブラリやパッケージに既知の脆弱性が存在していないかをバージョン情報などをもとに検査します。脆弱性があるバージョンのライブラリがあるとアラートを出す挙動をします。

 従来から利用されている Burp Suite や OWASP ZAP などのWebセキュリティ診断ツールは実際にアプリケーションを動作させて、その挙動から脆弱性を検出します。それに対して「依存ライブラリのセキュリティチェックツール」はアプリケーションを動作させずに検査します。ツールの動作が全く異なるので、検査内容も大きく違います。

 どちらかといったらWordPressの検査に利用される WPScan に検査内容は近いです。どちらも利用しているプラグイン(ライブラリ)のバージョン情報で検出するのがメインとなっているからです。
それでも検査を実施できる範囲は異なります。
 WPScan はネット越しに公開されているサイト全てに検査することが可能です。対して「依存ライブラリのセキュリティチェックツール」はアプリケーションが依存しているライブラリが記述されているファイル(Gemfile.lock や composer.lock)が検査対象になりますので、それらのファイルを閲覧できる権限者のみが検査を実施できます。それらのファイルに依存関係はほぼ全て記述されているので、依存関係を全て取得するのが難しいネット越しでの検査に比べてより厳密な検査ができます。

 そして近頃、Webアプリケーションなどのソフトウェアに依存しているライブラリに既知の脆弱性が潜んでいないかを検査するために、セキュリティチェックツールを提供・利用するサービスが増えてきている気がしています。

▼ Snyk もセキュリティチェックツールを開発/提供している企業であり資金調達が上手くいっている模様。 jp.techcrunch.com

 まずは、手軽に導入することができるOSSのセキュリティチェックツールを使用してみて、どのような検査結果を得ることができるのかなどを確認してみます。
ついでに検出された脆弱性の情報はどこから取得しているのかなども確認してきます。

続きを読む

2018年 人気脆弱性 TOP 10 in GitHub

f:id:motikan2010:20200106223239p:plain
  • はじめに
  • TOP 10
    • 10位 541 ポイント 『Intel Core マイクロプロセッサを搭載したシステムにおける情報漏えいに関する脆弱性(CVE-2018-3620 通称「Foreshadow」)』
    • 9位 575 ポイント 『Intel ハードウェアアーキテクチャのデバッグ例外を適切に処理していない問題(CVE-2018-8897)』
    • 8位 582 ポイント 『WinRAR における入力確認に関する脆弱性(CVE-2018-20250)』
    • 7位 592 ポイント 『TBK DVR4104 および DVR4216 デバイスにおける証明書・パスワードの管理に関する脆弱性(CVE-2018-9995)』
    • 6位 605 ポイント 『Microsoft Exchange Server における権限を昇格される脆弱性(CVE-2018-8581)』
    • 5位 627 ポイント『OpenSSH における情報漏えいに関する脆弱性(CVE-2018-15473)』
    • 4位 674 ポイント 『Apache Struts2 における任意のコードが実行可能な脆弱性(CVE-2018-11776、S2-057)』
    • 3位 946 ポイント『複数の Microsoft Windows 製品における権限を昇格される脆弱性(CVE-2018-8120)』
    • 2位 1236 ポイント『Drupal における入力確認に関する脆弱性(CVE-2018-7600 通称「Drupalgeddon2」)』
    • 1位 1242 ポイント『libssh における認証に関する脆弱性(CVE-2018-10933)』
    • TOP 10 一覧
    • おまけ
      • リポジトリ数ランキング
  • 更新履歴

はじめに

 2020年 1発目の投稿となりますが、時代に逆行して2018年に人気だった脆弱性を紹介します。
先日書いた「2019年 人気脆弱性 TOP 10 in GitHub」の2018年版です。

↓ 2019年版 ↓
blog.motikan2010.com

TOP 10

 TOP 10の算出方法としては、「リポジトリの数」と「それらのリポジトリのスターの数」を使用しています。
リポジトリ毎に10ポイント、スター毎に1ポイント 加算される形式で算出しています。
 ※各脆弱性のタイトルはJVNから引用しています。

10位 541 ポイント 『Intel Core マイクロプロセッサを搭載したシステムにおける情報漏えいに関する脆弱性(CVE-2018-3620 通称「Foreshadow」)』

access.redhat.com

人気リポジトリ
GitHub - ionescu007/SpecuCheck: SpecuCheck is a Windows utility for checking the state of the software mitigations and hardware against CVE-2017-5754 (Meltdown), CVE-2017-5715 (Spectre v2), CVE-2018-3260 (Foreshadow), and CVE-2018-3639 (Spectre v4)

続きを読む

2019年 人気脆弱性 TOP 10 in GitHub

f:id:motikan2010:20191231225911p:plain
  • はじめに
  • TOP 10
    • 10位 501 ポイント『Pulse Secure Pulse Connect Secure におけるパーミッションに関する脆弱性(CVE-2019-11510)』
    • 9位 522 ポイント『Canonical snapd における入力確認に関する脆弱性(CVE-2019-7304)』
    • 8位 545 ポイント『Firefox および Thunderbird における入力確認に関する脆弱性(CVE-2019-11708)』
    • 7位 572 ポイント『Android 用 ES File Explorer File Manager アプリケーションにおける入力確認に関する脆弱性(CVE-2019-6447)』
    • 6位 629 ポイント『Espressif ESP-IDF および ESP8266_NONOS_SDK における入力確認に関する脆弱性(CVE-2019-12586)』
    • 5位 704 ポイント『Oracle Fusion Middleware の Oracle WebLogic Server における WLS Core Components に関する脆弱性(CVE-2019-2618)』
    • 4位 785 ポイント『Docker および runc におけるコンテナエラーの脆弱性(CVE-2019-5736)』
    • 3位 935 ポイント『Oracle Fusion Middleware の Oracle WebLogic Server における Web Services に関する脆弱性(CVE-2019-2725)』
    • 2位 1868 ポイント『PHP における境界外書き込みに関する脆弱性(CVE-2019-11043)』
    • 1位 5413 ポイント『複数の Microsoft Windows 製品のリモートデスクトップ サービスにおけるリモートでコードを実行される脆弱性(CVE-2019-0708 通称「BlueKeep」)』
    • TOP 10 一覧
  • おまけ
    • リポジトリ数ランキング
  • 更新履歴

はじめに

 2019年も終わりに近づいているので、2019年に公表されたCVEが採番されている脆弱性の中から人気なものをGitHubから検索しTOP 10を決めていきます。

検索結果のリポジトリについては下記のリポジトリで管理されています。
github.com

TOP 10

 TOP 10の算出方法としては、「リポジトリの数」と「それらのリポジトリのスターの数」を使用しています。
リポジトリ毎に10ポイント、スター毎に1ポイント 加算される形式で算出しています。
 ※各脆弱性のタイトルはJVNから引用しています。

10位 501 ポイント『Pulse Secure Pulse Connect Secure におけるパーミッションに関する脆弱性(CVE-2019-11510)』

jp.tenable.com

攻撃者はユーザー名とプレーンテキストパスワードを取得するためにCVE-2019-11510を使用して脆弱性のあるシステムを探し出しています。

とある通り、任意のファイルが取得できる脆弱性となっています。

Twitter社にも該当する脆弱性があったようですね。 Twitterも影響を受けたSSL VPN製品の脆弱性についてまとめてみた - piyolog

こちらの脆弱性はBlack Hat 2019でも触れられていた脆弱性でした。 https://i.blackhat.com/USA-19/Wednesday/us-19-Tsai-Infiltrating-Corporate-Intranet-Like-NSA.pdf

人気リポジトリ
GitHub - projectzeroindia/CVE-2019-11510: Exploit for Arbitrary File Read on Pulse Secure SSL VPN (CVE-2019-11510)

続きを読む

PHP-FPM RCE(CVE-2019-11043)の攻撃をAWS WAFでブロック

  • はじめに
  • AWS WAFの設定
    • 文字列マッチの条件を作成
    • ルールを作成
    • ACLにルールを追加
  • 攻撃がブロックされることを確認
  • 参考
  • 更新履歴

はじめに

 先日、PHP-FPMにRCEの脆弱性(CVE-2019-11043)があることが公表されました。

 脆弱性の詳細について本記事で説明しません。脆弱性を含んでいるバーションや攻撃が可能となる条件等は下のリンクの記事を参照して下さい。

 本記事では、この脆弱性に対しての攻撃をブロックするAWS WAFのルールの作成方法を紹介します。
「PHPのアップデート」や「Nginxの設定変更」で対応できますが、それが行えない環境下での対応手段の1つだと思っています。
ブロックルールは単純なので、AWS WAF以外の製品にも適用できるとも考えています。

jp.tenable.com

続きを読む