Como chmod sem / usr / bin / chmod? [duplicado]

150

Hoje me contaram uma história de um treinador do Unix onde a senha do root vazou para os alunos, e um dos caras removeu a permissão de execução do /usr/bin/chmod . Como recuperar chmod neste caso e torná-lo executável novamente? Vamos dizer que obtê-lo de uma fonte externa ou recompilar não é uma opção preferível, existe algum hack inteligente que pode recuperar este chmod em si?

Note que isso aconteceu há muito tempo e eu não estou procurando uma solução para algum problema atual, apenas curioso sobre como o Unix nos fornece um problema semelhante.

    
por sundar 21.07.2013 / 21:08

9 respostas

184

Você pode executar o carregador diretamente e passar o comando que deseja executar:

/lib/ld-linux.so /bin/chmod +x /bin/chmod

Seu caminho para o carregador pode variar. Em um sistema de 64 bits, você precisa escolher o caminho certo com base em como chmod foi compilado; a versão de 64 bits tem o nome de algo como /lib64/ld-linux-x86-64.so.2

    
por 21.07.2013 / 21:23
98

O utilitário chmod depende da chamada do sistema chmod() (consulte man 2 chmod ). Então você poderia fazer isso com algumas linhas de C, ou apenas sobre qualquer outra linguagem que tenha um wrapper em torno dele (que seria a maioria deles). Poucos sistemas * nix precisarão de um compilador C e um interpretador perl; a maioria das distribuições linux requerem que o último funcione.

perl -e 'chmod 0755, "foobar.file"'
    
por 21.07.2013 / 21:22
65

Alguns sistemas também têm busybox instalado, caso em que você pode executar:

busybox chmod +x /bin/chmod

Desde que você estava pedindo por hacks, eu pensei em outro:

mv /bin/chmod /bin/chmod.orig
cp -a /bin/chown /bin/chmod

Agora você tem um /bin/chmod que é executável, mas na verdade é chown (ou seja, outro binário). Agora tudo o que temos a fazer é sobrescrevê-lo com o binário original.

dd if=/bin/chmod.orig of=/bin/chmod

Ele mantém o sinalizador + x para que você apenas tenha roubado o + x de outro arquivo para este.

É claro que, se todos esses binários alternativos (incluindo o carregador, perl, python, gcc et cetera) forem chmod -x, fixá-lo a partir de um sistema de resgate pode ser a única opção.

    
por 21.07.2013 / 22:42
42

Fácil. O que você pode fazer é preparar algum outro arquivo executável e, em seguida, cp chmod sobre ele.

 $ cp /bin/ls chmod
 $ cp /bin/chmod .

O primeiro cp cria um arquivo chamado chmod com permissões executáveis, mas que é realmente o executável ls . O segundo cp preenche esse arquivo com o código binário de chmod , preservando as permissões de execução do arquivo de destino (porque não especificamos nenhuma opção para transferir as permissões do arquivo de origem).

Outra abordagem é usar o utilitário install , que é um programa de cópia glorificado que pode definir permissões em uma única etapa. (Veja o argumento -m .)

$ install -m a+x /bin/chmod .
$ ./chmod # executes

O programa install não faz parte da especificação Unix, mas é encontrado no BSD e no GNU Coreutils. Ambos suportam a opção -m com a sintaxe chmod-like, simbólica e octal.

    
por 22.07.2013 / 16:55
15

Primeiras coisas no topo da minha cabeça,

  • Inicialize a partir de qualquer outra fonte (livro de rede, cd, etc.) e use o chmod nessa origem para definir as permissões.
  • Escreva um minúsculo programa em C para alterar as permissões.
  • Escreva um script perl (ruby, php, python, etc.) para alterar as permissões

/usr/bin/chmod está apenas fazendo uma chamada de sistema para alterar as permissões, você pode fazer com que o sistema se chame de diversas maneiras.

    
por 21.07.2013 / 21:23
9

Isso é mais do que qualquer outra resposta (com a possível exceção da resposta ld-linux.so , que é um realmente inteligente hack), mas pode ser mais adaptável a outros problemas (especialmente se você cair em um vórtice do tempo e viajar de volta para uma Terra Antes Perl ™).

  1. Por segurança, copie /bin/chmod para um local seguro:

    cd
    cp /bin/chmod .
    
  2. Do echo chmod | cpio -oc > chmod.cpio
    Isso cria um cpio archive (não diferente de um tar archive) contendo chmod . A opção -c especifica que os metadados do arquivo são gravados em hexadecimal (isto é, em ASCII).

  3. vi chmod.cpio
    Você verá algo como

    0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
                       ↑↑↑
    

    seguido por uma mistura de caracteres de controle, caracteres ASCII padrão, e caracteres ASCII estendidos. Observe que 0644 = 0x1A4 e 0755 = 0x1ED. Encontre o 1A4 (começando na posição do 20º caractere) e mude para 1ED . Salve e saia.

    • Se você tem uma edição hexadecimal ou algo semelhante, talvez seja melhor usar isso para evitar o risco que vi contaminará o código executável binário no arquivo. Mas eu tentei isso com vi e pareceu funcionar bem.
  4. cpio -i < chmod.cpio
    Agora você tem uma cópia de chmod em seu diretório, protegido 755.

Outros programas de arquivamento podem ter recursos semelhantes. Em particular, cpio é antigo e pode ser preterido; se você não tiver, procure pax .

    
por 08.08.2015 / 21:09
5

Ou ainda mais fácil - use setfacl , que geralmente está presente em sistemas modernos:

  1. Definir permissão executável para o usuário:

    # setfacl -m u::rx /bin/chmod
    
  2. Agora use o binário now executável para definir suas próprias permissões de volta para as originais (ou seja, para todos os usuários)

    # chmod +x /bin/chmod
    
  3. Exclua entradas de ACL estendidas - opcional, já que pode ter havido uma boa razão para elas estarem lá.

    # setfacl -b /bin/chmod
    

Note que setfacl pode ser usado em um sistema de arquivos que também não suporta ACLs.

    
por 27.01.2015 / 17:48
3

rsync também pode ser usado para alterar as permissões do arquivo

# rsync /bin/chmod /tmp/chmod --chmod=ugo+x
# ls -al /tmp/chmod
  -rwxr-x--- 1 root root 52000 Sep  6 15:13 /tmp/chmod
#
    
por 06.09.2015 / 14:17
1

Canalize o conteúdo de chmod em um arquivo já executável

cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh
    
por 04.10.2014 / 16:07