5.8 KiB
Namespace de Tempo
☁️ 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? Confira os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira produtos oficiais PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do 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.
Informações Básicas
O namespace de tempo permite deslocamentos por namespace para os relógios monotônicos e de tempo de inicialização do sistema. O namespace de tempo é adequado para uso em contêineres Linux para permitir que a data/hora seja alterada dentro de um contêiner e para ajustar os relógios dentro de um contêiner após a restauração de um checkpoint/snapshot.
Laboratório:
Criar diferentes Namespaces
CLI
sudo unshare -T [--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
Se você executar a linha anterior sem -f
, você receberá esse erro.
O erro é causado pelo processo PID 1 sair no novo namespace.
Depois que o bash começa a ser executado, ele bifurca vários novos sub-processos para fazer algumas coisas. Se você executar o unshare sem -f, o bash terá o mesmo pid que o processo "unshare" atual. O processo "unshare" atual chama o sistema de chamada unshare, cria um novo namespace de pid, mas o processo "unshare" atual não está no novo namespace de pid. É o comportamento desejado do kernel do Linux: o processo A cria um novo namespace, o próprio processo A não será colocado no novo namespace, apenas os sub-processos do processo A serão colocados no novo namespace. Então, quando você executa:
unshare -p /bin/bash
O processo unshare executará /bin/bash, e /bin/bash criará vários sub-processos, o primeiro sub-processo do bash se tornará o PID 1 do novo namespace, e o subprocesso sairá após concluir seu trabalho. Então, o PID 1 do novo namespace sairá.
O processo PID 1 tem uma função especial: ele deve se tornar o processo pai de todos os processos órfãos. Se o processo PID 1 no namespace raiz sair, o kernel entrará em pânico. Se o processo PID 1 em um sub-namespace sair, o kernel Linux chamará a função disable_pid_allocation, que limpará a flag PIDNS_HASH_ADDING nesse namespace. Quando o kernel Linux cria um novo processo, ele chama a função alloc_pid para alocar um PID em um namespace, e se a flag PIDNS_HASH_ADDING não estiver definida, a função alloc_pid retornará um erro -ENOMEM. É por isso que você recebeu o erro "Cannot allocate memory".
Você pode resolver esse problema usando a opção '-f':
unshare -fp /bin/bash
Se você executar o comando unshare com a opção '-f', o unshare irá criar um novo processo após criar o novo namespace pid. E executará /bin/bash no novo processo. O novo processo será o pid 1 do novo namespace pid. Em seguida, o bash também criará vários sub-processos para realizar algumas tarefas. Como o próprio bash é o pid 1 do novo namespace pid, seus sub-processos podem ser encerrados sem nenhum problema.
Traduzido de https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Verificar em qual namespace está o seu processo
Para verificar em qual namespace está o seu processo, você pode executar o seguinte comando:
ls -l /proc/$$/ns/
Onde $$
é o PID do seu processo.
ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time -> 'time:[4026531834]'
Encontre todos os namespaces de tempo
{% code overflow="wrap" %}
sudo find /proc -maxdepth 3 -type l -name time -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name time -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Entrando em um namespace de tempo
{% endcode %}
nsenter -T TARGET_PID --pid /bin/bash
Também, você só pode entrar em outro namespace de processo se você for root. E você não pode entrar em outro namespace sem um descritor apontando para ele (como /proc/self/ns/net
).