root@system:~# less myfile
-bash: /bin/less: Input/output error
O sistema de arquivos raiz está morto. Mas meu gato ainda está vivo (na minha memória):
root@system:~# cat > /tmp/somefile
C^d
root@system:~#
Ele é meio solitário, porém, todos os seus amigos se foram:
root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error
O sistema ainda está em execução e cumprindo seu propósito. Eu sei, eu sei, a única resposta sensata para isso é desligar o sistema e substituir a unidade raiz. Infelizmente, isso não é uma opção, pois custaria muito tempo e dinheiro. Além disso, mataria meu gato, e isso me deixaria triste.
Pensei em trazer-lhe os amigos habituais de um doador. Não me atrevo a tentar scp, caso o ssh tente carregá-lo e corte a linha (o binário desapareceu de qualquer maneira). Isso soa como um trabalho para o primo do meu gato:
root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found
Infelizmente ele se foi há muito tempo.
Agora, posso tentar enganar meu gato para fazer um ritual para ressuscitá-lo:
cat > netcat < /dev/tcp/localhost/9999
E esse tipo de trabalho. Ele está quase vivo:
root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied
Ele só precisa de uma pequena centelha de vida. Aquele pequeno+x
encantamento mágico que não posso recitar no momento.
Você pode me ajudar a trazer os amigos do meu gato de volta?
Existem várias possibilidades, todas dependendo dos parâmetros exatos da sua situação no momento. Vou assumir o Linux nos exemplos a seguir, quando aplicável, mas existe funcionalidade semelhante em outras plataformas na maioria dos casos.
Você pode conseguir que o carregador dinâmico execute um executável para você. Supondo que
cat
seja vinculado dinamicamente, o equivalente de sua plataforma/lib/ld-linux.so.2
provavelmente também estará na memória e, portanto, poderá ser usado para executar um binário:Você pode ter vários deles (32 e 64 bits são prováveis) e pode haver várias cópias disponíveis ou links simbólicos que precisam ser resolvidos. Um desses pode funcionar.
Se você tiver um sistema de arquivos vfat ou NTFS montado, ou outro que trate todos os arquivos como 777, você pode criar seu executável nele.
Se houver uma partição montada da qual você não se importa com o conteúdo, em uma unidade que ainda está funcionando, você pode substituir o conteúdo por uma nova imagem do mesmo tipo de sistema de arquivos contendo executáveis que você deseja -
cat
deve ser bom para isso no função que as pessoas costumam usardd
, e você pode fornecer a imagem pela rede.Este é plausível, mas tem muitos lugares para não funcionar dependendo do que exatamente ainda está na memória dessa partição.
Se houver algum arquivo acessível que tenha permissão de execução em qualquer sistema de arquivos gravável, você poderá
cat >
substituir o conteúdo por um binário de sua escolha.ctypes.sh
, que fornece uma interface de função externa para o Bash e, em seguida,dlcall chmod ./netcat 511
.Você pode trazer um arquivo de biblioteca dinâmico
foo.so
de sua construção e, em seguida,cat
carregá-lo em seu nome por meio deLD_PRELOAD
, permitindo que você execute código arbitrário.Se você interceptar, por exemplo,
open
:então você pode fazer o que você precisa fazer lá.
Minha sugestão seria trazer um
busybox
executável vinculado estaticamente como o primeiro item (ou realmente, o único item) para que você tenha toda a gama de comandos disponíveis sem reutilizar qualquer hack que o levou a esse ponto à exaustão.