Sổ tay An toàn thông tin 🌐 EN

Chương 12 — Kiểm thử xâm nhập & Đánh giá lỗ hổng

Tổng quan

Lỗ hổng bị bỏ sót không tự biến mất — nó nằm im chờ ai đó tìm ra trước, và câu hỏi luôn là ai tìm ra trước: đội mình hay kẻ tấn công. Đó là lý do mình học chương này: nắm cho được hai cách chủ động đi tìm điểm yếu của hệ thống (web, máy chủ, mạng) trước khi nó gây rò rỉ dữ liệu — vì một lỗ hổng bỏ sót là đủ để lộ toàn bộ dữ liệu người dùng.

Chương mở đầu bằng việc tách bạch quét lỗ hổng (vulnerability scanning) — tự động so khớp dấu hiệu hệ thống với cơ sở dữ liệu lỗ hổng đã biết, rộng và nông, chỉ phát hiện chứ không khai thác — với kiểm thử xâm nhập (pentest), nơi con người mô phỏng tấn công thật, khai thác thật để chứng minh tác động, sâu và hẹp hơn nhưng dựa nhiều vào suy luận. Từ phân biệt đó, chương đi theo quy trình kiểm thử web chuẩn OWASP (WSTG): recon, mapping, testing, exploit, report — rồi vào chi tiết cơ chế ba công cụ chủ lực. Burp Suite là intercepting proxy đứng giữa trình duyệt và server để xem, sửa từng request/response; Acunetix là DAST scanner thương mại tự crawl-audit-report, bổ sung chứ không thay Burp; Nmap lập bản đồ mạng ở mức host discovery, port scanning, version/OS detection. Chương khép lại bằng phần scope và pháp lý — ranh giới được phép kiểm thử phải ghi rõ trong văn bản uỷ quyền, vì chạy ngoài scope là truy cập trái phép dù mục đích tốt tới đâu.

Mục tiêu xuyên suốt: hiểu cơ chế tới từng gói tin, có lệnh chạy được thật cho mỗi công cụ, chứ không dừng ở lý thuyết.


12.1. Phân biệt Vulnerability Scanning và Penetration Testing

12.1.1. Định nghĩa và bản chất

Vulnerability Scanning (quét lỗ hổng) là quá trình tự động phát hiện các điểm yếu đã biết (known vulnerabilities) trên hệ thống bằng cách so khớp dấu hiệu (signature/fingerprint) với một cơ sở dữ liệu lỗ hổng (vulnerability database) như NVD (National Vulnerability Database), CVE feed, hoặc database riêng của nhà cung cấp. Bản chất là breadth-first (rộng, nông): quét nhiều mục tiêu, kiểm tra nhiều dấu hiệu, nhưng KHÔNG khai thác.

Penetration Testing (kiểm thử xâm nhập) là quá trình mô phỏng tấn công có chủ đích, trong đó người (hoặc người + công cụ) cố gắng khai thác thật lỗ hổng để chứng minh tác động (impact), chuỗi tấn công (kill chain), và mức độ truy cập đạt được. Bản chất là depth-first (sâu, hẹp): tập trung vào mục tiêu cụ thể, kết hợp lỗ hổng, vận dụng logic nghiệp vụ.

12.1.2. Bảng so sánh chi tiết

Tiêu chí Vulnerability Scanning Penetration Testing
Mục tiêu Liệt kê lỗ hổng đã biết Chứng minh khai thác được + tác động
Mức tự động hóa Cao (gần như hoàn toàn) Thủ công + công cụ hỗ trợ
Phát hiện logic flaw (IDOR, business logic) Hầu như không Có (thế mạnh)
Khai thác thực tế Không (chỉ phát hiện) Có (PoC, exploit)
Chứng minh false positive Khó Có (xác nhận thủ công)
Tần suất Liên tục/định kỳ (hàng tuần, hàng ngày trong CI) Định kỳ (quý/năm) hoặc theo sự kiện
Chi phí Thấp (license + tự động) Cao (chuyên gia + thời gian)
Đầu ra Danh sách CVE + severity Báo cáo kill chain + bằng chứng
Rủi ro gây hại hệ thống Thấp (có chế độ safe) Cao hơn (có thể gây downtime)
Phạm vi (scope) Toàn bộ tài sản Tập trung theo thỏa thuận
Tiêu chuẩn tham chiếu CVSS, CVE, CWE OWASP, PTES, OSSTMM, NIST SP 800-115

12.1.3. Vì sao cần cả hai

Vulnerability scanning trả lời câu hỏi "có bao nhiêu cánh cửa khả nghi?" trong khi pentest trả lời "kẻ tấn công thật sự vào được tới đâu và làm được gì?". Một scanner báo "port 443 chạy OpenSSL có CVE-2014-0160 (Heartbleed)" — nhưng chỉ pentest mới chứng minh được rằng kéo được private key ra khỏi RAM. Trong mô hình DevSecOps, scanning được nhúng vào pipeline (shift-left, liên tục), còn pentest là kiểm chứng định kỳ ở mức sâu hơn. Scanning là điều kiện cần (nhanh, rẻ, rộng) nhưng không đủ; pentest cung cấp ngữ cảnh khai thác và mức độ rủi ro thực để ưu tiên khắc phục.


12.2. Quy trình kiểm thử web theo OWASP

OWASP WSTG (Web Security Testing Guide) chia quá trình thành các pha. Dưới đây là vòng đời thực tế áp dụng cho pentest web:

+-------------+    +-------------+    +-------------+    +--------------+    +-------------+
|  1. Recon   | -> | 2. Mapping  | -> | 3. Testing  | -> | 4. Exploit   | -> | 5. Report   |
| (thu thập)  |    | (lập bản đồ)|    | (kiểm thử)  |    | (khai thác)  |    | (báo cáo)   |
+-------------+    +-------------+    +-------------+    +--------------+    +-------------+
       ^                                                                          |
       |__________________________ (lặp lại khi tìm thấy bề mặt mới) _____________|

12.2.1. Pha 1 — Reconnaissance (thu thập thông tin)

Chia làm passive (không chạm mục tiêu) và active (gửi gói tin tới mục tiêu).

Passive recon — không tạo lưu lượng tới mục tiêu, dùng nguồn công khai: - DNS records, certificate transparency logs (crt.sh) để liệt kê subdomain. - WHOIS, Shodan, Censys, Google dorking (site:, inurl:, filetype:). - Tìm secret rò rỉ trên GitHub, Wayback Machine (archive.org).

Ví dụ liệt kê subdomain qua Certificate Transparency:

# Truy vấn crt.sh, lọc subdomain duy nhất
curl -s 'https://crt.sh/?q=%25.example.com&output=json' \
  | jq -r '.[].name_value' \
  | sed 's/\*\.//g' | sort -u

Active recon — port scan (Nmap, mục 12.5), banner grabbing, fingerprint công nghệ:

# Nhận diện công nghệ web (header Server, X-Powered-By, cookie)
curl -sI https://example.com | grep -iE 'server|x-powered-by|set-cookie'
whatweb https://example.com

12.2.2. Pha 2 — Mapping (lập bản đồ ứng dụng)

Mục tiêu: dựng site map đầy đủ các endpoint, tham số, công nghệ. Đây là lúc Burp Suite Proxy + Target site map vào cuộc (mục 12.3.4). Các kỹ thuật: - Spidering/Crawling: tự động đi theo link. - Forced browsing / content discovery: đoán đường dẫn ẩn (/admin, /.git/, /backup.zip) bằng ffuf, gobuster, dirsearch. - Phân tích robots.txt, sitemap.xml, JS bundle để tìm API endpoint.

# Content discovery với ffuf
ffuf -u https://example.com/FUZZ -w /usr/share/wordlists/dirb/common.txt \
     -mc 200,204,301,302,307,401,403 -fs 0
# -u : URL với từ khóa FUZZ được thay thế bằng từng dòng wordlist
# -w : wordlist
# -mc: match HTTP status code (chỉ hiện response có code này)
# -fs: filter theo kích thước response (loại trang rác cùng kích thước)

12.2.3. Pha 3 — Testing (kiểm thử lỗ hổng)

Đối chiếu với OWASP Top 10 và WSTG. Mỗi nhóm test có checklist: - Injection (SQLi, NoSQLi, command injection, LDAPi). - Broken Access Control (IDOR, privilege escalation, path traversal). - Authentication & Session (brute force, session fixation, token entropy yếu). - XSS (reflected, stored, DOM-based). - SSRF, XXE, deserialization, business logic.

12.2.4. Pha 4 — Exploitation (khai thác)

Chứng minh tác động: trích xuất dữ liệu, leo quyền, RCE. Chỉ chạy trong scope — xem 12.6. Ghi lại request/response làm bằng chứng. Tránh hành vi phá hủy trừ khi RoE cho phép.

12.2.5. Pha 5 — Reporting (báo cáo)

Báo cáo gồm: Executive Summary (cho lãnh đạo), kỹ thuật chi tiết (cho engineer), mỗi finding có: mô tả, mức độ (CVSS), bằng chứng (PoC, screenshot, request/response), tác động, và khuyến nghị khắc phục cụ thể.

CVSS v3.1 — Base Score vector (cần nắm để chấm điểm severity):

Metric Ký hiệu Giá trị Ý nghĩa
Attack Vector AV N/A/L/P Network/Adjacent/Local/Physical
Attack Complexity AC L/H Low/High
Privileges Required PR N/L/H None/Low/High
User Interaction UI N/R None/Required
Scope S U/C Unchanged/Changed
Confidentiality C N/L/H None/Low/High
Integrity I N/L/H None/Low/High
Availability A N/L/H None/Low/High

Ví dụ vector chuỗi: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8 (Critical) — điển hình cho RCE unauthenticated qua mạng.

CVSS 4.0 (cần biết): FIRST đã phát hành CVSS v4.0 (chuỗi bắt đầu CVSS:4.0/...), bỏ metric Scope, tách nhóm Base thành Exploitability + Vulnerable/Subsequent System Impact, và bổ sung metric bảo mật con người (Safety) cùng nhóm Supplemental/Threat/Environmental. Nhiều nguồn hiện còn dùng song song v3.1, nên khi trích điểm phải ghi rõ phiên bản. (số phiên bản/độ phổ biến cần kiểm chứng theo thời điểm)

Đừng vá theo mỗi CVSS Base. Base score chỉ nói lỗ hổng "nặng tới đâu về lý thuyết", không nói nó có bị khai thác thật hay có với tới được trong hệ thống của bạn không. Thực tế nên ưu tiên vá theo tổ hợp: (a) reachability — thành phần dính CVE có thực sự nằm trên đường thực thi / có phơi ra ngoài không (lib nằm trong image nhưng không bao giờ gọi tới thì rủi ro thấp); (b) EPSS (Exploit Prediction Scoring System của FIRST) — xác suất bị khai thác trong 30 ngày tới; (c) CISA KEV (Known Exploited Vulnerabilities) — danh mục CVE đang bị khai thác ngoài thực địa, gần như luôn phải vá trước. Một CVE 9.8 không nằm trên code path và không có trong KEV thường xếp sau một CVE 7.5 đã có trong KEV + EPSS cao.


12.3. Burp Suite — phân tích chi tiết

Burp Suite (PortSwigger) là công cụ chủ lực để test web thủ công. Có ba phiên bản: Community (miễn phí, giới hạn, Intruder bị throttle, không có Scanner), Professional (có Scanner, Intruder đầy đủ), Enterprise (CI/CD, quét tự động quy mô lớn). Burp viết bằng Java, chạy trên JVM.

12.3.1. Kiến trúc Proxy MITM

Burp hoạt động như một intercepting proxy (man-in-the-middle) đặt giữa browser và server. Luồng dữ liệu:

+---------+        +------------------+        +-----------+
| Browser | <----> |  Burp Proxy      | <----> |  Server   |
| (client)| HTTP/S |  127.0.0.1:8080  | HTTP/S |  (target) |
+---------+        +------------------+        +-----------+
                   |  - Intercept     |
                   |  - Re-issue cert |
                   |  - Log site map  |
                   +------------------+

Mặc định Burp lắng nghe tại 127.0.0.1:8080. Browser cấu hình proxy trỏ tới đây. Burp nhận request, có thể tạm dừng (intercept), sửa, rồi chuyển tiếp tới server. Khi server trả về, Burp lại có thể sửa response trước khi giao cho browser.

Vì sao cần cài CA certificate

Với HTTP plaintext, MITM dễ — Burp đọc thẳng. Nhưng với HTTPS, TLS mã hóa toàn bộ. Để đọc/sửa được, Burp phải terminate TLS ở phía mình: nó thực hiện hai phiên TLS riêng biệt — một với browser, một với server.

Khi browser gửi CONNECT example.com:443, Burp: 1. Sinh động (on-the-fly) một certificate cho example.com, ký bằng CA root của Burp (mặc định tên PortSwigger CA). 2. Trình certificate giả này cho browser. 3. Browser kiểm tra chuỗi tin cậy. Nếu CA root của Burp đã được cài vào trust store của hệ điều hành/trình duyệt → hợp lệ → không cảnh báo. Nếu chưa cài → cảnh báo NET::ERR_CERT_AUTHORITY_INVALID.

Đây chính là lý do phải cài CA cert của Burp: để browser tin tưởng cert do Burp sinh ra, cho phép MITM HTTPS mà không cảnh báo, đồng thời giữ phiên TLS với server vẫn hợp lệ thật.

Lấy và cài CA cert:

1. Cấu hình browser proxy 127.0.0.1:8080
2. Truy cập http://burp  (hoặc http://burpsuite)
3. Bấm "CA Certificate" -> tải file cacert.der
4. Cài vào trust store:
   - Linux: chuyển DER->PEM rồi đưa vào /usr/local/share/ca-certificates/
   - Firefox: Settings -> Privacy & Security -> Certificates -> Import
     (đánh dấu "Trust to identify websites")
# Chuyển DER sang PEM và xem nội dung cert
openssl x509 -inform der -in cacert.der -out burp-ca.pem
openssl x509 -in burp-ca.pem -noout -text | grep -A2 'Subject:'
# Linux system-wide:
sudo cp burp-ca.pem /usr/local/share/ca-certificates/burp.crt
sudo update-ca-certificates

Lưu ý bảo mật: Burp CA private key được lưu trong cấu hình người dùng. Nếu key này rò rỉ, kẻ tấn công có thể MITM bất kỳ máy nào đã cài CA đó. Mỗi lần cài Burp sinh CA riêng — KHÔNG dùng chung. Gỡ CA khỏi trust store sau khi test xong trên máy không chuyên dụng.

12.3.2. Cấu trúc HTTP Request mà Burp thao tác

Burp hiển thị raw HTTP request theo đúng định dạng RFC 7230. Hiểu từng phần là điều kiện để sửa chính xác.

POST /api/v1/login HTTP/1.1\r\n          <- Request line: METHOD SP URI SP VERSION CRLF
Host: example.com\r\n                    <- Header
User-Agent: Mozilla/5.0\r\n
Content-Type: application/json\r\n
Content-Length: 41\r\n
Cookie: session=abc123\r\n
\r\n                                      <- Dòng trống (CRLF) phân tách header và body
{"username":"admin","password":"secret"} <- Message body (dài Content-Length byte)

Bảng cấu trúc từng phần của HTTP/1.1 request:

Thành phần Kích thước Ý nghĩa Ví dụ
Method biến đổi (token) Động từ HTTP POST, GET
SP 1 byte (0x20) Dấu cách phân tách
Request-URI biến đổi Đường dẫn + query /api/v1/login
HTTP-Version 8 byte Phiên bản giao thức HTTP/1.1
CRLF 2 byte (0x0D 0x0A) Kết thúc dòng \r\n
Header name token Tên trường Content-Type
: 2 byte Phân tách name/value :
Header value biến đổi Giá trị application/json
Empty line 2 byte (CRLF) Ranh giới header/body \r\n
Body = Content-Length Payload {...}

Vì sao: Content-Length PHẢI khớp số byte body thực tế. Khi sửa body trong Repeater, nếu không cập nhật Content-Length, server có thể chặn đứng (chờ thêm byte) hoặc cắt body. Burp Repeater có tùy chọn "Update Content-Length" tự động. Lỗ hổng HTTP Request Smuggling khai thác chính sự bất nhất giữa Content-Length và Transfer-Encoding: chunked mà front-end và back-end diễn giải khác nhau.

12.3.3. Module Proxy

Chức năng: Intercept (chặn), HTTP history (lịch sử), Match & Replace, WebSockets history.

Intercept on/off: Khi bật, mỗi request bị tạm dừng tại Burp, hiển thị để bạn sửa. Bấm "Forward" để gửi tiếp, "Drop" để hủy.

Match & Replace — luật tự động thay thế trên mọi request/response. Cấu trúc một rule:

Trường Ý nghĩa Ví dụ
Type Phạm vi áp dụng Request header / Request body / Response header...
Match Regex hoặc literal cần tìm ^User-Agent:.*$
Replace Chuỗi thay thế User-Agent: CustomAgent/1.0

Ví dụ thực tế: thêm X-Forwarded-For: 127.0.0.1 vào mọi request để test bypass IP allowlist:

Type:    Request header
Match:   (để trống - thêm header mới)
Replace: X-Forwarded-For: 127.0.0.1

Scope filtering: History có thể rất lớn. Nên giới hạn theo scope (mục sau) để chỉ log mục tiêu hợp pháp, tránh log lưu lượng cá nhân và tránh chạm host ngoài phạm vi.

12.3.4. Target — Site Map và Scope

Site Map là cây phân cấp host → thư mục → endpoint, tích lũy từ mọi request đi qua Burp (proxy, repeater, scanner). Mỗi node lưu request/response đã thấy.

Scope định nghĩa "mục tiêu hợp pháp". Cấu hình tại Target → Scope. Có hai chế độ: - Include in scope: danh sách host/URL được phép. - Exclude from scope: loại trừ (ví dụ trang logout, trang đăng xuất khỏi SSO).

Scope ảnh hưởng đến: Proxy có log không, Scanner có quét không, Intruder/Repeater có cảnh báo không. Định nghĩa scope nâng cao:

Include:
  Protocol: HTTPS
  Host:     ^.*\.example\.com$
  Port:     ^443$
  File:     ^/api/.*$

Vì sao (pháp lý): Scope là ranh giới pháp lý. Quét/khai thác ngoài scope = truy cập trái phép = vi phạm pháp luật (xem 12.6). Tùy chọn "Drop all out-of-scope traffic" trong Proxy options ngăn vô tình gửi request tới host ngoài phạm vi.

12.3.5. Repeater — gửi lại và sửa request

Repeater cho phép gửi một request nhiều lần với chỉnh sửa thủ công, xem response tức thì. Đây là công cụ chính để xác minh và tinh chỉnh lỗ hổng. Gửi request từ bất kỳ đâu vào Repeater bằng chuột phải → "Send to Repeater" (Ctrl+R).

Ví dụ test IDOR (Insecure Direct Object Reference)

IDOR: ứng dụng cho phép truy cập đối tượng của người khác chỉ bằng cách đổi ID, do thiếu kiểm tra authorization phía server.

Request gốc (của user A, id=1001):

GET /api/v1/orders/1001 HTTP/1.1
Host: shop.example.com
Cookie: session=eyJ1c2VyIjoiYWxpY2UifQ
Accept: application/json

Response: đơn hàng của Alice (200 OK).

Bước test: đổi 1001 → 1002 (đơn của người khác), gửi lại trong Repeater:

GET /api/v1/orders/1002 HTTP/1.1
Host: shop.example.com
Cookie: session=eyJ1c2VyIjoiYWxpY2UifQ
Accept: application/json
  • Nếu response trả về đơn hàng của user khác (200 + dữ liệu) → IDOR xác nhận. Alice xem được đơn của người khác dù session vẫn là của Alice.
  • Nếu trả 403 Forbidden / 404 → kiểm soát truy cập hoạt động đúng.

Phòng thủ: kiểm tra authorization phía server (object-level access control), so khớp resource.owner_id == session.user_id; UUID khó đoán giúp nhưng KHÔNG thay thế authorization.

Ví dụ test SQL Injection

Request gốc:

POST /api/v1/search HTTP/1.1
Host: shop.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 10

q=keyboard

Test 1 — phát hiện lỗi cú pháp (error-based): chèn một dấu nháy đơn:

q=keyboard'

Nếu response trả 500 kèm thông báo SQL syntax error near ''' → backend ghép chuỗi SQL không tham số hóa → khả năng SQLi.

Test 2 — boolean-based: so sánh hai điều kiện:

q=keyboard' AND '1'='1   -> trả kết quả bình thường (TRUE)
q=keyboard' AND '1'='2   -> trả rỗng (FALSE)

Hành vi khác nhau giữa TRUE/FALSE xác nhận injection.

Test 3 — UNION-based trích dữ liệu (sau khi xác định số cột):

q=keyboard' UNION SELECT username,password,NULL FROM users-- -

Dấu -- - comment phần SQL còn lại. Nếu kết quả trả về username/password → trích xuất dữ liệu thành công.

Lưu ý: luôn cập nhật Content-Length khi sửa body. URL-encode ký tự đặc biệt khi cần (' → %27, dấu cách → + hoặc %20) tùy Content-Type.

Phòng thủ: prepared statements / parameterized queries, ORM an toàn, least privilege cho DB account, WAF như lớp phòng thủ bổ sung (không thay thế fix gốc).

12.3.6. Intruder — tự động hóa tấn công có tham số

Intruder gửi nhiều request, thay payload vào các vị trí đánh dấu (ký hiệu §). Có 4 kiểu tấn công (attack types):

Attack type Số tập payload Cách phân phối Số request Trường hợp dùng
Sniper 1 Lần lượt từng vị trí, các vị trí khác giữ nguyên (số vị trí) × (số payload) Fuzz một tham số tại một thời điểm
Battering ram 1 Cùng một payload vào TẤT CẢ vị trí cùng lúc (số payload) Khi cần cùng giá trị ở nhiều chỗ
Pitchfork nhiều (1/vị trí) Lấy song song theo chỉ số: payload[i] ở mỗi vị trí min(độ dài các set) Cặp username+password tương ứng (credential stuffing)
Cluster bomb nhiều (1/vị trí) Tích Descartes: mọi tổ hợp tích các độ dài Brute force toàn bộ tổ hợp user × pass

Cách đánh dấu vị trí payload

Burp đặt cặp ký tự § quanh giá trị cần fuzz:

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=§admin§&password=§x§

Ở đây có 2 vị trí. Với Cluster bomb + set1 (usernames) 10 phần tử, set2 (passwords) 100 phần tử → 1000 request.

Ví dụ brute force đăng nhập (Cluster bomb)

Attack type: Cluster bomb
Position 1 (username): payload = Simple list [admin, root, user, test]
Position 2 (password): payload = Runtime file / wordlist (rockyou rút gọn)

Phân tích kết quả: sắp xếp theo cột Status và Length. Đăng nhập sai thường trả 200 + body "Invalid credentials" có độ dài cố định; đăng nhập đúng có thể trả 302 (redirect) hoặc body khác độ dài. Dùng cột Length để lọc anomaly. Thêm Grep-Match rule (ví dụ tìm chuỗi "Welcome") để đánh dấu request thành công.

Ví dụ fuzzing tham số (Sniper) tìm SQLi/XSS

Attack type: Sniper
Position: §value§ trong q=§test§
Payload set: SQLi fuzz list  (', '', ", `, ;, ' OR '1'='1, <script>...)
Payload processing: URL-encode all characters
Grep - Match: "SQL syntax", "ORA-", "ODBC"

Payload types trong Intruder:

Payload type Mô tả Ví dụ
Simple list Danh sách tĩnh wordlist
Runtime file Đọc từ file lớn (không nạp hết vào RAM) rockyou.txt
Numbers Sinh dải số 1–10000, step 1
Brute forcer Sinh tổ hợp ký tự charset abc, len 4
Username generator Sinh username từ tên john.doe, jdoe
Bit flipper Lật từng bit (test padding oracle, CSRF token) —

Lưu ý bảo mật & vận hành: Intruder Community Edition bị throttle (làm chậm). Brute force tạo lưu lượng lớn — có thể bị account lockout, WAF chặn, hoặc DoS vô tình. Luôn trong scope. Dùng "Resource pool" để giới hạn concurrent request, đặt delay tránh khóa tài khoản.

12.3.7. Decoder

Chuyển đổi và giải mã dữ liệu. Hỗ trợ: URL, HTML entity, Base64, ASCII hex, Octal, Binary, Gzip, và Hash (MD5, SHA...). Chế độ "Smart decode" tự đoán encoding.

Ví dụ giải JWT (3 phần header.payload.signature ngăn bởi dấu .):

Input:  eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ.<sig>
Decode as Base64 (phần 1): {"alg":"HS256"}
Decode as Base64 (phần 2): {"user":"admin"}

JWT dùng Base64URL (thay +→-, /→_, bỏ padding =). Burp Base64 decoder xử lý được; lưu ý thêm padding = nếu cần.

12.3.8. Comparer

So sánh hai mẩu dữ liệu theo word hoặc byte, tô màu khác biệt. Dùng để: so sánh response của tài khoản admin vs user thường (tìm chênh lệch trong access control), so sánh response TRUE vs FALSE trong blind SQLi, so sánh hai token để phân tích cấu trúc.

12.3.9. Sequencer — phân tích entropy của token

Sequencer kiểm tra tính ngẫu nhiên (randomness) của session token / CSRF token / reset token. Token đoán được = lỗ hổng nghiêm trọng (session hijacking).

Cơ chế: thu thập một lượng lớn token (lý tưởng nhiều nghìn mẫu), rồi chạy các bài kiểm định thống kê chuẩn FIPS 140-2 và các test riêng của Burp:

Test Đo gì
FIPS Monobit Tỉ lệ bit 0 và 1 cân bằng
FIPS Poker Phân bố các nhóm 4-bit
FIPS Runs Độ dài chuỗi bit liên tiếp
FIPS Long runs Có chuỗi quá dài không
Character/Bit transitions Tương quan giữa các vị trí

Kết quả tính bằng bits of effective entropy ở mức significance (mặc định 1%). Token "tốt" cần entropy cao. Token sinh từ thời gian (timestamp) hoặc counter tăng dần → entropy thấp → đoán được.

Lưu ý: entropy cao không đảm bảo an toàn nếu thuật toán sinh (PRNG) không phải CSPRNG. Sequencer chỉ phát hiện pattern thống kê, không kiểm tra thuật toán nguồn.

12.3.10. Scanner (chỉ Professional)

Scanner của Burp gồm passive (phân tích lưu lượng đã thấy, không gửi thêm request — phát hiện cookie thiếu Secure/HttpOnly, thông tin nhạy cảm) và active (gửi payload thăm dò — phát hiện SQLi, XSS, SSRF...). Cấu hình qua "Scan configuration": chọn audit checks, crawl strategy, độ sâu.

Cảnh báo: Active scan gửi payload tấn công thật (có thể tạo dữ liệu rác, kích hoạt email, sửa state). KHÔNG active scan trên production nhạy cảm khi chưa được phép rõ ràng.

12.3.11. Workflow hoàn chỉnh test một lỗ hổng bằng Burp

Ví dụ: test và xác nhận một Reflected XSS từ đầu đến cuối.

Bước 1 (Recon/Mapping): Bật Proxy, duyệt ứng dụng bình thường.
        Site map tích lũy endpoint /search?q=...
Bước 2 (Phát hiện điểm vào): Trong Proxy History, thấy giá trị `q`
        được phản chiếu vào HTML response.
Bước 3 (Send to Repeater): Ctrl+R request /search?q=test
Bước 4 (Thăm dò): Gửi q=<b>test</b>.
        - Xem response: nếu trả về `<b>test</b>` chưa escape -> reflect HTML.
Bước 5 (Chứng minh thực thi JS):
        q=<script>alert(document.domain)</script>
        URL-encode: q=%3Cscript%3Ealert(document.domain)%3C%2Fscript%3E
        - Nếu response chứa <script>...</script> nguyên vẹn (không bị HTML-encode)
          -> payload sẽ thực thi trong browser.
Bước 6 (Xác minh ngữ cảnh): Dùng Comparer so sánh response benign vs payload
        để xác định chính xác điểm reflect và bộ lọc (filter) nào áp dụng.
Bước 7 (Bypass filter nếu có): nếu < bị lọc, thử biến thể:
        - sự kiện: q="><img src=x onerror=alert(1)>
        - thoát context attribute
Bước 8 (Bằng chứng): chụp request/response, build PoC URL hoàn chỉnh.
Bước 9 (Report): mô tả, CVSS, PoC, khuyến nghị (output encoding theo ngữ cảnh,
        CSP, đặt HttpOnly cookie).

Phòng thủ XSS: output encoding theo ngữ cảnh (HTML, attribute, JS, URL), Content-Security-Policy, framework auto-escaping (React, Angular), HttpOnly cookie để JS không đọc được session.


12.4. Acunetix — DAST tự động

12.4.1. DAST là gì và vị trí của Acunetix

DAST (Dynamic Application Security Testing) kiểm thử ứng dụng đang chạy từ bên ngoài (black-box), không cần mã nguồn — đối lập với SAST (Static, phân tích mã nguồn) và IAST (Interactive, có agent bên trong ứng dụng). Acunetix là một DAST scanner thương mại, tự động hóa cao: tự crawl, tự audit, tự sinh báo cáo.

Khác biệt cốt lõi Acunetix vs Burp:

Tiêu chí Acunetix (DAST tự động) Burp Suite (thủ công + Scanner)
Mô hình Tự động hóa toàn diện Thủ công là chính, có Scanner (Pro)
Người dùng Vận hành định kỳ, ít can thiệp Chuyên gia thao tác sâu
Business logic / IDOR Yếu (máy khó hiểu logic) Mạnh (con người suy luận)
Quy mô Quét nhiều site, lịch trình Tập trung một mục tiêu
Tích hợp CI/CD Có (API, scheduler) Enterprise edition
Tinh chỉnh payload Hạn chế Linh hoạt tối đa

Hai công cụ bổ sung nhau: Acunetix quét rộng tìm low-hanging fruit, Burp đào sâu xác minh và khai thác logic.

12.4.2. Cấu hình một scan

Acunetix gọi mục tiêu là Target. Quy trình tạo scan:

1. Add Target: nhập URL gốc (https://app.example.com)
   - Description, Business Criticality (mức quan trọng để ưu tiên)
2. Target Settings:
   - Scan Speed: Slow/Moderate/Fast/Sequential (đánh đổi tốc độ vs tải server)
   - Site Login:
       * Automatic (cung cấp username/password, Acunetix tự login)
       * Recorded login sequence (ghi lại chuỗi thao tác login phức tạp)
   - Authentication: HTTP Basic/NTLM/header tùy chỉnh
   - Custom headers / cookies (ví dụ Authorization: Bearer ...)
   - Excluded paths (ví dụ /logout, /admin/delete-all)
   - Allowed hosts (giới hạn scope sang subdomain)
3. Scan Profile (Scan Type):
   - Full Scan / High Risk / Cross-site Scripting / SQL Injection /
     Weak Passwords / Crawl Only
4. Schedule: chạy ngay hoặc lịch định kỳ (cron-like)
5. Launch Scan

Recorded login sequence quan trọng vì nhiều endpoint nằm sau authentication. Acunetix dùng AcuSensor (agent IAST tùy chọn cài trên server PHP/.NET/Java) để tăng độ chính xác và phát hiện sâu hơn (gray-box), giảm false positive.

12.4.3. Cơ chế Crawl + Audit

Acunetix chạy 2 giai đoạn:

Giai đoạn 1 — Crawl (DeepScan): dùng engine duyệt như trình duyệt thật, thực thi JavaScript (hỗ trợ SPA, AJAX), khám phá mọi link, form, API endpoint, và tham số. Kết quả: danh sách "locations" và "inputs".

Giai đoạn 2 — Audit: với mỗi input phát hiện được, Acunetix gửi payload thăm dò và phân tích response: - SQLi: chèn payload, quan sát lỗi DB, độ trễ (time-based: SLEEP(5)), hoặc khác biệt boolean. - XSS: chèn marker script, kiểm tra reflect chưa escape. - SSRF, XXE, LFI/RFI, command injection: payload tương ứng. - Misconfiguration: header bảo mật thiếu, directory listing, file backup.

Time-based blind SQLi minh họa payload:

'; IF(1=1) WAITFOR DELAY '0:0:5'--      (MSSQL)
' OR SLEEP(5)-- -                        (MySQL)
' || pg_sleep(5)--                       (PostgreSQL)

Acunetix đo thời gian response: nếu response chậm đúng ~5s khi inject SLEEP(5) nhưng nhanh khi SLEEP(0) → xác nhận injection (blind, time-based).

12.4.4. Đọc báo cáo Acunetix

Báo cáo phân loại theo severity: High / Medium / Low / Informational. Mỗi finding gồm:

Trường báo cáo Ý nghĩa
Vulnerability name Tên lỗ hổng (vd "Blind SQL Injection")
Severity Mức độ (High/Medium/Low/Info)
Affected URL/parameter Endpoint + tham số bị ảnh hưởng
Request HTTP request mà Acunetix gửi (PoC)
Response / Evidence Bằng chứng (lỗi DB, độ trễ, reflect)
CVSS Điểm số
CWE Phân loại điểm yếu (vd CWE-89 SQLi)
Recommendation Hướng khắc phục
Classification OWASP, PCI DSS, ...

Các mẫu báo cáo chuẩn: Developer, Executive Summary, Compliance (PCI DSS, ISO 27001, HIPAA, OWASP Top 10).

12.4.5. False positive và xác minh

DAST tự động dễ báo false positive (báo có nhưng thực ra không khai thác được) và false negative (bỏ sót). Quy trình xác minh: 1. Lấy request PoC từ báo cáo. 2. Tái hiện thủ công bằng Burp Repeater hoặc curl. 3. Quan sát có đúng dấu hiệu khai thác không (ví dụ độ trễ time-based có ổn định không, hay chỉ do mạng). 4. Đánh dấu false positive trong Acunetix để lần scan sau bỏ qua.

Ví dụ kiểm chứng time-based SQLi bằng curl:

# Đo thời gian response giữa SLEEP(0) và SLEEP(5)
time curl -s "https://app.example.com/item?id=1' OR SLEEP(0)-- -" >/dev/null
time curl -s "https://app.example.com/item?id=1' OR SLEEP(5)-- -" >/dev/null
# Nếu lần 2 chậm hơn ~5s một cách ổn định -> SQLi thật, không phải false positive

Lưu ý: một báo cáo "Informational" (vd phiên bản server lộ trong header) có thể là mảnh ghép cho recon — đừng bỏ qua hoàn toàn. Ngược lại, không phải mọi "High" đều khai thác được trong ngữ cảnh thực; cần xác minh.


12.5. Nmap — phân tích tới mức gói tin

Nmap (Network Mapper) là công cụ host discovery, port scanning, version/OS detection, và chạy script (NSE). Hiểu Nmap đòi hỏi hiểu TCP 3-way handshake và cờ TCP, vì hầu hết scan thao tác trực tiếp các cờ này.

12.5.1. Nền tảng — TCP header và các cờ (flags)

TCP segment header (RFC 793/9293). Sơ đồ byte-by-byte:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data | Res |N|C|E|U|A|P|R|S|F|                               |
| Offset|     |S|W|C|R|C|S|S|Y|I|            Window             |
|       |     | |R|E|G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options (nếu Data Offset > 5)              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Bảng trường TCP header:

Trường Kích thước Ý nghĩa Ví dụ
Source Port 16 bit (2 byte) Cổng nguồn 49152
Destination Port 16 bit Cổng đích 443
Sequence Number 32 bit (4 byte) Số thứ tự byte 0x1A2B3C4D
Acknowledgment Number 32 bit ACK số seq kỳ vọng tiếp 0x1A2B3C4E
Data Offset 4 bit Độ dài header (đơn vị 32-bit word) 5 = 20 byte
Reserved 3 bit Dự trữ (0) 0
Flags 9 bit NS,CWR,ECE,URG,ACK,PSH,RST,SYN,FIN xem dưới
Window 16 bit Kích thước cửa sổ nhận 64240
Checksum 16 bit Kiểm tra lỗi header+data+pseudo-header 0x...
Urgent Pointer 16 bit Offset dữ liệu khẩn (nếu URG) 0
Options 0–40 byte MSS, SACK, Timestamp, Window scale MSS=1460

Các cờ điều khiển (control flags) — mỗi cờ 1 bit:

Cờ Ý nghĩa khi =1
SYN Yêu cầu thiết lập kết nối (đồng bộ seq)
ACK Trường Acknowledgment hợp lệ
FIN Kết thúc gửi dữ liệu (đóng nhẹ nhàng)
RST Reset/từ chối kết nối ngay lập tức
PSH Đẩy dữ liệu lên ứng dụng ngay
URG Có dữ liệu khẩn

TCP 3-way handshake (thiết lập kết nối):

Client                         Server
  | --- SYN (seq=x) ----------> |     state: SYN_SENT -> server SYN_RECV
  | <-- SYN,ACK (seq=y,ack=x+1) |
  | --- ACK (ack=y+1) --------> |     state: ESTABLISHED cả hai phía

Nmap khai thác hành vi này: server mở port trả SYN/ACK, server đóng port trả RST.

12.5.2. -sS — SYN scan (half-open / stealth)

Cơ chế: Nmap gửi SYN, KHÔNG hoàn tất handshake.

Port MỞ:
  Nmap --- SYN ------------> Target
  Nmap <-- SYN/ACK -------- Target
  Nmap --- RST -----------> Target   (Nmap chủ động cắt, không gửi ACK)
  => kết luận: open

Port ĐÓNG:
  Nmap --- SYN ------------> Target
  Nmap <-- RST ------------ Target
  => kết luận: closed

Port LỌC (firewall drop):
  Nmap --- SYN ------------> Target
  (không hồi đáp, gửi lại vài lần vẫn im)
  => kết luận: filtered

Vì sao "stealth": vì không hoàn tất handshake (không tới ESTABLISHED), nhiều ứng dụng/log cũ không ghi lại kết nối (chúng chỉ log sau khi accept()). Tuy nhiên IDS/IPS hiện đại phát hiện dễ dàng. SYN scan cần quyền raw socket (root/CAP_NET_RAW) vì Nmap tự tạo gói TCP, không qua connect() của OS.

sudo nmap -sS -p 1-1000 192.168.1.10

Output mẫu:

PORT     STATE    SERVICE
22/tcp   open     ssh
80/tcp   open     http
443/tcp  open     https
3306/tcp filtered mysql

12.5.3. -sT — TCP Connect scan

Cơ chế: Nmap gọi syscall connect() của OS, hoàn tất đủ 3-way handshake, rồi đóng (gửi FIN hoặc RST).

Nmap --- SYN -------> Target
Nmap <-- SYN/ACK ---- Target
Nmap --- ACK -------> Target    (ESTABLISHED đầy đủ)
Nmap --- RST/FIN ---> Target    (đóng)

Khi nào dùng: khi không có quyền root (không raw socket). Đánh đổi: tạo kết nối đầy đủ → ứng dụng log lại → ít stealth hơn, chậm hơn.

nmap -sT -p 22,80,443 192.168.1.10   # không cần sudo

12.5.4. -sU — UDP scan

UDP không có handshake (connectionless). Cơ chế suy luận:

Port ĐÓNG:
  Nmap --- UDP packet ----> Target
  Nmap <-- ICMP Port Unreachable (type 3, code 3) -- Target
  => closed

Port MỞ:
  Nmap --- UDP packet ----> Target
  - Nếu dịch vụ UDP trả về dữ liệu => open
  - Nếu KHÔNG hồi đáp gì => open|filtered (mơ hồ)

Port LỌC:
  Nmap --- UDP ----> Target
  Nmap <-- ICMP type 3 code 1,2,9,10,13 (admin prohibited...) => filtered

Vì sao UDP scan chậm: vì không có RST khẳng định "closed", Nmap dựa vào ICMP Port Unreachable; nhưng RFC 1812 giới hạn tốc độ phát ICMP (rate limiting), nên Nmap phải đợi và gửi lại → rất chậm. Để chính xác hơn cho port phổ biến, Nmap gửi payload đặc thù dịch vụ (DNS query tới 53, SNMP tới 161).

sudo nmap -sU --top-ports 20 192.168.1.10   # quét 20 cổng UDP phổ biến

12.5.5. -sN / -sF / -sX — Null, FIN, Xmas scan

Ba scan này lợi dụng quy định RFC 793: nếu một gói TCP đến port đóng mà KHÔNG có cờ SYN/RST/ACK → server phải trả RST; nếu port mở → server bỏ qua (không hồi đáp).

Scan Cờ bật Mô tả gói
-sN Null (không cờ nào) Tất cả cờ = 0
-sF FIN FIN Chỉ FIN = 1
-sX Xmas FIN+PSH+URG "Sáng đèn như cây thông Noel"
Port MỞ hoặc LỌC:
  Nmap --- (FIN/Null/Xmas) ---> Target
  (không hồi đáp)  => open|filtered

Port ĐÓNG:
  Nmap --- (FIN/Null/Xmas) ---> Target
  Nmap <-- RST ---------------- Target  => closed

Vì sao dùng: có thể vượt qua firewall stateless chỉ lọc gói SYN. Hạn chế quan trọng: Windows (và nhiều thiết bị) KHÔNG tuân thủ RFC chuẩn này — luôn trả RST bất kể port mở/đóng → mọi port hiện "closed" → scan vô dụng trên Windows. Chỉ hiệu quả với hệ tuân thủ RFC (nhiều Unix-like).

sudo nmap -sX -p 1-100 192.168.1.10

12.5.6. -sn — Host Discovery (ping scan, không quét port)

-sn (trước đây -sP) chỉ xác định host nào "sống" mà không scan port. Cơ chế mặc định (khi chạy với quyền root) gửi tổ hợp thăm dò:

Probe Gói gửi Mục đích
ICMP Echo Request ICMP type 8 Ping cổ điển
ICMP Timestamp ICMP type 13 Dự phòng khi Echo bị chặn
TCP SYN to 443 SYN Suy luận host sống qua phản hồi
TCP ACK to 80 ACK Vượt firewall lọc SYN
ARP request (LAN) ARP who-has Trên cùng subnet — đáng tin nhất

Trên LAN, Nmap dùng ARP (lớp 2) vì host buộc phải trả ARP reply nếu tồn tại — bỏ qua firewall lớp 3.

sudo nmap -sn 192.168.1.0/24      # liệt kê host sống trong subnet /24

Output:

Nmap scan report for 192.168.1.1
Host is up (0.0012s latency).
MAC Address: AA:BB:CC:DD:EE:FF (Vendor)
Nmap scan report for 192.168.1.10
Host is up (0.0023s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 2.34 seconds

-Pn (no ping) bỏ qua host discovery, coi mọi host là sống — dùng khi mục tiêu chặn ICMP.

12.5.7. -sV — Version detection

Sau khi xác định port mở, -sV xác định dịch vụ và phiên bản chạy trên đó. Cơ chế: 1. Kết nối tới port mở. 2. Nếu dịch vụ tự gửi banner (vd SSH, SMTP) → đọc và so khớp với nmap-service-probes. 3. Nếu im lặng → Nmap gửi một loạt probe (chuỗi byte đặc thù giao thức) và so khớp response với hàng nghìn signature regex trong nmap-service-probes.

--version-intensity 0-9 điều chỉnh số probe gửi (0 = ít/nhanh, 9 = đầy đủ).

sudo nmap -sV -p 22,80,443 192.168.1.10

Output:

PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
80/tcp  open  http     nginx 1.18.0 (Ubuntu)
443/tcp open  ssl/http nginx 1.18.0

Version chính xác → tra cứu CVE tương ứng (nền tảng cho vulnerability scanning).

12.5.8. -O — OS detection

-O đoán hệ điều hành qua TCP/IP stack fingerprinting: gửi nhiều probe được thiết kế đặc biệt và phân tích các đặc trưng phản hồi mà mỗi OS thực thi khác nhau:

Đặc trưng phân tích Ý nghĩa
Initial TTL TTL khởi đầu (Linux 64, Windows 128, một số 255)
TCP Window Size Kích thước cửa sổ mặc định
TCP Options & thứ tự MSS, NOP, SACK, Timestamp, Window scale và trình tự
Don't Fragment bit Có đặt DF không
ISN sampling Cách sinh Initial Sequence Number
ICMP responses Phản hồi với probe dị thường

Nmap so khớp fingerprint với nmap-os-db. Cần ≥1 port mở VÀ ≥1 port đóng để chính xác.

sudo nmap -O 192.168.1.10

Output:

Running: Linux 5.X
OS CPE: cpe:/o:linux:linux_kernel:5
OS details: Linux 5.0 - 5.14
Network Distance: 2 hops

12.5.9. -p — chỉ định port và -F

Cú pháp Ý nghĩa
-p 80 Một port
-p 22,80,443 Danh sách
-p 1-1000 Dải
-p- Toàn bộ 1–65535
-p U:53,T:80 Tách UDP/TCP
-F Fast — 100 port phổ biến nhất
--top-ports 20 20 port phổ biến nhất (theo nmap-services)

12.5.10. -T — Timing templates

-T0 đến -T5 điều chỉnh tốc độ qua nhiều tham số (delay giữa probe, parallelism, timeout):

Template Tên Đặc điểm Trường hợp dùng
-T0 Paranoid Cực chậm, tuần tự, delay tới 5 phút Né IDS tối đa
-T1 Sneaky Chậm, delay 15s Né IDS
-T2 Polite Giảm tải, ít song song Mạng nhạy cảm
-T3 Normal Mặc định Cân bằng
-T4 Aggressive Nhanh, mạng ổn định Pentest thông thường
-T5 Insane Cực nhanh, có thể mất gói LAN nhanh, chấp nhận sai số

-T4 là lựa chọn phổ biến trên mạng tốt. Có thể tinh chỉnh chi tiết: --min-rate, --max-rate (packet/s), --max-retries, --host-timeout.

12.5.11. NSE — Nmap Scripting Engine

NSE chạy script Lua để mở rộng Nmap: phát hiện lỗ hổng, brute force, thu thập thông tin. Script ở /usr/share/nmap/scripts/, phân theo category:

Category Mục đích Mức độ xâm phạm
safe Không gây hại, không khai thác Thấp
default (-sC) Chạy mặc định, hữu ích & an toàn Thấp
discovery Thu thập thêm thông tin Thấp
version Hỗ trợ -sV Thấp
auth Liên quan xác thực Trung bình
brute Brute force credential Cao (tạo lưu lượng)
vuln Kiểm tra lỗ hổng đã biết TB-Cao
exploit Khai thác thật Cao (nguy hiểm)
dos Kiểm tra DoS Rất cao (có thể sập dịch vụ)
intrusive Có thể gây tải/hại Cao
# Chạy script mặc định + version
sudo nmap -sC -sV 192.168.1.10

# Quét lỗ hổng đã biết
sudo nmap --script vuln -p 80,443 192.168.1.10

# Một script cụ thể
sudo nmap --script http-title,http-headers -p 80 192.168.1.10
sudo nmap --script smb-vuln-ms17-010 -p 445 192.168.1.10   # phát hiện EternalBlue
sudo nmap --script ssl-enum-ciphers -p 443 192.168.1.10    # liệt kê cipher TLS

Output mẫu --script vuln:

PORT   STATE SERVICE
80/tcp open  http
| http-slowloris-check:
|   VULNERABLE:
|   Slowloris DoS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750

Truyền tham số script (--script-args):

sudo nmap --script http-brute --script-args \
  http-brute.path=/login,userdb=users.txt,passdb=pass.txt -p 80 target

12.5.12. Tổng hợp lệnh quét toàn diện và output

sudo nmap -sS -sV -O -p- -T4 --script default,vuln -oA fullscan 192.168.1.10
# -sS  : SYN scan
# -sV  : version detection
# -O   : OS detection
# -p-  : toàn bộ 65535 port
# -T4  : timing aggressive
# --script default,vuln : NSE
# -oA fullscan : xuất 3 định dạng (.nmap, .gnmap, .xml) tên fullscan

Các định dạng output:

Cờ Định dạng Dùng để
-oN file Normal (giống màn hình) Đọc người
-oG file Greppable grep/awk xử lý nhanh
-oX file XML Parse bằng script, import công cụ khác
-oA base Cả 3 trên Lưu trữ đầy đủ

Phân tích nhanh greppable:

grep "open" fullscan.gnmap | awk '{print $2}'   # liệt kê IP có port mở

12.5.13. Đọc trạng thái port

Nmap phân biệt 6 trạng thái:

State Ý nghĩa
open Dịch vụ đang lắng nghe và chấp nhận
closed Host trả lời nhưng không có dịch vụ (trả RST)
filtered Không xác định được — firewall chặn probe
unfiltered Truy cập được nhưng chưa rõ open/closed (ACK scan)
open\|filtered Không phân biệt được (UDP, FIN/Null/Xmas im lặng)
closed\|filtered Hiếm (Idle scan)

Đây là phần KHÔNG được xem nhẹ — kiểm thử ngoài phạm vi cho phép là hành vi truy cập trái phép hệ thống máy tính, có thể bị xử lý hình sự.

12.6.1. Cơ sở pháp lý

  • Việt Nam: Bộ luật Hình sự 2015 (sửa đổi, bổ sung 2017), Điều 289 (truy cập trái phép mạng máy tính, mạng viễn thông), Điều 287 (cản trở/gây rối loạn hoạt động mạng); Luật An ninh mạng 2018; Luật An toàn thông tin mạng 2015. (Người đọc nên kiểm chứng số điều luật cập nhật tại thời điểm áp dụng — quy định có thể được sửa đổi.)
  • Quốc tế tham khảo: Computer Fraud and Abuse Act (CFAA — Hoa Kỳ), Computer Misuse Act (Anh).

Quét port hay gửi payload tới hệ thống KHÔNG có sự cho phép = vi phạm, bất kể có gây hại thật hay không.

12.6.2. Văn bản bắt buộc trước khi test

Văn bản Vai trò
Scope of Work (SoW) Định nghĩa rõ tài sản, IP/domain, loại test được phép
Rules of Engagement (RoE) Khung thời gian, kỹ thuật cấm (vd DoS), người liên hệ khẩn
Authorization Letter ("get-out-of-jail") Văn bản ủy quyền có chữ ký người có thẩm quyền
NDA Bảo mật dữ liệu phát hiện được

12.6.3. Nguyên tắc vận hành an toàn

  • KHÔNG quét/khai thác ngoài danh sách IP/domain trong scope. Trong Burp: bật "Drop all out-of-scope traffic".
  • Tránh kỹ thuật phá hủy (--script dos, brute gây lockout) trừ khi được cho phép rõ ràng và có cửa sổ bảo trì.
  • Cẩn trọng với cloud assets: AWS/GCP/Azure yêu cầu tuân thủ chính sách pen-test riêng; một số dịch vụ quản lý (managed) bị cấm test.
  • Lưu log mọi hành động (timestamp) làm bằng chứng phạm vi và phục vụ điều tra nếu có sự cố.
  • Dữ liệu nhạy cảm trích xuất trong quá trình test phải được lưu trữ mã hóa và xóa an toàn sau khi kết thúc theo NDA.

12.7. Tổng kết chương

Chương này đã đi từ phân biệt khái niệm (scanning vs pentest), qua quy trình OWASP 5 pha, tới ba công cụ trụ cột với chi tiết tới mức gói tin/trường/bước và ví dụ chạy được:

  • Burp Suite — kiểm soát thủ công sâu: kiến trúc MITM với CA cert, Proxy, Target/Scope, Repeater (IDOR, SQLi), Intruder (4 attack type), Decoder, Comparer, Sequencer, Scanner; workflow XSS đầu-cuối.
  • Acunetix — DAST tự động: crawl + audit, cấu hình scan, đọc báo cáo, xác minh false positive; bổ sung chứ không thay thế Burp.
  • Nmap — bản đồ mạng tới mức cờ TCP: -sS/-sT/-sU/-sN/-sF/-sX, -sn host discovery, -sV/-O fingerprinting, -p/-T tuning, NSE (--script vuln), đọc trạng thái và xuất kết quả.

Nguyên tắc xuyên suốt: hiểu cơ chế tới gốc, luôn xác minh thủ công kết quả tự động, và tuyệt đối tôn trọng phạm vi pháp lý.


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.