Zgodnie z Guidelines for Evidence Collection and Archiving jednym z elementów, które należy (w miarę szybko) pobrać jest pamięć. Można zrzucić pamięć fizyczną i następnie analizować ją choćby przy pomocy pakietu Volatility. Można też do sprawy podejść inaczej.
Prosty sposób na zrzucenie pamięci procesów użytkownika (w XP)
Załóżmy, że już stworzę swój samouruchamiający sie zestaw narzędzi na USB. Jednym z elementów, które chciałbym zebrać, będzie pamięć. Z jednej strony można wykorzystać narzędzia typu win32dd lub mdd, co jednak w przypadku, gdy użytkownik, w którego kontekście uruchomione zostaną te narzędzia nie ma praw administratora?
Skoro nie mogę pobrać całej pamięci, to może choć pamięć procesów użytkownika, do których siłą rzeczy ma on dostęp. Wbrew pozorom jest to dość łatwe zadanie. Potrzebny do tego jest:
- cdb z Debugging Tools For Windows,
- tasklist (standardowo dostępny w Windows XP),
W celu uruchomienia cdb na docelowym komputerze wcale nie trzeba instalować pakietu narzędzi, wystarczy do tego plik cdb.exe oraz kilka plików dll. Tasklist potrzebny jest do tego, by znaleźć procesy należące do danego użytkownika.
Całość można zamknąć w takim prostym skrypcie:
@set destdir=dump-%random%-%computername%-%username% @mkdir %destdir% for /f "skip=1 tokens=1,2 delims=," %%i in ('tasklist.exe /fi "username EQ %username%" /fo csv') do cdb -pv -p %%~j -c ".dump /ma %destdir%\%%~i-%%~j.dmp; q"
Na początku tworzony jest katalog docelowy, którego nazwa składa się z:
- stałej wartości dump,
- pewnej wartości losowej (zmienna środowiskowa %random%),
- nazwy maszyny (zmienna środowiskowa %computername%),
- nazwy użytkownika (zmienna środowiskowa %username%),
Następnie dla każdego procesu użytkownika następuje zrzut pamięci przy pomocy cdb.ee. Procesy użytkownika są znajdowane przy pomocy narzędzia tasklist.exe, a właściwie przy pomocy prostego filtru, który wyszukuje procesy, których właściciel jest zgodny z wartością zmiennej %username%. Tutaj muszę sprawdzić, czy komputerów domenowych nie trzeba traktować oddzielnie i zamiast %username% nie stosować czegoś w postaci %userdomain%\%username%. W każdym razie rezultatem polecenia jest lista w postaci:
"Image Name","PID","Session Name","Session#","Mem Usage" "explorer.exe","812","Console","0","84 736 K" (...) "tasklist.exe","2224","Console","0","4 496 K"
Z niej wyciągam nazwę procesu oraz jego PID. Dane te następnie są wykorzystywane do podpięcia się cdb.exe do kolejnych procesów. W cdb wywoływane jest polecenie .dump, za pomocą którego zrzucana jest pamięć procesu (i trochę dodatkowych informacji) do pliku (we wcześniej stworzonym katalogu) o nazwie postaci nazwa_procesu-pid_procesu.dmp. Zrzut taki można następnie otworzyć w WinDbg. Nawet jeśli ewentualna analiza zrzutu pamięci za pomocy debuggera jest za trudna (powtarzam - z debuggerem nie czuję się zbyt dobrze), to zawsze można skorzystać z "wysoce zaawansowanych" narzędzi typu strings oraz grep.
USERDNSDOMAIN=CONTOSO.NET
USERDOMAIN=CONTOSO
USERNAME=server-admin
COMPUTERNAME=server
Nie ma potrzeby dodawać nazwy domeny w skrypcie przed użytkownikiem. Działa tak jak jest.
USERNAME eq, ne User name in [domain\]user format
Przy czym wczoraj jakoś nie zauważyłem [domain\], czyli część domenowa wygląda na opcjonalną. Dzięki za info