Przejdź do treści

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.

echo 'export HISTTIMEFORMAT="%F %T "' >> /etc/bash.bashrc;

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.

readlink /bin/sh

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.

 echo "set savehist=(100 merge time)" >> ~/.tcshrc
 echo 'set history = (2000 "%h\t%Y-%m-%d %T\t%R\n")' >> ~/.tcshrc

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

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 $nosnik wskazuje na katalog docelowy na zewnętrznym nośniku, w przeciwnym wypadku należy przypisać ją poniższym poleceniem
    export nosnik=<katalog docelowy na zewnętrznym nośniku>
    

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.