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

56

Eu percebo que o título da pergunta provavelmente soa estranho, teórico ou simplesmente estúpido. Há um longo histórico para isso!

root@system:~# less myfile
-bash: /bin/less: Input/output error

O sistema de arquivos raiz está inativo. Mas meu gato ainda está vivo (na minha memória):

root@system:~# cat > /tmp/somefile
C^d
root@system:~#

Ele é meio solitário, 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 para 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, mataria meu gato, e isso me deixaria triste.

Eu pensei em trazer para ele seus amigos habituais de um doador. Não me atrevo a tentar scp-los, no caso ssh tenta carregá-lo e corta a linha (o binário se foi 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 realizar um ritual para ressuscitá-lo:

cat > netcat < /dev/tcp/localhost/9999

E isso funcionou. 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 encantamento mágico +x que não posso recitar no momento.

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

    
por goncalopp 14.10.2018 / 05:00

1 resposta

37

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 a funcionalidade semelhante existe em outras plataformas na maioria dos casos.

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

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

    Você pode ter vários deles (provavelmente 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ê tem um sistema de arquivos vfat ou NTFS montado, ou outro que trata todos os arquivos como 777, você pode criar seu executável lá.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
    
  • Se você tiver um sistema de arquivos de rede montado, mesmo que não seja localmente gravável, poderá criar arquivos no sistema remoto e usá-los normalmente.
  • Se houver uma partição montada que você não se importa com o conteúdo, em uma unidade que ainda esteja funcionando na maioria das vezes, você pode substituir o conteúdo por uma nova imagem do mesmo tipo de arquivo que contém executáveis - cat fique bem para isso no papel em que as pessoas geralmente usam dd , e você pode fornecer a imagem pela rede.

    $ cat > /dev/sdb1 < ...
    

    Este é plausível, mas tem muitos lugares para não funcionar dependendo do que exatamente ainda está na memória daquela partição.

  • Se houver qualquer arquivo acessível que tenha permissão de execução em qualquer sistema de arquivos gravável, você pode cat > nele para 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ê poderia instalar e carregar ctypes.sh , que fornece uma interface de função externa para Bash e, em seguida, dlcall chmod ./netcat 511 .
  • Você pode trazer um arquivo de biblioteca dinâmica foo.so da sua construção e ter cat carregando em seu nome por meio de LD_PRELOAD , permitindo que você execute 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 você precisa fazer lá.

Minha sugestão seria trazer em um executável busybox vinculado estaticamente como o primeiro item (ou, na verdade, apenas um item) para que você tenha toda a gama de comandos disponíveis sem reutilizar o hack que o levou até aquele ponto a exaustão.

    
por 14.10.2018 / 06:44