
Entra IDおよびIntune MDM向けの不正デバイス登録ツール。条件付きアクセスをバイパスしながら、デバイス参加、トークン取得、MDM登録、OMA-DMチェックインを自動化し、ポリシー、Wi-Fi認証情報、スクリプト、アプリを抽出します。
元のPytuneに触発されたOutOfTuneは、Entra IDに不正なデバイスを登録し、Intune MDMに登録し、その結果のコンプライアンス状態を確認します。
現在はWindowsデバイスのみ対応しています(これが私の主な目的でした)。将来的に他のOSも追加するかもしれません。
付属ブログ:
pip install -r requirements.txt
チェーンは複数のフェーズで実行され、各フェーズは chain_state.json に保存された状態に基づいて構築されます。
drs-token -> device-join -> device-token -> mdm-enroll -> mdm-checkin
ROPC (資格情報を知っている場合):
python OutOfTune.py drs-token -u [email protected] -p Password1!
事前取得済みトークン:
python OutOfTune.py drs-token -u [email protected] -t <drs_access_token>
python OutOfTune.py device-join
python OutOfTune.py device-join -n CORP-LAPTOP-01
出力: <DEVICENAME>.pfx - デバイス証明書。パスワードは password。
python OutOfTune.py device-token
python OutOfTune.py device-token --cert CORP-LAPTOP-01.pfx
デバイスオブジェクトとしてAADに認証します(ユーザーではありません)。ユーザースコープのCAポリシーをバイパスします。
python OutOfTune.py mdm-enroll
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
MDMエンドポイントに対してSOAP検出を実行し、WS-Trust PKCS10登録要求を送信します。出力: <DEVICENAME>_mdm.pfx。
--profile を使用して、Intuneに送信するデバイスのハードウェア/OS属性を偽装します(デバイスプロファイル を参照)。
python OutOfTune.py mdm-checkin
python OutOfTune.py mdm-checkin -r <refresh_token>
python OutOfTune.py mdm-checkin --cert CORP-LAPTOP-01_mdm.pfx
python OutOfTune.py mdm-checkin -O ./output
python OutOfTune.py mdm-checkin -O ./output --save-syncml ./output/raw
r.manage.microsoft.com に対してOMA-DM SyncMLループを実行します。Intuneは構成プロファイル、アプリの割り当て、およびその他のデバイスを対象とするポリシーをプッシュします。ループ完了後、インテリジェンスが自動的に抽出されて表示されます。
-r が指定された場合、更新トークンは manage.microsoft.com アクセストークンと交換され、各SyncML要求で Authorization: Bearer として送信されます。IntuneはこのトークンからUPNを読み取り、それをデバイスのプライマリユーザーとして設定します。これにより、ユーザースコープのコンプライアンスポリシーがバインドされます。ユーザーを割り当てるには -r を一度実行するだけでよく、それ以降のチェックインは更新トークンなしで実行できます。
-r がない場合、デバイスにはプライマリユーザーが設定されません。
この最初のチェックイン後、長期間(通常5〜7日)チェックインしないと、デフォルトの「有効」ポリシーによりデバイスが非準拠になる可能性があります。Intuneの構成によっては、デバイスが非準拠とマークされる前に猶予期間に入る場合があります。その場合は mdm-checkin を再実行してください。以前に更新トークンを使用してプライマリユーザーを割り当てた場合、プライマリユーザーはIntuneバックエンドに保存されているため、再度送信する必要はありません。
--save-syncml で保存された生のXMLラウンドを、ライブチェックインを実行せずに再解析します。
python OutOfTune.py parse-checkin --dir ./output/raw -O ./output2
python OutOfTune.py parse-checkin --file ./output/raw/round_001.xml -O ./output2
python OutOfTune.py check -u [email protected] -r <refresh_token>
python OutOfTune.py check -u [email protected] -p Password1!
デバイス証明書からPRTを生成し、それをIWServiceトークンと交換し、IWService/Devices に問い合わせてデバイスのコンプライアンス状態と非準拠ルールを取得します。
テナントCAが登録リソースにMFAを要求する場合は、MFAセッションの更新トークンを -r で使用します。
IME SideCarGateway経由でデバイスに割り当てられたWin32アプリとPowerShellスクリプトを取得します。MDMクライアント証明書のみを使用します — ユーザートークンは不要です。
python OutOfTune.py download-apps
python OutOfTune.py download-apps --cert CORP-LAPTOP-01_mdm.pfx
scripts/<PolicyId>.ps1 に保存されますapps/<AppName>/ に展開されますデバイスに割り当てられたプロアクティブ修復スクリプト(検出+修復のペア)を取得します。
python OutOfTune.py get-remediations
python OutOfTune.py get-remediations --cert CORP-LAPTOP-01_mdm.pfx
各ポリシーは remediations/<PolicyId>/ に保存され、以下が含まれます:
detection.ps1 — 検出スクリプトremediation.ps1 — 修復スクリプトparams.json — ポリシーIDとスクリプトパラメータIntuneからのデバイス削除に失敗した場合は、Entraから削除します。その後、Intune内で猶予期間に入り、後日自動的に再削除されます。
Intuneからデバイスを削除:
python OutOfTune.py retire-intune -u [email protected] -r <refresh_token>
Entra IDからデバイスオブジェクトを削除:
python OutOfTune.py entra-delete
python OutOfTune.py status
登録時およびチェックイン時にIntuneに送信されるデバイス属性は、JSONプロファイルを使用して完全に偽装可能です。これには、ハードウェア識別子、OSバージョン、製造元、およびすべての自己報告コンプライアンスCSP値(BitLocker、Firewall、Defender、TPM、Secure Boot)が含まれます。
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
python OutOfTune.py mdm-checkin # プロファイルは状態に保存され、自動的に再利用されます
| ファイル | デバイス |
|---|---|
profiles/default.json | デフォルト値 (VMware / Win10 Enterprise) |
profiles/dell_win11_ent.json | Dell Latitude 5540 / Windows 11 Enterprise 23H2 |
すべてのDeviceStatus CSP値は自己報告であり、独立した検証なしでIntuneによって信頼されます。HAS証明されたコンプライアンスチェック(HealthAttestation CSPを介したBitLockerEnabled、SecureBootEnabled)には実際のTPMが必要であり、この方法では偽装できません。
--debug 詳細なHTTP + トークンログ
--proxy <url> プロキシ経由でトラフィックをルーティング (例: http://127.0.0.1:8080)
これらはコマンドの前に配置します:
python OutOfTune.py --debug device-token
python OutOfTune.py --proxy http://127.0.0.1:8080 mdm-checkin
以前の実行の証明書がある場合や特定のPFXファイルを使用したい場合:
python OutOfTune.py device-token --cert path/to/device.pfx
python OutOfTune.py mdm-enroll --cert path/to/device.pfx
python OutOfTune.py mdm-checkin --cert path/to/mdm.pfx
python OutOfTune.py check --cert path/to/device.pfx
python OutOfTune.py download-apps --cert path/to/mdm.pfx
python OutOfTune.py get-remediations --cert path/to/mdm.pfx
すべてのフェーズの出力は、作業ディレクトリの chain_state.json に保存されます。削除すると新しく開始します。status を使用して、何も実行せずに現在の状態を確認できます。複数のデバイスを扱う場合は、それぞれに独自の状態ファイルがあることを確認してください。デフォルトの状態ファイルは、スクリプトの先頭で操作している任意のデバイスに変更できます。証明書の上書きオプションは主にデバッグ目的であるため、注意して使用してください。
多大な功績は @temp43487580 にあります。彼は元のPytuneを作成し、その独自の研究がこれを可能にしました。
| フラグ | 説明 |
|---|
--cert FILE | 使用するMDM PFX — デバイス名はファイル名から自動的に導出 |
-r RT | ユーザー更新トークン — プライマリユーザーを設定(一度だけ必要) |
-O DIR | 抽出したアーティファクトをDIRに保存 (wifi/, vpn/, scripts/, certs/, add_values.json, policy_values.json) |
--save-syncml DIR | 各ラウンドの生のSyncML XMLをDIRに保存(オフライン再解析用) |
-o FILE | 完全なコンソール出力をFILEに書き込む |
| カテゴリ | 保存先 | 備考 |
|---|
| Wi-Fiプロファイル | wifi/<SSID>.xml + _psk.txt | 存在する場合は平文PSKを抽出 |
| VPNプロファイル | vpn/<name>.xml | 完全なProfileXML |
| 証明書ペイロード | certs/cert_N.b64 | 暗号化されたPFXブロブ(生の状態、まだ復号化されていません) |
| SCEPチャレンジ | 表示 | CAモデル名、チャレンジURL |
| スクリプト | scripts/<name>.ps1 | OMA-DM経由でプッシュされたPowerShellスクリプト |
| MSIダウンロードURL | 表示 | LOBアプリの直接CDNリンク |
| ODJブロブ | odj_blob.b64 + odj_strings.txt | オフラインドメイン参加 — 読み取り可能な文字列を抽出 |
| Add値 | add_values.json | その他のAddコマンド(ルートCA証明書、MDEオンボーディング、ポリシー設定) |
| Replace値 | policy_values.json | Intuneによって設定されたポリシーCSP値 |
| フィールド | CSP | 備考 |
|---|
os_version | DevDetail/SwV | 最小/最大OSバージョンのコンプライアンスチェック |
os_edition_syncml | WindowsLicensing/Edition | 4 = Enterprise, 48 = Pro |
manufacturer | DevInfo/Man | 一部のポリシーは製造元を許可リストに登録する |
mac_address | SOAP AdditionalContext/MAC | 全ゼロは明らかな指標 |
hw_dev_id_enroll | SOAP AdditionalContext/HWDevID | 64桁の16進数 |
bitlocker_status | BitLocker/Status/DeviceEncryptionStatus | 2 = 暗号化済み (自己報告) |
encryption_compliance | DeviceStatus/Compliance/EncryptionCompliance | 1 = 準拠 (自己報告) |
firewall_status | DeviceStatus/Firewall/Status | 0 = オン (自己報告) |
secure_boot_state | DeviceStatus/SecureBootState | 1 = 有効 (自己報告、HAS証明なし) |
tpm_version | DeviceStatus/TPM/SpecificationVersion | 暗号的な証明なし |
defender_enabled | Defender/Health/DefenderEnabled | true = 実行中 |
defender_version | Defender/Health/DefenderVersion | 一部のポリシーは最小バージョンを強制する |