7.3 KiB
Namespace UTS
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você quiser ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Verifique os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
Um namespace UTS (UNIX Time-Sharing System) é um recurso do kernel Linux que fornece isolamento de dois identificadores do sistema: o nome do host e o domínio NIS (Network Information Service). Esse isolamento permite que cada namespace UTS tenha seu próprio nome de host independente e domínio NIS, o que é particularmente útil em cenários de containerização onde cada contêiner deve parecer como um sistema separado com seu próprio nome de host.
Como funciona:
- Quando um novo namespace UTS é criado, ele começa com uma cópia do nome do host e do domínio NIS do namespace pai. Isso significa que, na criação, o novo namespace compartilha os mesmos identificadores que seu pai. No entanto, quaisquer alterações subsequentes no nome do host ou no domínio NIS dentro do namespace não afetarão outros namespaces.
- Processos dentro de um namespace UTS podem alterar o nome do host e o domínio NIS usando as chamadas de sistema
sethostname()
esetdomainname()
, respectivamente. Essas alterações são locais ao namespace e não afetam outros namespaces ou o sistema hospedeiro. - Processos podem se mover entre namespaces usando a chamada de sistema
setns()
ou criar novos namespaces usando as chamadas de sistemaunshare()
ouclone()
com a flagCLONE_NEWUTS
. Quando um processo se move para um novo namespace ou cria um, ele começará a usar o nome do host e o domínio NIS associados a esse namespace.
Laboratório:
Criar diferentes Namespaces
CLI
sudo unshare -u [--mount-proc] /bin/bash
Ao montar uma nova instância do sistema de arquivos /proc
usando o parâmetro --mount-proc
, você garante que o novo namespace de montagem tenha uma visão precisa e isolada das informações de processo específicas daquele namespace.
Erro: bash: fork: Não é possível alocar memória
Quando o unshare
é executado sem a opção -f
, um erro é encontrado devido à forma como o Linux lida com os novos namespaces de PID (Process ID). Os detalhes-chave e a solução são descritos abaixo:
- Explicação do Problema:
- O kernel do Linux permite que um processo crie novos namespaces usando a chamada de sistema
unshare
. No entanto, o processo que inicia a criação de um novo namespace de PID (chamado de processo "unshare") não entra no novo namespace; apenas seus processos filhos o fazem. - Executar
%unshare -p /bin/bash%
inicia/bin/bash
no mesmo processo queunshare
. Consequentemente,/bin/bash
e seus processos filhos estão no namespace de PID original. - O primeiro processo filho do
/bin/bash
no novo namespace se torna o PID 1. Quando esse processo sai, ele aciona a limpeza do namespace se não houver outros processos, pois o PID 1 tem o papel especial de adotar processos órfãos. O kernel do Linux então desabilitará a alocação de PID nesse namespace.
- Consequência:
- A saída do PID 1 em um novo namespace leva à limpeza da flag
PIDNS_HASH_ADDING
. Isso resulta na funçãoalloc_pid
falhando ao alocar um novo PID ao criar um novo processo, produzindo o erro "Cannot allocate memory".
- Solução:
- O problema pode ser resolvido usando a opção
-f
com ounshare
. Essa opção faz com que ounshare
bifurque um novo processo após criar o novo namespace de PID. - Executar
%unshare -fp /bin/bash%
garante que o comandounshare
em si se torne o PID 1 no novo namespace./bin/bash
e seus processos filhos são então seguramente contidos dentro desse novo namespace, evitando a saída prematura do PID 1 e permitindo a alocação normal de PID.
Ao garantir que o unshare
seja executado com a flag -f
, o novo namespace de PID é mantido corretamente, permitindo que /bin/bash
e seus sub-processos operem sem encontrar o erro de alocação de memória.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Verifique em qual namespace está o seu processo
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Encontrar todos os namespaces UTS
{% code overflow="wrap" %}
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
{% endcode %}
Entrar dentro de um namespace UTS
nsenter -u TARGET_PID --pid /bin/bash
Também, você só pode entrar em outro namespace de processo se for root. E você não pode entrar em outro namespace sem um descritor apontando para ele (como /proc/self/ns/uts
).
Alterar o nome do host
unshare -u /bin/bash
hostname newhostname # Hostname won't be changed inside the host UTS ns
Referências
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, verifique os PLANOS DE ASSINATURA!
- Adquira o swag oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os repositórios HackTricks e HackTricks Cloud.