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]]