PowerShell átiratok elemzése

Raido Karro és Liisa Tallinn
május 28 2020

még akkor is, ha nem a PowerShell-t használja a Windows gépeiben, az ellenfelek és a toll-tesztelők. Miért használjon egyedi hax0r eszközöket, ha minden Windows gép beépített szkriptkörnyezetet tartalmaz? A Powershell lehetővé teszi a támadó számára, hogy nagyjából bármit megtegyen, miközben nem hagy nyomot a lemezeken. Hiba nem szeretni a PowerShell-t támadóként, és hiba nem szeretni a PowerShell-naplókat védőként.

az alábbiakban a SpectX free log analyzer segítségével elemezzük és lekérdezzük az általános statisztikákat, valamint a PowerShell átirat naplóiból származó konkrét betekintést, amelyeket közismerten nehéz elemezni. Nincs szükség a fájlok importálására vagy bevitelére az aktuális kimeneti könyvtárból – a SpectX közvetlenül a nyers naplókon futtatja a lekérdezéseket. Tiszta nézet létrehozása a nyers naplókból csak néhány percet vesz igénybe.

feltöltöttünk egy kis átiratfájlt a nyilvános S3 adattárunkba – nyugodtan futtassa az alábbi lekérdezéseket ezen a mintaadaton. A lekérdezésekben feltett kérdések célja az alapvonal feltárása és a rendellenes (potenciálisan rosszindulatú) viselkedés észlelése. Melyek voltak a legfelső parancsok? Mikor futott a legtöbb parancs? Mikor futottak először? Milyen parancskimenetek jelentek meg a konzolon a parancs futtatásakor – bármi szokatlan? Kik a legjobb felhasználók? Vannak olyan felhasználók, akik olyan parancsokat futtatnak, amelyeket nem kellene futtatniuk? Top host alkalmazások? Hány parancs óránként / nap / hét? Mi a helyzet az elhomályosított parancsokkal? És így tovább-ha egyszer megkapod a SpectX lekérdezéseket, a nyomon követési kérdések soha nem állnak meg.

tartalom

az Átiratokról
hogyan lehet bekapcsolni az átirat naplózását
az átirat naplók formátuma
a naplók olvasása és elemzése a SpectX segítségével
ki? Micsoda? Mikor? Hogyan? – a lekérdezések

átiratok mindent tudnak… vagy majdnem 6

a naplózásnak 3 típusa engedélyezhető a PowerShell számára: modulnaplózás, szkriptblokk és transzkripció. Mivel az első kettő Windows eseménynek tekinthető, gyakran ajánlott, hogy az átirat szöveges fájljait csak akkor olvassa el manuálisan, ha az első kettő figyelése miatt probléma merül fel. Ugyanakkor az átiratokban található információk a legátfogóbbak a három közül, és a lapos szöveges fájlok sokkal tárolhatóbbak, mint a modul és a szkriptblokk naplózása által létrehozott Windows események. Például, fut egy egyszerű write-host ‘hello world’, vagy ebben az esetben ‘All You Need is Logs’ termel 22 Windows események modul és script blokk naplózás, de ugyanazt az információt, valamint a parancs kimenet is bejelentkezett ebbe 1KB PowerShell átirat:

**********************
Windows PowerShell transcript start
Start time: 20200521135800
Username: DESKTOP-7KL6SCQ\Loki
RunAs User: DESKTOP-7KL6SCQ\Loki
Configuration Name:
Machine: DESKTOP-7KL6SCQ (Microsoft Windows NT 10.0.18363.0)
Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Process ID: 5624
PSVersion: 5.1.18362.752
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.18362.752
BuildVersion: 10.0.18362.752
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
**********************
Command start time: 20200521135818
**********************
PS C:\Users\Loki> write-host "All You Need is Logs"
All You Need is Logs
**********************
Command start time: 20200521135821
**********************
PS C:\Users\Loki> exit
**********************
Windows PowerShell transcript end
End time: 20200521135821
**********************

a baj az, hogy az átirat naplókat történelmileg hibakeresési célokra tervezték, vagyis az emberek számára, nem pedig a gépek számára. Tartalmuk szinte szabad formájú és közismerten nehéz elemezni. Ásni az interneten, megtalálható néhány kísérlet az interneten, hogy lenyelik átiratok egy log feldolgozó eszköz, de egyikük sem ér kitermelése parancsok, valamint a parancs kimenetek külön mezőkbe. Ez sajnálatos, mert a parancs kimenetek csak az átiratokba vannak naplózva, és a PS parancsok eredményeként történt tényleges betekintés értékes lehet.
Írja Be A SpectX-Et. A lenyelési fázis átugrása és az elemzőnyelv építőelemeinek használata nem csak a felhasználó és a host/machine mezőket tudja kinyerni a prológban, hanem a parancsok indítási idejét, parancsokat és kimeneteket is. Mivel a spectx elemzője a nyers naplófájlokra vonatkozik a lekérdezés futási ideje alatt, ez azt is jelenti, hogy hibakereshet, javíthatja és javíthatja az elemzőt minden lekérdezéssel, ha a napló formátuma megváltozik. A PowerShell átírási naplók pedig valóban ingatagok.
amikor elkezdtük írni ezt a bejegyzést, úgy gondoltuk, hogy a PowerShell átiratai mindenhatóak és mindent rögzítenek. Azonban a parancsokkal és kimenetekkel játszva kiderült, hogy van egy kivétel. Amikor egy PS szkriptet futtat egy URL-ről, az átirat elkapja a parancsot (beleértve az URL-t is) és a kimenetet, de teljesen vak marad a szkript vagy a szkript által futtatott parancsok tartalmával kapcsolatban. Például, ha meg szeretné tudni, hogy ez az adott parancsfájl hogyan fut egy url-ből, akkor a modulnaplózás által létrehozott Windows eseményekhez kell fordulnia.

**********************
Windows PowerShell transcript start
Start time: 20200521141014
Username: DESKTOP-7KL6SCQ\Loki
RunAs User: DESKTOP-7KL6SCQ\Loki
Configuration Name:
Machine: DESKTOP-7KL6SCQ (Microsoft Windows NT 10.0.18363.0)
Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Process ID: 788
PSVersion: 5.1.18362.752
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.18362.752
BuildVersion: 10.0.18362.752
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
**********************
Command start time: 20200521141021
**********************
PS C:\Users\Loki> iex (New-Object "net.webclient").DownloadString("http://spectx.com/test.ps1")
All You Need is Logs!
**********************
Command start time: 20200521141023
**********************
PS C:\Users\Loki> exit
**********************
Windows PowerShell transcript end
End time: 20200521141023
**********************

a PowerShell Átirat naplózásának bekapcsolása∞

1. Nyissa meg a Start menüt, majd írja be a ‘gpedit’ parancsot a helyi csoportházirend-szerkesztő ablak megnyitásához

2. Keresse meg a rendszergazdai sablonokat > Windows-összetevők > Windows PowerShell

3. Kattintson a ‘PowerShell átírás bekapcsolása’

4. Válassza az ‘Enabled’ lehetőséget, majd adja meg a kimeneti könyvtár elérési útját. Fontos! Jelölje be a négyzetet a meghívási fejlécek bekapcsolásához. Ez rögzíti az egyes parancsok futtatását egy parancs kezdési idejével.

5. Kattintson az OK gombra
6. Nyisson meg egy PowerShell ablakot, hogy tesztelje, működik-e a naplózás. Írjon be egy parancsot, pl. egy egyszerű write-host: ‘all you need is logs’, majd’exit’.

7. Ellenőrizze, hogy a 4. lépésben megadott kimeneti könyvtár tartalmaz-e átiratot a 6.lépésben megadott időbélyegekkel és műveletekkel.

hosszú távon jó ötlet a PowerShell átiratok gyűjteményének központosítása, hogy azokat méretekben elemezzék, pl. ellenőrizze ezt az oktatóanyagot @dan_franciscus által a 4sysops blogban.

Transcript Log Format (Átirat Naplóformátum)

néhány szó a naplóformátumról és az elemző logikáról. Ha inkább lekérdezést szeretne kapni, és nem érdekli a naplófájlok és az elemző anatómiája, ugorjon a következő szakaszra. Itt van egy minta egy nyers PS v. 5.1 átirat naplóból:

**********************
Windows PowerShell transcript start
Start time: 20171030223248
Username: WIN-FT17VBNL4B2\Administrator
RunAs User: WIN-FT17VBNL4B2\Administrator
Machine: WIN-FT17VBNL4B2 (Microsoft Windows NT 10.0.14393.0)
Host Application: C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell.exe
Process ID: 4268
PSVersion: 5.1.14393.1770
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.14393.1770
BuildVersion: 10.0.14393.1770
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
**********************
Command start time: 20171030223255
**********************
PS C:\Users\Administrator> echo test
test
**********************
Command start time: 20171030223256
**********************
PS C:\Users\Administrator> exit
**********************
Windows PowerShell transcript end
End time: 20171030223256
**********************

minden PowerShell-munkamenethez egy átirat fájl jön létre. Az átirat első szakasza egy prológus, amely munkamenet-specifikus mezőket tartalmaz, mint például a munkamenet kezdési ideje, felhasználó, PowerShell verzió stb. Ezután egy sor csillag után a parancsok és kimenetek gyűjteménye fut a munkamenet során. Végül egy opcionális epilógus szakasz a fájl végén a munkamenet befejezési idejével, de csak akkor, ha a munkamenet exit paranccsal fejeződött be (és nem az ablak bezárásával).

a prológus és az epilógus közötti parancsok száma változó. Ezért kétlépcsős megközelítést alkalmaztunk: először elemezzük a prológot, az epilógust és a parancsokat-kimeneteket ömlesztve; majd a parancsokat és kimeneteket külön mezőkbe bontjuk ki a lekérdezési rétegben.

Hogyan olvassuk és elemezzük az átiratokat!

A Spectx közvetlenül a nyers naplófájlokból olvassa az adatokat, és futásidőben elemzi azokat. A mintában feltételezzük, hogy bekapcsolta a meghívási fejléceket, vagyis minden PowerShell parancsot egy parancs kezdési idejével rögzítenek. Az átiratok tiszta táblázatként történő megtekintéséhez:

1. Töltse le és telepítse az ingyenes SpectX-et.

2. Másolja ezt az alap lekérdezést (Github) a lekérdezési ablakba

3. Módosítsa az elérési utat a 47. sorban, hogy megfeleljen az átirat naplófájljainak kimeneti könyvtárának. Ne változtassa meg az elérési út időváltozóit – ez lehetővé teszi a naplók szűrését a fájl elérési útjának időbélyegei alapján. Például, ha az egyik átiratfájl elérési útja

C:\Logs\powershell200405\PowerShell_transcript.WS01.5OoA7WLR.20200405152828.txt

, akkor a SpectX lekérdezésben szereplő URI, amely a C:\Logs\powershell mappa lenne:

file:/C:/Logs/powershell/$yyyy$$MM$$dd$/PowerShell_transcript.*.$yyyy$$MM$$dd$$HH$$mm$$ss$.txt

4. Módosítsa a napok számát az init-script legelején a script (sorok 2-4), ha azt szeretné, hogy vessen egy pillantást a régebbi/újabb naplók.

5. Nyomja meg a Futtatás gombot. Az eredményeknek ehhez hasonlónak kell lenniük:

ki? Micsoda? Mikor? Hogyan? A lekérdezések

amikor kérdéseket tesz fel a naplók, te vagy keres az ismert vagy az ismeretlen. Az ismert keresése egyszerű-csak szűrje le a szükséges adatokat. Például:

| filter(lower(output) CONTAINS 'error') 

megadja az összes parancsot, amely a ‘error’ karakterláncot tartalmazza a kimeneten.

ha egy adott időszakot szeretne megnézni, módosítsa az időbélyegeket tartalmazó init blokkot az alap lekérdezési parancsfájl legelején.

érdekesebbé válik, ha az ismeretlent keresed, és valami szokatlanra akarsz ásni. Az első lépés itt az alapvonal megállapítása-a szokásos, majd kiszűrése, mint valami, ami nem érdekli. Például egy ügyes trükk az, hogy megnézzük, mikor futott először egy parancs, majd azokra a parancsokra összpontosítunk, amelyeket először később láttak, mint mások (lásd alább a 2.számú lekérdezést).
másolja és illessze be ezeket a lekérdezéseket egyenként az alap lekérdezés végére. Kattintson duplán egy rekordra az összes tartalmának megtekintéséhez, kattintson a jobb gombbal egy mezőre a (negatív) szűrők alkalmazásához.

betekintés a parancsokba és a Parancskimenetekbe

1. Felső parancsok

| select(cnt:count(*), command)
| group(@2)
| sort(cnt DESC)

2. Mikor futott először egy parancs?

| select(min(commandStartTime),count(*),command,*)
| group(command)
| sort(min_commandStartTime)

3. Felső parancs-kimeneti Párok

| select(cnt:count(*), command,output)
| group(command,output)
| sort(cnt DESC)

4. Parancsok száma óránként

| select(count(*),trunc_cmd_start:commandStartTime)
| group(trunc_cmd_start)

5. Valószínűleg kézzel írt parancsok, azaz ‘c-vel kezdődő parancsok:\\’

| select(start_time, end_time, Username, RunAs_User, Machine, PID, PSVersion, commandText)
| filter(lower(commandText) contains 'c:\')

6. Elemezze újra a kimeneti mezőt az IP-címek észleléséhez a commandText-ben

| select(parse("DATA* IPADDR:ip DATA*", commandText), commandText, *)
| filter_out(ip IS NULL)

7. Keresse meg a ‘letöltés’ karakterláncot a command_output belsejében, még akkor is, ha el van takarva (távolítsa el az írásjeleket). Például, ha az invoke-parancs így nézett ki:

| select(deobf_commandText:lower(REPLACEALL(commandText, "" , '')) ) 
| filter(deobf_commandText contains 'download')

általános statisztika

8. Hány PowerShell ülés óránként?

| select(start_time:start_time,count(*))
| group(start_time)

9. Felső 100 felhasználónevek

| select(Username, cnt:count(*))
| group(@1)
| sort(cnt DESC)
| limit(100)

10. Hány rekordot hozott létre egy felhasználó gépenként?

| select(Username,Machine,cnt:count(*))
| group(@1,@2)
| limit(100)

11. Top Host alkalmazások-a PowerShell-t futtató alkalmazások listája, beleértve a további parancsparamétereket.

| select(cnt:count(*),Host_Application)
| group(@2)
| sort(cnt DESC)
| limit(100)

12. Top 100 Host Alkalmazások felhasználónként

| select(Host_Application, Username, cnt:count(*))
| group(@1,@2)
| sort(cnt DESC)
| limit(100)

13. Nézze meg közelebbről az írásjeleket a parancsokban. A kiugró parancsok (a szám kicsi) részletes megjelenést érdemelnek.

| select(PUNCT(command, 64, false), cnt:count(*),uniq_commands:ARRAY_LEN(ARRAY_UNIQ(ARRAY_AGG(command))),commands_array:ARRAY_UNIQ(ARRAY_AGG(command)))
| group(@1)
| sort(cnt)
| limit(100)

következtetés

annak ellenére, hogy a PowerShell átirati naplók nem könnyen olvashatók a gépek számára, az általuk tartalmazott információk átfogóak és érdemes elemezni. Végül is a PowerShell egy eszköz szinte bármilyen feladat automatizálására és konfigurálására a Windows rendszerben – ez egy gyűrű, amely mindet uralja. A PowerShell statisztikáinak, parancsainak és kimeneteinek fókuszált áttekintése jó módja annak, hogy megbizonyosodjon arról, hogy a gyűrű nincs rossz kezekben vagy tanácstalanul használják.
Köszönetnyilvánítás
köszönöm Taavi @ tisztázott biztonság. A Hunt The Hacker tanfolyam átiratai remek kiindulópontot jelentettek ehhez a cikkhez.

vissza a cikkekhez

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.