os programas setuid não parecem rodar setuid no TinyCore Linux

2

Eu quero demonstrar a vulnerabilidade dos programas setuid usando o live cd do TinyCore Linux. Ou seja, eu ofereço um programa especial, com permissões especiais, para que ele seja executado como o proprietário do arquivo em vez do usuário em execução. Estes são meus passos:

  1. Crie um programa (veja abaixo) com uma falha de segurança, compile-o em meu sistema inicial (Ubuntu)

  2. Faça o programa setuid e configure o dono do arquivo, ainda no Ubuntu

  3. Descompacte o CD ao vivo do Tiny Core, copie o programa vulnerável dentro dele e chroot nele

O problema é que o programa não parece rodar como setuid . Nem no ambiente chroot nem na imagem completa remasterizada. No Ubuntu funciona, mas eu preciso trabalhar no Tiny Core. O programa é executado no Tiny Core, mas não como o proprietário, apesar de ser setuid .

O código-fonte do programa:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  printf("Current time: ");
  fflush(stdout);
  system("date");
  return 0;
}

Comando para construir:

gcc -o prog prog.c

Tornar setuid:

sudo chown 1200.1200 prog
sudo chmod 4755 prog

Crie um script date para demonstrar a vulnerabilidade:

#!/bin/sh

echo hello > /tmp/test.txt
ls -l /tmp/test.txt

Torne o script crafted date executável e exponha a vulnerabilidade:

chmod +x date
PATH=.:$PATH ./prog

No Ubuntu, como esperado, isso cria /tmp/test.txt com o proprietário 1200. Mas quando eu chroot para o ambiente do live cd, ele não funciona lá, o executável é executado, mas não como o proprietário do arquivo. Se eu terminar a remasterização e criar o CD ao vivo e inicializá-lo, ele não funcionará lá, mesmo que o arquivo tenha o proprietário e o grupo corretos e a permissão 4755 . O que estou perdendo?

Se você quiser criar o ambiente chroot , faça o download do CD ao vivo de 8MB no link e siga estas etapas:

sudo mount Core-current.iso /mnt
mkdir /tmp/extract
cd /tmp/extract
zcat /mnt/boot/core.gz | sudo cpio -i -H newc -d

Copie os programas vulneráveis para o ambiente chroot com:

sudo cp -a /path/to/prog /tmp/extract/tmp
sudo cp /path/to/date /tmp/extract/tmp

chroot e teste a vulnerabilidade:

sudo chroot /tmp/extract /bin/sh
su - tc
cd /tmp
PATH=.:$PATH ./prog

Meu objetivo final, é claro, é fazê-lo funcionar no próprio CD ao vivo. Não importa se não funciona em chroot , parece apenas um primeiro teste adequado, sem ter que reempacotar a imagem e inicializar nela.

    
por janos 20.02.2013 / 07:06

2 respostas

2

Nada de errado com setuid no TinyCore. No entanto, o programa simples na questão não é tão simples de explorar no TinyCore.

A chamada system chama o comando especificado usando /bin/sh -c . No TinyCore, /bin/sh é um link simbólico para busybox ash , que desce setuid privileges. Portanto, mesmo que você crie um script de shell ou até mesmo um binário que faça algo malicioso e chame-o de date para enganar o programa vulnerável para executá-lo, ele não será executado como setuid . O programa original estará executando setuid , mas não o comando gerado por system .

Como uma observação, o bash padrão também cai setuid privileges quando invocado como /bin/sh , desde a versão 2. No entanto, a vulnerabilidade descrita na questão pode ser demonstrada no Debian e seus derivados, aparentemente A versão de bash não descarta privilégios. (Obviamente, há uma boa razão para isso, mas eu não pesquisei.)

Por fim, posso contornar o comportamento de eliminar privilégios alterando o programa para:

int main(int argc, char **argv)
{
  // circumvent busybox ash dropping privileges
  uid_t uid = geteuid();
  setreuid(uid, uid);

  printf("Current time: ");
  fflush(stdout);
  system("date");
  return 0;
}
    
por 28.02.2013 / 18:54
0

Talvez alguma política de segurança (SELinux, AppArmor, ...) esteja em vigor e não permita que a SUID seja executável não listado? Ou é apenas isso (por pura sanidade) /tmp é montado nosuid?

    
por 20.02.2013 / 20:08