Deletei O Bash ! E Agora?

Depois que escrevi o post relacionado aos arquivos presos por um processo o Cassiano passou uma dica muito boa que vale um blog post!

Cenário


Voce esta logado em um servidor remotamente via SSH, e por algum motivo bizarro , ou sem motivo ou por pura falta de atenção voce acaba removendo o Bash do servidor, voce abre um novo terminal ou uma outra pessoa tenta logar neste mesmo servidor e ocorre essa mensagem de erro:

1
2
3
4
dezoris:~ ferraz$ ssh 192.168.1.110
Last login: Sat Jan 22 01:53:45 2011 from 192.168.1.4
/bin/bash: No such file or directory
Shared connection to 192.168.1.110 closed.

Quando ocorrer esse problema se voce ainda estiver conectado à maquina não precisa entrar em desespero e também não precisa reinstalar o pacote do Bash novamente, vamos utilizar o recurso da partição /proc montada neste server , inicialmente precisariamos saber qual é o pid do processo Bash que estamos utilizando , podemos pegar essa informação executando um echo $$ so que desta vez não tem a necessidade de se verificar o PID do processo bash para localizar as informações necessarias em /proc, basta acessar o diretorio /proc/self, self é um link simbolico que aponta para o processo em execução no momento, no caso é a shell que mantemos aberta. Lembrando que dentro do diretorio /proc/self vamos encontrar diversas informações sobre a shell em execução armazenada em arquivos, symlinks ou diretorios. A parte que nos interessa é o symlink chamado exe no qual aponta para o PATH do processo do qual aquelas informações do diretorio proc fazem parte:

1
2
root@delorean:/proc/self# ls -lah exe
lrwxrwxrwx 1 root root 0 2011-01-22 01:54 exe -> /bin/bash (deleted)

Conforme mostrado no ultimo post, a informação extra (deleted) informa que a shell que mantemos ainda aberta em execução esta segurando o conteudo do executavel bash em memória , com isso podemos fazer o seguinte:

1
2
3
root@delorean:/proc/self# cp exe /bin/bash
root@delorean:/proc/self# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

Se tentarmos logar no server de outro terminal conseguiremos acesso!

1
2
3
dezoris:~ ferraz$ ssh 192.168.1.110
Last login: Sat Jan 22 01:58:16 2011 from 192.168.1.4
ferraz@delorean:~$

O que aconteceu?


Como mantinhamos a Shell ainda em execução o symlink continuava à apontar para o executavel mesmo depois de deletado com isso temos a possibilidade de fazer uma copia do conteudo que o symlink apontava novamente para o PATH original. Lembrando que o foi feito foi apenas a recuperação do conteudo do executável, não foi recuperado por si o arquivo original, se listarmos o symlink exe depois da copia veremos a informação de arquivo deletado ainda lá:

1
2
ferraz@delorean:/proc/self$ ls -lah exe
lrwxrwxrwx 1 ferraz ferraz 0 2011-01-22 02:22 exe -> /bin/bash (deleted)

Isso acontece porque o symlink ainda aponta para o inode do antigo Bash que foi removido, quando voce fez uma copia do conteudo que exe aponta foi criado um novo inode que aponta para esse novo executavel:

1
2
3
4
5
6
7
8
9
10
root@delorean:/proc/1090# ls -li /bin/bash
130861 -rwxr-xr-x 1 root root 934336 2011-01-22 02:17 /bin/bash
root@delorean:/proc/1090# rm /bin/bash
root@delorean:/proc/1090# ls -lah exe
lrwxrwxrwx 1 ferraz ferraz 0 2011-01-22 02:22 exe -> /bin/bash (deleted)
root@delorean:/proc/1090# cp exe /bin/bash
root@delorean:/proc/1090# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
root@delorean:/proc/1090# ls -li /bin/bash
130862 -rwxr-xr-x 1 root root 934336 2011-01-22 02:26 /bin/bash

Lembrando que essa dica apenas funciona se voce mantem uma Shell aberta no servidor no momento da remoção, se o bash foi removido e voce deslogou do servidor ou se executou um script remotamente via SSH voce nao tem mais a informação do processo via /proc disponivel para o restore.

Comments