Alterar permissões de um arquivo com a ajuda do meu gato

55
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 sua finalidade. Eu sei, eu sei, a única resposta sensata a isso é baixar o sistema e substituir a unidade raiz. Infelizmente, isso não é uma opção, pois custaria muito tempo e dinheiro. Além disso, isso mataria meu gato, e isso me deixaria triste.

Pensei em trazer a ele seus amigos habituais de um doador. Não ouso tentar scp-los, no caso de o ssh tentar carregá-lo e cortar a linha (o binário desapareceu de qualquer maneira). Isso parece 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 realizar 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 +xencantamento mágico que não posso recitar no momento.

Você pode me ajudar a trazer os amigos do meu gato de volta?

goncalopp
fonte
3
Você pode executar /lib/ld-linux.so.2 ./netcat(ou o equivalente do seu sistema) e fazer alguma coisa?
Michael Homer
4
Além disso: que sistema operacional é esse? Você tem algum sistema de arquivos vfat ou NTFS montado? Sistemas de arquivos de rede? Partições das quais você pode apagar o conteúdo? Existem quaisquer arquivos acessíveis com permissão de execução?
Michael Homer
3
"Além disso, isso mataria meu gato, e isso me deixaria triste." - Eu sempre achei que o ditado "Não Kiddens foi prejudicado durante a produção deste" era apenas um ditado, mas bem ...
rugk
7
I totalmente teve que upvote isso para todas essas analogias gato ... 😂
rugk
2
pobre gato, espero que ele esteja bem :(
cat

Respostas:

37

Existem várias possibilidades, todas dependendo dos parâmetros exatos da sua situação agora. Vou assumir o Linux nos exemplos a seguir, quando aplicável, mas na maioria dos casos existe funcionalidade semelhante em outras plataformas.

  • Você pode conseguir que o carregador dinâmico execute um executável para você. Supondo que catesteja vinculado dinamicamente, o equivalente a sua plataforma /lib/ld-linux.so.2provavelmente também estará na memória e, portanto, utilizável para executar um binário:

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand
    

    Você pode ter várias delas (provavelmente de 32 e 64 bits) e pode haver várias cópias disponíveis ou links simbólicos que precisam ser resolvidos. Um desses pode funcionar.

  • Se você possui um sistema de arquivos vfat ou NTFS montado ou outro que trata todos os arquivos como 777, é possível criar seu executável lá.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
  • Se você possui um sistema de arquivos de rede montado, mesmo que não seja gravável localmente, é possível criar arquivos no sistema remoto e usá-los normalmente.
  • Se houver uma partição montada você não se preocupam com o conteúdo, em uma unidade que ainda é maioritariamente de trabalho, você pode substituir o conteúdo com uma nova imagem do mesmo tipo de sistema de arquivos contendo arquivos executáveis que você quer - catdeve ser bom para isso no função que as pessoas costumam usar dde você pode fornecer a imagem pela rede.

    $ cat > /dev/sdb1 < ...

    Este é plausível, mas há muitos lugares para não funcionar, dependendo do que 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.

    $ cat > ~/test.py < ...
  • Como o Bash ainda está em execução, você pode carregar dinamicamente um plug-in do Bash no processo que expõe o chmod. Em particular, você pode instalar e carregarctypes.sh , o que fornece uma interface de função externa para o Bash e, em seguida dlcall chmod ./netcat 511.
  • Você pode trazer um arquivo foo.sode biblioteca dinâmica de sua construção e, em seguida, catcarregá-lo em seu nome LD_PRELOAD, permitindo executar código arbitrário.

    $ LD_PRELOAD=./hack.so cat /dev/null

    Se você interceptar, por exemplo open:

    int open(const char *path, int flags, ...) {
        chmod(path, 0755);
        return -1;
    }
    

    então você pode fazer o que for necessário.

Minha sugestão seria trazer um busyboxexecutá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 truque que o leve a esse ponto até a exaustão.

Michael Homer
fonte
3
Re "vinculado estaticamente busybox": observe que sashfoi projetado especificamente para esse tipo de caso de uso e pode estar mais disponível rapidamente (por exemplo, você pode instalá-lo com antecedência e deixar uma cópia em algum lugar para que fique na memória quando o sistema pausas ... ou você pode abandonar seus animais de estimação e comprar um monte de gado, suponho).
Kevin