Historia poleceń powłoki systemowej¶
Większość powłok systemowych zapisuje polecenia wpisane przez użytkownika, aby ułatwić mu ich powtórne wykorzystanie w przyszłości. Analiza historii wykonanych przez użytkownika poleceń może pomóc w ustaleniu przebiegu incydentu.
NIE URUCHAMIAJ WYŁĄCZONEGO URZĄDZENIA
Jeżeli urządzenie było połączone z zaatakowaną domeną lub siecią, mogło zostać skompromitowane. W takim przypadku nie jest zalecane uruchomienie go przed ustaleniem zakresu incydentu. Należy uznać je za skompromitowane i poddać analizie. Uruchomienie takiego urządzenia może spowodować zaszyfrowanie danych przez szkodliwe oprogramowanie, nawet jeśli urządzenie jest odłączone od sieci wewnętrznej instytucji.
Jeżeli urządzenie nie jest objęte atakiem ransomware, samo uruchomienie systemu operacyjnego może nadpisać kluczowe dla analizy dane, takie jak dzienniki zdarzeń czy pliki usunięte przez atakującego.
Zalecanym rozwiązaniem jest przekazanie dysków z takiego urządzenia lub całego urządzenia do wyspecjalizowanej instytucji, która zabezpieczy dane znajdującie się na dyskach w sposób nie nadpisujący ich zawartości, bez uruchamiania systemu.
Rodzaje powłok systemowych¶
Bash¶
Bash jest jedną z najpopularniejszych powłok systemowych; jest to powłoka o otwartym kodzie źródłowym. Obsługuje historię poleceń oraz uzupełnianie ścieżek plików, zmiennych i poleceń.
Pliki z historią poleceń domyślnie znajdują się w katalogu domowym użytkownika pod nazwą .bash_history.
Aby wyświetlić miejsce, w którym zapisywana jest historia poleceń, liczbę linii w pliku historii oraz liczbę poleceń, które zostaną zapamiętane, należy uruchomić poniższe polecenie.
echo "Podstawowe informacje o historii powłoki bash"
echo $HISTFILE; # Lokalizacja pliku historii
echo $HISTFILESIZE; # Liczba linii w pliku .bash_history
echo $HISTSIZE; # Liczba zapamiętywanych poleceń
Wzbogacenie historii poleceń o datę i czas
Domyślnie czas wykonania poleceń nie jest zapisywany w pliku .bash_history, aby włączyć rejestrowanie czasu wykonania poleceń w powłokach interaktywnych wszystkich użytkowników należy wykonać poniższe polecenie z uprawnieniami roota.
ZSH¶
ZSH (Z shell) to zaawansowana powłoka uniksowa rozszerzająca funkcjonalność basha. Jest domyślną powłoką w systemie macOS (od wersji 10.15 Catalina) oraz w dystrybucji Kali Linux.
Pliki z historią poleceń domyślnie znajdują się w katalogu domowym użytkownika pod nazwą .zsh_history.
Aby wyświetlić miejsce, w którym zapisywana jest historia poleceń, liczbę poleceń zapamiętywanych w pamięci oraz liczbę poleceń zapisywanych w pliku historii, należy uruchomić poniższe polecenie.
echo "Podstawowe informacje o historii powłoki zsh"
echo $HISTFILE; # Lokalizacja pliku historii
echo $HISTSIZE; # Liczba poleceń zapamiętywanych w pamięci
echo $SAVEHIST; # Liczba poleceń zapisywanych w pliku historii
Wzbogacenie historii poleceń o datę i czas
W zsh, w przeciwieństwie do basha, znaczniki czasu wykonania poleceń mogą być zapisywane domyślnie, jeśli włączona jest opcja EXTENDED_HISTORY (jest ona domyślnie włączana w wielu konfiguracjach, m.in. przez oh-my-zsh). Wpisy w pliku .zsh_history mają wtedy postać : <unix_timestamp>:<elapsed_seconds>;<command>, co ułatwia analizę chronologiczną.
Sh¶
Powłoka sh to powłoka systemowa, która nie jest domyślnie wykorzystywana w nowoczesnych systemach Linux. Jednakże, aby spełnić standardy POSIX, większość dystrybucji tworzy dowiązanie /bin/sh, które prowadzi do jednej z nowoczesnych powłok zgodnych ze standardem POSIX, np. dash lub bash.
Aby ustalić, do jakiej powłoki wskazuje /bin/sh, należy uruchomić poniższe polecenie.
Polecenie readlink zwraca wynik jedynie, gdy /bin/sh jest dowiązaniem symbolicznym. Jeśli jest plikiem binarnym (np. macOS, systemy BSD), należy użyć ls -l /bin/sh lub sh --version, aby zidentyfikować powłokę.
Fish¶
Fish to nowoczesna powłoka o otwartym kodzie źródłowym, domyślnie oferująca podświetlanie składni, autouzupełnianie i sugestie na podstawie historii.
Plik z historią poleceń oraz czasem ich wykonania domyślnie znajduje się w lokalizacji ~/.local/share/fish/fish_history (w wersjach od 3.0) lub ~/.config/fish/fish_history (w wersjach starszych).
Aby wyświetlić domyślną lokalizację pliku historii oraz liczbę zapamiętanych poleceń, należy uruchomić poniższe polecenie.
echo "Podstawowe informacje o historii powłoki fish"
echo ~/.local/share/fish/fish_history # Domyślna lokalizacja pliku historii
history | wc -l # Liczba zapamiętanych poleceń
Tcsh / Csh¶
Powłoka C shell (Csh) oraz jej rozwinięcie Tcsh są wykorzystywane w systemach z rodziny BSD oraz we wczesnych wersjach macOS.
W przypadku Csh zapisywanie historii poleceń do pliku domyślnie nie jest włączone.
Plik z historią poleceń domyślnie nosi nazwę .history i znajduje się w katalogu domowym użytkownika. Lokalizację tę można zmienić, ustawiając zmienną histfile (np. set histfile=~/.tcsh_history).
Jeżeli zmienna $histfile jest pusta, a zmienne $history oraz $savehist nie są zdefiniowane lub ich wartość jest równa 0, zapisywanie wykonanych poleceń jest wyłączone.
Aby wyświetlić i zweryfikować podstawowe informacje o historii powłoki Csh/Tcsh, należy uruchomić poniższe polecenie.
echo "Podstawowe informacje o historii powłoki csh/tcsh"
echo $histfile # Lokalizacja pliku historii poleceń.
echo $history # Maksymalna liczba poleceń zapisywanych w historii.
echo $savehist # Maksymalna liczba linii zapisanych w pliku `.history`.
Włączanie zapisu historii w Csh/Tcsh
Aby historia była zapisywana do pliku, wiersz set savehist=<liczba wierszy> musi być wpisany do pliku ~/.cshrc / ~/.tcshrc. Aby włączyć zapisywanie poleceń oraz ich czasu wykonywania, należy wykonać poniższe polecenia.
Warning
Csh nie obsługuje zapisywania czasu wykonania poleceń do pliku historii.
Zabezpieczenie historii poleceń z działającego systemu Linux¶
Poniższa procedura służy do zabezpieczenia plików historii poleceń poszczególnych użytkowników z działającego systemu Linux. Historia wykonanych poleceń pozwala odtworzyć kroki podjęte przez atakującego po uzyskaniu dostępu do systemu: pobieranie narzędzi, eskalację uprawnień, eksfiltrację danych, tworzenie połączeń z serwerem C2.
Wymagania¶
- Uruchomiony system
- Dostęp do konta z uprawnieniami root
Wymagane narzędzia¶
- Czysty nośnik zewnętrzny przygotowany na zaufanym urządzeniu, zgodnie z instrukcją Przygotowanie nośnika
Opis poleceń wykorzystanych w procedurze
| Polecenie | Opis |
|---|---|
while IFS=: read -r username _ _ _ _ home _; do ... done < /etc/passwd |
Iteruje po liniach pliku /etc/passwd, odczytując nazwę użytkownika i ścieżkę katalogu domowego, pomijając pozostałe pola. |
case "$home" in ""\|/\|/nonexistent\|/dev/null\|/var/empty) continue ;; |
Pomija konta z nieistniejącym lub nieprawidłowym katalogiem domowym. |
[ -d "$home" ] |
Sprawdza, czy katalog domowy użytkownika istnieje. |
for hf in .bash_history .zsh_history .sh_history .history .tcsh_history .local/share/fish/fish_history .config/fish/fish_history |
Iteruje po znanych nazwach plików historii różnych powłok systemowych. |
[ -f "$home/$hf" ] |
Sprawdza, czy dany plik historii istnieje w katalogu domowym użytkownika. |
cp -a "$home/$hf" ... |
Kopiuje plik historii poleceń z zachowaniem oryginalnych atrybutów (właściciel, uprawnienia, znaczniki czasu). |
date -u +%Y%m%dT%H%M%S-UTC |
Generuje bieżący znacznik czasu w strefie UTC. |
echo "..." >> $nosnik/error.log |
Dopisuje komunikat o rozpoczęciu i zakończeniu procedury do dziennika błędów na nośniku zewnętrznym. |
Procedura¶
Poniższe polecenia zabezpieczają pliki historii poleceń wszystkich użytkowników, w tym roota, dla powłok wymienionych w tym dokumencie: bash, zsh, fish oraz csh/tcsh. Pliki są kopiowane na nośnik zewnętrzny podmontowany pod zmienną środowiskową $nosnik. Każdy plik otrzymuje nazwę w formacie history_<użytkownik>_<plik>.
Przed uruchomieniem polecenia należy spełnić poniższe warunki:
- powłoka systemowa jest uruchomiona z uprawnieniami roota.
- zmienna
$nosnikwskazuje na katalog docelowy na zewnętrznym nośniku, w przeciwnym wypadku należy przypisać ją poniższym poleceniem
Aby zabezpieczyć historię poleceń wykonywanych przez użytkowników, należy uruchomić poniższy skrypt.
echo "Rozpoczęcie zabezpieczania informacji o historii poleceń $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
while IFS=: read -r username _ _ _ _ home _; do
case "$home" in ""|/|/nonexistent|/dev/null|/var/empty) continue ;; esac
[ -d "$home" ] || continue
for hf in .bash_history .zsh_history .sh_history .history .tcsh_history \
.local/share/fish/fish_history .config/fish/fish_history; do
[ -f "$home/$hf" ] && cp -a "$home/$hf" \
"$nosnik/history_${username}_${hf//\//_}"
done
done < /etc/passwd
echo "Zakończenie zabezpieczania informacji o historii poleceń $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
Ostatnia aktualizacja artykułu: 2026-09-02.