NFsec Logo

Wykrywanie procesu debugowania w systemie Linux

21/11/2024 w Bezpieczeństwo, Debug Możliwość komentowania Wykrywanie procesu debugowania w systemie Linux została wyłączona

P

roces debugowania (ang. debugging) polega na kontrolowanym wykonaniu programu pod nadzorem debugera. Podobnie wygląda proces śledzenia (ang. tracing), który działa zarówno w trybie debugowania, jak i rejestrowania wybranych zdarzeń w czasie rzeczywistym. W systemie Linux często możemy spotkać się z tego typu czynnościami w kontekście podsłuchiwania innych procesów. Zatem pozostaje pytanie, czy istnieje możliwość sprawdzenia czy dany proces jest aktualnie poddawany procesowi śledzenia lub debugowania? Otóż każdy uruchamiany proces może zajrzeć do ścieżki /proc/self/status i sprawdzić, czy klucz TracerPid ma inną wartość niż 0:

agresor@darkstar:~$ cd /proc/self; cat status | egrep -B7 ^TracerPid
Name:	bash
Umask:	0022
State:	S (sleeping)
Tgid:	2998765
Ngid:	0
Pid:	2998765
PPid:	2998764
TracerPid:	0

ponieważ wiersz “TracerPid” z wartością “0” oznacza, że żaden proces nie “śledzi” tego procesu. Za pomocą języka Python możemy napisać prosty skrypt o nazwie show_debbuger.py, który sprawdzi czy aktualnie w systemie jest uruchomiony jakiś proces, który jest śledzony i poda nam jego dane:

#!/usr/bin/env python3
# Debugger detector v0.1

import os
import re

def show_debugger(proc_path: str):
    pid_list, pid_found = [], []
    for pid in os.listdir(proc_path):
        if os.path.isdir(os.path.join(proc_path, pid)) and pid.isnumeric():
            pid_list.append(pid)
    for pid_number in pid_list:
        full_path = os.path.join(proc_path, pid_number, 'status')
        if os.path.isfile(full_path):
            with open(full_path, 'r') as proc_file:
                status_file = proc_file.read()
                tracer_pid = re.search(r'(?P<name>TracerPid.*)\s+(?P<pid>\d+)',
                                       status_file).group('pid')
            if tracer_pid != '0':
                process_name = re.search(r'Name:\s+(?P<name>\w+)',
                                         status_file).group('name')
                tracer_path = os.path.join(proc_path, tracer_pid, 'status')
                with open(tracer_path, 'r') as tracer_file:
                    status_file = tracer_file.read()
                    tracer_name = re.search(r'Name:\s+(?P<name>\w+)',
                                            status_file).group('name')
                print(f'Process: {process_name} with PID: {pid_number} is traced with:'
                      f' {tracer_name} with PID: {tracer_pid}')
                pid_found.append(pid_number)
    if pid_found:
                return True
    else:
        print('No process tracing found!')
        return False


if __name__ == '__main__':
    show_debugger('/proc')

W pierwszej konsoli możemy sprawdzić czysty system:

root@darkstar:~#./show_debbuger.py
No process tracing found!

W drugiej konsoli uruchamiamy strace na dowolnym procesie i uruchamiamy skrypt ponownie:

root@darkstar:~#./show_debbuger.py
Process: sshd with PID: 2055265 is traced with: strace with PID: 2061163

Dokładamy jeszcze gdb ponownie sprawdzając system:

root@darkstar:~#./show_debbuger.py
Process: multipathd with PID: 352 is traced with: gdb with PID: 2061871
Process: sshd with PID: 2055265 is traced with: strace with PID: 2061163

Zawsze też możemy wyłączyć możliwość śledzenia w systemie.

Więcej informacji: Detecting the Presence of a Debugger in Linux, How do you detect that you’re being ptraced?

Upakowane ELFy – czerwona flaga dla pliku binarnego w Linuksie

21/06/2024 w Bezpieczeństwo, Debug Możliwość komentowania Upakowane ELFy – czerwona flaga dla pliku binarnego w Linuksie została wyłączona

U

ltimate Packer for Executables (UPX) to program pakujący dla kilku formatów wykonywalnych, takich jak biblioteki DLL systemu Windows, aplikacji macOS oraz Linux ELF. Jak możemy przeczytać na oficjalnej stronie programu UPX: “potrafi zazwyczaj zmniejszyć rozmiar plików programów i bibliotek DDL o około 50% – 70%, redukując w ten sposób miejsce na dysku, czas ładowania w sieci, czas pobierania oraz inne koszty dystrybucji i przechowywania”. Programy pakujące zasadniczo biorą oryginalny plik wykonywalny i dodają mały fragment kodu zwany “odgałęzieniem” (ang. stub) do nowo utworzonego wykonywalnego pliku. Kod pośredniczący zostanie następnie użyty do rozpakowania pliku i “przywrócenia” pliku wykonywalnego do jego pierwotnego stanu. Podczas, gdy niektóre programu pakujące, takie jak wspomniany UPX, tylko kompresują pliki, inne mogą je również szyfrować. Atakujący często używają kompresji, aby ukrywać złośliwe oprogramowanie jako pozornie nieszkodliwe i legalne pliki, co może oszukać silniki antywirusowe oparte na sygnaturach.
[ czytaj całość… ]

Sprytny sposób na dostęp do informacji o sprzęcie w systemie Linux

09/01/2024 w Debug Możliwość komentowania Sprytny sposób na dostęp do informacji o sprzęcie w systemie Linux została wyłączona

J

ako zwykły użytkownik czasami mamy ograniczony dostęp do różnych informacji o sprzęcie maszyny fizycznej lub oprogramowaniu stojącego za maszyną wirtualną. Na przykład korzystanie z polecenia dmidecode to sprawdzony sposób na odczytywanie różnych informacji o pamięci RAM w systemach Linux, takich jak numer modelu, prędkość i inne atrybuty. Ale niestety używanie dmidecode jest ograniczone do praw administracyjnych ze względu na konieczność dostępu do /dev/mem. Okazuje się jednak, że istnieje inny, mniej znany sposób na uzyskanie tych samych informacji o wielu komponentach pamięci i nie tylko. Mianowicie podczas procesu uruchamiania w najnowszych dystrybucjach Linuksa udev wyodrębnia informacje DMI i przechowuje je w swojej “bazie danych”. Dlatego uruchomienie polecenia:

udevadm info -e | grep -e MEMORY_DEVICE -e MEMORY_ARRAY

jako zwykły użytkownik doje dostęp do informacji o pamięci DIMM Np.

E: MEMORY_DEVICE_1_FORM_FACTOR=DIMM
E: MEMORY_DEVICE_1_TYPE=DDR4
E: MEMORY_DEVICE_1_SPEED_MTS=2400
E: MEMORY_DEVICE_1_CONFIGURED_SPEED_MTS=2133
E: MEMORY_DEVICE_1_MANUFACTURER=00AD00B300AD
E: MEMORY_DEVICE_1_PART_NUMBER=HMA82GR7AFR8N-UH
E: MEMORY_DEVICE_1_SIZE=17179869184

Widzimy dostęp do informacji: typu, dostawcy, modelu, rozmiaru, szybkości MT/s i innych wskaźników pamięci. W ten sposób uzyskujemy dostęp do informacji w tych obszarach, gdy nie możemy uruchamiać poleceń jako administrator. Polecenie: udevadm info -e daje nam również dostęp do innych informacji DMI, które w przeciwnym razie byłyby zwykle ograniczone do konta root.

Więcej informacji: A Nifty Way To Access Linux Memory/RAM Information

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

Geo IP

10/04/2022 w Debug Możliwość komentowania Geo IP została wyłączona

C

zy ten plik to malware? Zależy jakiego silnika antywirusowego się spytasz. Podobnie jest w temacie znajdowania lokalizacji adresu IP, ponieważ powiązanie rzeczywistej lokalizacji z adresem IP jest prawie niemożliwe do pewnego poziomu dokładności (np. ulicy, miasta). Wiele osób od razu podniesie głos sprzeciwu odnosząc się do dostawców usług oferujących geolokalizację adresów IP. Tak, istnieją bazy zawierające informacje o lokalizacji geograficznej adresu IP. Niektóre nawet twierdzą, że mają bardzo dokładne informacje, ale czy są one wiarygodne? Rzućmy okiem na adres: 188.130.189.153. W tym celu skorzystamy z serwisów zawartych na stronie: resolve.rs, ponieważ uwzględnia ona bardzo dużo dostawców typu IP2GEO, z którymi możemy sprawdzić wspomniany adres IP. Przechodząc przez poszczególne serwisy i zadając im zapytanie o ten sam adres widzimy wiele różnic w wynikach. W momencie pisania tego wpisu wyniki były, co najmniej mylące nawet na poziomie kraju.
[ czytaj całość… ]

macOS Monterey – You shut down your computer because of a problem

02/01/2022 w Debug Możliwość komentowania macOS Monterey – You shut down your computer because of a problem została wyłączona

Po aktualizacji do systemu macOS Monterey (12.1) za każdym uruchomieniem komputera pojawia się komunikat: Komputer został wyłączony z powodu problemu. Naprawa polega na usunięciu plików z raportami diagnostycznymi: sudo su -; rm -dRfv /Library/Logs/DiagnosticReports/*.*.

Więcej informacji: You shut down your computer because of a problem upon every single boot

Elasticsearch 6.8.X – cannot compute used swap when total swap is 0 and free swap is 0

27/10/2021 w Debug Możliwość komentowania Elasticsearch 6.8.X – cannot compute used swap when total swap is 0 and free swap is 0 została wyłączona

P

o wykonaniu aktualizacji z Elasticsearch z 6.8.14 do 6.8.20 w pliku logu pojawia się ciągle powtarzająca się wiadomość: cannot compute used swap when total swap is 0 and free swap is 0. Dzieje się tak ze względu na tą zmianę. Jeśli na naszej maszynie wirtualnej / fizycznej wyłączony jest plik wymiany oraz włączony monitoring to, co 10 sekund będziemy mieli zapychane logi tym wpisem. W celu wyfiltrowania tego typu wiadomości, należy do pliku /etc/elasticsearch/log4j2.properties dołączyć następujące wpisy w sekcji appender.rolling:

appender.rolling.filter.regex.type = RegexFilter
appender.rolling.filter.regex.regex = cannot compute used swap.*
appender.rolling.filter.regex.onMatch = DENY
appender.rolling.filter.regex.onMismatch = NEUTRAL

Więcej informacji: Log4j RegexFilter

sysdiagnose plus

27/09/2021 w Bezpieczeństwo, Debug Możliwość komentowania sysdiagnose plus została wyłączona

S

ysdiagnose to narzędzie, które znajduje się na większości urządzeń z systemem macOS i iOS. Służy ono do zbierania informacji diagnostycznych dotyczących całego systemu. Obecna wersja – 3.0 zbiera duże ilości danych z szerokiej gamy lokalizacji w systemie. Mogą one być przydatne w informatyce śledczej komputera prowadzonej na żywo. W przypadku poszukiwań złośliwego oprogramowania przechwycone dane mogą pomóc w zidentyfikowaniu zainfekowanego pliku binarnego; mechanizmu persystencji (gdy złośliwe oprogramowanie uzyska dostęp do systemu, często chce zostać tam przez długi czas opracowując metody pozwalające na jego powrót po restarcie systemu; jeśli mechanizm persystencji jest wystarczająco unikalny, może nawet służyć jako świetny sposób na określenie cechy charakterystycznej danego złośliwego oprogramowania) lub połączeń do C2 (serwery Command and Control – nazywane również C&C odnoszą się do sposobu, w jaki atakujący komunikują się i sprawują kontrolę nad zainfekowanym systemem; po zainfekowaniu systemu większość złośliwego oprogramowania komunikuje się z serwerem kontrolowanym przez atakującego, aby przyjmować polecenia, pobierać dodatkowe komponenty lub wykradać informacje).
[ czytaj całość… ]

Duży HEAP, duży CPU, duży GC

08/10/2019 w Administracja, Debug Możliwość komentowania Duży HEAP, duży CPU, duży GC została wyłączona

Nasze maszyny posiadają następujące parametry: 64 GB RAM oraz 32 wątków CPU (z HT). Jest na nich uruchomiony ElasticSearch v5 z złotą zasadą 50% na heap oraz 50% na cache systemu plików. Oczywiście heap jest ustawiony tak, aby nie przekraczał trybu “zero-based”, czyli w tym przypadku 30720 MB:
[ czytaj całość… ]

Gdybym miał ukryć flagę CTF w Linuksie

29/09/2019 w CmdLineFu, Debug Możliwość komentowania Gdybym miał ukryć flagę CTF w Linuksie została wyłączona

0. Utworzenie pliku:

touch .findmehere

1. Lokalizacja obiektu w systemie plików:

ls -i .findmehere
15466911 .findmehere

2. Zakodowanie wiadomości:

while read -n1 char; do printf "%d " \'$char; done
C67 T84 F70 .46 f102 l108 a97 g103

3. Umieszczenie wiadomości w pliku:

sudo debugfs -w -R 'set_inode_field /home/ctf/.findmehere \
version 6784704610210897103' /dev/sda2

4. Sprawdzenie zapisu wiadomości:

sudo debugfs -R 'stat <15466911>' /dev/sda2
Inode: 15466911 Type: regular Mode: 0640   Flags: 0x80000
Generation: 1555060808 Version: 0x5e281ce5:65935ccf
User: 0 Group: 0 Project: 0 Size: 0
File ACL: 0
Links: 1 Blockcount: 0
Fragment:  Address: 0 Number: 0 Size: 0
 ctime: 0x5d8faaf2:5d64fd54 -- Sat Sep 28 20:48:18 2019
 atime: 0x5d8faaf2:5d64fd54 -- Sat Sep 28 20:48:18 2019
 mtime: 0x5d8faaf2:5d64fd54 -- Sat Sep 28 20:48:18 2019
crtime: 0x5d8faaf2:5d64fd54 -- Sat Sep 28 20:48:18 2019
Size of extra inode fields: 32
EXTENTS:

5. Weryfikacja wiadomości:

printf "%d\n" 0x5e281ce565935ccf
6784704610210897103
for i in `echo 67 84 70 46 102 108 97 103`; do echo -ne \\x$(printf %02x $i); done
CTF.flag

Więcej informacji: Ext4 Disk Layout, Czas utworzenia pliku w Linuksie