---
# System prepended metadata

title: '[TTCS] XÂY DỰNG HỆ THỐNG GIÁM SÁT VÀ PHẢN ỨNG TỰ ĐỘNG VỚI SỰ CỐ ATTT DỰA TRÊN WAZUH'

---

# [TTCS] **XÂY DỰNG HỆ THỐNG GIÁM SÁT VÀ PHẢN ỨNG TỰ ĐỘNG VỚI SỰ CỐ ATTT DỰA TRÊN WAZUH**

## **Giới thiệu**

### **1. Wazuh là gì ?**

Wazuh là một nền tảng mã nguồn mở được thiết kế để phát hiện xâm nhập (Intrusion Detection System – IDS), phân tích và giám sát bảo mật, đồng thời cung cấp khả năng quản lý sự kiện bảo mật (Security Information and Event Management – SIEM). Được xây dựng dựa trên công nghệ OSSEC, Wazuh đã nhanh chóng trở thành một trong những công cụ mạnh mẽ nhất trong việc giám sát và bảo vệ hệ thống, nhờ vào khả năng phát hiện và phản ứng nhanh chóng với các mối đe dọa bảo mật.

### **2. Một số tính năng của Wazuh**

Wazuh không chỉ đơn thuần là một hệ thống giám sát an ninh, mà còn mang đến hàng loạt tính năng độc đáo và mạnh mẽ:

- Phát hiện xâm nhập (IDS): Wazuh có khả năng giám sát toàn bộ hệ thống và phát hiện các hành vi bất thường hoặc xâm nhập không mong muốn dựa trên các quy tắc bảo mật định trước.
- Quản lý sự kiện bảo mật (SIEM): Nền tảng này có khả năng thu thập và phân tích các sự kiện từ nhiều nguồn khác nhau, giúp xác định các mối đe dọa tiềm ẩn.
- Quản lý cấu hình và chính sách: Wazuh cho phép quản lý và đảm bảo rằng tất cả các thiết bị và phần mềm tuân thủ các chính sách bảo mật đã được thiết lập.
- Phát hiện và xử lý mã độc: Khả năng nhận diện và loại bỏ mã độc, bảo vệ các hệ thống khỏi các phần mềm độc hại.
- Tích hợp linh hoạt với nhiều công cụ khác: Wazuh có thể tích hợp dễ dàng với nhiều công cụ và nền tảng khác như Elastic Stack (Elasticsearch, Logstash, Kibana), Splunk, AWS, Azure, và Google Cloud Platform.

### **3. Kiến trúc tổng quan của Wazuh**

![1](https://hackmd.io/_uploads/Hk49TQhEge.png)

- Wazuh Agent là thành phần chính trong kiến trúc Wazuh, được cài đặt trực tiếp trên các thiết bị đầu cuối (Endpoints) như máy chủ hoặc máy trạm để thu thập dữ liệu bảo mật và gửi về Wazuh Server hoặc Wazuh Manager.
- Wazuh Server sử dụng nhiều thành phần như công cụ phân tích, Wazuh API RESTful, dịch vụ đăng ký máy khách, dịch vụ kết nối, cụm daemon Wazuh và Filebeat. Wazuh Server thường được cài đặt trên hệ điều hành Linux và có thể triển khai trên máy chủ vật lý, máy ảo, Docker container, hoặc trên các dịch vụ đám mây. Thành phần chính là Wazuh manager(phân tích dữ liệu và cảnh báo) và Filebeat

Quy trình xử lý của phiên bản 4.11

| Bước | Thành phần | Chức năng | Chi tiết |
| --- | --- | --- | --- |
| **1** | **Wazuh Agent** | Thu thập log và gửi về Wazuh Manager | Log hệ điều hành, ứng dụng, network, file integrity monitoring, rootkit detection, etc. |
| **2** | **Wazuh Manager** | Phân tích log (dùng decoders + rules) và phát sinh cảnh báo (alert) | - `decoder.xml` để **giải mã định dạng log**  - `rules.xml` để **so sánh nội dung log** rồi **phát hiện sự kiện bất thường**. |
| **3** | **Wazuh Indexer** | Lưu trữ các alert đã phát sinh | Lưu lại toàn bộ event & alert theo dạng index (giống Elasticsearch). |
| **4** | **Wazuh Dashboard** | Hiển thị dữ liệu từ Wazuh Indexer | Giao diện web cho phép bạn tìm kiếm, lọc, vẽ biểu đồ, tạo report từ alert. |

Agent thu thập ➔ Manager phân tích ➔ Indexer lưu trữ ➔ Dashboard hiển thị, với API kết nối ngầm và các modules hỗ trợ tính năng nâng cao như vulnerability detection và asset inventory

### **4. Mô hình triển khai hệ thống**

![2](https://hackmd.io/_uploads/HJIhpQnNlg.jpg)

Đây là mô hình tổng quát cho việc triển khai các demo của mình với nhóm

P/S: Ban đầu nhóm tụi mình tính sẽ triển khai ở VMware mô hình đầy đủ sẽ có cả pfsense, nhưng thầy bộ môn không chịu kiểu đó, nên tụi mình chuyển qua triển khai mô hình trên google cloud, trong lúc triển khai thì không hiểu sau không thể kết nối với pfsense trên VM của google cloud được, nên chúng mình đành phải bỏ qua nó 😓 , và chỉ cấu hình firewall sương sương trên google cloud thoi.

![3](https://hackmd.io/_uploads/rJxR672Ngl.png)


Các VM trên google cloud, ở demo của mình thì chỉ cần đến máy VM có tên metaploitable và Wazuh để cấu hình rule và xem alert.

### **5. Kịch bản**

Mô tả: Trong trường hợp attacker đã xâm nhập vào mạng nội bộ của tổ chức và đạt được 1 user với quyền hạn thấp, với user đó attacker tiến hành ra soát các lỗ hổng, cài đặt các tệp đáng ngờ như các tình huống sau:

- Tình huống 1: Attacker tiến hành thêm, chỉnh sửa hoặc xóa các tệp trong hệ thống, cài đặt tệp độc hại để phá hổng hệ thống.
- Tình huống 2: Attacker tiến hành rà soát các quyền với người dùng và dùng leo thang đặc quyền với Sudo Right

### **Các tính năng thực hiện trong DEMO**

### **5.1 FIM (File integrity monitoring)**

FIM là một quy trình hoặc việc kiểm soát thăm dò nội bộ thực hiện hành động xác thực hệ điều hành và phần mềm ứng dụng bằng cách so sánh trạng thái hiện tại với chính sách bảo mật chuẩn đã được biết.

### **5.2 Cấu hình FIM**

Thêm dòng lệnh mẫu sau vào file tại đường dẫn `/var/ossec/etc/ossec.conf` ở Agent

```xml
<directories check_all="yes" report_changes="yes" realtime="yes">/root</directories>
```

- /root : đây là thư mục bạn sẽ thực hiện việc theo dõi
- check_all =”yes” : kiểm tra toàn bộ các thuộc tính của file (hash, quyền, size, . . . )
- report_changes="yes” : kiểm tra sự thay đổi của file và báo qua mục diff trong alert
- realtime="yes” : theo dõi thời gian thực

Ở đây thì mình sẽ để dòng cấu hình như thế này:

![5](https://hackmd.io/_uploads/BJ4XRm3Ege.png)

⇒ Để dòng cấu hình FIM ở dưới syscheck với thư mục quản lý là `/home/dotanhung874/demo/`

### **5.3 Thiết lập script để thực hiện việc xóa file độc hại ở Agent bằng Active Reponse**

- Active reponse là 1 module có sẵn ở Wazuh cho phép hệ thống tự động thực hiện các hành động phản ứng ngay khi phát hiện ra các mối đe dọa hoặc sự kiện bất thường.
- Thiết lập script ở đường dẫn này `/var/ossec/active-response/bin/remove-threat.sh`

```xml
#!/bin/bash

LOCAL=`dirname $0`;
cd $LOCAL
cd ../

PWD=`pwd`

read INPUT_JSON
FILENAME=$(echo $INPUT_JSON | jq -r .parameters.alert.data.virustotal.source.file)
COMMAND=$(echo $INPUT_JSON | jq -r .command)
LOG_FILE="${PWD}/../logs/active-responses.log"

#------------------------ Analyze command -------------------------#
if [ ${COMMAND} = "add" ]
then
 # Send control message to execd
 printf '{"version":1,"origin":{"name":"remove-threat","module":"active-response"},"command":"check_keys", "parameters":{"keys":[]}}\n'

 read RESPONSE
 COMMAND2=$(echo $RESPONSE | jq -r .command)
 if [ ${COMMAND2} != "continue" ]
 then
  echo "`date '+%Y/%m/%d %H:%M:%S'` $0: $INPUT_JSON Remove threat active response aborted" >> ${LOG_FILE}
  exit 0;
 fi
fi

# Removing file
rm -f $FILENAME
if [ $? -eq 0 ]; then
 echo "`date '+%Y/%m/%d %H:%M:%S'` $0: $INPUT_JSON Successfully removed threat" >> ${LOG_FILE}
else
 echo "`date '+%Y/%m/%d %H:%M:%S'` $0: $INPUT_JSON Error removing threat" >> ${LOG_FILE}
fi

exit 0;
```

- Set quyền và người dùng:

```xml
sudo chmod 750 /var/ossec/active-response/bin/remove-threat.sh
sudo chown root:wazuh /var/ossec/active-response/bin/remove-threat.sh
```

- Thiết lập 1 số rules cần thiết ở `/var/ossec/etc/rules/local_rules.xml` ****hoặc có thể set ở dashboard (dashboard → server management → rules → local_rules.xml). Khuyến khích mọi người sử dụng dashboard để thiết lập rule nhé.( vì Wazuh sẽ check giúp chúng ta xem có đúng chưa rồi mới cho chúng ta lưu)
    
    ```xml
    <group name="syscheck,pci_dss_11.5,nist_800_53_SI.7,">
        <!-- Rules for Linux systems -->
        <rule id="100018" level="7">
            <if_sid>550</if_sid>
            <field name="file">/home/dotanhung874/demo/</field>
            <description>File modified in /home/dotanhung874/demo/ directory.</description>
        </rule>
        <rule id="100019" level="7">
            <if_sid>554</if_sid>
            <field name="file">/home/dotanhung874/demo/</field>
            <description>File added to /home/dotanhung874/demo/ directory.</description>
        </rule>
    </group>
    ```
    
    - Group name : đây là tên mà ta sẽ tự đặt, khi đặt chung với các group name có sẵn thì nó sẽ gộp chung với các group name đó
    - Rule id 100000 trở lên là sẽ do người dùng đặt, ở đây rule id là 100018 level 7 sẽ được ghi nhận nếu detect được rule id 550 với field name là đường dẫn tới thư mục ta quản lý và tương tự với rule id 100019
    - Đây là khi thêm và sửa file, detect với rule của Wazuh
    
![4](https://hackmd.io/_uploads/SyoN0XnEee.png)

    
⇒ Mục đích set các rule như trên là nâng level và thay đổi thông báo cho việc detect các sự thay đổi trong thực mục mà ta chỉ định quản lý. Việc này giúp ta tránh được các alert không cần thiết cũng như tập trung hơn vào các thư mục quan trọng.

- Sau khi thiếp lập rules.
    
![6](https://hackmd.io/_uploads/B1rwCm2Vgx.png)

    

### **5.4 Cấu hình VirusTotal**

- Thiết lập các cấu hình sau tại đường dẫn `/var/ossec/etc/ossec.conf` ở Wazuh server hoặc ở dashboard (dashboard → server management → setting → edit configration)
    
    ```xml
    <ossec_config>
      <integration>
        <name>virustotal</name>
        <api_key><YOUR_VIRUS_TOTAL_API_KEY></api_key> <!-- Replace with your VirusTotal API key -->
        <rule_id>100018,100019</rule_id>
        <alert_format>json</alert_format>
      </integration>
    </ossec_config>
    ```
    
- <integration> : đây là phần khai báo việc tích hợp 1 dịch vụ bên ngoài vào Wazuh
- <rule_id>100018,100019</rule_id> : với 2 rule_id là 100018, 100019 thì sẽ được gửi Wazuh gọi API để VirusTotal để kiểm tra (hash file, domain, IP, . . ). Có thể thay thành <group>syscheck</group>, hoặc các thành phần khác.
- <alert_format>json</alert_format> : định dạng dữ liệu nhận và gửi với VirusTotal là JSON

### **5.5 Trigger active reponse với remove-threat.sh**

Thiết lập việc gọi Active Reponse `/var/ossec/etc/ossec.conf` ở Wazuh Server để nó trigger đến file remove-threat.sh để xóa file mã độc.

```xml
<ossec_config>
  <command>
    <name>remove-threat</name>
    <executable>remove-threat.sh</executable>
    <timeout_allowed>no</timeout_allowed>
  </command>

  <active-response>
    <disabled>no</disabled>
    <command>remove-threat</command>
    <location>local</location>
    <rules_id>87105</rules_id>
  </active-response>
</ossec_config>
```

- <command> : định nghĩ 1 lệnh
- <name>remove-threat</name> : tên của lệnh
- <executable>remove-threat.sh</executable> : đây là script thực thi lệnh mà Wazuh sẽ gọi khi thực thi khi lệnh ***remove-threat*** được gọi
- <timeout_allowed>no</timeout_allowed> : không cho phép timeout mà phải thực thi trong 1 khoảng thời gian
- <command>remove-threat</command> : gọi đến lệnh remove-threat
- <rules_id>87105</rules_id> : khi rule_id này được detect trên Wazuh thì Active reponse sẽ thực thực hiện lệnh remote-threat rồi trigger đến script remove-threat.sh để xóa đi file độc hại

### **5.6 Thiết lập rule để nhận thông báo xóa file độc hại thành công hoặc thất bại**

- Tiếp tục chỉnh sửa local_rules.xml ở Wazuh server

```xml
<group name="virustotal,">
  <rule id="100092" level="12">
    <if_sid>657</if_sid>
    <match>Successfully removed threat</match>
    <description>$(parameters.program) removed threat located at $(parameters.alert.data.virustotal.source.file)</description>
  </rule>

  <rule id="100093" level="12">
    <if_sid>657</if_sid>
    <match>Error removing threat</match>
    <description>Error removing threat located at $(parameters.alert.data.virustotal.source.file)</description>
  </rule>
</group>
```

- <if_sid>657</if_sid> nếu rule này được detect và trong log có thêm đoạn Successfully removed threat thì sẽ được ghi nhận với rule id 100092 thay vì 657. Tương tự với rule id 100093

Vậy cái rule 657 trong đó có gì ?

![7](https://hackmd.io/_uploads/r1Wi0734el.png)

Rule này sẽ trả về kết quả sau khi thực thi Active Reponse nên nó sẽ được dùng để xác nhận xem việc thực thi script xóa file độc hại có thành công hay không.

### 6. Thực hiện kịch bản: Tình huống thứ nhất

Ngoài các hành động thêm, sửa, xóa thì ta sẽ thử tính năng khi tích hợp thêm với VirusTotal. Ta sẽ dùng 1 đoạn mã độc hại giả được dùng để test hệ thống ở trang [eicar.org](http://eicar.org) hay EICAR (European Institute for Computer Antivirus Research - Viện nghiên cứu phần mềm chống virus Châu Âu).

![8](https://hackmd.io/_uploads/SkinAmnEgg.png)

Khi tạo file và thêm đoạn mã được lấy từ EICAR thì file vẫn còn nhưng tầm vài giây sau thì kiểm tra lại thì file đó đã không còn nữa. Chuyện gì đã xảy ra ? 

![9](https://hackmd.io/_uploads/rJM007hVxx.png)


Thì ngay tức khắc VirusTotal đã hành động, phát hiện được file độc hại và gọi đến Active Reponse để thực hiện việc xóa đi file độc hại này. 

![10](https://hackmd.io/_uploads/Hkc1kEn4le.png)

Với alert của VirusTotal có cả đường dẫn tới trang đó để xem chi tiết hơn file độc hại đã phát hiện.

**Cách để cho attacker không thể chỉnh sửa file với các mục quản lý**

- Thiết lập quyền chính xách
- Dùng Wazuh viết rule để block ip của đối tượng thêm chỉnh sửa file

B1: Tạo đoạn script thực hiện việc block bằng iptable ở active reponse ở agent tại

`/var/ossec/active-response/bin/block-ip.sh`

```xml
#!/bin/bash

IP="$1"

# Chặn IP bằng iptables
iptables -I INPUT -s $IP -j DROP
echo "$(date) - Blocked IP $IP" >> /var/ossec/logs/active-responses.log
```

Thêm quyền thực thi cho file chmod +x /var/ossec/active-response/bin/block-ip.sh

B2: sửa file `/var/ossec/etc/ossec.conf`

```xml
<ossec_config>
  <command>
    <name>block-ip</name>
    <executable>block-ip.sh</executable>
    <expect>srcip</expect> <!-- Wazuh sẽ đưa IP source vào script -->
    <timeout_allowed>no</timeout_allowed>
  </command>
  
  <active-response>
    <command>block-ip</command>
    <location>local</location>
    <rules_id>100018</rules_id> <!-- ID rule custom bắt chỉnh file important.txt -->
    <timeout>600</timeout> <!-- Sau 600 giây thì mở lại IP (nếu bạn setup unban) -->
  </active-response>
</ossec_config>

```

### 7. Thực hiện Tình huống thứ hai

![11](https://hackmd.io/_uploads/B10WkN2Vle.png)

Thiết lập rule để phát hiện tấn công Sudo Right

```xml
<group name="sudo-vim-shell">
  <rule id="100016" level="12">
    <if_sid>5402,5403</if_sid>
    <field name="command" type="pcre2">/usr/bin/(vim|vi)\s+-c\s+[!:/]\S*sh\b</field>
    <description>Suspicious use of vim/vi with sudo to spawn a shell</description>
    <group>attack,privilege_escalation,sudo,custom-telegram</group>
    <mitre>
      <id>T1548.003</id>
    </mitre>
  </rule>
</group>
```

Attacker sẽ tiến hành tìm cách leo quyền với người dùng đang có là lowuser và tìm được những thông tin sau qua lệnh kiểm tra như sau:

![12](https://hackmd.io/_uploads/S15u1N3Nee.png)

User hiện tại mà attacker có được là lowuser được phép sử dụng vim và find với quyền hạn của root từ dữ kiện trên attacker có thể sử dụng trang web GTFOBins, đây là trang web tổng hợp các lệnh Linux bình thường nhưng có thể bị lạm dụng để leo thang đặc quyền (Privilege Escalation), chạy shell, thực thi lệnh. 

![13](https://hackmd.io/_uploads/B115JVn4gl.png)


Attacker tiến hành leo quyền với câu lệnh tìm được và thành công leo lên được root.

![14](https://hackmd.io/_uploads/r1Lo1N24ex.png)


![15](https://hackmd.io/_uploads/ryRnyE3Nlg.png)


Cảnh báo nhận được sau khi attacker tiến hành leo quyền với vim, thông tin khá chi tiết với agent ngày giờ, lệnh mà attacker đã sử dụng để leo quyền và tên user đã thực hiện lệnh đó.

Thiết lập chặn người dùng sử dụng vim, find hoặc các chương trình có thể leo quyền khác.

![16](https://hackmd.io/_uploads/S1hCyV2Neg.png)


Vẫn có thể cho user sử dụng vim như sau nhưng phải dùng nó với noexec, không có user tạo shell khác từ các công cụ đó.

![17](https://hackmd.io/_uploads/H1ullVh4gg.png)


Khi thử lại thì attacker đã không thể sử dụng nó để leo quyền lên root nữa, nhưng khi attacker thực thi lệnh này thì vẫn sẽ có log khi nhận

### 8. Cài đặt gửi thông báo qua telegram

![17](https://hackmd.io/_uploads/H1gfeN2Eel.png)


- Sử dụng câu lệnh sau để lấy được chat id của bot: https://api.telegram.org/bot<token_bot>/getUpdates
- Phần token thì khi tạo bot nó đã cho trong message với BotFather

![19](https://hackmd.io/_uploads/SkU7xVhNxe.png)


Thêm 2 file custom-telegram và custom-telegram.py ở /var/ossec/integrations

Nội dụng file custom-telegram

```xml
#!/bin/sh

WPYTHON_BIN="framework/python/bin/python3"

SCRIPT_PATH_NAME="$0"

DIR_NAME="$(cd $(dirname ${SCRIPT_PATH_NAME}); pwd -P)"
SCRIPT_NAME="$(basename ${SCRIPT_PATH_NAME})"

case ${DIR_NAME} in
    */active-response/bin | */wodles*)
        if [ -z "${WAZUH_PATH}" ]; then
            WAZUH_PATH="$(cd ${DIR_NAME}/../..; pwd)"
        fi

        PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
    ;;
    */bin)
        if [ -z "${WAZUH_PATH}" ]; then
            WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
        fi

        PYTHON_SCRIPT="${WAZUH_PATH}/framework/scripts/$(echo ${SCRIPT_NAME} | sed 's/\-/_/g').py"
    ;;
     */integrations)
        if [ -z "${WAZUH_PATH}" ]; then
            WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
        fi

        PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
    ;;
esac

${WAZUH_PATH}/${WPYTHON_BIN} ${PYTHON_SCRIPT} "$@"
```

Nội dung file custom-telegram.py

```xml
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import json

try:
    import requests
except Exception:
    print("No module 'requests' found. Install: pip3 install requests")
    sys.exit(1)

CHAT_ID = "-4721288693"

def create_message(alert_json):
    # Get alert information
    title = alert_json['rule']['description'] if 'description' in alert_json['rule'] else ''
    description = alert_json['full_log'] if 'full_log' in alert_json else ''
    description = description.replace("\\n", "\n")  # Fix newline replacement
    alert_level = alert_json['rule']['level'] if 'level' in alert_json['rule'] else ''
    groups = ', '.join(alert_json['rule']['groups']) if 'groups' in alert_json['rule'] else ''
    rule_id = alert_json['rule']['id'] if 'rule' in alert_json else ''
    agent_name = alert_json['agent']['name'] if 'name' in alert_json['agent'] else ''
    agent_id = alert_json['agent']['id'] if 'id' in alert_json['agent'] else ''

    # Format message as plain text (no Markdown)
    msg_content = f'{title}\n\n'
    msg_content += f'{description}\n'
    msg_content += f'Groups: {groups}\n' if groups else ''
    msg_content += f'Rule: {rule_id} (Level {alert_level})\n'
    msg_content += f'Level: {alert_level}\n'
    msg_content += f'Agent: {agent_name} ({agent_id})\n' if agent_name else ''

    msg_data = {
        'chat_id': CHAT_ID,
        'text': msg_content
        # Remove parse_mode to send plain text
    }

    # Debug information
    with open('/var/ossec/logs/integrations.log', 'a') as f:
        f.write(f'MSG: {json.dumps(msg_data)}\n')

    return json.dumps(msg_data)

# Read configuration parameters
alert_file = open(sys.argv[1])
hook_url = sys.argv[3]

# Read the alert file
alert_json = json.loads(alert_file.read())
alert_file.close()

# Send the request
msg_data = create_message(alert_json)
headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'}
response = requests.post(hook_url, headers=headers, data=msg_data)

# Debug information
with open('/var/ossec/logs/integrations.log', 'a') as f:
    f.write(f'RESPONSE: {response}\n')

sys.exit(0)
```

Thiết lập quyền và người dùng để đồng bộ với hệ thống

```xml
chown root:wazuh /var/ossec/integrations/custom-telegram*
chmod 750 /var/ossec/integrations/custom-telegram*
```

Thêm cấu hình sau để tích hợp telegram

![20](https://hackmd.io/_uploads/SynrlNnNxg.png)


Có thể thay đổi mức level để nhận thông báo.

Một vài thông báo mẫu 

![21](https://hackmd.io/_uploads/rJVPgEhNel.png)


![22](https://hackmd.io/_uploads/ryl4dgN3Exg.png)


References:

https://documentation.wazuh.com/current/index.html

https://documentation.wazuh.com/current/proof-of-concept-guide/detect-remove-malware-virustotal.html

https://www.youtube.com/watch?v=rSA7LRh_eDw&t=7s

https://www.youtube.com/watch?v=ZPGR8gWths8&t=727s