From 19c42a6fed687b5960787f4b28b2df1f47f6a635 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Fri, 8 Apr 2022 20:51:46 +0200
Subject: [PATCH] update project

---
 .../linux_all_spring4shell/lib/bin/README     |   3 +
 .../local/86400/local_spring-vuln-scanner.sh  | 120 ++++++++++++++++++
 .../lib/local/local_spring-vuln-scanner.ps1   |  92 ++++++++++++++
 packages/spring4shell                         |  39 ++++++
 spring4shell.mkp                              | Bin 0 -> 3801 bytes
 web/plugins/metrics/spring4shell.py           |  53 ++++++++
 6 files changed, 307 insertions(+)
 create mode 100755 agents/custom/linux_all_spring4shell/lib/bin/README
 create mode 100755 agents/custom/linux_all_spring4shell/lib/local/86400/local_spring-vuln-scanner.sh
 create mode 100755 agents/custom/win_spring4shell/lib/local/local_spring-vuln-scanner.ps1
 create mode 100644 packages/spring4shell
 create mode 100644 spring4shell.mkp
 create mode 100644 web/plugins/metrics/spring4shell.py

diff --git a/agents/custom/linux_all_spring4shell/lib/bin/README b/agents/custom/linux_all_spring4shell/lib/bin/README
new file mode 100755
index 0000000..d8f8091
--- /dev/null
+++ b/agents/custom/linux_all_spring4shell/lib/bin/README
@@ -0,0 +1,3 @@
+https://github.com/hillu/local-spring-vuln-scanner
+
+
diff --git a/agents/custom/linux_all_spring4shell/lib/local/86400/local_spring-vuln-scanner.sh b/agents/custom/linux_all_spring4shell/lib/local/86400/local_spring-vuln-scanner.sh
new file mode 100755
index 0000000..7f46fce
--- /dev/null
+++ b/agents/custom/linux_all_spring4shell/lib/local/86400/local_spring-vuln-scanner.sh
@@ -0,0 +1,120 @@
+#!/bin/bash
+
+# Check local-spring-vuln-scanner
+# checkmk Local Check
+# Christian Wirtz, 2022-04 <doc@snowheaven.de>
+#
+# https://github.com/hillu/local-spring-vuln-scanner
+
+START_DATE=$(date +%s)
+
+DEST="/" # scan under this path
+WAITTIME="10800" # max scan runtime (default: 3h = 10800sec)
+
+EXCLUDE_PATHS="--exclude /mnt"
+LOGFILE="/tmp/local-spring-vuln-scanner"
+ARGS="--quiet --log $LOGFILE $EXCLUDE_PATHS"
+SERVICENAME="CVE-Spring4Shell"
+PWD="/usr/lib/check_mk_agent"
+
+# search pattern
+PATTERN_VULNERABLE="^indicator for vulnerable component found in "
+PATTERN_DENY=": permission denied$"
+PATTERN_CVES="^Checking for vulnerabilities: "
+PATTERN_REPLACE="indicator for vulnerable component found in "
+
+WAITMAX=$(which waitmax)
+
+COMMAND="$WAITMAX $WAITTIME $PWD/bin/local-spring-vuln-scanner $ARGS $DEST"
+
+MSG="Scanned path: $DEST"
+
+# Check if a scan is already running
+PROCESSES=$(pgrep -lfc local-spring-vuln-scanner)
+
+# Output if another scan is running
+if [[ $PROCESSES -gt 1 ]]
+then
+	PROCESSES=$(($PROCESSES - 1))
+	echo "3 $SERVICENAME processes=$PROCESSES; Another scan is already running, number of processes: $PROCESSES"
+	exit 3
+fi
+
+eval "$COMMAND"
+EXITCODE=$?
+
+CVES=$(grep -E "$PATTERN_CVES" $LOGFILE)
+# cut "Checking for vulnerabilities: " from "Checking for vulnerabilities: CVE-2022-22965"
+CVES=$(echo "$CVES" | awk -F':' '{print $2}')
+# trim spaces at the beginning of string
+CVES=${CVES##*( )}
+
+MSG="Checked for: $CVES, $MSG"
+
+DENIED=$(grep -c "$PATTERN_DENY" $LOGFILE)
+VULNERABLE=$(grep -cE "$PATTERN_VULNERABLE" $LOGFILE)
+
+END_DATE=$(date +%s)
+RUN_TIME=$(("$END_DATE" - "$START_DATE"))
+
+# Perfdata
+PERFDATA="files_vulnerable=$VULNERABLE;1;1|files_not_permitted=$DENIED;1|run_time=$RUN_TIME;"
+
+# Output if errors while scanning
+if [[ $EXITCODE -gt 0 ]]
+then
+	echo "2 $SERVICENAME - Error on scanner run: $EXITCODE"
+	exit 2
+fi
+
+# Output if suspicious files found
+if [[ $VULNERABLE -eq 0 ]]
+then
+    MSG="$MSG, No vulnerabilities found"
+else
+  # get files with indicator
+  FILES_VULNERABLE=$(sed -n -e "/$PATTERN_VULNERABLE/p" $LOGFILE | sed "s/$PATTERN_REPLACE//g" | sed ':a;N;$!ba;s/\n/\\n/g')
+  FILES_VULNERABLE="\nIndicator for vulnerable component found in:\n$FILES_VULNERABLE"
+  MSG="$MSG, Found indicators for vulnerable components"
+fi
+
+if [[ DENIED -gt 0 ]]
+then
+  # get denied files
+  FILES_DENIED=$(sed -n -e "/$PATTERN_DENY/p" $LOGFILE | sed ':a;N;$!ba;s/\n/\\n/g')
+  FILES_DENIED="\Unscanned files:\n$FILES_DENIED"
+fi
+
+LONGOUTPUT="$FILES_VULNERABLE\n$FILES_DENIED"
+
+# Default output
+echo "P $SERVICENAME $PERFDATA $MSG $LONGOUTPUT"
+
+# cleanup
+unset ARGS
+unset COMMAND
+unset CVES
+unset DENIED
+unset DEST
+unset END_DATE
+unset EXITCODE
+unset FILES_DENIED
+unset FILES_VULNERABLE
+unset LOGFILE
+unset LONGOUTPUT
+unset MSG
+unset PATTERN_CVES
+unset PATTERN_DENY
+unset PATTERN_REPLACE
+unset PATTERN_VULNERABLE
+unset PERFDATA
+unset PROCESSES
+unset PWD
+unset RUN_TIME
+unset SERVICENAME
+unset START_DATE
+unset VULNERABLE
+unset WAITMAX
+unset WAITTIME
+
+exit 0
diff --git a/agents/custom/win_spring4shell/lib/local/local_spring-vuln-scanner.ps1 b/agents/custom/win_spring4shell/lib/local/local_spring-vuln-scanner.ps1
new file mode 100755
index 0000000..07957b5
--- /dev/null
+++ b/agents/custom/win_spring4shell/lib/local/local_spring-vuln-scanner.ps1
@@ -0,0 +1,92 @@
+<#
+.Synopsis
+   Checks for CVE-2022-22965 wrapper for checkmk for a scan tool to check all drives and parse the output
+.DESCRIPTION
+   Author: Christopher Stegmann
+   Date: 2022-04
+#>
+
+$START_TIME = Get-Date
+
+$ErrorActionPreference = "SilentlyContinue"
+$SVC_NAME = "CVE-Spring4Shell"
+
+# pattern to search in output
+$PATTERN_VULNERABLE="^indicator for vulnerable component found in "
+$PATTERN_DENY=": Access is denied\.$"
+$PATTERN_CVES="^Checking for vulnerabilities: "
+$PATTERN_REPLACE="indicator for vulnerable component found in "
+
+# get list of drives to check without empty drives (like CDROM), returns i.e. "C:\ D:\"
+$DRIVES_TO_CHECK = (Get-PSDrive -PSProvider "FileSystem" | Where-Object used -gt 0 | Select -ExpandProperty root) -join " "
+
+$MSG = "Scanned drive(s): $($DRIVES_TO_CHECK)"
+
+$EXECUTABLE = "c:\ProgramData\checkmk\agent\bin\local-spring-vuln-scanner.exe"
+$EXCLUDE_PATHS = ""
+$LOGFILE = "$env:TEMP\spring4shell.log"
+$ARGS = "--quiet --log $($LOGFILE) $($EXCLUDE_PATHS)"
+
+$RUN = "$EXECUTABLE $ARGS $DRIVES_TO_CHECK"
+
+if (Test-Path -Path $LOGFILE -PathType Leaf) {
+    Remove-Item -Path $LOGFILE
+}
+
+if ( -not (Test-Path -Path $EXECUTABLE -PathType Leaf)) {
+  # warn scanner not found
+  Write-Output "1 $($SVC_NAME) - Error: $($EXECUTABLE) not found"
+  return
+}
+
+# run the scanner tool
+try{
+    & cmd /c $RUN
+}
+catch {
+    $ERRORINFO = $_
+    # warn error on scanning
+    Write-output "1 $($SVC_NAME) - Error on scanner run: $($ERRORINFO)"
+    return
+}
+
+ if (Test-Path -Path "$LOGFILE" -PathType Leaf) {
+  # search for vulnerabilites and remove log file name from output:
+  $FILES_VULNERABLE = Select-String -Path $LOGFILE -CaseSensitive -Pattern $PATTERN_VULNERABLE | Select -ExpandProperty Line
+  $VULNERABLE = $FILES_VULNERABLE.Length
+  if ( $VULNERABLE -gt 0 ) {
+    $FILES_VULNERABLE=($FILES_VULNERABLE -join "\n") -replace $PATTERN_REPLACE, ""
+    $FILES_VULNERABLE = "\nIndicator for vulnerable component found in:\n$FILES_VULNERABLE"
+    $MSG = "$MSG, Found indicators for vulnerable components"
+  } else {
+    $MSG = "$MSG, No vulnerabilities found"
+  }
+
+  # get number/list of denied files
+  $FILES_DENIED= (Select-String -Path $LOGFILE -CaseSensitive -Pattern $PATTERN_DENY)
+  $DENIED = $FILES_DENIED.Length
+  if ( $DENIED -gt 0 ) {
+    $FILES_DENIED=($FILES_DENIED -join "\n")
+    $FILES_DENIED = "\nUnscanned files:\n$FILES_DENIED"
+  }
+
+  # search for CVEs checked for:
+  $CVES = (Select-String -Path $LOGFILE -CaseSensitive -Pattern $PATTERN_CVES | Select -ExpandProperty Line).split(":")[1].trim()
+ } else {
+   Write-output "1 $($SVC_NAME) Logfile $($LOGFILE) not found"
+   return
+ }
+
+if (Test-Path -Path $LOGFILE -PathType Leaf) {
+    Remove-Item -Path $LOGFILE
+}
+
+$MSG = "Checked for: $CVES, $MSG"
+$LONGOUTPUT="$FILES_VULNERABLE\n$FILES_DENIED"
+
+$END_TIME = Get-Date
+$RUN_TIME = (New-TimeSpan -Start $START_TIME -End $END_TIME).TotalSeconds
+$PERFDATA="files_vulnerable=$VULNERABLE;1;1|files_not_permitted=$DENIED;1|run_time=$RUN_TIME;"
+write-output "P $($SVC_NAME) $PERFDATA $MSG\n$LONGOUTPUT\n"
+
+exit 0
diff --git a/packages/spring4shell b/packages/spring4shell
new file mode 100644
index 0000000..545c15c
--- /dev/null
+++ b/packages/spring4shell
@@ -0,0 +1,39 @@
+{'author': 'Christian Wirtz, doc[at]snowheaven[dot]de & Christopher Stegmann & '
+           'thl-cmk[at]outlook[dot]com',
+ 'description': 'Wrapper around spring-vuln-scanner\n'
+                'from Hilko Bengen <bengen@hilluzination.de>\n'
+                '\n'
+                'https://github.com/hillu/local-spring-vuln-scanner\n'
+                '\n'
+                'Scan interval:\n'
+                'Linux:daily (86400sec)\n'
+                'Windows; Rule needed: Set cache age for plugins and local '
+                'checks: 86400\n'
+                '\n'
+                'ToDo\n'
+                '- nicer output requested '
+                '(https://github.com/hillu/local-spring-vuln-scanner/issues/2)\n'
+                '- async config not so nice\n'
+                '\n'
+                'Changelog\n'
+                '2022-04-06 Wrt same perfdata-labels for Linux and Windows\n'
+                '2022-04-06 Wrt,thl-cmk nicer code from thl-cmk; some things '
+                'from Christian\n'
+                '2022-04-05 Wrt,thl-cmk Windows, added Run-time perfdata\n'
+                '2022-04-05 Wrt Windows ok, with the help of thl-cmk\n'
+                '2022-04-05 Wrt Linux check finalized\n'
+                '2022-04-05 Wrt running Windows baseversion together with '
+                'Christopher\n'
+                '2022-04-05 Wrt running Linux baseversion\n',
+ 'download_url': '',
+ 'files': {'agents': ['custom/linux_all_spring4shell/lib/bin/README',
+                      'custom/linux_all_spring4shell/lib/local/86400/local_spring-vuln-scanner.sh',
+                      'custom/win_spring4shell/lib/local/local_spring-vuln-scanner.ps1'],
+           'web': ['plugins/metrics/spring4shell.py']},
+ 'name': 'spring4shell',
+ 'num_files': 4,
+ 'title': 'Spring4Shell check plugin',
+ 'version': '0.95',
+ 'version.min_required': '2.0.0',
+ 'version.packaged': '2021.09.20',
+ 'version.usable_until': None}
\ No newline at end of file
diff --git a/spring4shell.mkp b/spring4shell.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..3f002ac6ed74a8d2151978bfff7d13243f98a6c9
GIT binary patch
literal 3801
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
PctQ9d9f+;70C)fZpE+)i

literal 0
HcmV?d00001

diff --git a/web/plugins/metrics/spring4shell.py b/web/plugins/metrics/spring4shell.py
new file mode 100644
index 0000000..fb8fd6e
--- /dev/null
+++ b/web/plugins/metrics/spring4shell.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2022-04-08
+#
+# Metrics file for the spring4shell plugin
+#
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics import (
+    metric_info,
+    graph_info,
+    perfometer_info,
+    check_metrics,
+)
+
+metric_info['files_vulnerable'] = {
+    'title': _('Vulnerable'),
+    'unit': 'count',
+    'color': '11/a',
+}
+metric_info['files_not_permitted'] = {
+    'title': _('Files denied'),
+    'unit': 'count',
+    'color': '21/a',
+}
+metric_info['run_time'] = {
+    'title': _('Run time'),
+    'unit': 's',
+    'color': '33/b',
+}
+
+perfometer_info.append(('stacked', [
+    {
+        'type': 'linear',
+        'segments': [
+            'files_vulnerable',
+            'files_not_permitted',
+        ],
+        'total': 100,
+    },
+    {
+        'type': 'linear',
+        'segments': [
+            'run_time',
+        ],
+        'total': 7200,
+    },
+]))
-- 
GitLab