
Erkennungsskripte für CVE-2023-50164 in Apache Struts2, die PowerShell- und Bash-Tools bereitstellen, um anfällige Versionen über Dateisysteme und Archive hinweg zu scannen.
Für PowerShell 5.1 und neuer. Geschrieben von Kjetil Sigvartsen in Norsk helsenett SF.
[String[]]$Extensions = @('*.jar', '*.war', '*.ear')
[string]$searchString = 'struts2-core'
foreach ($Disk in (Get-CimInstance Win32_LogicalDisk)) {
[string]$DriveLetter = $Disk.DeviceID
[string]$Path = "$($driveLetter)\"
foreach ($ChildItem in (Get-ChildItem -Path $Path -Recurse -Include $Extensions -File -ErrorAction SilentlyContinue)) {
[String]$FilePath = $ChildItem.FullName
$Content = Get-Content -Path $filePath -Raw
if ($Content -like "*$searchString*") {
Write-Output $filePath
} #if
} #foreach
} #foreach
Für PowerShell 5.1 und neuer. Geschrieben von Kjetil Sigvartsen in Norsk helsenett SF.
Dieses kann etwas CPU-intensiver sein, wird aber wesentlich schneller sein als die Variante oben. Beachten Sie, dass C:\Windows aus Geschwindigkeitsgründen ebenfalls herausgefiltert wird.
Falls eine detailliertere Ausgabe gewünscht wird, fügen Sie Folgendes am Anfang des Skripts ein:
$VerbosePreference = 'Continue'
Der Code lautet wie folgt:
[String[]]$Extensions = @('*.jar', '*.war', '*.ear')
[string]$searchString = 'struts2-core'
[string[]]$Exceptions = @('C:\Windows')
foreach ($Disk in (Get-CimInstance Win32_LogicalDisk)) {
[string]$DriveLetter = $Disk.DeviceID
[string]$Path = "$($driveLetter)\"
Write-Verbose -Message "Working on $Path"
try {
[System.IO.DirectoryInfo[]]$Folders = Get-ChildItem -Path $Path -Directory -ErrorAction Stop
} #try
catch {
Write-Verbose -Message "Unable to get child folders in disk $Path"
continue
} #catch
[System.Management.Automation.Job[]]$Jobs = $Null
[System.Management.Automation.Job[]]$Jobs = foreach ($Folder in $Folders) {
[string]$JobName = $Path + $Folder.Name
if ($Exceptions -contains $JobName) {
Write-Verbose -Message "Skipping $JobName, in exception list"
continue
} #if
Write-Verbose -Message "Starting jobs for $JobName"
Start-Job -Name $JobName -ScriptBlock {
Return (Get-ChildItem -Path $Using:JobName -Recurse -Include $Using:Extensions -File -ErrorAction SilentlyContinue)
} #Start-Job
} #Foreach
[System.Object[]]$JobResults = $Null
[System.Object[]]$JobResults = Receive-Job -Job $Jobs -AutoRemoveJob -Wait -ErrorAction Stop
[System.Management.Automation.Job[]]$RemainingJobs = $Null
[System.Management.Automation.Job[]]$RemainingJobs = get-Job -Name "$Path*" -ErrorAction Stop
if ($RemainingJobs) {
Write-Verbose -Message "$($RemainingJobs.count) jobs remaining"
} #if
foreach ($ChildItem in $JobResults) {
[String]$FilePath = $ChildItem.FullName
[string]$Content = Get-Content -Path $filePath -Raw
if ($Content -like "*$searchString*" -or $FilePath -like "*$searchString*") {
Write-Output $filePath
} #if
} #foreach
} #foreach
sudo find / -type f \( -iname "*.jar" -o -iname "*.war" -o -iname "*.ear" \) -exec grep -Fl "struts2-core" {} 2>/dev/null \;
Die Skripte listen Dateien auf, die die struts2-core-Bibliothek sind oder enthalten. Ein paar Beispiele hierfür:
/sti/til/mappe/struts2-core-6.3.0.2.jar - hier liegt die struts2-core-Bibliothek direkt im Dateisystem und die Version ist 6.3.0.2, bei der die Schwachstelle behoben ist.
/sti/til/mappe/apps/struts2-showcase-6.3.0.2.war - hier liegt die struts2-core-Bibliothek innerhalb der .war-Datei, wo der Inhalt aufgelistet werden muss, um zu sehen, welche Version von Struts2 enthalten ist:
$ unzip -l /sti/til/mappe/apps/struts2-showcase-6.3.0.2.war | fgrep struts2-core
1519992 2023-12-05 05:58 WEB-INF/lib/struts2-core-6.3.0.2.jar
Für PowerShell 5.1 und neuer. Geschrieben von Kjetil Sigvartsen in Norsk helsenett SF.
[string[]]$ZipFiles = @(
'C:\sti\til\mappe\apps\struts2-showcase-6.3.0.2.war'
)
Add-Type -AssemblyName System.IO.Compression.FileSystem
foreach ($ZipFile in $ZipFiles) {
foreach ($Entry in ([System.IO.Compression.ZipFile]::OpenRead($zipFile).Entries)) {
if ($Entry.FullName -like "*struts2-core*") {
Write-Output $Entry.FullName
} #if
} #foreach
} #foreach