TL;DR

Một vụ xâm nhập Windows điển hình kiểu Living-off-the-Land (LotL): kẻ tấn công không cài malware, chỉ dùng TeamViewer hợp pháp để remote vào máy nạn nhân, nén tài liệu nhạy cảm, exfil ra hạ tầng bên ngoài, rồi xoá chứng cứ. Investigator tái dựng toàn bộ chuỗi bằng cách tương quan 3 artifact trên Windows: Connections_incoming.txt + TeamViewer15_Logfile.log (ai vào, khi nào, từ IP nào), ConsoleHost_history.txt (lệnh PowerShell attacker gõ), và NTFS USN Journal $J (ai tạo archive, ai xoá file). Case study này cho thấy AV/EDR không nhìn thấy gì bất thường — nhưng forensic artifacts thì không nói dối.

Bối cảnh vụ việc

Một nhân viên báo hiện tượng lạ: ứng dụng tự bật, con trỏ chuột di chuyển mà không ai chạm máy. Đội IR vào cuộc và xác định máy đang bị điều khiển từ xa qua TeamViewer — công cụ hoàn toàn hợp pháp, có chữ ký số, được nhiều tổ chức cài sẵn cho mục đích hỗ trợ kỹ thuật.

Câu hỏi đặt ra cho forensic team: ai đã kết nối, khi nào, và làm gì trong phiên đó? Vì không có malware để trace, mọi dấu vết phải lấy từ artifact hệ điều hành và log của chính TeamViewer.

Tại sao case này quan trọng

Đây là pattern LotL kinh điển: attacker dùng công cụ được tin cậy (binary ký số, traffic mã hoá TLS qua port 5938 tới hạ tầng TeamViewer, trông y hệt phiên admin hợp lệ) thay cho malware. AV không flag. EDR nếu không tune rule "TeamViewer.exe spawn shell" cũng chỉ thấy một session remote bình thường. Lối vào thường là credential bị lộ, unattended-access password yếu, hoặc cấu hình mặc định — không cần exploit.

Hậu quả: xâm nhập gần như vô hình trong logs "bảo mật" truyền thống, nhưng để lại dấu vết rất rõ trong forensic artifacts. Ai không biết đọc những artifact đó thì không phát hiện được. Ai biết — dựng lại được toàn bộ attack chain tới từng phút.

Artifact chính: đọc đâu, tìm gì

Ba tầng artifact được tương quan trong vụ này:

1. TeamViewer logs — ai, khi nào, từ đâu

FileVai tròMúi giờ
C:\Program Files(x86)\TeamViewer\Connections_incoming.txtLog phiên incoming thành công. Chứa: TeamViewer ID bên kết nối, display name, start/end time, logged-on user, connection type, unique ID.UTC
C:\Users\<user>\AppData\Roaming\TeamViewer\Connections.txtLog phiên outgoing từ máy này.UTC
C:\Program Files(x86)\TeamViewer\TeamViewer15_Logfile.log (+ _OLD.log)Verbose diagnostic. Chứa public IP, PID, keyboard layout, failed attempts, file-transfer flag.Local time
...\AppData\Roaming\TeamViewer\MRU\RemoteSupport\*.tvcCache các ID đã kết nối thành công — populate dropdown "Partner ID".

Grep pattern quan trọng trong TeamViewer15_Logfile.log:

  • punch received — luôn chứa public IP thực của bên kết nối, kể cả qua relay.
  • Login::Identify — TeamViewer ID của source PC (ngay cả khi Connections_incoming.txt đã bị xoá).
  • New Participant added in CParticipantManager — display name của incoming session.
  • Trying connection to — các ID mà attacker thử pivot tới (lateral movement).

2. NTFS USN Journal — ai tạo archive, ai xoá file

USN Journal (\$Extend\$UsnJrnl:$J alternate data stream) ghi mọi thay đổi trên volume NTFS. Kể cả khi file bị xoá và bản ghi MFT bị reuse, entry trong journal vẫn còn. Reason code quan trọng: FILE_CREATE + DATA_EXTEND + CLOSE liên tiếp trên .zip/.rar = staging exfil; FILE_DELETE = wipe evidence. Parser: MFTECmd (Eric Zimmerman), UsnJrnl2Csv, Autopsy — output CSV rồi merge super-timeline với TimelineExplorer / plaso.

3. PowerShell history — lệnh attacker đã gõ

File: C:\Users\<user>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt. Persistent qua reboot, lưu tối đa ~4096 dòng.

Reveal chính xác syntax attacker đã dùng: download cradle, Compress-Archive, Invoke-WebRequest upload ra ngoài, Remove-Item wipe folder.

Hạn chế cần biết:

  • PSReadLine < PowerShell 7 không ghi timestamp — phải cross-ref với Windows Event ID 4104 (Script Block Logging) hoặc 400/800 (Engine Lifecycle) để gán thời gian chính xác.
  • Chỉ bắt lệnh gõ vào console interactive. -File script.ps1-EncodedCommand không vào file này.
  • Dễ wipe: Clear-History hoặc Set-PSReadLineOption -HistorySaveStyle SaveNothing. Đây chính là lý do PHẢI ship log về SIEM real-time.

Attack chain tái dựng

Tương quan 3 nguồn artifact cho ra timeline:

  1. Remote access via TeamViewerConnections_incoming.txt có entry với TeamViewer ID lạ, thời điểm ngoài giờ hành chính. punch received trong verbose log trả về public IP ở một quốc gia không ai đang công tác.
  2. Interactive session kéo dài vài phút — start/end time trong Connections_incoming.txt xác nhận attacker điều khiển máy tương tác, khớp với lời khai nhân viên.
  3. Compression — USN Journal hiện chuỗi FILE_CREATE + DATA_EXTEND cho một file .zip trong thư mục chứa tài liệu mật, cùng timestamp với phiên remote. ConsoleHost_history.txt có lệnh Compress-Archive tương ứng.
  4. Data exfiltrationInvoke-WebRequest / Invoke-RestMethod trong PS history trỏ tới một endpoint ngoài. PID của TeamViewer trong verbose log cũng gợi ý file-transfer flag được set.
  5. Evidence deletion — USN Journal ghi FILE_DELETE cho nhiều tài liệu nhạy cảm trong vòng vài giây sau bước exfil. File đã mất, nhưng dấu vết xoá thì không.

Khi nào áp dụng playbook này

Pattern lặp lại ở mọi incident có "công cụ admin bị lợi dụng": TeamViewer, AnyDesk, ScreenConnect, Atera, LogMeIn, Splashtop, RustDesk. Artifact path khác nhau nhưng phương pháp luận giống hệt: log connection của tool (ai, khi nào, từ IP nào) + USN Journal (file system trong cửa sổ thời gian đó) + PowerShell/Prefetch/Sysmon (lệnh và process đã chạy). Dùng tốt cho: insider threat, BEC lan sang endpoint, ransomware initial access qua RMM, helpdesk scam.

Giới hạn cần biết khi điều tra

  • UTC vs local time: Connections_incoming.txt dùng UTC, verbose log dùng local time — nhầm là sai cả timeline.
  • Log có thể bị wipe: admin quyền cao xoá được Connections_incoming.txt. Khi đó dựa vào verbose log, .tvc cache, Volume Shadow Copy.
  • USN Journal ring buffer mặc định ~32MB — với máy trọng yếu nên tăng: fsutil usn createjournal m=1073741824 a=134217728 C:.
  • PSReadLine < PS7 không có timestamp — phải bật Script Block Logging (Event 4104) để có thời gian thật.

Hardening rút ra từ case

  • Application control: WDAC / AppLocker chặn mọi RMM không whitelist — ở cả layer binary lẫn DNS.
  • MFA + trusted-device binding cho mọi remote-support account; tắt unattended-access password không cần thiết.
  • EDR rule: alert khi TeamViewer.exe (hoặc RMM bất kỳ) spawn powershell.exe, cmd.exe, rar.exe, 7z.exe — signal LotL rất mạnh.
  • Log forwarding real-time: ship Connections_incoming.txt, verbose log, ConsoleHost_history.txt về SIEM. Attacker wipe được file local — không wipe được bản đã ship.
  • Bật PowerShell Script Block Logging (GPO → Event 4104) + tăng USN Journal size. Chi phí gần bằng không, giá trị IR rất cao.

Case này là minh hoạ sống cho nguyên lý DFIR cốt lõi: không có malware không có nghĩa là không có dấu vết. Attacker luôn chạm vào file system, process tree, và network — và Windows ghi lại rất nhiều trong mặc định. Việc của defender là biết chỗ nào có log, đọc được log đó, và quan trọng hơn: ship log ra khỏi máy trước khi kẻ tấn công kịp wipe.

Nguồn: Cyber Fibers, Ben's IR Notes, Forensafe, Undercode, ACSC, @HackersCuriosos.