macOS FS Tricks
Combinações de permissões POSIX
Permissões em um diretório:
leitura - você pode enumerar as entradas do diretório
escrita - você pode excluir/escrever arquivos no diretório e pode excluir pastas vazias.
Mas você não pode excluir/modificar pastas não vazias a menos que tenha permissões de escrita sobre elas.
Você não pode modificar o nome de uma pasta a menos que a possua.
execução - você está autorizado a percorrer o diretório - se você não tiver esse direito, não poderá acessar nenhum arquivo dentro dele, ou em quaisquer subdiretórios.
Combinações Perigosas
Como sobrescrever um arquivo/pasta de propriedade do root, mas:
Um proprietário de diretório pai no caminho é o usuário
Um proprietário de diretório pai no caminho é um grupo de usuários com acesso de escrita
Um grupo de usuários tem acesso de escrita ao arquivo
Com qualquer uma das combinações anteriores, um atacante poderia injetar um link simbólico/link físico no caminho esperado para obter uma gravação arbitrária privilegiada.
Caso Especial de Raiz de Pasta R+X
Se houver arquivos em um diretório onde apenas o root tem acesso R+X, esses arquivos não são acessíveis a mais ninguém. Portanto, uma vulnerabilidade que permita mover um arquivo legível por um usuário, que não pode ser lido por causa dessa restrição, deste diretório para um diferente, poderia ser abusada para ler esses arquivos.
Exemplo em: https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions
Link Simbólico / Link Físico
Se um processo privilegiado estiver gravando dados em um arquivo que poderia ser controlado por um usuário com menos privilégios, ou que poderia ser previamente criado por um usuário com menos privilégios. O usuário poderia simplesmente apontá-lo para outro arquivo via um link simbólico ou físico, e o processo privilegiado gravará nesse arquivo.
Verifique nas outras seções onde um atacante poderia abusar de uma gravação arbitrária para escalar privilégios.
.fileloc
Arquivos com a extensão .fileloc
podem apontar para outras aplicações ou binários, então quando são abertos, a aplicação/binário será o executado.
Exemplo:
FD Arbitrário
Se você pode fazer um processo abrir um arquivo ou uma pasta com altos privilégios, você pode abusar do crontab
para abrir um arquivo em /etc/sudoers.d
com EDITOR=exploit.py
, então o exploit.py
obterá o FD para o arquivo dentro de /etc/sudoers
e abusará dele.
Por exemplo: https://youtu.be/f1HA5QhLQ7Y?t=21098
Evitar truques de atributos estendidos de quarentena
Removê-lo
Bandeira uchg / uchange / uimmutable
Se um arquivo/pasta tiver esse atributo imutável, não será possível colocar um xattr nele.
Montagem defvfs
Uma montagem devfs não suporta xattr, mais informações em CVE-2023-32364
ACL writeextattr
Este ACL impede a adição de xattrs
ao arquivo.
com.apple.acl.text xattr + AppleDouble
O formato de arquivo AppleDouble copia um arquivo incluindo suas ACEs.
No código-fonte é possível ver que a representação de texto do ACL armazenada dentro do xattr chamado com.apple.acl.text
será definida como ACL no arquivo descompactado. Portanto, se você comprimir um aplicativo em um arquivo zip com o formato de arquivo AppleDouble com um ACL que impede que outros xattrs sejam gravados nele... o xattr de quarentena não será definido no aplicativo:
Verifique o relatório original para mais informações.
Para replicar isso, primeiro precisamos obter a string de acl correta:
(Note que mesmo que isso funcione, a sandbox escreve o atributo de quarentena antes)
Não é realmente necessário, mas eu deixo aqui apenas por precaução:
pagemacOS xattr-acls extra stuffBypass de Assinaturas de Código
Os pacotes contêm o arquivo _CodeSignature/CodeResources
que contém o hash de cada arquivo no pacote. Note que o hash do CodeResources também está embutido no executável, então não podemos mexer com isso também.
No entanto, existem alguns arquivos cuja assinatura não será verificada, esses têm a chave omit no plist, como:
É possível calcular a assinatura de um recurso a partir da linha de comando com:
Normalmente, o macOS monta o disco falando com o serviço Mach com.apple.DiskArbitrarion.diskarbitrariond
(fornecido por /usr/libexec/diskarbitrationd
). Se adicionar o parâmetro -d
ao arquivo plist do LaunchDaemons e reiniciar, ele armazenará logs em /var/log/diskarbitrationd.log
.
No entanto, é possível usar ferramentas como hdik
e hdiutil
para se comunicar diretamente com o kext com.apple.driver.DiskImages
.
Gravações Arbitrárias
Scripts sh periódicos
Se o seu script puder ser interpretado como um script shell, você pode sobrescrever o script shell /etc/periodic/daily/999.local
que será acionado todos os dias.
Você pode simular uma execução deste script com: sudo periodic daily
Daemons
Escreva um LaunchDaemon arbitrário como /Library/LaunchDaemons/xyz.hacktricks.privesc.plist
com um plist executando um script arbitrário como:
Ficheiro Sudoers
Se tiver escrita arbitrária, poderá criar um ficheiro dentro da pasta /etc/sudoers.d/
concedendo a si próprio privilégios sudo.
Ficheiros PATH
O ficheiro /etc/paths
é um dos principais locais que popula a variável de ambiente PATH. Deve ser root para o sobrescrever, mas se um script de um processo privilegiado estiver a executar algum comando sem o caminho completo, poderá sequestrá-lo modificando este ficheiro.
Também pode escrever ficheiros em /etc/paths.d
para carregar novas pastas na variável de ambiente PATH
.
Gerar ficheiros graváveis como outros utilizadores
Isto irá gerar um ficheiro que pertence ao root e que é gravável por mim (código daqui). Isto também pode funcionar como privesc:
Memória Compartilhada POSIX
A memória compartilhada POSIX permite que processos em sistemas operacionais compatíveis com POSIX acessem uma área de memória comum, facilitando uma comunicação mais rápida em comparação com outros métodos de comunicação entre processos. Envolve a criação ou abertura de um objeto de memória compartilhada com shm_open()
, definindo seu tamanho com ftruncate()
, e mapeando-o no espaço de endereço do processo usando mmap()
. Os processos podem então ler e escrever diretamente nesta área de memória. Para gerenciar o acesso concorrente e evitar a corrupção de dados, mecanismos de sincronização como mutexes ou semáforos são frequentemente utilizados. Por fim, os processos desmapeiam e fecham a memória compartilhada com munmap()
e close()
, e opcionalmente removem o objeto de memória com shm_unlink()
. Este sistema é especialmente eficaz para IPC eficiente e rápido em ambientes onde múltiplos processos precisam acessar dados compartilhados rapidamente.
Descritores Guardados do macOS
Os descritores guardados do macOS são um recurso de segurança introduzido no macOS para melhorar a segurança e confiabilidade das operações de descritores de arquivo em aplicativos de usuário. Esses descritores guardados fornecem uma maneira de associar restrições específicas ou "guardas" com descritores de arquivo, que são aplicadas pelo kernel.
Este recurso é particularmente útil para prevenir certas classes de vulnerabilidades de segurança, como acesso não autorizado a arquivos ou condições de corrida. Essas vulnerabilidades ocorrem, por exemplo, quando uma thread está acessando uma descrição de arquivo, dando a outra thread vulnerável acesso sobre ela ou quando um descritor de arquivo é herdado por um processo filho vulnerável. Algumas funções relacionadas a essa funcionalidade são:
guarded_open_np
: Abre um FD com um guardaguarded_close_np
: Fecha-ochange_fdguard_np
: Altera as flags de guarda em um descritor (mesmo removendo a proteção do guarda)
Referências
Last updated