Napisał: Patryk Krawaczyński
15/01/2024 w Administracja, Bezpieczeństwo
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
Napisał: Patryk Krawaczyński
28/07/2023 w Administracja
W
programowaniu biblioteka jest zbiorem wstępnie skompilowanych fragmentów kodu. Bibliotekę programistyczną możemy ponownie wykorzystać w różnych programach, które mają mieć zaimplementowane obsługę tych samych zadań. Są bardzo przydatne, ponieważ zapewniają funkcje, klasy i struktury danych wielokrotnego użytku. Niektóre przykłady bibliotek w systemie Linux to glibc (wersja GNU standardowej biblioteki C), libc (standardowa biblioteka C). Biblioteki możemy podzielić na dwie główne kategorie: biblioteki statyczne (ang. static libraries) – związane statycznie z programem w czasie kompilacji; biblioteki współdzielone (ang. shared libraries) – ładowane podczas uruchamiania programu i ładowane do pamięci w czasie wykonywania.
[ czytaj całość… ]
Napisał: Patryk Krawaczyński
16/05/2023 w Administracja
O
d wersji Apache 2.4.26 dostępny jest moduł umożliwiający kompresję statycznych elementów strony za pomocą algorytmu brotli. Jego szybkość jest podobna do gzip, ale zapewnia wyższą kompresję. Aktualnie algorytm ten jest już obsługiwany przez wszystkie główne przeglądarki, takie jak: Chrome, Firefox, Safari i Edge. W poniższej konfiguracji włączymy kompresję brotli dla reprezentatywnej grupy statycznych plików, ale zapewnimy również powrót do kompresji gzip, gdyby klient nie obsługiwał tej pierwszej.
[ czytaj całość… ]
Napisał: Patryk Krawaczyński
09/05/2023 w Administracja, Bezpieczeństwo
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ść… ]
Napisał: Patryk Krawaczyński
02/03/2023 w Administracja
K
ażde polecenie jest zapisywane w historii powłoki. Możemy ją ograniczać; obchodzić te ograniczenia; dodawać do niej czas wykonania poleceń; ulepszać wyszukiwanie itd. Najprostszym sposobem korzystania z historii jest używanie klawiszy kursora góra/dół. Większość użytkowników jest świadoma skrótu [Ctrl]+R. Naciskasz kombinację [Ctrl]+R (R jak reverse – wyszukiwanie wsteczne) kilka razy i jak przegapisz szukane polecenie, przewracasz oczami, naciskasz [Ctrl]+C i szukasz ponownie. Dlaczego w takim przypadku nie użyć wyszukiwania „do przodu” np. za pomocą [Ctrl]+S ? Otóż w standardowej konfiguracji kombinacja [Ctrl]+S zawiesza terminal, a [Ctrl]+Q go odwiesza. Funkcjonalność ta pochodzi z dawnych czasów i przydawała się m.in. przy zatrzymywaniu przepływu danych przez terminal. Dzisiaj już raczej się jej nie wykorzystuje. W celu wyłączenia tej funkcji i przywrócenia możliwości przeszukiwania historii wystarczy dodać linię do startowego pliku powłoki:
echo "stty -ixon" >> ~/.bash_profile
Teraz możemy przeszukiwać historię wstecz i do przodu używając [Ctrl]+R i [Ctrl]+S.
Więcej informacji: How to unfreeze after accidentally pressing Ctrl-S in a terminal?
Napisał: Patryk Krawaczyński
22/01/2023 w Administracja, Bezpieczeństwo
Wiadomości jądra Linux po starcie systemu powinny być dostępne tylko dla administratora. To samo tyczy się jego wskaźników. Analogicznie możemy postąpić z logami jądra, które są wyświetlane na konsoli podczas i po starcie serwera. Za ich wyświetlanie odpowiedzialna jest jedna z najbardziej znanych funkcji z interfejsu jądra Linuksa – printk(). Jest to standardowe narzędzie, które służy do wyświetlania wiadomości i zazwyczaj najbardziej podstawowy sposób na śledzenie i debugowanie kodu jądra. Jeśli jesteśmy zaznajomieni z printf(3) to można powiedzieć, że printk() jest na nim oparty, chociaż ma pewne funkcjonalne różnice: jego komunikaty mogą zostać określone za pomocą poziomu szczegółowości (na czym się skupimy tutaj) oraz ciąg formatu (ang. format string) – choć w dużej mierze zgodny z C99, nie podąża dokładnie za tą samą specyfikacją.
[ czytaj całość… ]
Napisał: Patryk Krawaczyński
28/12/2022 w Administracja
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ść… ]
Napisał: Patryk Krawaczyński
28/11/2022 w Administracja, Bezpieczeństwo
W
raz z wersją git 2.34.0 każdy nasz commit do kodu lub jego tag będzie mógł zostać podpisany kluczem SSH. Możliwość podpisywania dowolnych danych za pomocą SSH została dodana już w 2019 roku z wydaniem OpenSSH 8.0. Jednak, aby używać tej funkcjonalności bez żadnego problemu najlepiej używać OpenSSH w wersji 8.8. Nasz proces zaczynamy od instalacji i konfiguracji klienta git i SSH:
sudo apt install -y git
Kolejnym krokiem jest wygenerowanie klucza SSH, który będzie używany do podpisywania:
ssh-keygen -t ed25519 -C "agresor@nfsek.pl" -f ~/.ssh/code_commit_signing
Odpowiadamy na pytania i upewniamy się, że wpisaliśmy silne i unikalne hasło do klucza. Klucz ten będzie domyślnie przechowywany w naszym katalogu domowym pod katalogiem .ssh:
agresor@darkstar:~$ cat .ssh/code_commit_signing.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMzu8wjcnyAorVVtEjddoG2gaYjmRnHiZHvElYFcl/s/
agresor@nfsek.pl
[ czytaj całość… ]
Napisał: Patryk Krawaczyński
22/09/2022 w Administracja, Bezpieczeństwo
M
inimalizacja QNAME (RFC 7816), czyli Query Name zmienia zapytania DNS pochodzące z resolwera rekurencyjnego, aby w każdym zapytaniu zawierał tylko tyle szczegółów, ile jest to wymagane dla tego kroku w procesie rozwiązywania danej domeny. Internet Engineering Task Force opisuje to jako technikę, „w której resolwer DNS nie wysyła już pełnej oryginalnej nazwy QNAME do nadrzędnego serwera nazw”. Powiedzmy, że chcemy odwiedzić stronę: stardust.nfsec.pl. W celu określenia adresu IP, z którym chce się połączyć przeglądarka, system wysyła zapytania do resolwera dostawcy usług internetowych (ISP) lub innego ustawionego przez konfigurację systemu. Prosi on o pełną nazwę – stardust.nfsec.pl – w tym przypadku. ISP (lub inny serwer DNS przydzielony przez zarządce sieci, z której korzystasz) zapyta root DNS, a następnie domenę najwyższego poziomu (.pl), a następnie domenę drugorzędną (nfsec.pl) o pełną nazwę domeny. W rzeczywistości wszystko, czego się dowiadujesz od głównego serwera DNS to odpowiedź na pytanie „kto odpowiada za .pl?”, a jedyne, o co pytasz serwer .pl, to „kto odpowiada za .nfsec.pl?”. Żadne z tych żądań nie musi zawierać informacji o pełnej nazwie strony internetowej, którą chcesz odwiedzić, aby odpowiedzieć na wcześniejsze pytania, ale niestety oba te serwery taką informacje otrzymują. Tak zawsze działał DNS, ale obecnie nie ma ku temu praktycznego powodu.
[ czytaj całość… ]
Napisał: Patryk Krawaczyński
11/05/2021 w Administracja
K
iedyś zestaw narzędzi dla Microsoft Windows znany pod nazwą SysInternals był przeznaczony tylko dla tego systemu operacyjnego. Od jakiegoś czasu narzędzie do monitorowania procesów o nazwie Process Monitor (znane również jako procmon) jest dostępne dla systemu Linux. Osoby, które chociaż raz pracowały z tym narzędziem na systemie okienek wiedzą, że jest to wygodne narzędzie do przeglądania aktywności wywołań systemowych w czasie rzeczywistym.
Proces instalacji ogranicza się do zarejestrowania repozytorium Microsoftu:
wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
Oraz wrzuceniu odpowiedniej paczki do systemu:
sudo apt-get update
sudo apt-get install procmon
Samo polecenie interfejsem graficznym przypomina htop. Uruchomienie śledzenia wszystkich procesów i wywołań systemowych w systemie można osiągnąć poprzez uruchomienie:
sudo procmon
Jeśli chcemy na przykład śledzić proces o ID = 20 i tylko wywołania systemowe odczytu, zapisu i otwierania wystarczy przekazać poleceniu składnie:
sudo procmon -p 20 -e read,write,openat
Więcej informacji: ProcMon for Linux, procmon -h
Ostatni komentarz :