Chương 15 — Threat Intelligence & Khung tấn công
Tổng quan
Đọc log mà không có framework thì mỗi cảnh báo là một mảnh rời — thấy IP lạ gọi ra ngoài, nhưng không biết nó khớp giai đoạn nào trong một cuộc tấn công thật, và không nói chuyện được với đội threat intel bằng cùng một thuật ngữ. Chương này gom lại bộ "ngôn ngữ chung" mà dân SOC và threat intel dùng để mô tả, đo và phản ứng với hành vi kẻ tấn công.
Chương đi theo đúng trình tự một cuộc điều tra thật. Trước hết là khung tư duy: Cyber Kill Chain chia tấn công có chủ đích thành 7 giai đoạn tuyến tính — phá vỡ một mắt xích là gãy cả chuỗi; Diamond Model nhìn mỗi vụ xâm nhập qua 4 đỉnh (kẻ tấn công, năng lực, hạ tầng, nạn nhân) và cho phép pivot từ một manh mối nhỏ ra cả một nhóm APT. Kế đó là cách phân loại bằng chứng: IOC (dấu vết tĩnh, dễ đổi) so với IOA (chuỗi hành vi, khó né hơn), và Pyramid of Pain giải thích vì sao chặn một IP thì đối thủ đổi trong 5 phút, còn chặn một TTP thì chúng phải xây lại cả lối đánh.
MITRE ATT&CK là phần chi tiết nhất — knowledge base hành vi thật với định danh riêng cho từng technique (kiểu T1059.001), còn ATT&CK Navigator tô màu ma trận đó để nhìn ra khoảng trống phát hiện. Từ lý thuyết, chương xuống tới việc viết rule thật: Sigma cho log, YARA cho file/memory, Suricata cho traffic mạng — và cách chia sẻ tình báo đó ra ngoài qua STIX/TAXII/MISP. Phần cuối tách bạch các loại malware (virus, worm, trojan, ransomware, rootkit, RAT, botnet, fileless) và hai hướng mổ xẻ mẫu — tĩnh và động — hai khái niệm mình từng gộp chung trước khi phân biệt rõ ràng.
Cần tra nhanh? Bảng 15.15 nối từng giai đoạn tấn công với technique tiêu biểu, nguồn telemetry và rule phát hiện — dùng nó như mục lục thực hành của cả chương.
15.1. Vì sao cần Framework: từ "alert rời rạc" tới "ngôn ngữ chung"
Trước khi có các framework chuẩn hóa, mỗi đội bảo mật mô tả tấn công theo cách riêng: "có người login sai nhiều lần", "có file lạ chạy PowerShell". Vấn đề không phải thiếu dữ liệu mà là thiếu ngôn ngữ chung để:
- Trao đổi giữa các đội/tổ chức (SOC nội bộ ↔ ISAC ↔ vendor).
- Đo lường độ phủ phát hiện (detection coverage): ta phát hiện được bao nhiêu phần trăm hành vi mà đối thủ có thể làm?
- Ưu tiên đầu tư: nên viết rule phát hiện gì trước?
- Tái lập (reproducibility): cùng một hành vi luôn được gọi bằng cùng một định danh.
Các framework trong chương này giải các bài toán khác nhau nhưng bổ trợ nhau:
| Framework | Câu hỏi nó trả lời | Mức trừu tượng |
|---|---|---|
| Cyber Kill Chain | Tấn công đi qua những giai đoạn tuyến tính nào? | Cao (chiến lược) |
| Diamond Model | Một sự kiện liên hệ adversary / capability / infrastructure / victim ra sao? | Trung (phân tích sự kiện) |
| MITRE ATT&CK | Đối thủ thực sự làm gì ở mỗi giai đoạn (hành vi quan sát được)? | Thấp (kỹ thuật, đo được) |
| Pyramid of Pain | Chặn IOC nào thì gây đau nhất cho đối thủ? | Thước đo giá trị IOC |
Vì sao cần nhiều framework? Kill Chain quá thô để viết detection; ATT&CK quá chi tiết để báo cáo cho lãnh đạo; Diamond Model giúp phân tích quan hệ nhưng không liệt kê kỹ thuật. Một SOC trưởng thành dùng cả ba: Kill Chain để kể chuyện, Diamond để pivot điều tra, ATT&CK để đo coverage và viết rule.
15.2. Cyber Threat Intelligence (CTI): định nghĩa, phân loại, vòng đời
15.2.1. CTI là gì và không là gì
Threat Intelligence = dữ liệu về mối đe dọa đã qua xử lý + phân tích + bối cảnh hóa để hỗ trợ ra quyết định. Điểm mấu chốt phân biệt với "data" thuần:
Data → "IP 185.220.101.45 xuất hiện trong log"
Information→ "IP này là Tor exit node, kết nối lúc 03:00"
Intelligence→ "IP này được nhóm FIN7 dùng làm C2 trong chiến dịch
nhắm ngành tài chính tháng 5; khuyến nghị chặn + hunt
các host đã beacon tới nó"
Intelligence phải actionable (hành động được) và gắn bối cảnh (ai, mục tiêu gì, vì sao).
15.2.2. Bốn loại CTI
| Loại | Người tiêu thụ | Khung thời gian | Ví dụ cụ thể | Định dạng điển hình |
|---|---|---|---|---|
| Strategic | Ban lãnh đạo, CISO | Dài hạn (tháng/năm) | "Ngành crypto-exchange bị nhắm bởi Lazarus với động cơ tài chính" | Báo cáo văn xuôi, không kỹ thuật |
| Operational | SOC manager, IR lead | Trung hạn (tuần) | "Chiến dịch đang dùng macro Office → Cobalt Strike; TTP gồm T1566.001, T1059.001" | Campaign report, TTP list |
| Tactical | Threat hunter, detection engineer | Ngắn–trung | "TTP cụ thể: PowerShell -enc base64 spawn từ winword.exe" |
Sigma rule, ATT&CK technique |
| Technical | SOC analyst L1/L2, hệ thống tự động | Rất ngắn (giờ/ngày) | "Hash a1b2c3..., IP 185.x, domain evil.com" |
IOC feed (STIX/MISP), CSV |
Vì sao chia tầng? Vì IOC kỹ thuật mau hỏng (đối thủ đổi IP/hash dễ dàng) còn TTP/strategic bền hơn. Đầu tư phát hiện nên dịch chuyển lên các tầng cao (xem Pyramid of Pain ở 15.6).
15.2.3. Vòng đời tình báo (Intelligence Lifecycle) — 6 pha
Mô hình kinh điển (gốc từ cộng đồng tình báo quân sự/CIA, áp dụng cho CTI):
┌────────────────────────────────────────────────────────────┐
▼ │
1.Direction → 2.Collection → 3.Processing → 4.Analysis → 5.Dissemination → 6.Feedback
│ │
└──────────────────────────── vòng lặp khép kín ──────────────────────────┘
| Pha | Việc làm | Đầu ra | Lưu ý kỹ thuật |
|---|---|---|---|
| 1. Direction (Planning) | Xác định yêu cầu tình báo (PIR – Priority Intelligence Requirements) | "Ai nhắm vào ta? Bằng TTP nào?" | Không có PIR → thu thập vô định, ngập IOC vô dụng |
| 2. Collection | Thu thập từ OSINT, feed thương mại, telemetry nội bộ, dark web, ISAC | Raw data | Ghi nguồn + thời điểm để đánh giá độ tin cậy |
| 3. Processing | Chuẩn hóa: parse log, decode, dedupe, normalize sang STIX | Structured data | Bước hay bị bỏ qua → "garbage in" |
| 4. Analysis | Tương quan, gán TTP, đánh giá độ tin cậy (Admiralty Code) | Intelligence product | Tránh confirmation bias; dùng ACH (Analysis of Competing Hypotheses) |
| 5. Dissemination | Phát hành đúng định dạng cho đúng đối tượng | Báo cáo, feed, rule | Strategic ≠ technical về format |
| 6. Feedback | Người dùng đánh giá: có actionable không? | Điều chỉnh PIR | Đóng vòng lặp, nếu không CTI sẽ lệch nhu cầu |
Admiralty Code (NATO) dùng để gán độ tin cậy hai chiều: độ tin nguồn (A–F) và độ tin thông tin (1–6). Ví dụ "B2" = nguồn thường đáng tin, thông tin có thể đúng.
| Source reliability | Information credibility |
|---|---|
| A = Completely reliable | 1 = Confirmed |
| B = Usually reliable | 2 = Probably true |
| C = Fairly reliable | 3 = Possibly true |
| D = Not usually reliable | 4 = Doubtful |
| E = Unreliable | 5 = Improbable |
| F = Cannot be judged | 6 = Cannot be judged |
15.3. Cyber Kill Chain (Lockheed Martin) — 7 bước
Mô hình do Lockheed Martin công bố (2011), mô tả tấn công có chủ đích (APT) như chuỗi tuyến tính. Triết lý phòng thủ: phá vỡ bất kỳ một mắt xích nào thì toàn chuỗi gãy → "intrusion kill chain".
[1] [2] [3] [4] [5] [6] [7]
Recon ──▶ Weaponization ──▶ Delivery ──▶ Exploitation ──▶ Installation ──▶ C2 ──▶ Actions on Objectives
dò la ghép exploit gửi tới chạy code cài đặt kênh đánh cắp / phá hoại /
mục tiêu + payload nạn nhân khai thác persistence điều khiển lan ngang
▲
── chặn được BẤT KỲ một mắt xích nào ──▶ toàn chuỗi gãy ─────────────────┘
Sơ đồ cho thấy bản chất tuyến tính của mô hình: tấn công đi tuần tự từ trái sang phải, và phòng thủ chỉ cần làm gãy một bước là vô hiệu cả chiến dịch. Đây cũng là điểm yếu — mô hình giả định một dòng chảy một chiều, khó mô tả lateral movement lặp lại hay tấn công cloud không có khâu "delivery" malware.
| # | Giai đoạn | Hành động của attacker | Dấu hiệu / Phòng thủ Blue Team |
|---|---|---|---|
| 1 | Reconnaissance | Thu thập email, công nghệ, nhân sự (LinkedIn, whois, scan) | Log WAF/IDS phát hiện scan; honeytoken; theo dõi đăng ký domain giống thương hiệu |
| 2 | Weaponization | Ghép exploit + payload (vd: PDF có macro) | Khó phát hiện (xảy ra ở phía attacker); phân tích mẫu thu được |
| 3 | Delivery | Gửi qua email/USB/web | Email gateway, sandbox đính kèm, proxy log |
| 4 | Exploitation | Khai thác lỗ hổng để chạy code | EDR phát hiện exploit, EMET/CFG, patch |
| 5 | Installation | Cài backdoor/persistence | Giám sát autorun, dịch vụ mới, registry Run key |
| 6 | Command & Control (C2) | Thiết lập kênh điều khiển | Phân tích beacon, DNS tunneling, JA3 fingerprint |
| 7 | Actions on Objectives | Đánh cắp dữ liệu, phá hoại, lan ngang | DLP, monitor exfil, phát hiện encryption hàng loạt (ransomware) |
Hạn chế: Kill Chain giả định tuyến tính và lấy "malware từ bên ngoài" làm trung tâm; yếu khi mô tả tấn công từ bên trong (insider), lateral movement lặp lại, hoặc tấn công cloud không có "malware delivery". ATT&CK ra đời để bù chỗ này (vòng lặp, phi tuyến, hành vi quan sát được).
Unified Kill Chain (Paul Pols, 2017) hợp nhất Kill Chain + ATT&CK thành 18 giai đoạn theo 3 cụm (In → Through → Out), khắc phục tính tuyến tính. Cần kiểm chứng số giai đoạn theo bản gốc nếu trích dẫn chính xác.
15.4. Diamond Model of Intrusion Analysis
Công bố 2013 (Caltagirone, Pendergast, Betz). Mỗi sự kiện xâm nhập (event) được mô hình hóa bằng 4 đỉnh kim cương, liên kết với nhau:
Adversary
/\
/ \
/ \
Infrastructure ------ Capability
\ /
\ /
\/
Victim
| Đỉnh | Ý nghĩa | Ví dụ cụ thể |
|---|---|---|
| Adversary | Kẻ tấn công (operator/customer) | Nhóm APT29 |
| Capability | Năng lực: malware, exploit, kỹ năng (TTP) | Backdoor "WellMess", exploit CVE-XXXX |
| Infrastructure | Hạ tầng: C2 domain, IP, email gửi đi | 185.220.101.45, update-msft[.]com |
| Victim | Nạn nhân: tổ chức, người, tài sản | Hãng dược X, mail server |
Sức mạnh — Pivoting: khi nắm một đỉnh, ta lần ra đỉnh khác. Ví dụ: từ một domain C2 (infrastructure) → tra passive DNS ra IP dùng chung → tìm các domain khác trỏ cùng IP → suy ra capability/adversary khác của cùng nhóm.
Domain evil.com ─(passive DNS)→ 1.2.3.4 ─(reverse)→ bad2.com, bad3.com
│ │
(whois) (sandbox)
▼ ▼
email reg X ──────(pivot adversary)─────► cùng campaign
Các meta-feature mở rộng: timestamp, phase (gắn Kill Chain), result, direction, methodology, resources. Social-Political (động cơ adversary↔victim) và Technology (capability↔infrastructure) là hai trục bổ sung.
Diamond bổ trợ ATT&CK: ATT&CK điền vào Capability (TTP cụ thể), còn Diamond đặt nó trong quan hệ điều tra.
15.5. IOC vs IOA
Ví von cho dễ nhớ: IOC giống dấu vân tay tên trộm để lại sau khi đã đột nhập — bằng chứng tĩnh của việc đã xảy ra. IOA giống camera bắt được cảnh ai đó đang cạy cửa sổ — chuỗi hành vi đang diễn ra, can thiệp được trước khi mất đồ.
| Tiêu chí | IOC (Indicator of Compromise) | IOA (Indicator of Attack) |
|---|---|---|
| Bản chất | Bằng chứng tĩnh đã xảy ra | Hành vi/ý đồ đang diễn ra |
| Ví dụ | Hash e3b0c44..., IP, domain, mutex, registry key |
"winword.exe spawn powershell.exe rồi tải file từ Internet" |
| Độ bền | Thấp (đổi dễ) | Cao (logic tấn công khó đổi) |
| Phát hiện | So khớp danh sách | Phân tích chuỗi hành vi (EDR) |
Ví dụ IOA (chuỗi nhân–quả) mà EDR phát hiện:
1. outlook.exe → tạo tiến trình winword.exe (mở đính kèm)
2. winword.exe → spawn cmd.exe /c powershell -enc <base64>
3. powershell → kết nối ra 185.x (download)
4. powershell → ghi file vào %APPDATA%\svchost.exe
5. file mới → tạo registry Run key (persistence)
Không indicator đơn lẻ nào ở trên là "xấu tuyệt đối" — chính chuỗi mới là dấu hiệu tấn công. Đây là khác biệt cốt lõi: IOC = "cái gì đã thấy"; IOA = "đang định làm gì". ATT&CK technique về bản chất là cách chuẩn hóa IOA.
15.6. Pyramid of Pain (David Bianco, 2013)
Hình dung như đuổi một kẻ trộm: đổi khóa cửa thì hắn thử cửa sổ (rẻ, đổi trong vài phút); nhưng nếu ta khiến cả cách hắn đột nhập không còn dùng được thì hắn phải học lại nghề. Pyramid of Pain đo đúng "nỗi đau" đó.
Mô hình đo mức đau mà việc ta chặn một loại indicator gây ra cho đối thủ — tức chi phí họ phải bỏ ra để né tránh.
/\
/ \ ← Tough! (khó nhất cho attacker đổi)
/ TTP \
/------\
/ Tools \ ← Challenging
/----------\
/ Network/ \ ← Annoying
/ Host Artifacts \
/------------------\
/ Domain Names \ ← Simple
/----------------------\
/ IP Addresses \ ← Easy
/--------------------------\
/ Hash Values \ ← Trivial (đổi 1 byte → hash mới)
/------------------------------\
| Mức | Indicator | Chi phí đối thủ để né | Hành động Blue Team |
|---|---|---|---|
| Trivial | Hash (MD5/SHA256) | Đổi 1 byte → hash khác hoàn toàn | Vẫn block, nhưng đừng kỳ vọng |
| Easy | IP address | Thuê IP mới (vài phút) | Block + theo dõi pattern hạ tầng |
| Simple | Domain | Đăng ký domain mới (DGA tự động) | DNS sinkhole, phát hiện DGA |
| Annoying | Host/Network artifacts (mutex, User-Agent lạ, registry) | Phải sửa malware | Viết detection theo artifact |
| Challenging | Tools (Mimikatz, Cobalt Strike) | Phải đổi công cụ | YARA theo công cụ, JA3 |
| Tough | TTPs (hành vi: dump LSASS, pass-the-hash) | Phải đổi cách hành động | ATT&CK detection — đầu tư ở đây |
Bài học vận hành: đầu tư detection ở đỉnh tháp (TTP) cho lợi nhuận lâu dài; IOC ở đáy tháp rẻ nhưng chỉ chặn được đúng chiến dịch đã biết. Đây là lý do MITRE ATT&CK (catalog TTP) là trung tâm của detection engineering hiện đại.
15.7. MITRE ATT&CK — kiến trúc và mô hình dữ liệu
ATT&CK = Adversarial Tactics, Techniques, and Common Knowledge. Là knowledge base các hành vi đối thủ quan sát được trong thực tế (curated từ báo cáo công khai). Không phải framework tuyến tính như Kill Chain — nó là ma trận các hành vi.
15.7.1. Phân cấp khái niệm
Tactic = MỤC TIÊU chiến thuật ("VÌ SAO" — attacker muốn đạt gì)
└─ Technique = CÁCH chung để đạt mục tiêu ("LÀM GÌ") → ID Txxxx
└─ Sub-technique = biến thể cụ thể ("LÀM NHƯ THẾ NÀO") → ID Txxxx.xxx
└─ Procedure = hiện thực CỤ THỂ của một nhóm/malware
| Cấp | Trả lời | Định danh | Ví dụ |
|---|---|---|---|
| Tactic | Why (mục tiêu) | TAxxxx |
TA0006 Credential Access |
| Technique | What (phương pháp) | Txxxx |
T1003 OS Credential Dumping |
| Sub-technique | How (biến thể) | Txxxx.xxx |
T1003.001 LSASS Memory |
| Procedure | Cụ thể ai làm sao | (mô tả) | "Mimikatz sekurlsa::logonpasswords đọc LSASS" |
Cấu trúc ID — phân tích từng phần:
| Thành phần | Định dạng | Ý nghĩa | Ví dụ |
|---|---|---|---|
| Prefix | 1 ký tự | Loại đối tượng | T=Technique, TA=Tactic, S=Software, G=Group, M=Mitigation, C=Campaign, DS=Data Source |
| Số technique | 4 chữ số | Định danh technique | 1003 |
| Dấu chấm + 3 chữ số | .xxx |
Sub-technique | .001 |
Ví dụ đầy đủ: T1059.001 = Technique 1059 (Command and Scripting Interpreter), sub-technique 001 (PowerShell).
15.7.2. Mô hình quan hệ (ATT&CK STIX data model)
ATT&CK được phát hành dưới dạng STIX 2.1 bundle (JSON) trên GitHub mitre/cti. Các object type chính và ánh xạ:
| Khái niệm ATT&CK | STIX 2.1 type | Quan hệ |
|---|---|---|
| Technique | attack-pattern |
— |
| Tactic | x-mitre-tactic |
technique kill_chain_phases trỏ tới tactic |
| Group | intrusion-set |
uses → attack-pattern / malware |
| Software (malware/tool) | malware / tool |
uses → attack-pattern |
| Mitigation | course-of-action |
mitigates → attack-pattern |
| Data Source/Component | x-mitre-data-source / x-mitre-data-component |
detects → attack-pattern |
| Relationship | relationship |
nối các object |
Trích một attack-pattern (rút gọn, đúng cấu trúc STIX):
{
"type": "attack-pattern",
"id": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22",
"spec_version": "2.1",
"name": "PowerShell",
"x_mitre_is_subtechnique": true,
"kill_chain_phases": [
{ "kill_chain_name": "mitre-attack", "phase_name": "execution" }
],
"external_references": [
{ "source_name": "mitre-attack",
"external_id": "T1059.001",
"url": "https://attack.mitre.org/techniques/T1059/001" }
],
"x_mitre_platforms": ["Windows"],
"x_mitre_data_sources": ["Command: Command Execution",
"Process: Process Creation",
"Module: Module Load"],
"x_mitre_detection": "Monitor for execution of powershell.exe with..."
}
Lưu ý quan trọng: technique ID đặt trong external_references (nơi source_name == "mitre-attack"), KHÔNG phải trường id (đó là STIX UUID). Đây là điểm hay nhầm khi viết script parse ATT&CK.
15.7.3. Lấy và truy vấn dữ liệu ATT&CK — ví dụ chạy được
Tải bundle Enterprise và đếm số technique bằng jq:
# Tải STIX bundle Enterprise ATT&CK
curl -sSL -o enterprise-attack.json \
https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json
# Đếm số attack-pattern chưa bị deprecated/revoked
jq '[.objects[]
| select(.type=="attack-pattern")
| select((.revoked // false)|not)
| select((.x_mitre_deprecated // false)|not)] | length' \
enterprise-attack.json
# Liệt kê technique ID + tên cho tactic "credential-access"
jq -r '.objects[]
| select(.type=="attack-pattern")
| select(.kill_chain_phases[]?.phase_name=="credential-access")
| (.external_references[]
| select(.source_name=="mitre-attack").external_id)
+ " " + .name' \
enterprise-attack.json | sort | head
Giải thích tham số: select(.type=="attack-pattern") lọc đúng technique; .kill_chain_phases[]?.phase_name truy cập tactic (dấu ? tránh lỗi khi mảng vắng); .external_references[] | select(.source_name=="mitre-attack").external_id rút technique ID.
Truy vấn ở tầng Python với thư viện chính thức mitreattack-python:
from mitreattack.stix20 import MitreAttackData
mad = MitreAttackData("enterprise-attack.json")
# Lấy technique theo ATT&CK ID
t = mad.get_object_by_attack_id("T1003.001", "attack-pattern")
print(t.name) # LSASS Memory
# Nhóm nào dùng technique này?
groups = mad.get_groups_using_technique(t.id)
for g in groups:
print(g["object"].name) # vd: APT28, ...
15.7.4. 14 Tactic Enterprise (Reconnaissance → Impact)
Thứ tự cột trong ma trận Enterprise (đây là thứ tự logic, không bắt buộc tuyến tính khi tấn công thật):
| # | Tactic | ID | Mục tiêu của attacker | Technique ví dụ |
|---|---|---|---|---|
| 1 | Reconnaissance | TA0043 | Thu thập thông tin trước tấn công | T1595 Active Scanning, T1589 Gather Victim Identity Info |
| 2 | Resource Development | TA0042 | Chuẩn bị hạ tầng/công cụ | T1583 Acquire Infrastructure, T1587 Develop Capabilities |
| 3 | Initial Access | TA0001 | Đặt chân vào mạng | T1566 Phishing, T1190 Exploit Public-Facing App |
| 4 | Execution | TA0002 | Chạy code độc hại | T1059 Command and Scripting Interpreter |
| 5 | Persistence | TA0003 | Duy trì chỗ đứng qua reboot | T1547 Boot/Logon Autostart, T1053 Scheduled Task |
| 6 | Privilege Escalation | TA0004 | Nâng quyền | T1548 Abuse Elevation Control, T1068 Exploit for PrivEsc |
| 7 | Defense Evasion | TA0005 | Né phát hiện | T1070 Indicator Removal, T1027 Obfuscated Files |
| 8 | Credential Access | TA0006 | Lấy tài khoản/mật khẩu | T1110 Brute Force, T1003 OS Credential Dumping |
| 9 | Discovery | TA0007 | Dò xét môi trường | T1083 File/Directory Discovery, T1018 Remote System Discovery |
| 10 | Lateral Movement | TA0008 | Di chuyển sang host khác | T1021 Remote Services, T1550 Use Alternate Auth Material |
| 11 | Collection | TA0009 | Gom dữ liệu mục tiêu | T1005 Data from Local System, T1113 Screen Capture |
| 12 | Command and Control | TA0011 | Điều khiển từ xa | T1071 App Layer Protocol, T1572 Protocol Tunneling |
| 13 | Exfiltration | TA0010 | Tuồn dữ liệu ra | T1041 Exfil Over C2 Channel, T1048 Exfil Over Alt Protocol |
| 14 | Impact | TA0040 | Phá hoại/tống tiền | T1486 Data Encrypted for Impact, T1490 Inhibit System Recovery |
Vì sao 2 tactic "Reconnaissance" và "Resource Development" được thêm sau (PRE-ATT&CK gộp vào): ban đầu ATT&CK Enterprise bắt đầu từ Initial Access. Các hoạt động trước xâm nhập (recon, mua hạ tầng) xảy ra ngoài mạng nạn nhân nên khó telemetry, được tách thành PRE-ATT&CK rồi (2020) tích hợp lại làm 2 cột đầu.
15.8. Đào sâu các Technique trọng yếu (cơ chế + dấu hiệu phát hiện)
15.8.1. T1110 — Brute Force (Credential Access)
Là gì: thử nhiều cặp credential cho tới khi đúng. Sub-techniques:
| ID | Tên | Cơ chế |
|---|---|---|
| T1110.001 | Password Guessing | Thử nhiều mật khẩu cho một tài khoản |
| T1110.002 | Password Cracking | Bẻ hash offline (sau khi đã dump) |
| T1110.003 | Password Spraying | Thử một mật khẩu phổ biến trên nhiều tài khoản (né lockout) |
| T1110.004 | Credential Stuffing | Dùng cặp user/pass rò rỉ từ nơi khác |
Vì sao password spraying nguy hiểm: chính sách lockout thường khóa sau N lần sai trên một tài khoản. Spray thử Summer2024! lần lượt cho 5000 user → mỗi user chỉ 1 lần sai → không kích hoạt lockout.
Ví dụ thực tế — spray SMB/RDP bằng crackmapexec (dùng trong lab có phép):
# Một mật khẩu, nhiều user, có --continue-on-success để gom hết hit
crackmapexec smb 10.0.0.0/24 -u users.txt -p 'Summer2024!' \
--continue-on-success
Lưu ý công cụ:
crackmapexec(CME) đã ngừng bảo trì từ ~2023; bản kế thừa được cộng đồng phát triển tiếp là NetExec (nxc), cú pháp gần như tương đương (nxc smb 10.0.0.0/24 -u users.txt -p 'Summer2024!' --continue-on-success). Với môi trường mới nên dùngnxc.
Dấu hiệu Blue Team (Windows Security log):
| Trường | Giá trị cần để ý |
|---|---|
| Event ID | 4625 (logon failed) — nhiều, rải nhiều TargetUserName |
| Event ID | 4771 (Kerberos pre-auth failed), 4768 |
| Failure Reason / Status | 0xC000006A (sai mật khẩu), 0xC0000234 (account locked) |
| Pattern | Nhiều username khác nhau, cùng một password attempt window → spray |
Detection logic (pseudo-SIEM):
COUNT(distinct TargetUserName) WHERE EventID=4625
GROUP BY SourceIP, time_bucket(5m) > 20 → cảnh báo password spraying
15.8.2. T1059 — Command and Scripting Interpreter (Execution)
| Sub | Interpreter |
|---|---|
| T1059.001 | PowerShell |
| T1059.003 | Windows Command Shell (cmd) |
| T1059.004 | Unix Shell (bash) |
| T1059.005 | Visual Basic |
| T1059.006 | Python |
| T1059.007 | JavaScript |
Ví dụ payload PowerShell mã hóa — giải thích từng phần:
powershell.exe -nop -w hidden -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBi...
| Tham số | Ý nghĩa | Vì sao attacker dùng |
|---|---|---|
-nop |
-NoProfile |
Bỏ qua profile (tránh logging/khởi tạo) |
-w hidden |
-WindowStyle Hidden |
Ẩn cửa sổ |
-enc |
-EncodedCommand (Base64 UTF-16LE) |
Né phát hiện chuỗi, né dấu nháy escape |
Lưu ý mã hóa: chuỗi sau -enc là Base64 của text UTF-16 Little Endian, không phải UTF-8. Giải mã đúng:
# Lệnh thực: giải mã encoded command
echo 'SQBFAFgAIAAoAE4AZQB3AC0ATwBi' | base64 -d | iconv -f UTF-16LE -t UTF-8
# → "IEX (New-Ob..." (Invoke-Expression — tải & chạy từ bộ nhớ)
Dấu hiệu Blue Team:
- Script Block Logging (Event ID 4104) ghi lại nội dung script đã giải mã — bật qua GPO Administrative Templates → Windows PowerShell → Turn on PowerShell Script Block Logging.
- Process creation (4688 / Sysmon 1) với CommandLine chứa -enc, -e, FromBase64String, IEX, DownloadString.
- Parent–child bất thường: winword.exe → powershell.exe (IOA).
15.8.3. T1003 — OS Credential Dumping (Credential Access)
| Sub | Nguồn credential | Cơ chế |
|---|---|---|
| T1003.001 | LSASS Memory | Đọc bộ nhớ tiến trình lsass.exe (chứa hash/vé Kerberos/đôi khi plaintext) |
| T1003.002 | Security Account Manager (SAM) | Đọc registry hive SAM → NTLM hash local |
| T1003.003 | NTDS (ntds.dit) |
Database AD trên Domain Controller → toàn bộ hash domain |
| T1003.004 | LSA Secrets | HKLM\SECURITY\Policy\Secrets |
| T1003.006 | DCSync | Giả làm DC, yêu cầu replication (DRSGetNCChanges) để lấy hash |
Vì sao LSASS là mục tiêu: Local Security Authority Subsystem Service giữ credential material để hỗ trợ SSO. Mimikatz sekurlsa::logonpasswords mở handle tới lsass.exe, đọc các cấu trúc bộ nhớ và giải mã.
Ví dụ thực tế (lab):
mimikatz # privilege::debug # bật SeDebugPrivilege
mimikatz # sekurlsa::logonpasswords # dump credential từ LSASS
Dump bằng công cụ living off the land (LOLBIN — lợi dụng công cụ có sẵn của hệ điều hành) khó bị AV chú ý hơn:
:: Tạo minidump LSASS bằng comsvcs.dll (LOLBIN)
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump <PID_lsass> C:\temp\l.dmp full
Dấu hiệu Blue Team:
- Sysmon Event ID 10 (ProcessAccess) với TargetImage = lsass.exe và GrantedAccess = 0x1010/0x1410/0x143A (quyền đọc bộ nhớ) từ tiến trình không phải hệ thống.
- Credential Guard (VBS) cô lập LSASS secrets → vô hiệu mimikatz logonpasswords.
- PPL (Protected Process Light) cho LSASS: RunAsPPL=1 ở HKLM\SYSTEM\CurrentControlSet\Control\Lsa.
Sysmon config phát hiện đọc LSASS:
<Sysmon schemaversion="4.90">
<EventFiltering>
<RuleGroup name="lsass-access" groupRelation="or">
<ProcessAccess onmatch="include">
<TargetImage condition="image">lsass.exe</TargetImage>
</ProcessAccess>
</RuleGroup>
</EventFiltering>
</Sysmon>
15.8.4. T1021 — Remote Services (Lateral Movement)
| Sub | Dịch vụ | Port | Dấu hiệu |
|---|---|---|---|
| T1021.001 | RDP | TCP 3389 | Event 4624 Logon Type 10 (RemoteInteractive) |
| T1021.002 | SMB/Windows Admin Shares (C$, ADMIN$) | TCP 445 | Logon Type 3; truy cập \\host\ADMIN$ |
| T1021.004 | SSH | TCP 22 | auth log |
| T1021.006 | WinRM | TCP 5985/5986 | Logon Type 3; wsmprovhost.exe |
Logon Type — bảng tra (Windows Event 4624):
| Type | Ý nghĩa | Liên quan lateral movement |
|---|---|---|
| 2 | Interactive (tại máy) | — |
| 3 | Network (SMB, share, WinRM) | Có — pass-the-hash, psexec |
| 10 | RemoteInteractive (RDP) | Có |
| 5 | Service | persistence |
Ví dụ thực tế — pass-the-hash qua SMB (impacket):
# Dùng NTLM hash thay vì mật khẩu để thực thi từ xa (T1021.002 + T1550.002)
impacket-psexec -hashes :32ed87bdb5fdc5e9cba88547376818d4 \
Administrator@10.0.0.5
Dấu hiệu: chuỗi 4624 (Type 3) → tạo service "PSEXESVC" (Event 7045) → tiến trình con cmd.exe trên host đích.
15.8.5. T1041 — Exfiltration Over C2 Channel (Exfiltration)
Là gì: tuồn dữ liệu ra qua chính kênh C2 đang dùng (HTTP/HTTPS/DNS) thay vì mở kênh riêng — để hòa lẫn lưu lượng.
Dấu hiệu Blue Team — phát hiện C2/beacon ở mức gói tin: - Beaconing: kết nối định kỳ đều đặn (vd mỗi 60s ± jitter) tới cùng host. Phát hiện qua phân tích periodicity của NetFlow. - Tỷ lệ upload/download bất thường (bytes_out >> bytes_in cho exfil). - JA3/JA3S fingerprint của TLS client hello khớp Cobalt Strike/Metasploit. - DNS exfil: subdomain dài, entropy cao, nhiều query TXT/NULL.
Beacon pattern (NetFlow nhìn theo thời gian):
10:00:00 client → C2 220 bytes
10:01:00 client → C2 240 bytes ← chu kỳ ~60s
10:02:01 client → C2 225 bytes
... (độ lệch nhỏ = jitter) → cảnh báo regular beaconing
15.9. Các Matrix: Enterprise, Mobile, ICS
ATT&CK có nhiều "domain" với tactic/technique riêng phù hợp môi trường:
| Matrix | Phạm vi | Platform con | Tactic đặc thù |
|---|---|---|---|
| Enterprise | IT doanh nghiệp | Windows, Linux, macOS, Cloud (IaaS, SaaS, Office/Google Workspace, Azure AD/Entra ID), Network, Containers | 14 tactic (đã liệt kê) |
| Mobile | Android, iOS | — | Có thêm các tactic liên quan thiết bị; vd Network Effects |
| ICS | Hệ thống điều khiển công nghiệp/OT | PLC, SCADA, HMI | 12 tactic gồm Impair Process Control, Inhibit Response Function |
Cloud (nằm trong Enterprise): ví dụ technique đặc thù cloud: - T1078.004 Valid Accounts: Cloud Accounts - T1098 Account Manipulation (thêm credential/role IAM) - T1530 Data from Cloud Storage (đọc S3 bucket public) - T1526 Cloud Service Discovery
ICS — vì sao tách riêng: trong OT, "Impact" có thể là gây thiệt hại vật lý (đóng/mở van, làm hỏng tua-bin — như Stuxnet/Triton). Tactic Inhibit Response Function mô tả việc vô hiệu hệ thống an toàn (Safety Instrumented System) — không có khái niệm tương đương trong IT. Technique ví dụ: T0816 Device Restart/Shutdown, T0831 Manipulation of Control.
15.10. ATT&CK Navigator: map detection & đo coverage
Navigator là ứng dụng web (chạy được offline) tô màu các ô technique trên ma trận để trực quan hóa: coverage phát hiện, hoạt động của một nhóm APT, gap analysis. Dữ liệu lưu dưới layer file (JSON).
15.10.1. Cấu trúc layer JSON — từng trường
{
"name": "SOC Detection Coverage Q2",
"versions": { "attack": "17", "navigator": "5.0.0", "layer": "4.5" },
"domain": "enterprise-attack",
"description": "Độ phủ rule SIEM hiện tại",
"techniques": [
{
"techniqueID": "T1059.001",
"tactic": "execution",
"score": 100,
"color": "",
"comment": "Phủ bởi Sigma rule win_susp_powershell_enc",
"enabled": true,
"metadata": [
{ "name": "rule_id", "value": "SIGMA-0421" }
]
},
{
"techniqueID": "T1003.001",
"tactic": "credential-access",
"score": 50,
"comment": "Chỉ có rule Sysmon EID10, chưa cover comsvcs"
}
],
"gradient": {
"colors": ["#ff6666", "#ffe766", "#8ec843"],
"minValue": 0, "maxValue": 100
},
"legendItems": [],
"showTacticRowBackground": true,
"tacticRowBackground": "#dddddd",
"selectTechniquesAcrossTactics": true
}
| Trường | Kiểu | Ý nghĩa |
|---|---|---|
domain |
string | enterprise-attack / mobile-attack / ics-attack |
versions.attack |
string | Phiên bản ATT&CK (vd "15") — phải khớp để ID hợp lệ |
techniques[].techniqueID |
string | ID technique/sub-technique |
techniques[].tactic |
string | tactic shortname (vì 1 technique có thể thuộc nhiều tactic → cần chỉ rõ ô nào) |
techniques[].score |
number | Điểm để tô gradient (vd % coverage) |
gradient |
object | Ánh xạ score→màu (min→max) |
Vì sao cần tactic trên từng technique: một technique như T1078 Valid Accounts xuất hiện ở nhiều cột (Initial Access, Persistence, Privilege Escalation, Defense Evasion). Trường tactic chỉ định tô ô nào.
15.10.2. Quy trình đo coverage thực tế
- Liệt kê toàn bộ detection rule (Sigma/SIEM) hiện có.
- Gán mỗi rule → một/nhiều technique ID (qua trường
tags: attack.txxxxtrong Sigma — xem 15.11). - Sinh layer JSON (script),
score=100cho technique có rule,0cho chưa. - Mở Navigator → import layer → nhìn vùng đỏ = detection gap.
- So với layer của các APT nhắm vào ngành mình (MITRE cung cấp sẵn layer theo group) → kết hợp 2 layer bằng phép toán để ưu tiên.
Script sinh layer từ kho Sigma (rút gọn):
import glob, yaml, json, re
techs = {}
for f in glob.glob("rules/**/*.yml", recursive=True):
doc = yaml.safe_load(open(f, encoding="utf-8"))
for tag in (doc.get("tags") or []):
m = re.fullmatch(r"attack\.(t\d{4}(?:\.\d{3})?)", tag, re.I)
if m:
techs[m.group(1).upper()] = techs.get(m.group(1).upper(), 0) + 1
layer = {
"name": "Sigma coverage", "domain": "enterprise-attack",
"versions": {"attack": "17", "navigator": "5.0.0", "layer": "4.5"},
"techniques": [
{"techniqueID": t, "score": min(100, c*25),
"comment": f"{c} rule(s)"} for t, c in techs.items()
],
"gradient": {"colors": ["#ff6666","#8ec843"], "minValue":0, "maxValue":100}
}
json.dump(layer, open("coverage.json","w"), indent=2)
Navigator hỗ trợ layer arithmetic: ví dụ tạo layer mới = a - b để tìm technique APT dùng (a) mà ta chưa cover (b).
15.11. Detection Engineering: Sigma, YARA, Suricata gắn ATT&CK
15.11.1. Sigma — rule SIEM-agnostic
Là gì: định dạng YAML mô tả detection trên log một cách trung lập, rồi sigma-cli chuyển sang truy vấn Splunk/Elastic/Sentinel...
[PROD] Cấu trúc rule — từng trường (rule này khớp theo hành vi trên CommandLine, thuộc tầng cao Pyramid of Pain — xem Chương 10 về detection engineering và Chương 8 về telemetry endpoint):
title: PowerShell EncodedCommand Suspicious
id: f7d4c3b2-1a2b-4c3d-9e8f-0a1b2c3d4e5f
status: experimental
description: Phát hiện powershell.exe chạy với tham số -EncodedCommand
references:
- https://attack.mitre.org/techniques/T1059/001
author: Blue Team
date: 2026/06/19
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '\powershell.exe'
CommandLine|contains:
- ' -enc '
- ' -EncodedCommand '
- ' -e '
condition: selection
falsepositives:
- Một số script quản trị hợp lệ dùng -enc
level: high
tags:
- attack.execution
- attack.t1059.001
| Trường | Bắt buộc | Ý nghĩa |
|---|---|---|
id |
Có | UUID duy nhất (dedupe, tham chiếu) |
logsource.category |
Có | Loại log (process_creation, firewall, dns_query...) |
detection.selection |
Có | Điều kiện khớp (map key→field log) |
detection.condition |
Có | Logic boolean kết hợp các selection |
tags |
Khuyến nghị | attack.txxxx → liên kết ATT&CK (dùng đo coverage) |
Modifier (|): endswith, contains, startswith, re (regex), all. Vì sao có modifier: log thực tế đường dẫn đầy đủ → cần endswith thay vì so khớp tuyệt đối.
Biên dịch sang backend (lệnh thật):
pip install sigma-cli pysigma-backend-splunk
sigma convert -t splunk -p splunk_windows powershell_enc.yml
# Output (SPL):
# Image="*\\powershell.exe" (CommandLine="* -enc *" OR CommandLine="* -e *" ...)
15.11.2. YARA — pattern matching trên file/bộ nhớ
Là gì: ngôn ngữ rule khớp chuỗi/byte/regex trong file hoặc process memory → phân loại malware (mức "Tools" trên Pyramid of Pain).
[PROD] Cấu trúc rule (khớp chuỗi đặc trưng của công cụ — tầng "Tools", tương đối bền vì buộc đối thủ đổi công cụ):
import "pe"
rule Mimikatz_Strings
{
meta:
author = "BlueTeam"
description = "Phát hiện chuỗi đặc trưng Mimikatz"
attack = "T1003.001"
reference = "https://attack.mitre.org/software/S0002/"
strings:
$s1 = "sekurlsa::logonpasswords" ascii wide
$s2 = "privilege::debug" ascii wide
$s3 = { 6D 69 6D 69 6B 61 74 7A } // "mimikatz" hex
$re = /gentilkiwi|benjamin delpy/ nocase
condition:
uint16(0) == 0x5A4D and // MZ header (PE file)
pe.number_of_sections > 1 and
2 of ($s*) and $re
}
| Phần | Ý nghĩa |
|---|---|
strings |
Khai báo pattern: ascii/wide (UTF-16), nocase, hex { .. }, regex /../ |
condition |
Logic; uint16(0)==0x5A4D kiểm tra 2 byte đầu = MZ (PE); 2 of ($s*) = ít nhất 2 string khớp |
import "pe" |
Module phân tích PE (số section, import, entry point) |
Vì sao uint16(0)==0x5A4D: file PE bắt đầu bằng signature "MZ" (0x4D 0x5A) — little-endian đọc 2 byte đầu thành 0x5A4D. Điều kiện này loại sớm file không phải PE → rule nhanh hơn.
Lệnh quét thật:
yara -r -w mimikatz.yar /path/to/scan # -r đệ quy, -w tắt warning
yara mimikatz.yar --scan-list pids.txt # quét theo PID (memory)
15.11.3. Suricata — IDS/IPS phát hiện network (C2/exfil)
Là gì: IDS/IPS chữ ký + phân tích giao thức. Rule khớp gói/flow, gắn metadata ATT&CK.
[DEMO] Cấu trúc rule — từng phần (chỉ minh hoạ cơ chế, KHÔNG dùng thẳng production): IOC kiểu chuỗi User-Agent/URI cố định nằm ở đáy Pyramid of Pain — đối thủ đổi User-Agent hoặc URI trong vài phút nên rule này kém bền, dễ né và dễ false positive. Khi triển khai thật, hãy ưu tiên phát hiện theo hành vi/TTP (xem Chương 10) và bổ sung telemetry mạng tương quan với endpoint (xem Chương 8).
alert http $HOME_NET any -> $EXTERNAL_NET any ( \
msg:"ATT&CK T1071.001 Suspicious User-Agent CobaltStrike default"; \
flow:established,to_server; \
http.user_agent; content:"Mozilla/5.0 (compatible; MSIE 9.0"; \
http.uri; content:"/__utm.gif"; \
classtype:trojan-activity; \
metadata: attack_target Client_Endpoint, mitre_technique_id T1071; \
sid:9000001; rev:1; )
| Thành phần | Ý nghĩa |
|---|---|
alert http |
Action (alert/drop/reject) + protocol app-layer |
$HOME_NET any -> $EXTERNAL_NET any |
Hướng: nguồn IP/port → đích IP/port |
flow:established,to_server |
Chỉ khớp gói client→server trong kết nối đã thiết lập |
http.user_agent + content |
Sticky buffer: chỉ tìm trong header User-Agent |
sid |
Signature ID (duy nhất); rev revision |
metadata: mitre_technique_id |
Gắn ATT&CK ID |
Vì sao dùng sticky buffer (http.user_agent): giới hạn việc tìm content đúng vào trường cần, tránh false positive và tăng tốc (không scan toàn payload).
Chạy thật trên file pcap:
suricata -r capture.pcap -S local.rules -l ./out/
# Kết quả alert ở ./out/fast.log và eve.json (JSON, đầy đủ field)
cat ./out/fast.log
# 06/19/2026-10:00:01 [**] [1:9000001:1] ATT&CK T1071.001 ... [**] ...
15.12. Chia sẻ tình báo: STIX, TAXII, MISP
15.12.1. STIX 2.1 — ngôn ngữ mô tả CTI
STIX (Structured Threat Information eXpression) dùng JSON; mọi thứ là SDO (STIX Domain Object), SRO (Relationship Object), hoặc SCO (Cyber-observable Object).
[DEMO] STIX Indicator (SDO) — từng trường (minh hoạ cấu trúc; bản thân IOC domain đơn lẻ thuộc đáy Pyramid of Pain, mau hỏng — không nên là trụ cột phát hiện):
{
"type": "indicator",
"spec_version": "2.1",
"id": "indicator--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f",
"created": "2026-06-19T08:00:00.000Z",
"modified": "2026-06-19T08:00:00.000Z",
"name": "Malicious C2 domain",
"indicator_types": ["malicious-activity"],
"pattern": "[domain-name:value = 'update-msft.com']",
"pattern_type": "stix",
"valid_from": "2026-06-19T00:00:00Z"
}
| Trường | Kích thước/Định dạng | Ý nghĩa |
|---|---|---|
type |
string | Loại object (indicator, malware, threat-actor...) |
id |
type--UUIDv4 |
Định danh toàn cục duy nhất |
created/modified |
ISO 8601 UTC (timestamp) | Versioning |
pattern |
STIX Patterning language | Biểu thức khớp observable |
pattern_type |
enum | stix, snort, yara, sigma... |
STIX Pattern là một mini-ngôn ngữ: [file:hashes.'SHA-256' = 'abc...' AND file:size > 1024]. Toán tử: AND OR FOLLOWEDBY, qualifier WITHIN, REPEATS. Vì sao tách pattern riêng: cho phép biểu diễn điều kiện phức hợp, không chỉ một IOC đơn.
15.12.2. TAXII 2.1 — giao thức vận chuyển STIX
TAXII (Trusted Automated eXchange of Indicator Information) là API HTTPS REST để trao đổi STIX. Mô hình: Server → API Roots → Collections → Objects.
| Endpoint | Method | Trả về |
|---|---|---|
/taxii2/ |
GET | Discovery: liệt kê API roots |
/{api-root}/collections/ |
GET | Danh sách collection |
/{api-root}/collections/{id}/objects/ |
GET | Lấy STIX objects (hỗ trợ filter ?added_after=) |
/{api-root}/collections/{id}/objects/ |
POST | Đẩy object lên |
# Phải set Accept đúng media type TAXII 2.1
curl -s -H "Accept: application/taxii+json;version=2.1" \
-u user:pass \
"https://taxii.example.org/api1/collections/<id>/objects/?added_after=2026-06-18T00:00:00Z"
Header Accept: application/taxii+json;version=2.1 là bắt buộc — server dùng nó để negotiate phiên bản; thiếu thì trả 406.
15.12.3. MISP — nền tảng chia sẻ thực dụng
MISP dùng mô hình Event → Attribute → Object → Tag/Galaxy.
| Khái niệm | Ý nghĩa |
|---|---|
| Event | Một sự kiện/chiến dịch (chứa nhiều attribute) |
| Attribute | Một IOC: type (ip-dst, domain, sha256, url...), value, category, to_ids (có đẩy ra IDS không) |
| Object | Nhóm attribute có cấu trúc (vd "file" gồm filename+md5+sha256) |
| Galaxy / Cluster | Tri thức ngữ cảnh; MITRE ATT&CK được nhúng làm Galaxy → gắn technique vào event |
| Tag | Nhãn (TLP, ATT&CK, threat-actor) |
Trường to_ids quan trọng: true = IOC đủ tin cậy để đẩy thành rule IDS/SIEM; false = chỉ ngữ cảnh, không tự động chặn (tránh false positive).
TLP (Traffic Light Protocol) điều khiển chia sẻ:
| Tag | Chia sẻ tới |
|---|---|
tlp:red |
Chỉ người nhận trực tiếp |
tlp:amber |
Tổ chức + đối tác cần biết |
tlp:amber+strict |
Chỉ trong tổ chức |
tlp:green |
Cộng đồng, không công khai |
tlp:clear (trước là white) |
Công khai |
Ví dụ thật — tạo event + thêm attribute qua REST API (PyMISP):
from pymisp import PyMISP, MISPEvent, MISPAttribute
misp = PyMISP("https://misp.local", "<AUTH_KEY>", ssl=False)
ev = MISPEvent()
ev.info = "FIN7 phishing campaign June 2026"
ev.distribution = 1 # 1 = This community only
ev.threat_level_id = 2 # 1=High,2=Medium,3=Low,4=Undefined
ev.analysis = 1 # 0=Initial,1=Ongoing,2=Completed
ev.add_tag("tlp:amber")
ev.add_tag('misp-galaxy:mitre-attack-pattern="OS Credential Dumping - T1003"')
ev.add_attribute("domain", "update-msft.com", to_ids=True,
category="Network activity")
ev.add_attribute("sha256",
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
to_ids=True, category="Payload delivery")
created = misp.add_event(ev, pythonify=True)
print(created.id)
Hoặc thuần HTTP:
curl -s https://misp.local/events/add \
-H "Authorization: <AUTH_KEY>" \
-H "Accept: application/json" -H "Content-Type: application/json" \
-d '{"Event":{"info":"Test","distribution":"0","threat_level_id":"2",
"analysis":"0",
"Attribute":[{"type":"ip-dst","value":"185.220.101.45","to_ids":true}]}}'
15.13. Phân loại Malware
Hình dung như bệnh dịch: virus phải bám vào "vật chủ" mới lây (như cảm cúm bám người), worm tự bò sang máy khác không cần ai mở (như dịch lây trong không khí), còn trojan thì giả dạng món quà vô hại để ta tự rước vào nhà. Gọi đúng "bệnh" mới chọn đúng "thuốc".
| Loại | Cơ chế lan/định nghĩa | Cần host? | Tự nhân? | ATT&CK liên quan |
|---|---|---|---|---|
| Virus | Chèn code vào file/chương trình khác; chạy khi host chạy | Có | Có (qua host) | T1204 User Execution |
| Worm | Tự lan qua mạng/lỗ hổng, không cần người dùng | Không | Có (tự động) | T1210 Exploit Remote Services |
| Trojan | Giả phần mềm hợp lệ, mở backdoor | — | Không | T1036 Masquerading |
| Ransomware | Mã hóa dữ liệu, đòi tiền chuộc | — | Có thể | T1486 Data Encrypted for Impact |
| Rootkit | Ẩn sự hiện diện (kernel/bootkit), hook API | — | Không | T1014 Rootkit |
| RAT | Remote Access Trojan: điều khiển từ xa toàn diện | — | Không | T1219 Remote Access Software |
| Botnet | Mạng máy bị nhiễm điều khiển tập trung (DDoS/spam) | — | Có | T1583.005 Botnet |
| Fileless | Sống trong bộ nhớ/registry/WMI, ít/không chạm đĩa | Không | — | T1059, T1047 WMI, T1620 Reflective Loading |
Vì sao fileless khó phát hiện: không có file để AV quét hash/signature → phải phát hiện ở mức hành vi (IOA): PowerShell tải code vào RAM, WMI event subscription làm persistence, registry chứa payload base64. Đây minh họa trực tiếp Pyramid of Pain — buộc Blue Team lên tầng TTP.
15.14. Phân tích Malware cơ bản
15.14.1. Static Analysis (không chạy mẫu)
Strings — trích chuỗi ASCII/Unicode để tìm dấu vết (URL, IP, lệnh, mutex):
strings -n 8 sample.exe | grep -Ei 'http|\.exe|powershell|HKEY|cmd'
strings -e l sample.exe # -e l = little-endian 16-bit (Unicode/UTF-16)
-n 8 chỉ lấy chuỗi ≥ 8 ký tự (giảm nhiễu); -e l cần thiết vì Windows hay dùng chuỗi UTF-16LE mà mặc định strings bỏ qua.
PE Header — cấu trúc file thực thi Windows (đào tới byte):
Một file PE bố cục như sau (offset từ đầu file):
Offset 0x00 ┌──────────────────────────────────────────┐
│ DOS Header (IMAGE_DOS_HEADER, 64 bytes) │
│ e_magic = "MZ" (0x4D5A) │ ← 2 bytes, offset 0x00
│ e_lfanew = offset tới PE header │ ← 4 bytes, offset 0x3C
0x3C ───────►│ │
├──────────────────────────────────────────┤
e_lfanew ──► │ PE Signature "PE\0\0" (0x50450000) │ ← 4 bytes
├──────────────────────────────────────────┤
│ COFF File Header (IMAGE_FILE_HEADER, 20B) │
│ Machine (2B) 0x8664=x64 │
│ NumberOfSections (2B) │
│ TimeDateStamp (4B) epoch compile │
│ SizeOfOptionalHeader (2B) │
│ Characteristics (2B) │
├──────────────────────────────────────────┤
│ Optional Header (PE32: 224B / PE32+: 240B) │
│ Magic (2B) 0x10B=PE32, 0x20B=PE32+ │
│ AddressOfEntryPoint (4B) RVA │
│ ImageBase, SectionAlignment, ... │
│ Subsystem (2B) 2=GUI, 3=CUI │
│ DataDirectory[16] (Import, Export...) │
├──────────────────────────────────────────┤
│ Section Table (mỗi entry 40 bytes) │
│ .text .data .rdata .rsrc │
└──────────────────────────────────────────┘
| Trường | Offset | Kích thước | Ý nghĩa | Giá trị ví dụ |
|---|---|---|---|---|
e_magic |
0x00 | 2 B | Chữ ký DOS | 4D 5A ("MZ") |
e_lfanew |
0x3C | 4 B | Offset tới PE header | 0x000000E8 |
| PE signature | e_lfanew | 4 B | 50 45 00 00 ("PE\0\0") |
— |
Machine |
+0x04 | 2 B | Kiến trúc | 0x8664 (x64), 0x014C (x86) |
NumberOfSections |
+0x06 | 2 B | Số section | 5 |
TimeDateStamp |
+0x08 | 4 B | Thời điểm compile (epoch) | 0x5F2A... |
Magic (Opt.) |
+0x18 | 2 B | PE32 vs PE32+ | 0x010B / 0x020B |
AddressOfEntryPoint |
Opt+0x10 | 4 B | RVA điểm vào code | 0x1500 |
Subsystem |
Opt | 2 B | GUI/Console | 2=GUI, 3=Console |
Vì sao đọc PE header có giá trị forensic:
- TimeDateStamp lệch vô lý (tương lai/quá khứ xa) → có thể bị giả mạo (anti-forensics).
- Section có RawSize ≈ 0 nhưng VirtualSize lớn + entropy cao → dấu hiệu packed (UPX, themida).
- Imports nghèo nàn (chỉ LoadLibrary+GetProcAddress) → import resolution động → packed/obfuscated.
# Phân tích PE bằng pefile (Python)
python3 - <<'PY'
import pefile, math
pe = pefile.PE("sample.exe")
print("Machine:", hex(pe.FILE_HEADER.Machine))
print("Compile time:", pe.FILE_HEADER.TimeDateStamp)
print("EntryPoint RVA:", hex(pe.OPTIONAL_HEADER.AddressOfEntryPoint))
for s in pe.sections:
data = s.get_data()
ent = 0
if data:
from collections import Counter
for c in Counter(data).values():
p = c/len(data); ent -= p*math.log2(p)
print(s.Name.decode(errors='replace').strip('\x00'),
"vsize=%#x rawsize=%#x entropy=%.2f" %
(s.Misc_VirtualSize, s.SizeOfRawData, ent))
PY
Entropy > ~7.0 trên một section thực thi gợi ý dữ liệu nén/mã hóa (packed). Đây là heuristic quan trọng trong triage.
Hashing & lookup:
sha256sum sample.exe # hash để tra VirusTotal/MISP
# Import hash (imphash) – đặc trưng theo bảng import, gom biến thể cùng builder
python3 -c "import pefile;print(pefile.PE('sample.exe').get_imphash())"
imphash (import hash) bền hơn file hash vì các mẫu cùng "builder" thường có cùng thứ tự import → gom được biến thể (mức Tools trên Pyramid of Pain).
15.14.2. Dynamic Analysis (chạy trong sandbox)
Là gì: chạy mẫu trong môi trường cô lập (VM snapshot, không có route ra Internet thật hoặc dùng INetSim giả lập), thu hành vi: tiến trình tạo, file ghi, registry, kết nối mạng, API call.
Setup an toàn — vì sao:
- VM không nối mạng sản xuất; snapshot để revert.
- INetSim/FakeNet giả lập DNS/HTTP để mẫu "tin" là online → lộ C2 mà không thật sự kết nối ra ngoài.
- Tránh sandbox-aware malware: nhiều mẫu kiểm tra VMware, số CPU, sbiedll.dll, sleep dài để né.
Công cụ & lệnh thật:
# 1. Giả lập dịch vụ mạng (Linux phân tích)
inetsim # log DNS query, HTTP request mẫu gửi đi
# 2. Theo dõi hệ thống call (Linux ELF)
strace -f -e trace=network,file ./sample 2>strace.log
# 3. Procmon (Windows) — lọc:
# Operation = Process Create / RegSetValue / WriteFile
# → xuất CSV để map sang ATT&CK
Đầu ra mẫu (Procmon) → map ATT&CK:
winword.exe → Process Create powershell.exe -enc ... → T1059.001
powershell → WriteFile %APPDATA%\Microsoft\svchost.exe → T1105 Ingress Tool Transfer
powershell → RegSetValue HKCU\...\Run\Updater → T1547.001 Registry Run Key
svchost.exe → TCP Connect 185.220.101.45:443 → T1071.001 / T1041
Báo cáo Cuckoo/CAPE Sandbox tự động hóa: chạy mẫu, hook API, trả JSON gồm danh sách hành vi + đã tự map sang ATT&CK technique (ttps trong report). CAPE còn dump payload đã giải nén (unpacked) từ bộ nhớ — hữu ích vì static analysis trên mẫu packed vô dụng.
15.15. Tổng hợp: vòng đời tấn công ↔ dấu hiệu phát hiện
Bảng tra cứu nhanh nối giai đoạn → technique → telemetry → detection:
| Giai đoạn | Technique tiêu biểu | Nguồn telemetry | Dấu hiệu / Rule |
|---|---|---|---|
| Initial Access | T1566.001 Spearphishing Attachment | Email gateway, EDR | Office spawn script (IOA) |
| Execution | T1059.001 PowerShell | EID 4104, Sysmon 1 | -enc, IEX, DownloadString |
| Persistence | T1547.001 Run Key | Sysmon 13 (RegSet) | Ghi ...\CurrentVersion\Run |
| Priv Esc | T1068 Exploit for PrivEsc | EDR, kernel log | Token manipulation, crash dump |
| Defense Evasion | T1070.001 Clear Windows Event Logs | EID 1102 | Audit log bị xóa |
| Credential Access | T1003.001 LSASS | Sysmon 10 | GrantedAccess 0x1010 tới lsass |
| Discovery | T1018 Remote System Discovery | Sysmon 1 | net view, nltest /dclist |
| Lateral Movement | T1021.002 SMB/Admin Shares | EID 4624 Type 3, 7045 | PSEXESVC service tạo |
| Collection | T1560 Archive Collected Data | Sysmon 11 | rar.exe a -hp, 7zip |
| C2 | T1071.001 Web Protocols | Proxy, NetFlow, Zeek | Beaconing, JA3 khớp |
| Exfiltration | T1041 Exfil over C2 | NetFlow | bytes_out >> bytes_in |
| Impact | T1486 Data Encrypted | Sysmon 11, EDR | Đổi tên đuôi hàng loạt, xóa shadow copy (T1490 vssadmin delete shadows) |
Nguyên tắc detection engineering:
1. Map mọi rule → ATT&CK ID (cho đo coverage trong Navigator).
2. Ưu tiên TTP (đỉnh Pyramid) hơn IOC (đáy).
3. Một technique nên có nhiều rule ở nhiều data source (defense in depth detection) — vd LSASS dump phát hiện cả qua Sysmon 10 lẫn EDR memory scan.
4. Theo dõi false positive qua trường falsepositives của Sigma; rule không tinh chỉnh sẽ bị bỏ qua (alert fatigue).
5. Đóng vòng lặp: dùng feedback từ IR thực tế (Diamond Model pivot) để tạo PIR mới → cập nhật collection (CTI lifecycle).
15.16. Lưu ý bảo mật & vận hành tổng kết
- IOC mau hỏng: tự động hết hạn IOC technical (qua
valid_from/TTL trong STIX, hoặc decay model của MISP) để tránh phình danh sách block và FP. to_idsphải có người duyệt: đừng auto-block mọi IOC nhận từ feed — một domain hợp lệ bị gắn nhầm có thể gây outage.- TLP nghiêm ngặt: rò rỉ tình báo
tlp:redcó thể tiết lộ nguồn/nạn nhân; thực thi TLP ở cả con người và hệ thống chia sẻ. - ATT&CK không phải checklist tuân thủ: "100% coverage" là ảo tưởng — technique luôn mở rộng và procedure vô hạn; coverage chỉ là công cụ ưu tiên, không phải đích.
- Phân tích malware = hoạt động rủi ro: luôn cô lập mạng, dùng VM throwaway, không phân tích mẫu live trên máy nối mạng sản xuất.
- Threat-informed defense: chọn các nhóm APT thực sự nhắm ngành mình (qua report/ISAC), lấy layer ATT&CK của họ, ưu tiên detection theo đó thay vì cố phủ toàn ma trận.
Tài liệu nên kiểm chứng khi trích dẫn chính xác
- Số tactic/technique và ID cụ thể thay đổi theo từng phiên bản ATT&CK — luôn đối chiếu
attack.mitre.orgvàversions.attacktrong layer. - Số giai đoạn Unified Kill Chain (18) và chi tiết STIX media types nên kiểm lại theo bản đặc tả gốc (OASIS STIX/TAXII 2.1) trước khi dùng trong tài liệu chính thức.
Ghi chú của mình
Khu vực ghi chú cá nhân: những điểm từng hiểu sai, phần còn đang tìm hiểu, hoặc kinh nghiệm rút ra khi thực hành — cập nhật dần.