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 usamdd
, 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 tercat
carregando em seu nome por meio deLD_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.