
Pour PowerShell 5.1 et versions ultérieures. Écrit par Kjetil Sigvartsen chez 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
Pour PowerShell 5.1 et versions ultérieures. Écrit par Kjetil Sigvartsen chez Norsk helsenett SF.
Ce script peut être plus intensif en CPU, mais sera considérablement plus rapide que la variante ci-dessus. Notez que C:\Windows est également filtré pour des raisons de rapidité.
Si une sortie plus détaillée est souhaitée, ajoutez ce qui suit en haut du script :
$VerbosePreference = 'Continue'
Le code est par ailleurs le suivant :
[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 \;
Les scripts listeront les fichiers qui sont, ou contiennent, la bibliothèque struts2 core. Quelques exemples :
/chemin/vers/dossier/struts2-core-6.3.0.2.jar - ici la bibliothèque struts2 core se trouve directement sur le système de fichiers, et la version est 6.3.0.2, où la vulnérabilité est corrigée.
/chemin/vers/dossier/apps/struts2-showcase-6.3.0.2.war - ici la bibliothèque struts2 core se trouve à l'intérieur du fichier .war, et son contenu doit être listé pour voir quelle version de Struts2 est incluse :
$ unzip -l /chemin/vers/dossier/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
Pour PowerShell 5.1 et versions ultérieures. Écrit par Kjetil Sigvartsen chez Norsk helsenett SF.
[string[]]$ZipFiles = @(
'C:\chemin\vers\dossier\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