
Outil d'inscription d'appareil rogue pour Entra ID et Intune MDM. Automatise l'adhésion de l'appareil, l'acquisition de jetons, l'inscription MDM et la vérification OMA-DM pour extraire les politiques, les identifiants Wi-Fi, les scripts et les applications tout en contournant l'accès conditionnel.
Inspiré par l'original Pytune, OutOfTune enregistre un appareil non autorisé dans Entra ID, l'inscrit dans Intune MDM et vérifie l'état de conformité résultant.
Ne prend en charge que les appareils Windows car c'était mon objectif principal, pourrait en ajouter d'autres à l'avenir.
Blog d'accompagnement :
pip install -r requirements.txt
La chaîne s'exécute en phases, chacune s'appuyant sur l'état sauvegardé dans chain_state.json.
drs-token -> device-join -> device-token -> mdm-enroll -> mdm-checkin
ROPC (identifiants connus) :
python OutOfTune.py drs-token -u [email protected] -p Password1!
Jeton pré-obtenu :
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
Produit <NOM_APPAREIL>.pfx - le certificat d'appareil. Le mot de passe est password.
python OutOfTune.py device-token
python OutOfTune.py device-token --cert CORP-LAPTOP-01.pfx
S'authentifie auprès d'AAD en tant qu'objet appareil (pas en tant qu'utilisateur). Contourne les politiques CA limitées à l'utilisateur.
python OutOfTune.py mdm-enroll
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
Exécute la découverte SOAP contre le point de terminaison MDM, puis soumet une demande d'inscription PKCS10 WS-Trust. Produit <NOM_APPAREIL>_mdm.pfx.
Utilisez --profile pour usurper les attributs matériels/OS de l'appareil envoyés à Intune (voir Profils d'appareil).
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
Exécute la boucle SyncML OMA-DM contre r.manage.microsoft.com. Intune poussera les profils de configuration, les affectations d'applications et toutes autres politiques ciblant l'appareil. Une fois la boucle terminée, les informations sont automatiquement extraites et affichées.
Si -r est fourni, le jeton d'actualisation est échangé contre un jeton d'accès manage.microsoft.com et envoyé comme Authorization: Bearer dans chaque requête SyncML. Intune lit l'UPN de ce jeton et le définit comme utilisateur principal de l'appareil, ce qui entraîne la liaison des politiques de conformité limitées à l'utilisateur. Vous n'avez besoin d'exécuter qu'une seule fois avec -r pour qu'un utilisateur soit assigné ; tous les checkins ultérieurs peuvent être exécutés sans jeton d'actualisation.
Sans -r, l'appareil n'aura pas d'utilisateur principal.
Après ce premier checkin, si vous ne vous reconnectez pas pendant une période prolongée (généralement 5 à 7 jours), l'appareil pourrait devenir non conforme en raison de la politique par défaut "Is Active". Selon la configuration d'Intune, l'appareil peut entrer dans une période de grâce avant d'être marqué comme non conforme. Si cela se produit, relancez mdm-checkin. Si vous avez déjà utilisé un jeton d'actualisation pour assigner un utilisateur principal, vous n'avez pas besoin de le soumettre à nouveau car l'utilisateur principal est désormais stocké dans le backend Intune.
Réanalysez les tours XML bruts sauvegardés avec --save-syncml sans exécuter un checkin en direct.
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!
Frappe un PRT à partir du certificat d'appareil, l'échange contre un jeton IWService, et interroge IWService/Devices pour l'état de conformité de l'appareil et les éventuelles règles de non-conformité.
Utilisez -r avec un jeton d'actualisation de session MFA si le CA du locataire exige MFA pour la ressource d'inscription.
Récupère les applications Win32 et les scripts PowerShell assignés à l'appareil via le IME SideCarGateway. Utilise uniquement le certificat client MDM — aucun jeton utilisateur requis.
python OutOfTune.py download-apps
python OutOfTune.py download-apps --cert CORP-LAPTOP-01_mdm.pfx
scripts/<PolicyId>.ps1apps/<NomApp>/Récupère les scripts de correction proactive (paires détection + correction) assignés à l'appareil.
python OutOfTune.py get-remediations
python OutOfTune.py get-remediations --cert CORP-LAPTOP-01_mdm.pfx
Chaque politique est sauvegardée dans remediations/<PolicyId>/ contenant :
detection.ps1 — le script de détectionremediation.ps1 — le script de correctionparams.json — ID de la politique et éventuels paramètres du scriptSi la suppression de l'appareil d'Intune échoue, supprimez-le d'Entra. Il entrera alors dans une période de grâce dans Intune et sera automatiquement réévalué ultérieurement.
Supprimer l'appareil d'Intune :
python OutOfTune.py retire-intune -u [email protected] -r <refresh_token>
Supprimer l'objet appareil d'Entra ID :
python OutOfTune.py entra-delete
python OutOfTune.py status
Les attributs d'appareil envoyés à Intune lors de l'inscription et du checkin sont entièrement usurpables via un profil JSON. Cela inclut les identifiants matériels, la version de l'OS, le fabricant et toutes les valeurs CSP de conformité auto-déclarées (BitLocker, Pare-feu, Defender, TPM, Secure Boot).
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
python OutOfTune.py mdm-checkin # le profil est sauvegardé dans l'état et réutilisé automatiquement
| Fichier | Appareil |
|---|---|
profiles/default.json | Valeurs par défaut (VMware / Win10 Enterprise) |
profiles/dell_win11_ent.json | Dell Latitude 5540 / Windows 11 Enterprise 23H2 |
Toutes les valeurs CSP DeviceStatus sont auto-déclarées et considérées comme fiables par Intune sans vérification indépendante. Les vérifications de conformité attestées par HAS (BitLockerEnabled, SecureBootEnabled via la CSP HealthAttestation) nécessitent un TPM réel et ne peuvent pas être usurpées de cette manière.
--debug journalisation verbeuse HTTP + tokens
--proxy <url> acheminer le trafic via un proxy (ex. http://127.0.0.1:8080)
Ces options se placent avant la commande :
python OutOfTune.py --debug device-token
python OutOfTune.py --proxy http://127.0.0.1:8080 mdm-checkin
Si vous avez des certificats d'une exécution précédente ou souhaitez utiliser des fichiers PFX spécifiques :
python OutOfTune.py device-token --cert chemin/vers/appareil.pfx
python OutOfTune.py mdm-enroll --cert chemin/vers/appareil.pfx
python OutOfTune.py mdm-checkin --cert chemin/vers/mdm.pfx
python OutOfTune.py check --cert chemin/vers/appareil.pfx
python OutOfTune.py download-apps --cert chemin/vers/mdm.pfx
python OutOfTune.py get-remediations --cert chemin/vers/mdm.pfx
Toutes les sorties de phase sont sauvegardées dans chain_state.json dans le répertoire de travail. Supprimez-le pour repartir à zéro. Utilisez status pour inspecter l'état actuel sans rien exécuter. Si vous manipulez plusieurs appareils, assurez-vous que chacun possède son propre fichier d'état. Le fichier d'état par défaut peut être modifié au début du script pour l'appareil que vous traitez. Soyez prudent avec les options de remplacement de certificat, elles sont principalement destinées au débogage.
Un grand merci à @temp43487580 qui a créé l'original Pytune et dont les recherches originales ont rendu cela possible
| Option | Description |
|---|
--cert FICHIER | PFX MDM à utiliser — le nom de l'appareil est dérivé automatiquement du nom de fichier |
-r RT | Jeton d'actualisation utilisateur — définit l'utilisateur principal (nécessaire une seule fois) |
-O RÉP | Sauvegarder les artefacts extraits dans RÉP (wifi/, vpn/, scripts/, certs/, add_values.json, policy_values.json) |
--save-syncml RÉP | Sauvegarder le XML SyncML brut par tour dans RÉP pour une réanalyse hors ligne |
-o FICHIER | Écrire la sortie complète de la console dans FICHIER |
| Catégorie | Sauvegardé dans | Remarques |
|---|
| Profils Wi-Fi | wifi/<SSID>.xml + _psk.txt | PSK en clair extrait si présent |
| Profils VPN | vpn/<nom>.xml | ProfileXML complet |
| Charges utiles de certificats | certs/cert_N.b64 | Blobs PFX chiffrés (bruts, pas encore déchiffrés) |
| Défis SCEP | affiché | Nom du modèle CA, URL du défi |
| Scripts | scripts/<nom>.ps1 | Scripts PowerShell poussés via OMA-DM |
| URLs de téléchargement MSI | affiché | Liens CDN directs pour les applications LOB |
| Blob ODJ | odj_blob.b64 + odj_strings.txt | Jonction de domaine hors ligne — chaînes lisibles extraites |
| Valeurs d'ajout | add_values.json | Toutes les autres commandes Add (certificats racine CA, intégration MDE, configuration de politique) |
| Valeurs de remplacement | policy_values.json | Valeurs de la CSP Policy définies par Intune |
| Champ | CSP | Remarques |
|---|
os_version | DevDetail/SwV | Vérifications de conformité de version OS min/max |
os_edition_syncml | WindowsLicensing/Edition | 4 = Enterprise, 48 = Pro |
manufacturer | DevInfo/Man | Certaines politiques autorisent les fabricants |
mac_address | SOAP AdditionalContext/MAC | Tous des zéros est un indicateur évident |
hw_dev_id_enroll | SOAP AdditionalContext/HWDevID | 64 caractères hexadécimaux |
bitlocker_status | BitLocker/Status/DeviceEncryptionStatus | 2 = chiffré (auto-déclaré) |
encryption_compliance | DeviceStatus/Compliance/EncryptionCompliance | 1 = conforme (auto-déclaré) |
firewall_status | DeviceStatus/Firewall/Status | 0 = activé (auto-déclaré) |
secure_boot_state | DeviceStatus/SecureBootState | 1 = activé (auto-déclaré, non attesté par HAS) |
tpm_version | DeviceStatus/TPM/SpecificationVersion | Aucune preuve cryptographique |
defender_enabled | Defender/Health/DefenderEnabled | true = en cours d'exécution |
defender_version | Defender/Health/DefenderVersion | Certaines politiques imposent une version minimale |