
Scripts de detección y guía para la vulnerabilidad CVE-2022-22965 (Spring4Shell) en Spring Framework, incluidos escáneres de PowerShell y Bash para archivos JAR/WAR vulnerables y comprobaciones de versiones de JDK.
https://github.com/NCSC-NL/spring4shell/blob/main/software/README.md
Requisitos para ser vulnerable a CVE-2022-22965:
Vea los scripts de PowerShell y bash más abajo.
Hilko Bengen ha publicado un escáner que busca versiones vulnerables de CachedIntrospectionResults.class basado en versiones aquí: https://github.com/hillu/local-spring-vuln-scanner
Esto se puede averiguar ejecutando:
java -version
en los sistemas correspondientes.
Tenga en cuenta que las aplicaciones Java pueden ejecutarse de diversas maneras, y se pueden tener varias versiones instaladas simultáneamente. Para estar seguro de qué versión de Java se está ejecutando, primero puede identificar desde dónde se ejecuta el binario de Java y luego ver qué versión corresponde a ese binario.
En Linux, esto se puede hacer ejecutando:
ps aux | grep java
donde se encuentra, por ejemplo, /usr/lib/jvm/java-11-openjdk-amd64/bin/java, y entonces se puede ejecutar el siguiente comando usando la ruta absoluta:
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/java -version
openjdk version "11.0.14.1" 2022-02-08
OpenJDK Runtime Environment (build 11.0.14.1+1-Ubuntu-0ubuntu1.18.04)
OpenJDK 64-Bit Server VM (build 11.0.14.1+1-Ubuntu-0ubuntu1.18.04, mixed mode, sharing)
De manera similar en Windows, se puede encontrar la ruta absoluta de los procesos Java en ejecución usando WMI o PowerShell:
WMI: C:\> wmic process where "name='java.exe'" get ExecutablePath
PowerShell: PS C:\> Get-Process java | Select-Object Path
JFrog ha publicado código Python que identifica el uso de esto, y se puede usar directamente en programas Java compilados sin necesidad de extraer archivos .jar/.war: https://github.com/jfrog/jfrog-spring-tools
En cuanto a la identificación de Spring Framework en el sistema, depende del sistema operativo que se ejecute:
Los siguientes scripts de PowerShell para encontrar aplicaciones potencialmente vulnerables, es decir, aplicaciones que utilizan o están basadas en Spring Framework. Tenga en cuenta que estos scripts no distinguirán entre versiones actualizadas o no, pero identificarán sistemas que probablemente tengan la vulnerabilidad actualmente, según el punto 1 anterior.
Buscar spring-beans*.jar y cachedintrospectionresults.class en archivos *.war del sistema:
$SearchName = "*.war"
$Drives = Get-WmiObject Win32_LogicalDisk -Filter 'DriveType=3' | Select -ExpandProperty DeviceID
#$Drives = Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' | Select-Object -ExpandProperty DeviceID
#powershell version 6
$Vulnerable = $false
$entries = @()
$hits = @()
$search1 = "spring-beans*.jar"
$search2 = "cachedintrospectionresults.class"
Foreach ($drive in $drives) {
$SearchDir = "$drive\"
$wars= (&cmd /c pushd $searchDir `& robocopy /l "$searchDir" null "$searchName" /ns /njh /njs /np /nc /ndl /xjd /mt /s) -replace '^\s+|\s+$'
Foreach ($war in $wars){
If($war) {
#$war
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem
$entries = ([System.IO.Compression.ZipArchive](https://github.com/helsecert/cve-2022-22965/blob/HEAD/%5BSystem.IO.Compression.ZipFile%5D::OpenRead($war))).Entries
foreach ($entry in $entries){
if ($entry.Name -like $search1) {
"$($war)\$($entry.FullName)"
$hits = $hits +1
}
if ($entry.Name -like $search2) {
"$($war)\$($entry.FullName)"
$hits = $hits +1
}
}
}
}
}
If ($hits){ "Vulnerable" }
Else { "Compliant" }
Además, buscar cachedintrospectionresults.class en todos los archivos .jar es útil, y sabemos que no siempre es spring-beans*.jar el que contiene esta clase.
$SearchName = "*.jar"
$Drives = Get-WmiObject Win32_LogicalDisk -Filter 'DriveType=3' | Select -ExpandProperty DeviceID
#$Drives = Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' | Select-Object -ExpandProperty DeviceID
#powershell version 6
$Vulnerable = $false
$entries = @()
$hits = @()
$search1 = "cachedintrospectionresults.class"
Foreach ($drive in $drives) {
$SearchDir = "$drive\"
$wars= (&cmd /c pushd $searchDir `& robocopy /l "$searchDir" null "$searchName" /ns /njh /njs /np /nc /ndl /xjd /mt /s) -replace '^\s+|\s+$'
Foreach ($war in $wars){
If($war) {
#$war
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem
$entries = ([System.IO.Compression.ZipArchive](https://github.com/helsecert/cve-2022-22965/blob/HEAD/%5BSystem.IO.Compression.ZipFile%5D::OpenRead($war))).Entries
foreach ($entry in $entries){
if ($entry.Name -like $search1) {
"$($war)\$($entry.FullName)"
$hits = $hits +1
}
}
}
}
}
If ($hits){ "Vulnerable" }
Else { "Compliant" }
Para búsquedas en Linux, se puede buscar la clase cachedintrospectionresults.class en todos los archivos .jar y .war en el disco, así como buscar spring-beans*.jar en archivos *.war:
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
y también buscar el mismo nombre de clase en archivos .jar que están dentro de archivos .war:
#!/bin/bash
find / -name '*.war' -print0 2>/dev/null -print0 | while read -d $'\0' spring; do
echo -en "${spring}: "$(unzip -p "${spring}" '*.jar' | strings | grep -Fi 'cachedintrospectionresults.class' | awk '{ print $NF }')"\n"
done
exit 0
https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement
https://www.praetorian.com/blog/spring-core-jdk9-rce/
https://bugalert.org/content/notices/2022-03-30-spring.html
https://www.rapid7.com/blog/post/2022/03/30/spring4shell-zero-day-vulnerability-in-spring-framework/
https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/