Điều tra sự cố: từ một mật khẩu yếu đến toàn quyền domain trong 20 giờ
Case study forensics thực tế: brute force → webshell → Mimikatz → tài khoản persistence. Phân tích chuỗi tấn công qua log SIEM/Sysmon và bài học rút ra.
TL;DR
Một server ứng dụng nội bộ (gọi tắt là SRV-APP-01) của khách hàng bị chiếm quyền điều khiển hoàn toàn chỉ trong khoảng 20 giờ, bắt đầu từ một tài khoản có mật khẩu yếu. Chuỗi tấn công đi qua đủ các bước kinh điển: brute force → upload webshell → do thám → tạo tài khoản duy trì truy cập → dump credential bằng Mimikatz → thiết lập kênh C2 qua FRP.
Điều đáng nói: mọi bước đều để lại dấu vết trong Sysmon và IIS log. Bài này mổ xẻ từng giai đoạn theo góc nhìn blue team — cái gì bắt được, bắt bằng cách nào, và lẽ ra chặn được ở đâu.
1. Bối cảnh
| Hạng mục | Chi tiết |
|---|---|
| Nạn nhân | Một server ứng dụng web nội bộ (IIS), đặt tên ẩn danh SRV-APP-01 |
| Cảnh báo đầu tiên | Alert "user được thêm vào group Administrators" từ SIEM |
| Thời điểm phát hiện | 12:44 — Ngày D |
| Thời gian điều tra | ~17 giờ, trải qua 2 ngày |
| Kết luận | Tấn công có chủ đích, khai thác thành công, đã dump credential |
Cảnh báo kích hoạt điều tra không phải là bước xâm nhập đầu tiên của attacker — mà là bước leo thang đặc quyền, tức là kẻ tấn công đã ở trong hệ thống từ trước đó gần một ngày. Đây là điểm rất thường gặp: thứ SOC nhìn thấy đầu tiên hiếm khi là điểm khởi đầu thật sự.
2. Dòng thời gian tấn công
17:04 — Ngày D-1 · Truy cập ban đầu
Attacker brute force vào tài khoản test trên cổng web app.example.local và thành công.
Tài khoản này dùng mật khẩu yếu, không có khoá tài khoản (account lockout) sau nhiều lần sai.
→ MITRE ATT&CK: T1110 Brute Force
17:41 — Ngày D-1 · Đặt chỗ đứng (foothold)
Upload các webshell đầu tiên: 722.aspx, lieu.aspx, dd.aspx vào thư mục web.
→ T1505.003 Web Shell
12:20 — Ngày D · Do thám nội bộ
Chạy ipconfig, net localgroup administrators, systeminfo, whoami để nắm cấu hình
hệ điều hành và danh sách tài khoản. Đáng chú ý: dùng appcmd list apppool /text:*
để moi username/password của các Application Pool trong IIS.
→ T1082 System Information Discovery, T1087 Account Discovery
12:44 — Ngày D · Duy trì truy cập & leo thang đặc quyền
Tạo tài khoản máy giả dạng SVCAPP01$ (đặt tên có $ cuối để trông giống machine account,
né sự chú ý) rồi thêm thẳng vào nhóm Administrators.
→ T1136 Create Account, T1078 Valid Accounts
12:57 — Ngày D · Thiết lập kênh C2
Chạy frp (fast reverse proxy) từ C:\ProgramData\frp.txt, kết nối ra ngoài tới
198.51.100.72:443. FRP giúp tunnel RDP/dịch vụ nội bộ ra Internet, vượt firewall.
→ T1090 Proxy, T1571 Non-Standard Port
13:01 — Ngày D · Truy cập tương tác
Remote Desktop (Logon Type 10) vào bằng tài khoản SVCAPP01$ vừa tạo.
13:02–13:05 — Ngày D · Thu thập credential
Drop hàng loạt công cụ vào Downloads: mimikatz.exe, disable-defender.exe,
DefenderRemover.exe, ladon.exe, rdp.exe... Sau đó chạy Mimikatz với
sekurlsa/dpapi::cred để trích xuất hash mật khẩu và DPAPI credential từ bộ nhớ.
→ T1003 OS Credential Dumping, T1562.001 Disable Security Tools
13:24–13:40 — Ngày D · Rải thêm webshell (persistence dự phòng)
Drop thêm nhiều .aspx/.ashx/.asmx (loginbb.aspx, gesila1.ashx, sc.asmx,
apidf.ashx) vào các thư mục con của ứng dụng — nguỵ trang lẫn trong đường dẫn
assets/codemirror/mode/... để khó bị phát hiện khi review thủ công.
3. Mổ xẻ từng giai đoạn
3.1 Truy cập ban đầu — mắt xích yếu nhất
Toàn bộ sự cố bắt nguồn từ một tài khoản demo/test còn sót lại với mật khẩu yếu và
không có cơ chế lockout. IIS log cho thấy chuỗi request POST /token dồn dập từ cùng
một IP nguồn trong thời gian ngắn — dấu hiệu brute force kinh điển.
2025-XX-19 10:04:05 POST /api/Account/LoginToken 443 203.0.113.45 Mozilla/5.0...
2025-XX-19 10:04:11 POST /token 443 203.0.113.45 Mozilla/5.0...
2025-XX-19 10:04:17 POST /token 443 203.0.113.45 Mozilla/5.0...
2025-XX-19 10:08:03 GET /api/login/getquyen?ngonngu=1&username=test&text=... 203.0.113.453.2 Webshell — vì sao khó dọn sạch
Attacker không chỉ thả một webshell. Họ rải nhiều biến thể ở nhiều đường dẫn khác nhau,
cố tình nhét vào các thư mục trông "vô hại" như assets/codemirror/mode/apl/. Chiến thuật
này khiến việc dọn dẹp dễ sót — xoá cái thấy được, bỏ lỡ cái nguỵ trang.
Cách phát hiện hiệu quả nhất không phải quét tên file, mà là truy vết sự kiện tạo file
(Sysmon Event ID 11) do tiến trình web (w3wp.exe/Explorer.EXE) sinh ra trong thư mục web:
Event 11 (FileCreate)
Image: C:\Windows\Explorer.EXE
TargetFilename: E:\...\ClientApp\src\assets\codemirror\mode\apl\loginbb.aspx
User: <domain>\SVCAPP01$
UtcTime: 2025-XX-20 06:33:08Nguyên tắc: file
.aspx/.ashxmới xuất hiện trong thư mục web sau thời điểm deploy gần nhất luôn đáng nghi. Hãy so với baseline/artifact của bản release chính thức.
3.3 Do thám & moi mật khẩu App Pool
Bước bị đánh giá thấp nhất nhưng nguy hiểm: dùng chính công cụ hợp lệ của Windows để lấy secret.
appcmd list apppool /text:name
appcmd list apppool "DefaultAppPool" /text:processModel.password
appcmd list apppool ".NET v4.5" /text:processModel.passwordappcmd cho phép đọc mật khẩu identity của Application Pool ở dạng plaintext nếu
attacker đã có quyền admin cục bộ. Đây là kỹ thuật "living off the land" (LOLBin) — không
mang mã độc vào, nên AV thường bỏ qua.
3.4 Tài khoản persistence nguỵ trang
Tài khoản SVCAPP01$ được đặt tên kết thúc bằng $ để trông giống machine account.
Trong một danh sách dài user, mắt người rất dễ lướt qua. Nhưng log Security ghi lại rõ ràng:
"A user account SVCAPP01$ was created"
"An attempt was made to reset an account's password"
"A user was added to admin group"Và phiên đăng nhập RDP sau đó (Logon Type 10) lộ nguyên hành vi tương tác:
An account was successfully logged on.
New Logon:
Account Name: SVCAPP01$
Logon Type: 10 (RemoteInteractive - RDP)
Network Information:
Source Address: 10.20.30.61
Process Name: C:\Windows\System32\svchost.exe3.5 Credential dumping bằng Mimikatz
Trước khi chạy Mimikatz, attacker cố vô hiệu hoá Defender (disable-defender.exe,
DefenderRemover.exe). Sau đó gọi Mimikatz để đọc DPAPI credential:
mimikatz.exe "privilege::debug" "dpapi::cred /in:C:\Users\administrator\AppData\
Local\Microsoft\Credentials\<blob-id>" exitTừ đây, mọi mật khẩu và hash lưu trên máy đều coi như đã lộ — kể cả tài khoản admin. Đây là điểm mà sự cố chuyển từ "một server bị chiếm" sang "giả định lộ toàn bộ credential trên máy đó".
4. IOC (đã ẩn danh)
IP
203.0.113.45— nguồn brute force & upload webshell198.51.100.72:443— máy chủ C2 (kết nối FRP)
Tài khoản
SVCAPP01$— tài khoản do attacker tạo để duy trì truy cập
File / công cụ
C:\ProgramData\frp.txt— reverse proxy (FRP)mimikatz.exe,ladon.exe,disable-defender.exe,DefenderRemover.exe- Webshell:
722.aspx,lieu.aspx,dd.aspx,loginbb.aspx,gesila1.ashx,sc.asmx,apidf.ashx
Đường dẫn webshell tiêu biểu
E:\...\ClientApp\src\app\core\preloader\*.aspx|*.ashx|*.asmx
E:\...\ClientApp\src\assets\codemirror\mode\apl\*.aspx|*.ashx|*.asmx5. Xử lý & khắc phục
Các bước đã/đang thực hiện, sắp theo thứ tự ưu tiên:
- Đổi mật khẩu tài khoản
testvà bắt buộc chính sách mật khẩu mạnh (≥ 8 ký tự, đủ hoa/thường/số/ký tự đặc biệt) — đã làm. - Xoá tài khoản
SVCAPP01$ngay lập tức — đã làm. - Gỡ toàn bộ webshell theo danh sách đường dẫn + xoá
frp.txt— đã làm. - Vô hiệu hoá chức năng upload file đang bị lạm dụng, phát hành bản vá — đã làm.
- Đổi mật khẩu toàn bộ tài khoản local trên server (vì credential coi như đã lộ) — cần làm ngay.
- Rà soát lại toàn hệ thống để đảm bảo không còn backdoor sót lại — cần làm.
6. Bài học rút ra
Về phòng thủ (defense):
- Account lockout + rate limit đáng lẽ chặn được sự cố ngay từ bước brute force. Tài khoản test/demo còn sót là "cửa sau" phổ biến bậc nhất.
- App Pool identity không nên dùng mật khẩu tĩnh đọc được bằng
appcmd. Cân nhắc Managed Service Account (gMSA). - Bật LSA Protection / Credential Guard để làm khó Mimikatz; đừng để Defender bị tắt âm thầm mà không có alert.
Về giám sát (detection):
- Alert theo hành vi, không chỉ theo signature: "user lạ vào group Administrators", "file .aspx tạo mới trong thư mục web", "kết nối outbound bất thường tới IP lạ trên 443".
- Sysmon Event ID 1 (process create), 3 (network), 11 (file create) là bộ ba xương sống để dựng lại timeline. Không có chúng, điều tra sẽ mù.
- VPN/log không đầy đủ = điểm mù. Nếu phần mềm VPN không lưu log truy cập chi tiết, hãy cân nhắc thay thế — vì khi có sự cố, thứ không log được là thứ không truy vết được.