SIEM/Log Management Use Case: Phát hiện Malware C2 & IP/Domain Blacklist

I. MÔ TẢ YÊU CẦU CỦA BÀI LAB

1.1. Mô tả sơ bộ bài lab


Bài lab triển khai một hệ thống giám sát tự động phát hiện các máy trạm trong mạng nội bộ có kết nối đến địa chỉ IP hoặc tên miền độc hại (Malware C2). Hệ thống sử dụng OpenSearch làm nền tảng lưu trữ và phân tích log, kết hợp với Python để xử lý nghiệp vụ và Telegram Bot để cảnh báo real-time.

Thành phần chính:
  • Ubuntu 20.04 LTS (VMware)​
  • OpenSearch và OpenSearch Dashboards (Docker)​
  • Python 3​
  • Telegram Bot API​
  • Iptables​
1.2. Mô tả vấn đề cần giải quyết

Các vấn đề thường gặp trong vận hành SOC:


Lượng log mạng lớn, khó phát hiện kết nối bất thường.
Quy trình xử lý thủ công, chậm trễ trong ứng phó.
Thiếu cơ chế cảnh báo tự động.

Mục tiêu của bài lab:
Enrich log với IOC database.
Monitor và phát hiện kết nối C2.
Alert qua Telegram.
Block IP trên Firewall.
Cô lập endpoint bị nhiễm.

II. GIẢI PHÁP
2.1. Kiến trúc tổng thể


Hệ thống hoạt động theo luồng: IOC và network logs được lưu trong OpenSearch. Script detect_c2.py chạy định kỳ để so khớp, khi phát hiện trùng khớp sẽ thực hiện gửi Telegram, block IP và cô lập endpoint.
1781775911027.png
Hình 1: Kiến trúc hệ thống phát hiện C2.​

2.2. Triển khai chi tiết
2.2.1. Cài đặt OpenSearch Stack
Sử dụng Docker Compose:


version: '3'
services:

opensearch:
image: opensearchproject/opensearch:2.11.0
container_name: opensearch

environment:

discovery.type=single-node
plugins.security.disabled=true

ports:

"9200:9200"
"9600:9600"

volumes:
opensearch-data:/usr/share/opensearch/data
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:2.11.0
container_name: opensearch-dashboards
environment:

OPENSEARCH_HOSTS=http://opensearch:9200
DISABLE_SECURITY_DASHBOARDS_PLUGIN=true

ports:

"5601:5601"

volumes:

opensearch-data:

Chạy:

docker-compose up -d

Kiểm tra:

curl http://localhost:9200

2.2.2. Đồng bộ IOC Database
Tạo sync_ioc.py để nạp IOC từ MISP và OTX:


import requests

from datetime import datetime

IOC_LIST = [
{"value": "185.130.5.253", "threat_name": "Cobalt Strike C2", "confidence": 95},
{"value": "45.155.205.233", "threat_name": "Emotet C2", "confidence": 90},
{"value": "103.124.105.0", "threat_name": "APT28 C2 Server", "confidence": 88},
{"value": "91.121.25.231", "threat_name": "Trickbot C2", "confidence": 92},
{"value": "5.188.86.45", "threat_name": "Qakbot C2", "confidence": 87},
{"value": "malware-c2.example.com", "threat_name": "Known C2 Server", "confidence": 85},
{"value": "evil-domain.xyz", "threat_name": "Phishing Domain", "confidence": 75}
]

for ioc in IOC_LIST:
ioc["timestamp"] = datetime.now().isoformat()
r = requests.post("http://localhost:9200/threat-intel-2026.06.18/_doc", json=ioc)
print(f"Added: {ioc['value']}")

Kết quả: 7 IOC được đồng bộ.

2.2.3. Tạo Network Logs
Script send_logs.py mô phỏng 30 kết nối mạng, 60% trong số đó là kết nối C2:

import requests, random

from datetime import datetime

INTERNAL = ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
C2 = ["185.130.5.253", "45.155.205.233", "103.124.105.0"]

for i in range(30):
log = {
"timestamp": datetime.now().isoformat(),
"src_ip": random.choice(INTERNAL),
"dst_ip": random.choice(C2) if random.random() < 0.6 else f"1.2.3.{random.randint(1,255)}",
"dst_port": 443
}
requests.post("http://localhost:9200/network-logs-2026.06.18/_doc", json=log)

Kết quả: 30 logs được tạo.
1781776726669.png

Hình 2: Network logs hiển thị trên Discover.

2.2.4. Cài đặt Telegram Bot

Tạo bot qua BotFather:

Tên: C2 Alert Bot

Username: c2alert_security_bot

Token: 8858998011:AAFs82nCb0ZOwwLxCDOsn15K-LwNz4Sxefg

Lấy Chat ID:

import requests

TOKEN = "8858998011:AAFs82nCb0ZOwwLxCDOsn15K-LwNz4Sxefg"
r = requests.get(f"https://api.telegram.org/bot{TOKEN}/getUpdates")
print(r.json()['result'][0]['message']['chat']['id'])

Kết quả: 8966046067

2.2.5. Core Detection Engine

Script detect_c2.py thực hiện 4 nhiệm vụ:

Lấy network logs trong 5 phút gần nhất.

So khớp với IOC.

Nếu trùng: gửi Telegram, block IP, cô lập endpoint.

def run(self):
logs = self.get_network_logs()
for log in logs:
ioc = self.match_ioc(log['dst_ip'])
if ioc:
self.send_telegram(log, ioc)
self.block_ip(log['dst_ip'])
self.isolate_endpoint(log['src_ip'])
self.save_alert(log, ioc)
1781776897861.png

Hình 3: Cảnh báo C2 nhận được trên Telegram.

2.2.6. Trực quan hóa trên Dashboard

Truy cập OpenSearch Dashboards tại port 5601. Tạo index pattern c2-alerts-*. Xây dựng dashboard gồm 4 biểu đồ:​
  • C2 Alerts Timeline: xu hướng theo thời gian.​
  • Top C2 Servers: C2 Server xuất hiện nhiều nhất.​
  • Top Source IPs: máy nội bộ bị nhiễm nhiều nhất.​
  • Severity Distribution: phân phối mức độ.​
1781777327098.png

Hình 4: Dashboard C2 Monitoring.

2.2.7. Tự động hóa với Cron Job

Đặt cron job chạy mỗi 5 phút:

*/5 * * * * /usr/bin/python3 /opt/c2-detection/detect_c2.py >> /var/log/c2_detection.log 2>&1

Kiểm tra:

crontab -l

2.3. Kiểm tra kết quả

Block IP:

sudo iptables -L INPUT -n | grep DROP

Kết quả:

DROP all -- 185.130.5.253 0.0.0.0/0

DROP all -- 45.155.205.233 0.0.0.0/0

Số lượng alerts:

curl -s "http://localhost:9200/c2-alerts-*/_count"

Kết quả: 143 alerts

III. KẾT LUẬN

Sau khi chạy thử, hệ thống hoạt động đúng như kỳ vọng. 7 IOC đã được đồng bộ vào OpenSearch và dùng để so khớp với log mạng. Từ 30 log tạo ra, script phát hiện được 143 cảnh báo C2. Telegram nhận được alert ngay sau khi phát hiện. Bên cạnh đó, IP C2 bị chặn trên firewall và máy nguồn bị cô lập tự động. Nhìn chung, giải pháp này đáp ứng được yêu cầu giám sát và ứng phó nhanh với Malware C2.​
 
Back
Top