Post

Dựng SIEM mini lab - Từ tấn công mô phỏng đến phát hiện với Suricata/ELK

Thiết lập

Sơ đồ tấn công

image

Cấu hình từng máy

Máy Giám Sát (Ubuntu Server)

Thành phầnThông tin
Hệ điều hànhUbuntu Server 22.04 LTS
Địa chỉ IP172.16.254.30
RAM4 GB
CPU2 vCPU
Disk50 GB
Phần mềmSuricata (IDS)
 Zeek (Network Analysis)
 Elasticsearch + Kibana (SIEM)
 Filebeat (Log collection)
Tải và cài đặt file iso cho Ubuntu Server tại đây
Sau khi tải mình tiến hành sử dụng Oracle Virtualbox để dựng máy giám sát với cấu hình là “50GB ổ đĩa - 4GB RAM - 2 vCPU”

image image

Để cấu hình mạng, mình thay đổi nội dung file /etc/netplan/50-cloud-init.yaml bằng lệnh
1
sudo nano /etc/netplan/50-cloud-init.yaml
Thành nội dung
1
2
3
4
5
6
7
8
9
10
11
12
13
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 172.16.254.30/16
      gateway4: 172.16.0.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 1.1.1.1

image

Máy victim (Windows 11)

Thành phầnThông tin
Hệ điều hànhWindows 10/11
Địa chỉ IP172.16.254.10
RAM2 GB
CPU2 vCPU
Disk40 GB
Phần mềmSysmon (System monitoring)
 Filebeat for Windows (Log forwarding)
Tương tự như trên, mình build máy victim với cấu hình

“40GB ổ đĩa - 2GB RAM - 2 vCPU” image image

Để cấu hình mạng mình set ip là 172.16.254.10

image image

Cài đặt công cụ

Máy Giám Sát (Ubuntu Server)

Lần lượt setup theo thứ tự như sau :

image

Elasticsearch

Các thành phần Elaticsearch không có sẵn trong kho gói mặc định của Ubuntu. Tuy nhiên, chúng có thể được cài đặt bằng APT sau khi thêm danh sách nguồn gói của Elastic.
Để bắt đầu, hãy sử dụng cURL để nhập khóa GPG công khai của Elaticsearch vào APT.
1
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Tiếp theo, thêm kho lưu trữ (repository) chính thức của Elasticsearch vào danh sách nguồn phần mềm mà hệ thống Ubuntu của bạn có thể tìm kiếm và tải về.
1
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
Tiếp theo, hãy cập nhật danh sách gói của bạn để APT sẽ đọc nguồn Elastic mới:
1
sudo apt update
Okay, đã cài đặt xong, bây giờ chỉnh sửa file config elaticsearch.yml
1
2
3
4
5
cluster.name: my-siem-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
Cấu hình của mình cho phép kết nối từ mọi thiết bị trong mạng qua cổng 9200

image

Để xác nhận nó chạy thành công hay chưa ta chỉ cần truy cập :9200 nếu nó trả về thì đã chạy thành công

image

Bây giờ Elaticsearch đã hoạt động, hãy cài đặt Kibana, thành phần tiếp theo của Elastic Stack.

Kibana

Vì trước đó mình đã thêm nguồn gói Elastic ở trước, nên phần này mình chỉ cần cài bằng apt
1
sudo apt install kibana
Sau đó kích hoạt và bắt đầu dịch vụ Kibana:
sudo systemctl enable kibana
sudo systemctl start kibana
Tiếp theo là cấu hình kibana
1
sudo nano /etc/kibana/kibana.yml
Nội dung là
1
2
3
4
5
6
7
8
# Để cho phép các máy khác kết nối đến
server.host: "0.0.0.0"

# Để Kibana biết nó cần kết nối đến Elasticsearch ở đâu
elasticsearch.hosts: ["http://localhost:9200"]

# (Tùy chọn) Đặt tên cho Kibana để dễ nhận diện
server.name: "kibana"
Cuối cùng là lưu file và khởi động lại kibana
1
sudo systemctl restart kibana
Sau khi khởi động lại thành công, mở trình duyệt web trên máy tính và truy cập:
1
http://[IP-CỦA-UBUNTU-SERVER]:5601

image

Suricata

Mình cài đặt suricata theo docs của chúng: https://docs.suricata.io/en/latest/install/ubuntu.html
Sau khi cài đặt xong, tiến hành cấu hình Suricata trên Ubuntu
Trước khi cấu hình, mình sẽ xác định thông tin Network Interface sẽ sử dụng
monitor@UbuntuServer:/home$ ip -p -j route show default
[ {
        "dst": "default",
        "gateway": "172.16.0.1",
        "dev": "enp0s3",
        "protocol": "static",
        "flags": [ ]
    } ]
Bây giờ chúng ta có thể chỉnh sửa cấu hình của Suricata và xác minh hoặc thay đổi tên Network Interface bằng cách mở file cấu hình /etc/suricata/suricata.yaml
Thực hiện tìm đến dòng có nội dung af-packet: ở dòng thứ 580. Bên dưới dòng đó là Interface mặc định mà Suricata sẽ sử dụng để kiểm tra lưu lượng. Chỉnh sửa dòng này để phù hợp với Interface của chúng ta như đã thực hiện kiểm tra ở trên:

image

Thêm dòng này vào detect-engine để bật tính năng live rule
detect-engine:
  - rule-reload: true
Sau khi xong, cập nhật Suricata
1
suricata-update
Để biết thành công hay chưa ta tiến hành thêm rule vào để thử, mình thêm đoạn rule kiểm tra PING thông qua ICMP.
Để thêm rule, ta config file /etc/suricata/suricata.yaml để biết nó sử dụng file rule nào, sau đó thêm rule vào file đó

image

Theo như ví dụ này rule được lấy từ file suricata.rules, thêm rule vào đây

image

Sau khi chạy log được lưu trong thư mục /var/log/suricata/, có các log chính sau:
1. fast.log
  • Dạng text, đơn giản, ghi nhanh các alert khi phát hiện tấn công.
    2. eve.json
  • Đây là file quan trọng nhất.
  • Dữ liệu dạng JSON, có thể import trực tiếp vào Elasticsearch/Kibana.
  • Chứa alert, flow, DNS, HTTP, TLS, file info… tùy config trong suricata.yaml.
3. stats.log
  • Ghi thống kê hiệu năng: số packet xử lý, dropped, decode error…
    4. suricata.log
  • Log hoạt động của chính Suricata (khởi động, lỗi cấu hình, warning…).
5. files-json.log (nếu bật)
  • Ghi lại metadata của file được phát hiện trong traffic.
    Okay, restart và ping thử xem rule hoạt động chưa

    image

FileBeat trên Ubuntu (Monitor machine)

Cài đặt Filebeat bằng apt
sudo apt install filebeat
Bật dịch vụ
1
2
sudo systemctl enable filebeat
sudo systemctl start filebeat
Bật module Suricata
1
sudo filebeat modules enable suricata
Cấu hình module Suricata, mở file /etc/filebeat/modules.d/suricata.yml và thêm:
- module: suricata
  eve:
    enabled: true
    var.paths: ["/var/log/suricata/eve.json"]
Chỉnh file cấu hình chính (filebeat.yml) bằng cách mở file sudo nano /etc/filebeat/filebeat.yml
output.elasticsearch:
  hosts: ["http://172.16.254.30:9200"]
Cuối cùng tạo và restart filebeat
1
sudo filebeat setup --pipelines --index-management --dashboards && sudo systemctl restart filebeat
Để chắc chắn ta đã setup thành công, có thể truy cập trực tiếp vào API của elasticsearch theo http://<ip>:9200/_cat/indices?v hoặc đọc log filebeat bằng lệnh sudo journalctl -fu filebeat

image image

Từ ảnh chụp màn hình cho thấy Suricata đã được đẩy lên thành công.

Máy victim (Windows 11)

Máy này mình sẽ cài đặt 2 công cụ: Sysmon (dùng để giám sát hệ thống) và Filebeat (thu thập, chuyển đổi và chuyển tiếp (forward) nhật ký từ máy local đến một máy chủ từ xa để phân tích tập trung)
Trước tiên là cài đặt sysmon trước, công cụ này có thể được cài đặt từ trang sysmon chính thức của microsoft

Sysmon

Sau khi tải file zip và giải nén, chúng ta tiếp tục tải file cấu hình bởi vì sysmon sẽ ghi log mọi thứ theo mặc định, dẫn đến quá nhiều dữ liệu thừa. Ta cần một file cấu hình (XML) để lọc và tập trung vào các sự kiện có ý nghĩa bảo mật. Mình sẽ tải file cấu hình từ SwiftOnSecurity
Z:\Sysmon>dir
 Volume in drive Z is VBOX_share
 Volume Serial Number is 0001-0307

 Directory of Z:\Sysmon

07/23/2024  02:08 PM         4,563,248 Sysmon64.exe
08/24/2025  08:35 PM    <DIR>          .
07/23/2024  02:08 PM         4,993,440 Sysmon64a.exe
08/24/2025  08:35 PM           123,257 sysmonconfig-export.xml
07/23/2024  02:08 PM         8,480,560 Sysmon.exe
07/23/2024  02:08 PM             7,490 Eula.txt
08/24/2025  08:29 PM    <DIR>          ..
               5 File(s)     18,176,187 bytes
               2 Dir(s)  154,080,198,656 bytes free
Sau khi tải xong cài đặt với file cấu hình qua lệnh
.\Sysmon.exe -i -accepteula -h sha256 -n -l sysmonconfig-export.xml
1
2
3
4
5
-h sha256: Ghi lại giá trị hash SHA256 của các file thực thi. Đây là thuật toán hash mạnh và phổ biến để nhận diện phần mềm.

-n: Theo dõi kết nối mạng (Network Connection).

-l: Tải và áp dụng file cấu hình.
Truy cập Applications and Services Logs -> Microsoft -> Windows -> Sysmon -> Operational thấy 1 loạt sự kiện windows sysmon ở đây cho thấy rằng đã cài đặt thành công

image

FileBeat

FileBeat có thể được tải từ đây
Giống như windows, sau khi tải xuống, ta sẽ tiến hành config trên file filebeat.yml
Đầu tiên là cấu hình các file log được thu thập, ở ví dụ này mình xác định các log được thu thập là sysmon, security, application và system

image

Tiếp theo là Output (nơi gửi log đến), Vì elasticsearch chạy ở Ubuntu 172.16.254.30 nên mình sẽ config như sau

image

Sau khi config xong, lưu file và cài đặt lại Filebeat Service
1
.\install-service-filebeat.ps1
Khởi động service
1
Start-Service filebeat

-> Sau khi service chạy, Filebeat trên Windows sẽ forward log về Elasticsearch/Kibana.

Ta có thể xác định nó thành công hay chưa bằng cách truy cập vào http://172.16.254.30:5601
Theo như ví dụ này, ta thấy rằng hostname NexusLite-PC của victim đã được đẩy lên.

image

Ta cần tạo Data View cho các file windows logs này, để làm được ta vào tab Stack Management

image

Tiếp theo chọn Index patterns -> Create index pattern

image

Bởi vì phiên bản filebeat của windows là 9.1.2 nên mình đặt là filebeat-9.1.2*

image

Và trường timestamp field chọn @timestamp

image

Quay lại Discover bây giờ ta đã thấy log từ windows gửi về

image

Tấn công

Kịch bản tấn công

image image

Sau khi mình scan với nmap, phát hiện ra 1 cổng đang mở là ssh
Mình tiến hành bruteforce mật khẩu ssh
Để làm được mình sử dụng hydra với wordlist là rockyou.txt của linux
1
2
3
4
5
6
7
8
9
10
11
12
┌──(kali㉿kali)-[~/Downloads/share]
└─$ hydra -t 4 -l administrator -P /usr/share/wordlists/rockyou.txt ssh://172.16.254.10
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-08-29 12:40:32
[WARNING] Restorefile (you have 10 seconds to abort... (use option -I to skip waiting)) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 4 tasks per 1 server, overall 4 tasks, 14344399 login tries (l:1/p:14344399), ~3586100 tries per task
[DATA] attacking ssh://172.16.254.10:22/
[22][ssh] host: 172.16.254.10   login: administrator   password: iloveu
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-08-29 12:40:44

Đã có credentials tiến hành login vào trong
Sau khi đăng nhập vào được, mình tiến hành bước tiếp theo của quy trình tấn công là drop file mã độc xuống và chạy
Trên máy linux chạy lệnh sau
1
2
3
4
5
┌──(kali㉿kali)-[~/Downloads/test]
└─$ scp /home/kali/Downloads/test/Drop.exe administrator@172.16.254.10:/C:/Users/Administrator/Downloads/Drop.exe

administrator@172.16.254.10's password: 
Drop.exe                                      100%   16KB  12.2MB/s   00:00    

image

Phát hiện

image

Việc xuất hiện rất nhiều cổng đích khác nhau trong thời gian ngắn là dấu hiệu port scanning. Đây chính là hành vi mà attacker (172.16.254.49) đang dò quét các port trên victim (172.16.254.10) để tìm dịch vụ đang mở.
Đây là nội dung của event.original

image

Số packet/bytes bất thường:
1
2
3
pkts_toserver: 1, pkts_toclient: 0

bytes_toclient: 0 → nghĩa là không có phản hồi từ server.

Trạng thái flow:

1
2
3
"state": "new", "reason": "timeout"

"tcp.syn": true, "tcp.state": "syn_sent"

=> Đây chính xác là hành vi TCP SYN scan (thử gửi SYN đến nhiều port khác nhau để dò dịch vụ, nhưng server không trả lời).

Ta có thể sử dụng file log Security.evtx hoặc Sysmonlog với Login type 3 (Network logon) để xem các truy cập thông qua internet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "timestamp": "2025-08-29T05:50:50.600Z",
  "event_id": 4624,
  "event_action": "Logon",
  "status": "success",
  "logon_type": 3,
  "logon_process": "sshd",
  "process_name": "C:\\Windows\\System32\\OpenSSH\\sshd.exe",
  "target_user": {
    "username": "Administrator",
    "domain": "NEXUSLITE-PC",
    "sid": "S-1-5-21-3728023933-3198538435-3165039231-500",
    "elevated": true
  },
  "subject_user": {
    "username": "NEXUSLITE-PC$",
    "domain": "WORKGROUP",
    "sid": "S-1-5-18"
  },
  "network": {
    "source_ip": "-",
    "source_port": "-"
  },
  "host": {
    "hostname": "NexusLite-PC",
    "ip": "172.16.254.10",
    "os": "Windows 11 Pro"
  }
}

ProcessName được hiển thị ở trên là C:\Windows\System32\OpenSSH\sshd.exe cho thấy rõ ràng sự kiện đăng nhập thành công qua ssh và ip máy chủ được đăng nhập nằm ở trường ip: 172.16.254.10, tuy nhiên không tìm thấy thông tin gì về ip đăng nhập.
Thay vào đó ta sẽ tìm thông tin đăng nhập này trên Sysmon log

image image

Kết quả trả về có 8866 dòng log tương ứng và ip thực hiện ở đây là ip: 172.16.254.49 và đây cũng chính là ip attacker. Việc có hàng nghìn kết nối TCP từ cùng một IP vào port 22 cho thấy rõ brute-force SSH attack.
Đây là giai đoạn tấn công Credential Access trong MITRE ATT&CK (T1110 – Brute Force).

image

Tiếp tục lọc theo winlog.event_data.Image: C:\Windows\System32\OpenSSH\ssh.exe

image

Ta thấy scp được sử dụng để copy file Drop.exe từ linux sang Downloads của windows

Resource

  • https://cloudfly.vn/techblog/cach-cai-dat-elaticsearch-logstash-va-kibana-elastic-stack-tren-ubuntu-2004#b-c-1-c-i-t-v-thi-t-l-p-c-u-h-nh-elaticsearch
  • https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elastic-stack-on-ubuntu-22-04
  • https://123host.vn/community/tutorial/huong-dan-cai-dat-suricata-tren-ubuntu-20-04.html
  • https://docs.suricata.io/en/latest/install/ubuntu.html
  • https://www.elastic.co/downloads/beats/filebeat
This post is licensed under CC BY 4.0 by the author.