Приложение A. Решения сформулированных задач

Данное Приложение содержит решения определённых задач, представленных в главах с Главы 1 по Главу 5. Обратите внимание, что здесь решаются не все поставленные задачи, так как это не служит разделом для жульничества с головоломкой кроссворда. Вместо этого он предоставляет ключевую инсайдерскую информацию, которая может потребоваться для решения поставленных задач.

Я твёрдо убеждён что единственный путь для того чтобы стать профессионалом в Pthon, PowerShell или сочетании обоих состоит в практике. Один из лучших способов состоит в определении некой задачи которую вы бы желали решить, а затем начать с малого и попробовать различные подходы. После этого, и только после этого, объединять ваши эксперименты в сценарии или программы. Обратите внимание, что это слегка противоречит традиционным подходам каскадной или даже спиральной разработки в информатике; тем не менее, я полагаю что это наилучший способ обучения. В одной из своих первых книг Python Forensics я отчеканил фразу "тестируй, потом кодируй". На тот момент это очень соответствовало разработке сценариев Python и я уверен, что она всё ещё соответствует сегодня и PowerShell и Python.

Для упрощения применения в качестве справочного материала данное Приложение разбито в соответствии с главами.

[Замечание]Замечание

Только не забывайте, что многие из CmdLet и сценариев требуют полномочий Администратора.

Глава 1. Введение в PowerShell для расследования

Первая задача: Исполнение 'Find' на основе Расширения файла


PS C:\WINDOWS\system32> Get-Help Get-ChildItem

NAME
    Get-ChildItem

SYNOPSIS
    Gets the files and folders in a file system drive. 
		
 

Пример A: Поиск всех файлов с расширением .jpg


PS C:\WINDOWS\system32> get-childitem C:\ -include *.jpg -recurse -force
Directory: C:\$Recycle.Bin\S-1-5-21-1545112040-36671619-2396729391-1001\$RPSE7Z2\PHOTO

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        8/15/2018  11:24 AM         26903 20-fake-images-10.jpg
-a----        8/15/2018  11:21 AM         37651 20-fake-images-20.jpg
-a----        8/21/2018   8:01 AM         85175 area-51-caller.jpg
-a----        7/30/2018   9:52 AM         177153 jets.JPG
-a----        8/21/2018   7:54 AM         137948 moon_landing_hoax.jpg

Directory: C:\IMAGES

Mode                LastWriteTime        Length Name
----                -------------        ------ ----
-a----         9/3/2018   2:58 PM        624744 Biking.jpg
-a----         9/3/2018   2:58 PM       1224201 Castle.JPG
-a----         9/3/2018   2:58 PM        446759 Cat.jpg
-a----         9/3/2018   2:58 PM        600630 Deutchland.JPG
-a----         9/3/2018   2:58 PM        304930 Disney.jpg
-a----         9/3/2018   2:58 PM         96831 dscn0011.jpg
-a----         9/3/2018   2:58 PM         98012 kinderscout.jpg
-a----         9/3/2018   2:58 PM        252607 Munich.JPG
-a----         9/3/2018   2:58 PM       3352190 Rome.jpg
-a----         9/3/2018   2:58 PM         91329 Turtle.jpg
-a----         9/3/2018   2:58 PM          5459 zzz.jpg

--- OUTPUT truncated for brevity
		
 

Пример B: Отображение скрытых системных файлов в c:\


PS C:\WINDOWS\system32> Get-ChildItem c:\ -Hidden -System

Directory: C:\
Mode                LastWriteTime        Length  Name
----                -------------        ------  ----
d--hs-         2/5/2017   1:43 PM                $Recycle.Bin
d--hs-        1/21/2019   4:09 PM                Config.Msi
d--hsl         2/5/2017   1:49 PM                Documents and Settings
d--hs-        1/31/2019   8:05 AM                System Volume Information
-arhs-        7/16/2016   7:43 AM        384322  bootmgr
-a-hs-        7/16/2016   7:43 AM             1  BOOTNXT
-a-hs-        1/12/2019  11:32 AM    5111406592  hiberfil.sys
-a-hs-        1/28/2019  11:20 PM    3891789824  pagefile.sys
-a-hs-       12/20/2018   1:56 PM     268435456  swapfile.sys
		

Вторая задача: Опрос сетевых настроек

 

Пример A: Получение основных сетевых настроек TCP


PS C:\WINDOWS\system32> Get-Help Get-NetIPConfiguration

NAME
    Get-NetIPConfiguration

SYNOPSIS
    Gets IP network configuration .

PS C:\WINDOWS\system32> Get-NetIPConfiguration -All

InterfaceAlias       : Ethernet
InterfaceIndex       : 8
InterfaceDescription : Realtek PCIe GBE Family Controller
NetProfile.Name      : hoz  3
IPv4Address          : 192.168.86.36
IPv6DefaultGateway   :
IPv4DefaultGateway   : 192.168.86.1
DNSServer            : 192.168.86.1
		
 

Пример B: Получение текущих соединений TCP


PS C:\WINDOWS\system32> Get-NetTCPConnection | select-object -Property LocalAddress, RemoteAddress, State, OwningProcess | Format-Table -AutoSize

LocalAddress  RemoteAddress        State OwningProcess
------------  -------------        ----- -------------
192.168.86.36 52.114.74.45   Established         67228
192.168.86.36 162.125.9.3      CloseWait        132676
192.168.86.36 162.125.33.7     CloseWait        132676
192.168.86.36 23.32.68.10    Established        156280
192.168.86.36 162.125.18.133 Established        132676
192.168.86.36 162.125.34.129 Established        132676
192.168.86.36 162.125.9.7      CloseWait        132676
192.168.86.36 17.249.156.16  Established         17736
192.168.86.36 162.125.18.133 Established        132676
192.168.86.36 162.125.9.4      CloseWait        132676
192.168.86.36 162.125.34.129 Established        132676
		

Третья задача: Опрос настроек межсетевого экрана

 

Пример A: Проверка текущего состояния локального межсетевого экрана


PS C:\WINDOWS\system32> get-Help Get-NetFirewallProfile

NAME
    Get-NetFirewallProfile

SYNOPSIS

    Displays settings that apply to the per-profile configurations of the Windows Firewall with Advanced Security.

PS C:\WINDOWS\system32> Get-NetFirewallProfile | Select-Object -Property Enabled, Profile

Enabled Profile
------- -------
   True Domain
   True Private
   True Public
		

Глава 2. Конвейеры PowerShell

В Главе 2 будут применяться CmdLet Start и Stop Transcript для перехвата резульатов всех выводов CmdLet. Получаемые в результате стенографические записи добавлены в конце данного раздела с неким выбором CmdLet для наших экспериментов.


PS C:\WINDOWS\system32> Get-Help Start-Transcript

NAME
    Start-Transcript

SYNOPSIS
    Creates a record of all or part of a Windows PowerShell session to a text file.

PS C:\WINDOWS\system32> Get-Help Stop-Transcript

NAME
    Stop-Transcript

SYNOPSIS
    Stops a transcript.

PS C:\WINDOWS\system32> Start-Transcript c:\PS\Transcript\transcript.txt

Transcript started, output file is c:\PS\Transcript\transcript.txt
		

Стенографирование команд и откликов

Отметим: некоторые выводы сокращены.


**********************
Windows PowerShell transcript start
Start time: 20190131103013
Username: PYTHON-3\cdhsl
RunAs User: PYTHON-3\cdhsl
Configuration Name:
Machine: PYTHON-3 (Microsoft Windows NT 10.0.17134.0)
Host Application: C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe
Process ID: 41620
PSVersion: 5.1.17134.407
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.17134.407
BuildVersion: 10.0.17134.407
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Transcript started, output file is c:\PS\Transcript\transcript.txt
PS C:\WINDOWS\system32> Get-Process -ComputerName .

Handles  NPM(K)    PM(K)   WS(K)      CPU(s)      Id  SI  ProcessName
-------  ------    -----   -----      ------      --  --  -----------
    470      22     6524    4172    2,793.53   55708   2  AdobeCollabSync
    277      14     2692     708        0.17   56592   2  AdobeCollabSync
    238      23     9184     156        0.23  113824   2  ApplePhotoStreams
    487      28    19988   22108       14.77   79164   2  ApplicationFrameHost
    166       9     2084     100        0.09  183548   2  AppVShNotify
    157       8     1804     104        0.02  209908   0  AppVShNotify
    375      25     5160    2020        2.17   17736   2  APSDaemo
   1326      74   232108  173896       43.73  184112   2  POWERPNT
   1210      86   380800  397292      240.86   41620   2  powershell_ise
    941      91    50384   10732        3.31  166420   0  PRSvc
    307      28    31836    1536        1.66   35788   2  QtWebEngineProcess
    339      15     6444    3408        3.67   12076   2  RAVBg64
    345      16     7136    4712        3.77   23452   2  RAVBg64
    608      26    19760    1536        0.41    6204   0  RealSenseDCM
      0      14     1388   20876      167.36      96   0  Registry
    449      20    10136   15780        9.48   17068   2  RemindersServer
    220       9     1792     160        0.08    2540   0  RtkAudioService64
    126       9     1532     528        0.05  216496   2  rundll32
    120       7     1384    6136        0.00  168436   0  SearchFilterHost
   1241      83    57844   54048       52.45  161508   0  SearchIndexer
     52       3      504     208        0.41     452   0  smss
    220      13     5172    5116      223.39    2364   0  svchost
    155       9     1696     424        0.09   14104   2  TUAutoReactivator64
    329      20     6296    11196     851.14   60052   2  TuneUpUtilitiesApp64
   1167      34    46024    32928  12,831.14   63708   0  TuneUpUtilitiesService64
    198      14     2912     3408       2.34    4224   0  UploaderService
    124       8     1400      316       0.52   15912   2  WavesSvc64
    110       8     2624      156       0.02    4380   0  WavesSysSvc64
    156      10     1528       36       0.02     724   0  wininit
    247      10     2668     2528       3.83  215952   2  winlogon
   1754      91   200124   197816     415.23   67228   2  WINWORD
    343      14    15340    13956     971.41   15696   0  WmiPrvSE
    308      17    11144     8360     319.03   24228   0  WmiPrvSE
    237      10     2348      764       0.61  132372   0  WUDFHost

PS C:\WINDOWS\system32> Get-Process -Name chrome

Handles  NPM(K)    PM(K)    WS(K)     CPU(s)      Id  SI  ProcessName
-------  ------    -----    -----     ------      --  --  -----------
    271      21    18696    24180       0.16   26420   2  chrome
    338      32    94600    49056      11.11   48132   2  chrome
    273      25    36024    36760       1.44   76284   2  chrome
    558      30    92792    67576      26.75   83340   2  chrome
    343      30    80788    87232       3.33   88260   2  chrome
    266      19    13940    17364       0.08  115852   2  chrome
    142      11     1988     7236       0.05  128480   2  chrome
    356      33    97140    78868       3.84  128952   2  chrome
    223      10     2100     7252       0.03  148004   2  chrome
    267      21    21652    23044       0.25  149520   2  chrome
    273      22    26964    26600       0.30  197144   2  chrome
   1639      73   115292   110896      64.27  214792   2  chrome

PS C:\WINDOWS\system32> Get-MpThreat

None reported

PS C:\WINDOWS\system32> get-service | where-object {$_.Status -eq "Stopped"}

Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
Stopped  AppReadiness       App Readiness
Stopped  AppVClient         Microsoft App-V Client
Stopped  AppXSvc            AppX Deployment Service (AppXSVC)
Stopped  AssignedAccessM... AssignedAccessManager Service
Stopped  AxInstSV           ActiveX Installer (AxInstSV)
Stopped  BcastDVRUserSer... GameDVR and Broadcast User Service_...
Stopped  BDESVC             BitLocker Drive Encryption Service
Stopped  BluetoothUserSe... Bluetooth User Support Service_2a63...
Stopped  Bonjour Service    Bonjour Service
Stopped  CaptureService_... CaptureService_2a637185
Stopped  CertPropSvc        Certificate Propagation
Stopped  ssh-agent          OpenSSH Authentication Agent
Stopped  SupportAssistAgent Dell SupportAssist Agent
Stopped  svsvc              Spot Verifier
Stopped  swprv              Microsoft Software Shadow Copy Prov...
Stopped  TermService        Remote Desktop Services
Stopped  TieringEngineSe... Storage Tiers Management
Stopped  TrustedInstaller   Windows Modules Installer
Stopped  tzautoupdate       Auto Time Zone Updater
Stopped  UevAgentService    User Experience Virtualization Service
Stopped  UmRdpService       Remote Desktop Services UserMode Po...
Stopped  upnphost           UPnP Device Host
Stopped  VacSvc             Volumetric Audio Compositor Service
Stopped  vds                Virtual Disk
Stopped  VMAuthdService     VMware Authorization Service
Stopped  vmicguestinterface Hyper-V Guest Service Interface
Stopped  vmicheartbeat      Hyper-V Heartbeat Service
Stopped  vmickvpexchange    Hyper-V Data Exchange Service
Stopped  vmicrdv            Hyper-V Remote Desktop Virtualizati...
Stopped  vmicshutdown       Hyper-V Guest Shutdown Service
Stopped  vmictimesync       Hyper-V Time Synchronization Service
Stopped  vmicvmsession      Hyper-V PowerShell Direct Service
Stopped  vmicvss            Hyper-V Volume Shadow Copy Requestor
Stopped  VMnetDHCP          VMware DHCP Service
Stopped  VMUSBArbService    VMware USB Arbitration Service
Stopped  VMware NAT Service VMware NAT Service

PS C:\WINDOWS\system32> Get-Location

Path
----
C:\WINDOWS\system32

PS C:\WINDOWS\system32> Set-Location C:\PS

PS C:\PS> Test-NetConnection

ComputerName           : internetbeacon.msedge.net
RemoteAddress          : 13.107.4.52
InterfaceAlias         : Ethernet
SourceAddress          : 192.168.86.36
PingSucceeded          : True
PingReplyDetails (RTT) : 24 ms

PS C:\PS> Get-Disk | Format-List *

DiskNumber            : 0
PartitionStyle        : GPT
ProvisioningType      : Fixed
OperationalStatus     : Online
HealthStatus          : Healthy
BusType               : SATA
UniqueIdFormat        : FCPH Name
OfflineReason         :
UniqueId              : 5000039751D8A26D
AdapterSerialNumber   :
AllocatedSize         : 1000203837440
BootFromDisk          : True
FirmwareVersion       : AX0P3D
FriendlyName          : TOSHIBA MQ01ABD100
Guid                  : {ea267102-e3e3-4a17-b349-e5e0161bc012}
IsBoot                : True
IsClustered           : False
IsHighlyAvailable     : False
IsOffline             : False
IsReadOnly            : False
IsScaleOut            : False
IsSystem              : True
LargestFreeExtent     : 1048576
Location              : Integrated : Adapter 0 : Port 0
LogicalSectorSize     : 512
Manufacturer          :
Model                 : TOSHIBA MQ01ABD100
Number                : 0
NumberOfPartitions    : 6
Path                  : \\?\scsi#disk&ven_toshiba&prod_mq01abd100#4&1b6d0cbc&0&000000#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
PhysicalSectorSize    : 4096
SerialNumber          :            X6LSTAXNT
Signature             :
Size                  : 1000204886016
PSComputerName        :
CimClass              : ROOT/Microsoft/Windows/Storage:MSFT_Disk
CimInstanceProperties : {ObjectId, PassThroughClass, PassThroughIds, PassThroughNamespace...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties
DiskNumber            : 2
PartitionStyle        : MBR
ProvisioningType      : Fixed
OperationalStatus     : Online
HealthStatus          : Healthy
BusType               : USB
UniqueIdFormat        : Vendor Specific
OfflineReason         : USBSTOR\DISK&VEN_DYMO&PROD_PNP&REV_1.00\7&347EDADD&0&15314622032011&0:PYTHON-3
AdapterSerialNumber   :
AllocatedSize         : 4193792
BootFromDisk          : False
FirmwareVersion       : 1.00
FriendlyName          : DYMO PnP
Guid                  :
IsBoot                : False
IsClustered           : False
IsHighlyAvailable     : False
IsOffline             : False
IsReadOnly            : False
IsScaleOut            : False
IsSystem              : False
LargestFreeExtent     : 0
Location              : Integrated : Adapter 0 : Port 0
LogicalSectorSize     : 512
Manufacturer          : DYMO
Model                 : PnP
Number                : 2
NumberOfPartitions    : 1
PhysicalSectorSize    : 512
SerialNumber          : 15314622032011
Signature             : 6975421
Size                  : 4193792
PSComputerName        :
CimClass              : ROOT/Microsoft/Windows/Storage:MSFT_Disk
CimInstanceProperties : {ObjectId, PassThroughClass, PassThroughIds, PassThroughNamespace...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties

PS C:\PS> Stop-Transcript

**********************
Windows PowerShell transcript end
End time: 20190131103856
**********************
		

Глава 3. Исследование целеполагания сценариев PowerShell


PS C:\WINDOWS\system32> Get-ChildItem c:\ -Hidden -System#
# Simple file Inventory Script
#
# Function to convert size values to human readable
function GetMBSize($num)
{
    $suffix = "MB"
    $MB = 1048576
    $num = $num / $MB
    "{0:N2} {1}" -f $num, $suffix
}

# Set Report Title
$rptTitle = "File Inventory"
# Get the current date and tme
$rptDate=Get-Date

# Set the target Directory and parameters
$targetDirectory = "c:\"

# Create HTML Header Section
$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
<p>
<b> $rptTitle</b>
<p>
<b> Date: $rptDate </b>
<p>
<b> Target: $targetDirectory </b>
<p>
"@

# Provide script output for user
Write-Host "Create Simple File Inventory"
$dir = Get-ChildItem $targetDirectory -File

# Create an empty array to hold values
$outArray = @()

# Loop through each file found
foreach ($item in $dir)
{
    # create and object to hold item values from separate CmdLets
    $tempObj = "" | Select "FileName", "Attribute", "Size", "HashValue"

    # Get the fullname including path
    $fullName  = $item.FullName

    # Get the attributes assoicated with this file
    $attributes = $item.Attributes
    $size       = GetMBSize($item.Length)

    # Generate the SHA-256 Hash of the file
    $hashObj = Get-FileHash $fullName -ErrorAction SilentlyContinue

    # Get just the Hash Value
    $hashValue = $hashObj.Hash

    # if hash value could not be generated set to Not Available
    if ([string]::IsNullOrEmpty($hashValue))
    {
        $hashValue = "Not Available"
    }

    # Fill in the tempObj
    $tempObj.FileName  = $fullName
    $tempObj.Attribute = $attributes
    $tempObj.Size      = $size
    $tempObj.HashValue = $hashValue

    # Add the tempObj to the outArray
    $outArray += $tempObj

    # Clear the output array
    $tempObj = $null
}

$outArray | ConvertTo-Html -Head $Header -Property FileName, Attribute, Size, HashValue |
 Out-File test.html

#$outArray | ConvertTo-Html | out-file test.html
Write-Host "Script Completed"
Write-Host "test.html created"
		

Образец вывода сценария PowerShell


PS C:\PS> C:\PS\testInventory.ps1
Create Simple File Inventory
Scan the C: Drive for Hidden and System Files Only
Script Completed
test.html created

PS C:\PS>
		

Снимки экрана HTML

 

Рисунок A-1



[Замечание]Замечание

Добавляя в команду Get-Childitem параметр -System вы должны получить системные файлы из каталога c:\ directory .

 

Рисунок A-2



[Замечание]Замечание

Изменив $targetFolder своего сценария и добавляя в команду Get-Childitem параметр -Recurse,вы способны обработать всё устройство c:\. Запуская свой сценарий для папки c:\PS\ с включённым параметром -Recurse мы получаем приводимый ниже результат (обрезанный для краткости).

[Замечание]Замечание

Изменив переменную $MB на $KB = 1024, вы затем можете воспроизвести результаты в килоБайтах, изменить свой сценарий и попробовать его.

 

Рисунок A-3



Кроме того, воспользовавшись CmdLet Invoke-Command вы можете расширить данный пример для сбора файла инвентаризации удалённых систем.

Глава 4. Python и расследования/ выборка сведений в реальном времени

Выполнение удалённых команд PowerShell непосредственно из Python:

Пример A: Получение удалённых процессов из PLUTO


import subprocess
runningProcess = subprocess.check_output("PowerShell -Executionpolicy byPass
                 -Command Invoke-Command -ComputerName PLUTO -Credential PLUTO\Remote-Admin -ScriptBlock {Get-Process}")

print runningProcess.decode()
		
 

Образец выполнения

 

Рисунок A-4



 

Рисунок A-5



Пример B: Получение удалённых служб из PLUTO


import subprocess
runningServices = subprocess.check_output("PowerShell -Executionpolicy byPass
                 -Command Invoke-Command -ComputerName PLUTO -Credential PLUTO\Remote-Admin -ScriptBlock {Get-Service}")

print runningServices.decode()
		
 

Рисунок A-6



Пример C: Получение удалённой настройки IP из PLUTO


import subprocess
ipConfig = subprocess.check_output("PowerShell -Executionpolicy byPass
                 -Command Invoke-Command -ComputerName PLUTO -Credential PLUTO\Remote-Admin -ScriptBlock { Get-NetIPConfiguration -All}")

print ipConfig.decode()
		
 

Рисунок A-7



Глава 5. Пример расследования PowerShell/ Python

Изучение предоставленных в Главе 6 сценариев предоставит все необходимые методы, требующиеся для завершения и развития данной задачи. Я призываю вас выполнить её самостоятельно.