Jails em SSH: Montando sistema de Shell Seguro
Neste artigo vamos aprender a criar sistemas de Jail em SSH e assim separar recursos a usuários shell de acordo com suas necessidades, criando um ambiente secundário, o que aumenta a segurança na disponibilização de acessos remotos a terceiros.
Parte 5: Projeto sob fogo: Testando o nosso sistema Jail
Agora que temos nosso Jail pronto, vamos nos autenticar como o usuário bandit e ver o que acontece. :-)
# ssh -l bandit 192.168.106.129
bandit@localhost's password:
Linux mephisto 2.6.18-openvz-686 #1 SMP Tue Apr 10 20:28:40 CEST 2007 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Feb 19 16:01:58 2008 from 192.168.106.1
bandit@mephisto:~$
// Até aqui tudo aparentemente normal. É como se tivéssemos logado em qualquer servidor Debian da vida.
bandit@mephisto:~$ id
bash: id: command not found
// Oops o comando id não existe +_+
// Agora percebemos que realmente estamos limitados :D
bandit@mephisto:~$ uname -a
bash: uname: command not found
bandit@mephisto:~$ pwd
/home/bandit
bandit@mephisto:~$ ps
bash: ps: command not found
bandit@mephisto:~$ netstat -ntpl
bash: netstat: command not found
bandit@mephisto:~$
bandit@mephisto:~$ scp
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
// Temos a disposição apenas o SCP que adicionamos no momento em que criamos a Jail.
bandit@mephisto:~$ cd /
bandit@mephisto:/$ ls -la
total 36
drwxr-xr-x 9 root root 4096 Feb 19 20:51 .
drwxr-xr-x 9 root root 4096 Feb 19 20:51 ..
drwxr-xr-x 2 root root 4096 Feb 19 20:41 bin
drwxr-xr-x 2 root root 4096 Feb 19 21:04 dev
drwxr-xr-x 5 root root 4096 Feb 19 21:01 etc
drwxr-xr-x 3 root root 4096 Feb 19 20:51 home
drwxr-xr-x 3 root root 4096 Feb 19 20:41 lib
drwxr-xr-x 5 root root 4096 Feb 19 20:41 usr
drwxr-xr-x 3 root root 4096 Feb 19 20:41 var
bandit@mephisto:/$
Como podem ver o usuário enxerga somente o Jail e não o nosso sistema real. Ele vive em um ambiente totalmente separado. Isto ajuda muito pois limitado assim ele não consegue acessar o root do sistema nem executar programas nocivos como exploits.
Como podem ver a versão do kernel que estou utilizando é a 2.6.18 com o patch do openvz para virtualização. Esta versão é vulnerável a falha de escalamento de privilégios em kernel na função vmsplice().
E se nosso usuário estiver mal intencionado e tentar exploitar nosso servidor para virar root e assim sair do Chroot()?
bandit@mephisto:~$ ./vmsplice
Para deixar frisado este exploit acima é totalmente funcional e ele executado em um sistema comum, faria o atacante ganhar acesso de root.
O ambiente chroot() mostrou que funciona muito bem. Você pode utilizá-lo em larga escala de acordo com suas necessidades e moldá-lo de forma que consiga implantar com sucesso todos os tipos de aplicativos em diferentes Jails.
# ssh -l bandit 192.168.106.129
bandit@localhost's password:
Linux mephisto 2.6.18-openvz-686 #1 SMP Tue Apr 10 20:28:40 CEST 2007 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Feb 19 16:01:58 2008 from 192.168.106.1
bandit@mephisto:~$
// Até aqui tudo aparentemente normal. É como se tivéssemos logado em qualquer servidor Debian da vida.
bandit@mephisto:~$ id
bash: id: command not found
// Oops o comando id não existe +_+
// Agora percebemos que realmente estamos limitados :D
bandit@mephisto:~$ uname -a
bash: uname: command not found
bandit@mephisto:~$ pwd
/home/bandit
bandit@mephisto:~$ ps
bash: ps: command not found
bandit@mephisto:~$ netstat -ntpl
bash: netstat: command not found
bandit@mephisto:~$
bandit@mephisto:~$ scp
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
// Temos a disposição apenas o SCP que adicionamos no momento em que criamos a Jail.
bandit@mephisto:~$ cd /
bandit@mephisto:/$ ls -la
total 36
drwxr-xr-x 9 root root 4096 Feb 19 20:51 .
drwxr-xr-x 9 root root 4096 Feb 19 20:51 ..
drwxr-xr-x 2 root root 4096 Feb 19 20:41 bin
drwxr-xr-x 2 root root 4096 Feb 19 21:04 dev
drwxr-xr-x 5 root root 4096 Feb 19 21:01 etc
drwxr-xr-x 3 root root 4096 Feb 19 20:51 home
drwxr-xr-x 3 root root 4096 Feb 19 20:41 lib
drwxr-xr-x 5 root root 4096 Feb 19 20:41 usr
drwxr-xr-x 3 root root 4096 Feb 19 20:41 var
bandit@mephisto:/$
Como podem ver o usuário enxerga somente o Jail e não o nosso sistema real. Ele vive em um ambiente totalmente separado. Isto ajuda muito pois limitado assim ele não consegue acessar o root do sistema nem executar programas nocivos como exploits.
Como podem ver a versão do kernel que estou utilizando é a 2.6.18 com o patch do openvz para virtualização. Esta versão é vulnerável a falha de escalamento de privilégios em kernel na função vmsplice().
E se nosso usuário estiver mal intencionado e tentar exploitar nosso servidor para virar root e assim sair do Chroot()?
bandit@mephisto:~$ ./vmsplice
----------------------------------- Linux vmsplice Local Root Exploit By qaaz ----------------------------------- [+] mmap: 0x0 .. 0x1000 [+] page: 0x0 [+] page: 0x20 [+] mmap: 0x4000 .. 0x5000 [+] page: 0x4000 [+] page: 0x4020 [+] mmap: 0x1000 .. 0x2000 [+] page: 0x1000 [+] mmap: 0xb7de8000 .. 0xb7e1a000 Segmentation fault bandit@mephisto:~$Segmentation fault... porque ? Porque o sistema não tem acesso as systemcalls que este exploit precisa para executá-lo. Nossa jail então é algo que vai nos deixar bem confortáveis em relação à algumas explorações.
Para deixar frisado este exploit acima é totalmente funcional e ele executado em um sistema comum, faria o atacante ganhar acesso de root.
O ambiente chroot() mostrou que funciona muito bem. Você pode utilizá-lo em larga escala de acordo com suas necessidades e moldá-lo de forma que consiga implantar com sucesso todos os tipos de aplicativos em diferentes Jails.
Mais uma vez um ótimo artigo que vem ajudar em muito na implementação de segurança em servidores Linux.
Parabéns.