Wazuh ist eine Open Source Sicherheitsplattform, die Unternehmen dabei unterstützt, ihre IT Infrastruktur zu überwachen, Bedrohungen zu erkennen und darauf zu reagieren. Die Software bietet eine umfassende Suite von Funktionen, darunter Log- und Event-Management, Intrusion Detection, Compliance-Management und Security Information and Event Management ([[SIEM]]). vie-srv-dc01 vie-srv-fs04 vie-srv-fs03 vie-srv-dc02 vie-srv-lb00 vie-srv-ex02 vie-srv-ex01 vie-srv-gts03 vie-srv-gts04 vie-p-srv-fw01 vie-p-srv-fw02 vie-p-srv-fw03 vie-t-srv-fw01 vie-srv-infra01 vie-srv-ca01 vie-t-srv-audit vie-p-srv-at01 vie-p-srv-at02 vie-p-srv-at03 vie-p-srv-mb01 vie-p-srv-mb02 vie-p-srv-mb03 vie-p-srv-mb04 vie-p-srv-ps00 vie-p-srv-wsy02 vie-srv-smct01 vie-p-srv-rg24 vie-srv-au01 vie-srv-dvo02 VIE-SRV-EBK02 vie-srv-db04 vie-srv-db05 vie-srv-dmzfs03 vie-srv-dmzfs02 vie-nb-gbi016 vie-srv-epm00 VIE-SRV-EPM02 vie-p-srv-flb01 Wazuh besteht aus mehreren Komponenten, darunter den Wazuh-Agenten, die auf den zu überwachenden Systemen installiert sind, dem Wazuh-Manager, der die Daten von den Agenten sammelt und analysiert, sowie dem Elastic Stack (früher bekannt als [[elk-stack|ELK Stack]]), der für die Speicherung und Visualisierung der Daten verwendet wird. Der Wazuh Manager ist das Herzstück des Systems und empfängt die Daten von den Agenten. Er analysiert die Informationen, erkennt Anomalien und Bedrohungen und generiert Warnmeldungen. Diese Warnmeldungen können in Echtzeit an Sicherheitspersonal gesendet werden, um schnelle Reaktionen zu ermöglichen. Wazuh unterstützt eine Vielzahl von Betriebssystemen, einschließlich [[Linux]], [[Windows]] und macOS. Es bietet auch die Möglichkeit, benutzerdefinierte Regeln zu erstellen, um spezifische Bedrohungen oder Compliance-Anforderungen abzudecken. data.win.eventdata.lmPackageName = NTLM =====Config===== ====OSSec.conf==== ossec.conf ist die Hauptkonfigurationsdatei des Wazuh-Managers. Ein Konfigurationsfehler kann den Start der Wazuh-Dienst verhindern. Die Datei gibt es auf dem Wazuh-Manager und dem Wazuh-Agent. Auf dem Wazuh-Manager unter /var/ossec/etc/ossec.conf Auf dem Wazuh-Agent unter ^Plattform^Pfad^ | Windows | C:\Program Files (x86)\ossec-agent\ossec.conf | | Linux/Unix | /var/ossec/etc/ossec.conf | | macOS | /Library/Ossec/etc/ossec.conf | Enable Vulnerability Scan # In /var/ossec/etc/ossec.conf [...] yes [...] ===Beispiel===
172.21.0.143
1514 tcp
ubuntu, ubuntu22, ubuntu22.04 10 60 yes aes yes default
no 5000 500 no yes yes yes yes yes yes yes 43200 etc/shared/rootkit_files.txt etc/shared/rootkit_trojans.txt yes yes 1800 1d yes wodles/java wodles/ciscat yes yes /var/log/osquery/osqueryd.results.log /etc/osquery/osquery.conf yes no 1h yes yes yes yes yes yes yes 10 yes yes 12h yes yes yes 60m no 43200 yes /etc,/usr/bin,/usr/sbin /bin,/sbin,/boot /etc/mtab /etc/hosts.deny /etc/mail/statistics /etc/random-seed /etc/random.seed /etc/adjtime /etc/httpd/logs /etc/utmpx /etc/wtmpx /etc/cups/certs /etc/dumpdates /etc/svc/volatile .log$|.swp$ /etc/ssl/private.key yes yes yes yes 10 100 yes 5m 1h 10 command df -P 360 full_command netstat -tulpn | sed 's/\([[:alnum:]]\+\)\ \+[[:digit:]]\+\ \+[[:digit:]]\+\ \+\(.*\):\([[:digit:]]*\)\ \+\([0-9\.\:\*]\+\).\+\ \([[:digit:]]*\/[[:alnum:]\-]*\).*/\1 \2 == \3 == \4 \5/' | sort -k 4 -g | sed 's/ == \(.*\) ==/:\1/' | sed 1,2d netstat listening ports 360 full_command last -n 20 360 no etc/wpk_root.pem yes plain
apache /var/log/nginx/access.log apache /var/log/nginx/error.log syslog /var/ossec/logs/active-responses.log syslog /var/log/auth.log syslog /var/log/syslog syslog /var/log/dpkg.log syslog /var/log/kern.log
====Agent.conf==== Die agent.conf Datei ist ossec.conf sehr ähnlich, wird aber zur zentralen Verteilung von Konfigurationsinformationen an Agenten verwendet. Sie befindet sich auf dem Wazuh-Manager unter /var/ossec/etc/shared/agent.conf und ist von beginn an leer. =====CLI===== Managing Agents (interactive /var/ossec/bin/manage_agents Removing an agent from the manager /var/ossec/bin/manage_agents -r Restart the manager sudo docker exec -it /bin/bash service wazuh-manager restart =====Ubuntu Docker Installation===== # https://github.com/AlphaBravoCompany/wazuh-demo-server #!/bin/bash set -e G="\e[32m" E="\e[0m" if ! grep -q 'Ubuntu' /etc/issue then echo ----------------------------------------------- echo "Not Ubuntu? Could not find Codename Ubuntu in lsb_release -a. Please switch to Ubuntu." echo ----------------------------------------------- exit 1 fi ## Update OS echo "Updating OS packages..." sudo apt update sudo apt upgrade -y ## Install Prereqs echo "Installing Prereqs..." sudo apt-get update sudo apt-get install -y \ apt-transport-https ca-certificates curl gnupg lsb-release \ software-properties-common haveged bash-completion jq ## Install Docker echo "Installing Docker..." sysctl -w vm.max_map_count=262144 curl -sSL https://get.docker.com/ | sh systemctl start docker usermod -aG docker $USER ## Install Docker Compose echo "Installing docker-compose..." curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ## Install Wazuh Docker echo "Installing Wazuh..." git clone https://github.com/wazuh/wazuh-docker.git -b 4.3 --depth=1 cd wazuh-docker/single-node docker-compose -f generate-indexer-certs.yml run --rm generator docker-compose up -d ## Print Server Information and Links cd ../../ touch ./server-details.txt echo ----------------------------------------------- echo -e ${G}Install is complete. Please use the below information to access your environment.${E} | tee ./server-details.txt echo -e ${G}Wazuh UI:${E} https://this-host-ip | tee -a ./server-details.txt echo -e ${G}Wazuh Login${E}: admin/SecretPassword | tee -a ./server-details.txt echo Details above are saved to the file at ./server-details.txt echo ----------------------------------------------- =====Queries===== Siehe [[Elasticsearch]] [[https://opensearch.org/docs/latest/query-dsl/|Docs]], [[https://documentation.wazuh.com/current/user-manual/indexer-api/use-case.html]] ====Match==== Feld muss zutreffen GET /wazuh-alerts-4.x-2025*/_search { "size": 10, "query": { "match": { "data.win.eventdata.authenticationPackageName": "NTLM" } } } ====Wildcard==== GET /wazuh-alerts-4.x-2025*/_search { "size": 10, "query": { "wildcard": { "data.win.eventdata.authenticationPackageName": "NTLM" } } } ====Bool Must==== Beide Felder müssen zutreffen GET /wazuh-alerts-4.x-2025*/_search { "size": 10, "query": { "bool": { "must": [ { "match": { "data.win.eventdata.authenticationPackageName": "NTLM" } }, { "match": { "data.win.system.eventID": "4624" } } ] } } } ====Bool Should==== should bedeutet, dass mindestens eine der Bedingungen erfüllt sein kann. Falls ein Dokument beide Bedingungen erfüllt, wird es höher gewichtet, aber es ist nicht zwingend erforderlich. Falls kein weiteres must- oder filter-Kriterium vorhanden ist, kann Elasticsearch hier auch alle Dokumente zurückgeben, selbst wenn keines der should-Bedingungen erfüllt ist. Problem: Ohne "minimum_should_match": 1 kann es vorkommen, dass du auch Ergebnisse bekommst, die keines der Kriterien erfüllen. GET /wazuh-alerts-4.x-2025*/_search { "size": 10, "query": { "bool": { "should": [ { "match": { "data.win.eventdata.authenticationPackageName": "NTLM" } }, { "match": { "data.win.system.eventID": "4624" } } ] } } } Mindestens 2 Felder müssen zutreffen GET /wazuh-alerts-4.x-2025*/_search { "size": 10, "query": { "bool": { "should": [ { "match": { "data.win.eventdata.authenticationPackageName": "NTLM" } }, { "match": { "data.win.system.eventID": "4624" } }, { "match": { "data.win.eventdata.logonType": "3" } } ], "minimum_should_match": 2 } } } ====Bool Must Bool Should==== GET /wazuh-alerts-4.x-2025*/_search { "size": 10, "query": { "bool": { "must": [ { "bool": { "should": [ { "match": { "data.win.eventdata.authenticationPackageName": "NTLM" } }, { "match": { "data.win.system.eventID": "4624" } } ], "minimum_should_match": 1 } } ] } } } Der äußere must stellt sicher, dass die innere should-Bedingung zwingend zutreffen muss. Die should-Bedingung innerhalb des bool-Blocks sorgt dafür, dass mindestens eine der Bedingungen zutreffen kann. Falls ein Dokument beide should-Bedingungen erfüllt, wird es höher gewichtet. Effekt: Diese Abfrage gibt nur Dokumente zurück, die mindestens eines der should-Kriterien erfüllen. Dokumente, die weder "authenticationPackageName": "NTLM" noch "eventID": "4624" enthalten, werden ausgeschlossen. GET /wazuh-alerts-4.x-2025*/_search { "size": 10, "query": { "bool": { "must": [ { "bool": { "should": [ { "match": { "data.win.eventdata.authenticationPackageName": "NTLM" } }, { "match": { "data.win.system.eventID": "4624" } } ], "minimum_should_match": 1 } }, { "bool": { "should": [ { "match": { "data.win.eventdata.logonType": "3" } }, { "match": { "data.win.eventdata.logonType": "10" } } ], "minimum_should_match": 1 } } ] } } } ^Abfrage^Bedeutung^Kann Ergebnisse ohne Treffer zurückgeben?^Mindestens eine Bedingung muss erfüllt sein?^ |should direkt in bool|Beide Bedingungen sind optional, erhöhen aber das Ranking|Ja (falls kein minimum_should_match)|(Ergebnisse können auch ohne Übereinstimmung erscheinen)| |should innerhalb must|Mindestens eine should-Bedingung muss erfüllt sein|Nein|(Mindestens eine Bedingung muss passen)| ====More==== GET /wazuh-alerts-4.x-2025.03.0*/_search { "size": 10, "query": { "wildcard": { "data.win.eventdata.authenticationPackageName": "NTLM" } } } GET /wazuh-alerts-4.x-2025.03.0*/_search { "size": 10, "query": { "wildcard": { "data.win.eventdata.authenticationPackageName": "NTLM" } }, "sort": [{ "@timestamp": "asc" }], "search_after": ["2025-03-04T18:56:45.890+0000"] } GET /wazuh-alerts-4.x-2025.03.0*/_search { "size": 10, "query": { "wildcard": { "data.win.eventdata.authenticationPackageName": "NTLM" } }, "sort": [{ "@timestamp": "asc" }] } GET /wazuh-alerts-4.x-2025*/_search { "query": { "bool": { "must": [ { "match": { "data.win.eventdata.targetUserName": "dom_docusnap" } }, { "wildcard": { "data.win.system.message": "*logged on*" } } ] } } } =====Paging===== [[todo]] =====Bash Script===== #!/bin/bash # Wazuh Indexer URL und Authentifizierung WAZUH_INDEXER="https://172.21.0.143:9200" USERNAME="admin" PASSWORD="SecretPassword" # Anfrage ausführen curl -k -u "$USERNAME:$PASSWORD" -X GET "$WAZUH_INDEXER/wazuh-alerts-4.x-2025*/_search" -H "Content-Type: application/json" -d @- < bash wazuh-query.sh | jq -r '.hits.hits[]._source | (.data.win.eventdata.authenticationPackageName)' bash wazuh-query.sh | jq -r '.hits.hits[]._source | (.data.win.eventdata.lmPackageName)' bash wazuh-query.sh | jq -r '.hits.hits[]._source | (.agent.name)' bash wazuh-query.sh | jq -r '.hits.hits[]._source | (.data.win.system.eventID)' bash wazuh-query.sh | jq -r '.hits.hits[]._source | "[\(.agent.name)] \(.data.win.eventdata.targetUserName) - (\(.data.win.eventdata.ipAddress):\(.data.win.eventdata.ipPort)) - \(.data.win.eventdata.workstationName) - \(.data.win.eventdata.lmPackageName) "' =====Python Client===== # pip install opensearch-py from opensearchpy import OpenSearch es = OpenSearch( hosts=["https://localhost:9200"], http_auth=("admin", "SecretPassword"), verify_certs=False ) query = { "query": {"match_all": {}} } resp = es.search(index="wazuh-alerts-4.x-2025.03.20", body=query, size=1000) for hit in resp["hits"]["hits"]: ts = hit["_source"].get("timestamp", "Kein Timestamp") # Sicherstellen, dass die verschachtelten Keys existieren data = hit["_source"].get("data", {}) win = data.get("win", {}) eventdata = win.get("eventdata", {}) targetUserName = eventdata.get("targetUserName", "---") authenticationPackageName = eventdata.get("authenticationPackageName", "---") print(ts, '-', targetUserName, '-', authenticationPackageName) =====Links===== * [[https://wazuh.com/|Homepage]] * [[https://www.youtube.com/watch?v=5M3-ruCXVfY|Einführung in Wazuh]] * [[https://www.youtube.com/watch?v=naOsPLpG19o|Vulnerabilities Overview]] * [[https://www.youtube.com/watch?v=nSOqU1iX5oQ|Windows Monitoring using Sysmon & Wazuh]] * [[https://www.youtube.com/watch?v=3CaG2GI1kn0|NetworkChuck]]