gundoghunt-alertpresentation.ps1

# load config
. $PSScriptRoot\get-config.ps1

#Main function to PRESENT the data
function displayHeader {
    param (
        [string]$menuText
    )
    $logoColor="green"
    [console]::ForegroundColor = $logoColor
    if(!$debugOn)
    {
        Clear-Host
    }
    write-host " gggggg " 
    write-host " gggggg "       
    write-host " gggggg "       
    write-host " ggggggg "      
    write-host " %ggggggg ggggggggg "     
    write-host " gggggggggggg. %ggggggg gggg "  
    write-host " ggggggggggg ggggggg gggg "   
    write-host " ggggggggggggggg ggggg " 
    write-host " ggggggggggggg ggggg " 
    write-host " ggggggggggggggggggggggggggggggg% "
    write-host " gggggggggggggggggggggggggggggggg "
    write-host " ggggggggggggggggggggggggggggg "
    write-host " ggggggggggggggggggggg g "
    write-host " gggggggggggggggggg . "
    write-host " ggggggggggggggggggggg "
    write-host " gggggggggggggggggggg "
    write-host " ggggggggggggggggggg "
    write-host " gggggggggggggggggggg "
    write-host " *ggggggggggggggggggg "
    write-host " ggggggggggggggggggggg "
    write-host " gggggggggggggggggggg% "
    write-host " gggggggggggggggggg "
    write-host " ggggggggggggggggggggg "
    write-host " gggggggggggggggggggggg "
    write-host " gggggggggggg /ggggggggg "
    write-host " gggggggggg ggggggggg ,gggggg "
    write-host " ggggggggggg gggggggg . gggggggggg<●>gg/ "
    write-host " gggggggggg gggggggg %gggggggggggggggggggggggggggggggggggggggggg,* "
    write-host " gggggggg gggggggg gggggggggggggggggggggggggggggggggg "
    write-host " ggggggggg gggggggg gggggggggggggggggggggggggggggggg, "
    write-host " gggggggg %gggggggg ggggggggggg gggggggggggggggg% "
    write-host " ggggggg ggggggggg /gggggggggg/ ,ggggggggggg "
    write-host " gggggggg gggggggg gggg gggg/ gg/ /gggg "
    write-host " ggggggg ggggggg ggg ggg 8I gg g "
    write-host "ggggggggg .gggggggg ggg 8I *gg gg "
    write-host " %gggggg gggggggggg gg 8I *gg "
    write-host " gggggg *g/ ggggggg .g 8I gggg "
    write-host "ggggg ,gg gg gg ,ggg ggg. .gggg.8I ,ggggg. ,gggg,gg "
    write-host "dP Y8I I8 8I ,8 8P 8, dP Y8I dP Y8gggdP Y8I "
    write-host "i8 ,8I I8. .8I I8 8I 8I i8 .8I i8 ,8I i8 .8I "
    write-host "d8 d8I d8b d8b dP 8I Yb d8 d8b d8 d8 d8 d8I "
    write-host  "P Y8888P.8888P..Y88P..Y88P. 8I .Y8P.Y8888P..Y8P.Y8888P P.Y8888P.888 "    
    write-host  " .d8I. d8I "
    write-host  " .dP-8I ,dP.8I "
    write-host  " .8 8I .8 8I "
    write-host  " I8 8I I8 8I "
    write-host  " .8 8I .8 8I "   
    write-host  " .Y8P. .Y8P "
    Write-Host 
    Write-Host  "Version 2.0 | February 2022 | (C) @jangeisbauer | Happy Hunting" 
    [console]::ForegroundColor = "White"
    write-host $versionText
    Write-Host
    write-host $menuText
    Write-Host
    Write-Host
}
# custom prompt
function Read-HostCustom{
    param($Prompt)
    Write-Host $Prompt -NoNewLine
    $Host.UI.ReadLine()
}
# gundog hunting alert presentation (v1 functionality)
function get-alertDataResults {
    if(!$debugOn)
    {
        Clear-Host
    }
    if($null -ne $alert)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor red
        Write-host Tenant: $CurrentTenant
        $tempAlertTitle = "[" + $plainalert.severity + "] " + $alert.Title   
        Write-Host "$tempAlertTitle (more info via `$alert)"  -ForegroundColor red       
        $alertTime = get-date($alert.Timestamp)
        Write-Host $alertTime
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor red
        Write-Host
        Write-Host "Category:" $alert.category "| Detection Source:" $alert.DetectionSource "| Investigation: " $plainalert.investigationState "| Status: " $plainalert.status
        Write-Host 
    }
    if($null -ne $plainalert)
    {
        $global:Incident = $allIncidents | Where-Object{$_.incidentid -eq $plainalert.incidentId}
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor darkyellow
        $incidentName = $Incident.incidentName 
        Write-Host "Associated Incident: $incidentName (more info via `$Incident)"  -ForegroundColor darkyellow      
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor darkyellow
        Write-Host
        Write-Host "Incident ID:" $Incident.incidentId " | Incident Severity:" $Incident.Severity  
        Write-Host
        if($Incident.alerts.count -gt 1)
        {
            Write-Host "Other Alerts in this Incident:" -ForegroundColor darkyellow
            Write-Host
            foreach ($incidentAlert in $Incident.alerts) {
                if($incidentAlert.alertId -ne $plainalert.alertId)
                {
                    Write-Host "Alert Name:" $incidentAlert.title
                    Write-Host "AlertID:" $incidentAlert.alertID
                    Write-Host "Severity:" $incidentAlert.severity
                    Write-Host "Service Source:" $incidentAlert.serviceSource
                    Write-Host "Creation Time:" $incidentAlert.creationTime
                    Write-Host "Status:" $incidentAlert.status
                    write-Host "Classification:" $incidentAlert.classification
                    write-Host "Assigned To:" $incidentAlert.assignedTo
                    Write-Host
                }
            }
        }
        else {
            Write-Host "The alert is the only alert in this incident."
            Write-Host 
        }
    }
    if($null -ne $alert.EmailSubject)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "Email-Alert (more info via `$alert)"  -ForegroundColor green   
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "EmailSubject:" $alert.EmailSubject
        Write-Host "EmailP1Sender:" $alert.EmailP1Sender 
        Write-Host "EmailP2Sender:" $alert.EmailP2Sender
        Write-Host "EmailSenderIP:" $alert.EmailSenderIP 
        Write-Host "EmailThreats:" $alert.EmailThreats 
        Write-Host "EmailThreatIntelligence:" $alert.EmailThreatIntelligence 
        Write-Host "EmailDeliveryAction:" $alert.EmailDeliveryAction 
        Write-Host "EmailDeliveryLocation:" $alert.EmailDeliveryLocation 
        Write-Host
    }
    if($null -ne $alert.Entities.ProcessCommandLine)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "Process Alert (more info via `$alert)"  -ForegroundColor green   
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "File Name:" $alert.Entities.fileName
        Write-Host "File Path:" $alert.Entities.filePath
        Write-Host "Process Command Line:" $alert.Entities.ProcessCommandLine 
        Write-Host
    }
    if($null -ne $alert.filename -or $null -ne $alert.sha256 -or $null -ne $alert.folderpath -or $null -ne $alert.sha1)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "Files (more info via `$filesApiInfo and `$filesApiStats)"  -ForegroundColor green   
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "FileName:" $alert.filename 
        Write-Host "Folderpath:" $alert.folderpath 
        Write-Host "SHA1:" $alert.sha1
        Write-Host "SHA256:" $alert.sha256 
        Write-Host
        if($null -ne $filesApiInfo)
        {
            if($filesApiInfo.GetType().Name -eq "Object[]")
            {
                foreach ($fi in $filesApiInfo) {
                    Write-Host Global Prevalence: $fi.globalPrevalence
                    Write-Host Global First Observed: $fi.globalFirstObserved
                    Write-Host File Size: $fi.size
                    Write-Host File Product Name: $fi.fileProductName
                    Write-Host Signer: $fi.signer
                    Write-Host Issuer: $fi.issuer
                    Write-Host Is Valid Cert: $fi.isValidCertificate
                    Write-Host
                }
            }
            else {
                Write-Host Global Prevalence: $filesApiInfo.globalPrevalence
                Write-Host Global First Observed: $filesApiInfo.globalFirstObserved
                Write-Host File Size: $filesApiInfo.size
                Write-Host File Product Name: $filesApiInfo.fileProductName
                Write-Host Signer: $filesApiInfo.signer
                Write-Host Issuer: $filesApiInfo.issuer
                Write-Host Is Valid Cert: $filesApiInfo.isValidCertificate
                Write-Host
            }
        }
        if($null -ne $filesApiStats)
        {
            if($filesApiStats.GetType().Name -eq "Object[]")
            {
                foreach ($fs in $filesApiStats) {
                    Write-Host Org Prevalence: $fs.orgPrevalence
                    Write-Host Org First Obeserved: $fs.orgFirstSeen
                    Write-Host
                }
            }
            else {
                Write-Host Org Prevalence: $filesApiStats.orgPrevalence
                Write-Host Org First Obeserved: $filesApiStats.orgFirstSeen
                Write-Host
            }
        }
        
    }

    if($null -ne $alert.Remoteurl -or $null -ne $alert.urls)
    {
        if($alert.urls -ne "about:internet")
        {
            if($null -ne $alert.Remoteurl) {$url = $alert.Remoteurl}
            if($null -ne $alert.urls) {$url = $alert.urls}
            Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
            Write-Host "URLs (more info via `$urlScan & `$urlScanResultUrl)" -ForegroundColor green
            Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
            Write-Host $alert.url
            Write-Host
            
            if($url.GetType().Name -eq "Object[]")
            {
                foreach ($u in $url) {
                    get-urlInfo -url $u
                    if($null -ne $urlScan -and $urlScan -ne "")
                    {
                        Write-Host $u -ForegroundColor Yellow
                        write-host $urlScanResult 
                        if($null -ne $urlScan.verdicts.overall)
                        {
                            Write-Host Malicious: $urlScan.verdicts.overall.malicious
                            $ipsTemp = $urlScan.lists.ips | Select-Object -First 10
                            Write-Host IPs: $ipsTemp
                            $countryTemp = $urlScan.lists.countries | Select-Object -First 10
                            Write-Host Countries: $countryTemp
                            $cityTemp = $urlScan.page.city | Select-Object -First 10
                            Write-Host City: $cityTemp
                            $domainsTemp = $urlScan.lists.Domains | Select-Object -First 10
                            Write-Host Domains: $domainsTemp
                            $serverTemp = $urlScan.lists.servers | Select-Object -First 10
                            Write-Host Server: $serverTemp
                            $certsTemp = $urlScan.lists.certificates | Select-Object -First 10
                            Write-Host Certificates: $certsTemp
                            write-host
                        }
                    }
                    else {
                        Write-Host $u -ForegroundColor Yellow
                        write-host "No results from URLScan.io"
                    }
                }
            }else 
            {
                get-urlInfo -url $url
                if($null -ne $urlScan -and $urlScan -ne "")
                {
                    Write-Host $url -ForegroundColor Yellow
                    write-host $urlScanResult
                    if($null -ne $urlScan.verdicts.overall)
                    {
                        Write-Host Malicious: $urlScan.verdicts.overall.malicious
                        $ipsTemp = $urlScan.lists.ips | Select-Object -First 10
                        Write-Host IPs: $ipsTemp
                        $countryTemp = $urlScan.lists.countries | Select-Object -First 10
                        Write-Host Countries: $countryTemp
                        $cityTemp = $urlScan.page.city | Select-Object -First 10
                        Write-Host City: $cityTemp
                        $domainsTemp = $urlScan.lists.Domains | Select-Object -First 10
                        Write-Host Domains: $domainsTemp
                        $serverTemp = $urlScan.lists.servers | Select-Object -First 10
                        Write-Host Server: $serverTemp
                        $certsTemp = $urlScan.lists.certificates | Select-Object -First 10
                        Write-Host Certificates: $certsTemp
                        write-host
                    }
                }
                else {
                    Write-Host $url -ForegroundColor Yellow
                    write-host "No results from URLScan.io"
                }
            }
            Remove-Variable url -ErrorAction SilentlyContinue
            Remove-Variable urlScan -ErrorAction SilentlyContinue
            Remove-Variable urlScanResult -ErrorAction SilentlyContinue
            Write-Host
        }
    }
    if($null -ne $device)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "Device (more info via `$Device)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $device  | Out-Host
    }
    if($null -ne $user)
    {
        Write-Host
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "User (more info via `$User)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $user  | Out-Host
    }
    if($null -ne $riskySignIns)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "Risky SignIns (more info via `$riskySignIns)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $riskySignIns.value | Sort-Object Timestamp -Descending | Format-Table @{Name="Time";expression={get-date($_.activityDateTime)}}, riskType, riskEvent, riskLevel, @{Name="City";expression={$_.location.city}}, @{Name="State";expression={$_.location.state}}, @{Name="Country";expression={$_.location.countryorregion}} | Out-Host
        Write-Host
        if($riskySignIns.value.Count -eq 0)
        {
            $AccountName = $user.accountname
            Write-Host "No Risky SignIns for" $AccountName
            Write-Host
        }
    }
    if($null -ne $network)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "Network (more info via `$Network)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $network | Select-Object -Last $numberOfEvents -ErrorAction SilentlyContinue | Sort-Object Timestamp -Descending | Where-Object{$_.remoteurl -ne "" -and $_.remoteurl -notmatch $notMatchThese} | Format-Table @{Name="Time";expression={get-date($_.TimeStamp)}},InitiatingProcessFileName, @{Name="Country";expression={($ipGeoInfo -match $_.RemoteIP).Country}},@{Name="City";expression={($ipGeoInfo -match $_.RemoteIP).City}}, RemoteIP, RemotePort, RemoteUrl | Out-Host
    }
    if($null -ne $processes)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "Processes (more info via `$Processes)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $processes | Select-Object -Last $numberOfEvents -ErrorAction SilentlyContinue | Sort-Object Timestamp -Descending | Format-Table @{Name="Time";expression={get-date($_.TimeStamp)}}, ActionType, FolderPath, ProcessCommandLine, InitiatingProcessAccountName | Out-Host
    }
    if($null -ne $vulnerabilities)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "Vulnerabilities (more info via `$vulnerabilities)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $criticalVuln=$vulnerabilities | Where-Object {$_.severity -eq "Critical"} | Format-Table cveId, productName, ProductVendor, ProductVersion, severity | Out-Host
        $criticalVuln
        Write-Host
        if($criticalVuln.Count -eq 0)
        {
            $deviceName = $device.name 
            Write-Host "No critical vulnerabilities on $deviceName"
            Write-Host
        }
    }
    if($null -ne $signins)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "SignIns (more info via `$signins)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        Write-Host "User City:" $user.city "User Country:" $user.country -ForegroundColor yellow
        $signins | Select-Object -Last $numberOfEvents -ErrorAction SilentlyContinue | Sort-Object Timestamp -Descending | Format-Table @{Name="Time";expression={get-date($_.TimeStamp)}}, Application, LogonType, AccountUpn, DeviceName, Country, City, IPAddress  | Out-Host
    }
    if($null -ne $emails)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "Emails (more info via `$emails)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $emails | Select-Object -Last $numberOfEvents -ErrorAction SilentlyContinue | Sort-Object Timestamp -Descending | Format-Table @{Name="Time";expression={get-date($_.TimeStamp)}}, SenderFromAddress, RecipientEmailAddress, Subject, Url, FileName  | Out-Host
    }
    if($null -ne $office)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "Office (more info via `$Office)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $office | Select-Object -Last $numberOfEvents -ErrorAction SilentlyContinue | Sort-Object Timestamp -Descending | Format-Table @{Name="Time";expression={get-date($_.TimeStamp)}}, Application, FileName, DeviceName, ISP | Out-Host
    }
    if($null -ne $allalerts)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "All Alerts (more info via `$allalerts)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $allIncidents.alerts | Where-Object{$_.devices.devicednsname -eq $alert.devicename -or $_.entities.accountname -eq $alert.accountname} | Format-Table @{Name="Time";expression={get-date($_.creationTime)}}, Title, Severity, status, DetectionSource | out-host
    }
    if($null -ne $registry)
    {
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        write-host "Registry (more info via `$Registry)" -ForegroundColor green
        Write-Host ------------------------------------------------------------------------------------------------------------------------- -ForegroundColor green
        $registry | Select-Object -Last $numberOfEvents -ErrorAction SilentlyContinue | Where-Object {$_.RegistryValueName -ne ""} | Sort-Object Timestamp -Descending | Format-Table @{Name="Time";expression={get-date($_.TimeStamp)}}, RegKey, RegistryValueName, RegistryValueData, InitiatingProcessCommandLine | Out-Host
    }
}