Bài tập 1: Fuzzing với zzuf

Mục tiêu bài tập:

Trong bài tập này, chúng ta sẽ tìm hiểu quá trình fuzzing.

Các nhiệm vụ trong bài tập:

  1. ☐ Đăng nhập vào máy ảo Ub20 Fuzzing bằng mật khẩu studentpassword.
  2. ☐ Đảm bảo rằng Tính năng Ngẫu nhiên hóa Bố cục Không gian Địa chỉ (ASLR) của bạn bị vô hiệu hóa. Gõ sudo sysctl kernel.randomize_va_space=0 và nhấn Enter.
    ![alt text](image1.png)
  3. ☐ Chúng ta hiện sẽ không đề cập đến phân tích nhị phân và khai thác vì chúng ta đã có một mô-đun chuyên dụng cho việc đó.
  4. ☐ Mở một cửa sổ terminal và điều hướng đến thư mục /home/student/Downloads/fuzzing/zzuf.
  5. ☐ Khi bạn đã ở trong thư mục, hãy gõ man zzuf và đọc thêm về công cụ này. Một ví dụ về kết quả được hiển thị trong ảnh chụp màn hình.
    ![alt text](image2.png)

Dành vài phút và xem xét dữ liệu trên trang chính.

  1. ☐ Tiếp theo, để tạo một tệp, hãy gõ vn -hd 32 /dev/zero. Kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image3.png)
  2. ☐ Tiếp theo, chúng ta muốn sử dụng công cụ zzuf để fuzz lệnh cat. Mở một terminal mới và gõ zzuf cat /dev/zero | hd -vn 32 và nhấn Enter. Một ví dụ về điều này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image4.png)
  3. ☐ Như hình ảnh cho thấy, công cụ zzuf đã fuzz hai byte trong tệp nhị phân và nếu bạn chạy lại, nó sẽ lặp lại điều này. Do đó, nó thể hiện hành vi có thể tái hiện.
  4. ☐ Tiếp theo, chúng ta hãy thử làm điều tương tự nhưng xuất ra ở cơ số 8, là cơ số bát phân. Trong cửa sổ terminal, hãy gõ zzuf cat /dev/zero | od -vn 32 và nhấn Enter. Một ví dụ về kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image5.png)
  5. ☐ Bạn sẽ nhận thấy rằng kết quả đầu ra giống nhau, vì vậy đây là một lợi thế khác. Bất kể ứng dụng bị fuzz là gì, dữ liệu được fuzz là giống nhau.
  6. ☐ Tỷ lệ fuzzing là tỷ lệ của các bit bị fuzz khi zzuf thay đổi. Nó có thể được chỉ định bằng cờ -r. Theo mặc định, tỷ lệ fuzzing là 0,004, có nghĩa là fuzzing 0,4% số bit.
  7. ☐ Tiếp theo, chúng ta sẽ thử và fuzz nhiều bit hơn bằng cách sử dụng cờ, hãy gõ zzuf -r 0.05 cat /dev/zero | hd -vn 32 và nhấn Enter. Một ví dụ về kết quả đầu ra của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image6.png)
  8. ☐ Hành vi của zzuf có thể tái hiện, nhưng chúng ta có thể cần fuzz theo những cách khác nhau. Chúng ta thực hiện việc này bằng cách thay đổi seed ngẫu nhiên bằng cờ -s. Giá trị mặc định của bộ tạo số ngẫu nhiên là 0. Chúng ta có thể thay đổi seed, hãy gõ zzuf -s 1 cat /dev/zero | hd -vn 32 và nhấn Enter. Một ví dụ về kết quả đầu ra được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image7.png)
  9. ☐ Một phương pháp khác để sử dụng công cụ này là fuzz các tệp trực tiếp. Gõ cat /dev/zero | zzuf | hd -vn 32 và nhấn Enter. Một ví dụ về kết quả đầu ra của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image8.png)
  10. ☐ Chúng ta cũng có thể sử dụng công cụ này để tạo tệp. Gõ dd if=/dev/zero bs=1 count=32 | zzuf > output-file và nhấn Enter. Một ví dụ về kết quả đầu ra được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image9.png)
  11. ☐ Tiếp theo, để xem tệp, hãy gõ hd -v output-file và nhấn Enter. Kết quả đầu ra được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image10.png)
  12. ☐ Chúng ta có thể sử dụng zzuf như một công cụ kiểm tra hàng loạt cũng như một công cụ gỡ lỗi. Trong cửa sổ terminal, hãy gõ zzuf /bin/ls và nhấn Enter. Bởi vì zzuf cố gắng fuzz tệp nhị phân /bin/ls, điều này được coi là không mong muốn vì tệp thực thi được kỳ vọng không gây ra bất kỳ hành vi bất thường hoặc thông báo lỗi nào. Do đó, công cụ này không cho phép bất kỳ fuzz nào diễn ra trên thư mục /bin hoặc /sbin/*. Một ví dụ về kết quả đầu ra từ lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image11.png)
  13. ☐ Chúng ta thấy rằng tệp /etc/magic và hai tệp /usr/share/. Chúng ta có thể sử dụng cờ -E để đảm bảo rằng công cụ này loại trừ các tệp. Công cụ này thông báo cho chúng ta rằng hiện tại không có tệp nào được loại trừ. Trong cửa sổ terminal, hãy gõ zzuf -E /etc/magic /usr/share/ /usr/bin/ls* và nhấn Enter. Một ví dụ về kết quả đầu ra của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image12.png)
  14. ☐ Một cách khác để tránh sự cố này là sử dụng tùy chọn include bằng cờ -i.
  15. ☐ Chúng ta cũng có thể sử dụng cờ -c để đảm bảo zzuf chỉ fuzz các tệp xuất hiện trên dòng lệnh ứng dụng. Gõ zzuf -c -file /bin/ls và nhấn Enter. Một ví dụ về kết quả đầu ra của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image13.png)
  16. ☐ Đảm bảo rằng bạn đang ở trong thư mục /home/student/examples/samplecode. Gõ for i in {1..2000}; do zzuf -r $i * > $i-malformed; done.
  17. ☐ Do đó, đối với mỗi tệp ví dụ, chúng ta tạo ra 2000 biến thể bị lỗi, tất cả đều được đặt tên theo mẫu [number]-malformed.[extension]. Tham số -r đối với zzuf là lượng thay đổi ngẫu nhiên cần đưa vào và trong trường hợp này, nó sẽ khác nhau ngẫu nhiên trong khoảng 1 đến 2000. Bạn chắc chắn có thể điều chỉnh số lượng biến thể bằng cách sử dụng thử nghiệm và đánh giá. 2000 là một con số hợp lý để bắt đầu. Gõ for i in {1..2000}; do zzuf -r $i * > $i-malformed; done và nhấn Enter. Một ví dụ về kết quả đầu ra được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image14.png)
  18. ☐ Không có 24
  19. ☐ Như hình ảnh cho thấy, vòng lặp đã tạo ra rất nhiều tệp để chúng ta làm việc.
  20. ☐ Từ đây, chúng ta sẽ đưa các tệp đầu vào vào một chương trình như sau:
    LC_ALL=C; LANG=C; for f in *.example*; do timeout 3 convert -resize 2 “$f” /tmp/test.png; echo $f done > fuzzing.log
  21. ☐ LC_ALL=C; LANG=C đảm bảo rằng chúng ta đặt kết quả đầu ra thành ngôn ngữ tiếng Anh. Chúng ta thực hiện việc này vì chúng ta bây giờ muốn tìm kiếm các thông báo lỗi. Lệnh timeout đảm bảo rằng chúng ta dừng lại nếu gặp sự cố mất quá nhiều thời gian. Lệnh tiếp theo tạo ra một tệp PNG ngẫu nhiên, vì vậy chúng ta đang sử dụng convert ở đây, và đối số -resize 2 làm cho tệp PNG chỉ có kích thước 2×2. Cuối cùng, chúng ta muốn biết tệp nào đã gây ra sự cố, vì vậy chúng ta sử dụng đầu ra trong phần echo.
  22. ☐ Điều này có thể mất khá nhiều thời gian. Tùy thuộc vào máy tính bạn đang sử dụng, tệp nhật ký có thể trở nên khá lớn. Do đó, hãy đảm bảo rằng bạn có một không gian trống ở đâu đó có vài gigabyte.
  23. ☐ Tiếp theo, hãy gõ grep -C 2 “Segmentation fault” fuzzing.log và nhấn Enter.
    ![alt text](image15.png)
  24. ☐ Trong trường hợp này, chúng ta không thấy bất kỳ sự cố nào, nhưng quá trình là điều quan trọng nhất. Bạn có thể thay đổi số lượng và làm việc với công cụ này trực tiếp để thực hiện các thay đổi.
  25. ☐ Chúng ta có một phương pháp khác để sử dụng zzuf, đó là sử dụng nó trực tiếp. Trong ví dụ này, chúng ta sẽ sử dụng zzuf với 0.100000, có nghĩa là 0.1. Đảm bảo rằng bạn đang ở trong thư mục samplecode và gõ zzuf -t 0.1 -C -q /opt/bin/*.exe > wingby.exe. Tham số -t chỉ định thời gian chờ trong vài giây. Giá trị -C bị ép buộc, đảm bảo rằng chúng ta thực thi quá trình. Biến -q triệt tiêu kết quả đầu ra từ cửa sổ Windows.
  26. ☐ -s nghĩa là chúng ta chỉ nên fuzz các tệp được cung cấp, nhưng vì chúng ta đang fuzz theo một trình tự, chúng ta sẽ fuzz từng cái một. Giá trị seed ngẫu nhiên được đặt mặc định, vì vậy chúng ta thực sự không thấy bất kỳ kết quả đầu ra nào có nghĩa là zzuf không tìm thấy bất kỳ lỗi nào. Nếu zzuf gặp lỗi, nó sẽ đưa ra thông báo. Do đó, với timeout là ba giây, chúng ta đã thử xem liệu có thể làm cho chương trình bị lỗi hay không. Nếu chúng ta chạy vào một vòng lặp vô hạn, nó cũng có thể bị lỗi. Một ví dụ về kết quả đầu ra từ lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image16.png)
  27. ☐ Chúng ta thấy trong hình ảnh rằng chúng ta đã có SIGSEGV. Đây là lỗi segmentation fault, và bất cứ khi nào chúng ta gặp lỗi này, chúng ta biết rằng đã xảy ra sự cố. Nó được biểu thị bằng signal 11. Bây giờ chúng ta có dữ liệu để truy vấn lỗi cụ thể đó. Trong cửa sổ terminal, hãy nhập thông tin từ bên trong dấu ngoặc đơn, vì vậy chúng ta gõ zzuf -t 0.0647 s 16915 > wingby.exe > crash.exe và nhấn Enter.
    ![alt text](image17.png)
  28. ☐ Bây giờ chúng ta đã có tệp đã được fuzz mà tạo ra sự cố trong ứng dụng của chúng ta. Chúng ta có thể gửi những tệp này đến tác giả ứng dụng. Vui lòng lưu ý rằng nếu bạn đã fuzz một trong những chương trình có sẵn trong thư mục đã cho, thì một lượng lớn các sự cố đã được báo cáo trước đó và bạn sẽ không thêm bất kỳ điều gì mới mẻ vào đây.
  29. ☐ Chúng ta cũng có thể khám phá chương trình bị lỗi của mình bằng valgrind. Chỉ cần chạy valgrind với “-q” trước lệnh sau để giảm thiểu các thông báo dài dòng không cần thiết. Gõ valgrind -q objdump -x crash.exe. Một ví dụ về kết quả đầu ra từ lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image18.png)
  30. ☐ Như hình ảnh cho thấy, chúng ta đã có một chút thông tin về chương trình bị lỗi. Bây giờ bạn đã quen thuộc với quá trình làm cho chương trình bị lỗi.
  31. ☐ Mục tiêu bài tập đã đạt được.

Bài tập 2: Address Sanitizer

Mục tiêu bài tập:

Trong bài tập này, chúng ta sẽ khám phá quá trình sử dụng công cụ Address Sanitizer, công cụ sẽ cung cấp cho chúng ta nhiều khả năng hơn.

Các nhiệm vụ trong bài tập:

  1. ☐ Đăng nhập vào máy ảo Ub20 Fuzzing bằng mật khẩu studentpassword.
  2. ☐ Điều đầu tiên chúng ta cần làm là tạo một hàm main đơn giản. Nhập mã sau vào trình soạn thảo yêu thích của bạn và lưu nó dưới dạng test.c: #include <stdio.h> int main() { int a[2]; a[2] = 1; return 0; }
  1. Use code with caution.C
  2. ☐ Không có 4
  3. ☐ Không có 5
  4. ☐ Một mảng có tên là “a” với các phần tử được xác định. Các phần tử của mảng này được truy cập bằng chỉ mục bắt đầu từ 0. Trong đoạn mã này, chúng ta có một truy cập mảng không hợp lệ a[2] = 1. Mã này đặt biến thành giá trị 1. Tuy nhiên, a[2] là một giá trị không hợp lệ vì nó đọc bộ nhớ từ bên ngoài các phần tử của mảng, được xác định là a[0] và a[1]. Vị trí bộ nhớ này chứa gì là không xác định, do đó, nó có thể chứa bất kỳ giá trị nào, nhưng không phải là một giá trị hợp lệ.
  5. ☐ Các phiên bản gần đây của trình biên dịch như llvm và gcc đã nhận được một công cụ mạnh mẽ để bắt các lỗi truy cập bộ nhớ như vậy. Đó là Address Sanitizer. Chúng ta sẽ thêm cờ -fsanitize=address khi biên dịch. Chúng ta cũng có thể đặt biến môi trường ASAN_OPTIONS để gỡ lỗi thêm. Để biên dịch, chúng ta sử dụng các cờ sau:
    gcc -fsanitize=address -g gdb -o test test.c
  6. ☐ Không có 8
  7. ☐ Trong cửa sổ terminal, hãy gõ gcc -fsanitize=address -g gdb -o test test.c và nhấn Enter.
  8. ☐ Bây giờ mã đã được biên dịch với Address Sanitizer, chúng ta có thể nhận thêm thông tin phản hồi khi chạy nó. Gõ ./test và nhấn Enter. Một ví dụ về kết quả đầu ra của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image19.png)
  9. ☐ Công cụ đang báo cáo rằng chúng ta có lỗi tràn bộ đệm ngăn xếp như được hiển thị trong ảnh chụp màn hình sau. Nó thậm chí còn tham chiếu đến dòng có vấn đề.
  10. ☐ Để thêm Address Sanitizer vào các tệp được sử dụng thường xuyên, chúng ta có thể cấu hình tệp như sau. Đối với một tệp phần mềm đang sử dụng cấu hình thông thường, chúng ta có thể sử dụng lệnh sau:
    a. ./configure –disable-shared LDFLAGS=”-fsanitize=address -g” CXXFLAGS=”-fsanitize=address -g”
    b. make
  11. ☐ Một lần nữa, chúng ta thêm -g cho gdb để gỡ lỗi thêm nếu có thể. Chúng ta vô hiệu hóa các thư viện được chia sẻ và đặt các cờ cho cả trình biên dịch C và C++.
  12. ☐ Bây giờ chúng ta có thể chạy các tệp của mình đối với các đầu vào bị lỗi tương tự như chúng ta đã làm trong lần chạy trước đó.
  13. ☐ Khi chuyển hướng kết quả đầu ra đến tệp nhật ký, chúng ta phải xem xét rằng chúng ta không thể grep cho Segmentation Fault nữa. Thay vào đó, chúng ta cần grep cho Address Sanitizer.
  14. ☐ Vui lòng lưu ý những điều sau khi sử dụng Address Sanitizer. Nếu zzuf tìm thấy một lỗi truy cập bộ nhớ như đã trình bày ở trên, nó sẽ không tự động làm hỏng ứng dụng. Nó sẽ hiển thị một thông báo cho thấy lỗi và sau đó trả về mã lỗi thích hợp cho ứng dụng đó. Chúng ta không thể ép buộc ứng dụng bị hỏng bằng đoạn mã như đã hiển thị ở trên, vì vậy phần mềm chạy ngay lập tức sau khi gặp lỗi. Để thực hiện việc này, chúng ta cần sử dụng biến môi trường ASAN_OPTIONS = “abort_on_error=1”.
  15. ☐ Một vấn đề khác có thể xảy ra là một ứng dụng có thể yêu cầu một lượng lớn bộ nhớ trong đó một mẫu được fuzz gây ra một sự cố. Điều này do đó có thể làm cho hệ thống của bạn không ổn định trong khi chạy fuzzer. Do đó, hãy ghi nhớ giới hạn của hệ thống bạn và không làm bất cứ điều gì có thể làm cho toàn bộ hệ thống của bạn không ổn định.
  16. ☐ Như bạn đã thấy, bạn có thể thực hiện một số việc thú vị với công cụ này. Do đó, bạn được khuyến khích tìm hiểu thêm về công cụ này cũng như các công cụ khác.
  17. ☐ Mục tiêu bài tập đã đạt được.

Bài tập 3: Fuzzing với AFL

Mục tiêu bài tập:

Trong bài tập này, chúng ta sẽ khám phá quá trình fuzzing bằng cách sử dụng công cụ American Fuzzy Lop (AFL).

Các nhiệm vụ trong bài tập:

  1. ☐ Đăng nhập vào máy ảo Ub20 Fuzzing bằng mật khẩu studentpassword.
  2. ☐ Đảm bảo Address Space Layout Randomization (ASLR) bị vô hiệu hóa. Để fuzzing và sử dụng afl-fuzz, bạn không cần mở terminal và gõ sudo sysctl kernel.randomize_va_space=0. Tuy nhiên, đối với bài tập này, bạn không cần lặp lại lệnh này. Bạn có thể quên rằng ASLR đang bị vô hiệu hóa.
  3. ☐ Chúng ta hiện tại không cần xử lý phân tích nhị phân và khai thác vì chúng ta đã có mô-đun chuyên dụng cho điều đó. Các khía cạnh khác liên quan đến fuzzing sẽ được đề cập trong bài tập này.
  4. ☐ Sau khi bạn đã đăng nhập, hãy mở một cửa sổ terminal.
  5. ☐ Chúng ta sẽ tạo một chương trình để làm việc với. Trong trình soạn thảo yêu thích của bạn, hãy nhập chương trình sau: #include <stdio.h> #include <string.h> int main(void) { char login[33]; char password[33]; printf("login:\n"); gets(login); printf("password:\n"); gets(password); if (strcmp(login, "root") == 0) { if (strcmp(password, "1qazxsw2") == 0) { printf("Access Granted\n"); return 1; } } printf("Access Denied\n"); return 0; }

Use code with caution.C

☐ Lưu chương trình là afirsttest.c. Chương trình sử dụng hai ký tự dài 32 ký tự, một ký tự để lưu tên người dùng và ký tự kia để lưu mật khẩu. Để kiểm tra giới hạn đầu vào, chúng ta sử dụng hàm gets() được biết đến với việc gây ra lỗi tràn bộ đệm.

☐ Sau khi thực thi, chương trình đầu tiên yêu cầu tên người dùng và sau đó là mật khẩu. Đầu vào được so sánh với các giá trị được mã hóa cứng “root” và “1qazxsw2”. Nếu cả tên người dùng và mật khẩu khớp với các giá trị đã biết, thì “Access Granted” sẽ được hiển thị cho người dùng. Nếu không, thông báo “Access Denied” sẽ được hiển thị.

☐ Chúng ta sẽ biên dịch chương trình này với tất cả các biện pháp giảm thiểu được vô hiệu hóa. NX, NX-stack, canary và stack NX đều là các biện pháp bảo vệ được thiết kế để ngăn chặn mã bị khai thác được thực thi trực tiếp từ ngăn xếp. Chúng ta có thể vô hiệu hóa trực tiếp các biện pháp này trên ngăn xếp bằng cách thêm một giá trị bổ sung vào phần mềm để ngăn ngăn xếp thực thi, nhưng một số triển khai hiện đại nhất định vô hiệu hóa tùy chọn này. Thay vào đó, chúng chỉ trả về các lỗi và ngoại lệ cho những trường hợp như vậy. Các cơ chế bảo vệ này có thể được vô hiệu hóa bằng cách sử dụng lệnh gcc sau:
gcc -fno-stack-protector -z execstack afirsttest.c -o afirsttest-gcc

☐ Không có 28

☐ -fno-stack-protector sẽ vô hiệu hóa canary ngăn xếp trong khi -z execstack làm cho cả heap và ngăn xếp có thể thực thi được. Để xác minh rằng các tùy chọn này đã được cài đặt, chúng ta sử dụng một công cụ mạnh mẽ có tên checksec. Gõ checksec afirsttest-gcc trong terminal. Một ví dụ về điều này được hiển thị trong ảnh chụp màn hình sau.

![alt text](image20.png)

☐ Checksec báo cáo về hai cơ chế bảo mật bổ sung khác ngoài canary ngăn xếp mà chúng ta sẽ không giải thích chúng trong bài tập này.

☐ No-Execute (NX) là một cơ chế bảo mật ngăn chặn việc thực thi mã trong một số vùng bộ nhớ.

☐ Relocation Read-Only (RRO) là kỹ thuật được sử dụng để làm cho các phần không cần thiết của tệp ELF không thể ghi được để ngăn chặn ghi đè lên bảng toàn cục (GOT) bị tràn bộ đệm.

☐ Position Independent Executables (PIE) giúp khó khăn hơn trong việc khai thác lỗi

các thao tác tiếp theo

  1. ☐ Mặc dù nằm ngoài phạm vi của bài tập này, nhưng chúng ta sẽ giải thích ngắn gọn về việc triển khai ASAN. AddressSanitizer (ASAN) là một công cụ phát hiện lỗi bộ nhớ nhanh.
  2. ☐ Bây giờ chương trình mục tiêu đã được tạo, chúng ta đã sẵn sàng bắt đầu fuzz nó để khám phá các lỗ hổng.
  3. ☐ Chúng ta sẽ sử dụng AFL, một fuzzer mã nguồn mở và miễn phí.
  4. ☐ Trước khi bắt đầu với AFL, chúng ta cần biên dịch mã nguồn của chúng ta bằng trình biên dịch afl-gcc được cung cấp. Trình biên dịch AFL sẽ thêm mã xung quanh mã nguồn để tối đa hóa việc bao phủ mã. Để biên dịch mã nguồn của chúng ta bằng AFL, hãy sử dụng cùng một lệnh đã sử dụng trước đó để biên dịch afirsttest.c bằng gcc hoặc sử dụng Makefile được liên kết.
  5. ☐ Trong cửa sổ terminal, hãy nhập afl-gcc -fno-stack-protector -z execstack afirsttest.c -o afirsttest-afl và nhấn Enter. Một ví dụ về kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image21.png)
  6. ☐ Cảnh báo được hiển thị như trong ảnh chụp màn hình ở trên, nhưng chúng ta biết rằng tệp nhị phân kết quả là tệp sẽ được sử dụng cho mục đích của chúng ta.
  7. ☐ Không có 38
  8. ☐ Một khía cạnh quan trọng của fuzzing là tạo ra tất cả các trường hợp thử nghiệm có thể có của mô-đun, ví dụ: tạo ra các đường dẫn mã khác nhau. Chương trình ví dụ của chúng ta có ba đường dẫn có thể có sau:
    a. Tên người dùng và mật khẩu hợp lệ
    b. Tên người dùng không hợp lệ
    c. Tên người dùng hợp lệ, mật khẩu không hợp lệ
  9. ☐ Do đó, để đạt được ba đường dẫn có thể này, phương pháp là thiết kế từng trường hợp thử nghiệm với tệp riêng của nó.
  10. ☐ Tệp đầu tiên sẽ có hai dòng, không có dòng nào chứa thông tin xác thực thích hợp. Tệp thứ hai sẽ có tên người dùng đúng nhưng mật khẩu không hợp lệ. Tệp thứ ba sẽ có cả hai thông tin xác thực chính xác. Tên của tệp hoặc nội dung của tệp ở mỗi trường hợp này không quan trọng. Dữ liệu cho mỗi tệp đại diện cho các trường hợp này được hiển thị trong bảng sau:
Tên tệp mộtTên tệp haiTên tệp ba
case-one.txtcase-two.txtcase-three.txt
adminrootroot
admintoor1qazxsw2
  1. ☐ Sau khi bạn đã tạo các tệp của mình, hãy tạo một thư mục cho các tệp đó và bạn có thể gọi nó là testcases.
  2. ☐ Tạo một thư mục khác cho kết quả của ba trường hợp thử nghiệm và di chuyển chúng vào đó.
  3. ☐ Sau khi bạn đã di chuyển các tệp, hãy nhập ls -lart testcases và xác minh rằng kết quả đầu ra khớp với những gì được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image22.png)
  4. ☐ Tại thời điểm này, chúng ta đã sẵn sàng bắt đầu fuzzer. Nhập afl-fuzz -i testcases -o results ./afirsttest-afl và nhấn Enter. Một ví dụ về kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau. Điều này xảy ra khi bạn chạy chương trình.
    ![alt text](image23.png)
  5. ☐ Tất cả những gì chúng ta phải làm là làm theo các bước trong thông báo lỗi, mở một cửa sổ khác và nhập sudo -i. Sau đó, nhập echo core > /proc/sys/kernel/core_pattern.
    ![alt text](image24.png)
  6. ☐ Bây giờ chúng ta sẽ có thể chạy lại lệnh của mình trong cửa sổ terminal ban đầu. Bạn có thể phải chuyển sang màn hình mở rộng nếu bạn nhận được thông báo lỗi. Một ví dụ về điều này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image25.png)
  7. ☐ Sau khi xem xét hình ảnh, bạn sẽ thấy rằng có khá nhiều dữ liệu để bạn xem xét. Chúng ta sẽ không đề cập đến tất cả những điều này do những hạn chế về thời gian. Bạn được khuyến khích đọc tệp README được đặt tại /usr/local/share/doc/afl/. Một ví dụ về phần đầu của tệp được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image26.png)
  8. ☐ Kết quả đầu ra bạn tìm kiếm khi công cụ fuzzing đang chạy có hai phần quan trọng đối với chúng ta trong bài tập này:
    a. Tổng số đường dẫn
    b. Tổng số sự cố
  9. ☐ Mỗi mục trong số này được hiển thị trong ảnh chụp màn hình sau:
    ![alt text](image27.png)
  10. ☐ Vì tổng số đường dẫn được liệt kê là 3, và chúng ta đã xác định từ đầu bài tập rằng chúng ta có ba đường dẫn đầu vào, chúng ta có thể phá vỡ những gì hiện đang hiển thị. Chúng ta đã hoàn thành ba đường dẫn đầu vào, vì vậy chúng ta có thể dừng fuzzing.
  11. ☐ Đối với ví dụ này, chúng ta chỉ có ba đường dẫn đầu vào được tạo, và như vậy, chúng ta có lợi thế đó. Lợi thế này sẽ không có sẵn trong tình huống bình thường, nhưng để làm rõ, chúng ta có thể xem xét thêm hai chi tiết khác được hiển thị ở đó, đó là tốc độ thực thi và tải CPU. Cả hai đều được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image28.png)
  12. ☐ Liên quan đến CPU, vì chúng ta đang chạy trên máy ảo và nó đã được cấu hình với hai CPU với hai lõi trên mỗi CPU, chúng ta có tải CPU khá hợp lý. Khi thử nghiệm với một bộ xử lý và hai lõi, tỷ lệ giảm đáng kể. Do đó, hãy ghi nhớ số lượng lõi và bộ xử lý nếu bạn đang fuzz, vì nó có thể mất nhiều bộ nhớ và bộ xử lý.
  13. ☐ Liên quan đến tốc độ thực thi, ở đây chúng ta có 820/giây, đó là điều bạn nên chú ý khi fuzzing.
  14. ☐ Để xem xét hai sự cố duy nhất này, hãy nhập ls -lart results/crashes và nhấn Enter. Kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image29.png)
  15. ☐ Mỗi tệp chứa một sự cố. Vì signal là 11, điều này có nghĩa là sự cố được gây ra bởi lỗi segmentation fault. Bài tập này sẽ không tìm hiểu về quá trình khai thác bằng công cụ, vì có một mô-đun chuyên dụng cho điều đó. Chúng ta sẽ làm việc với công cụ trong mô-đun APC.
  16. ☐ Chúng ta cần lấy dữ liệu từ tệp bị lỗi làm đầu vào và đưa nó vào chương trình của chúng ta. Trong cửa sổ terminal, hãy nhập cat /results/crashes/id:000000,sig:11,src:000000,op:havoc,rep:2 ./afirsttest-gcc. Lưu ý rằng bạn cần thay “id” bằng “id” của bạn. Một ví dụ về kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image30.png)
  17. ☐ Như bạn có thể thấy, lỗi segmentation fault và sự cố của chúng ta được hiển thị.
  18. ☐ Bước tiếp theo sẽ là phân tích dữ liệu. Chúng ta biết rằng chúng ta có một chương trình yếu vì chúng ta đã tạo ra nó.
  19. ☐ Mục tiêu bài tập đã đạt được.

Bài tập 4: Fuzzing với AFL và capstone

Mục tiêu bài tập:

Trong bài tập này, chúng ta sẽ tiếp tục tìm hiểu quá trình fuzzing bằng cách sử dụng công cụ American Fuzzy Lop (AFL).

Các nhiệm vụ trong bài tập:

  1. ☐ Đến máy ảo Ub20 Fuzzing và đăng nhập bằng studentpassword làm Mật khẩu.
  2. ☐ Chúng ta sẽ làm việc và fuzz với công cụ capstone. Capstone là một công cụ tháo gỡ mã nguồn mở được sử dụng trong các công cụ khai thác, trình tháo gỡ, trình gỡ lỗi và các dự án khác.
  3. ☐ Mã chúng ta sẽ sử dụng đã được tạo ra để fuzz. Nó nằm trong thư mục gốc và được gọi là capstest.c. Mã được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image31.png)
  4. ☐ Đây chỉ là một tệp nhỏ mà chúng ta đang sử dụng làm cơ sở. Thực sự không có gì đặc biệt ở đây, nhưng nếu bạn có một ví dụ khác, việc sử dụng công cụ này là quá trình tương tự.
  5. ☐ Bạn không cần nhập các lệnh sau đây, nhưng chúng tôi bao gồm chúng trong trường hợp bạn muốn thực hiện việc này trên máy của mình. Chúng ta đang bao gồm các tệp nhị phân ở đây. # compile an instrumented version of capstone git clone https://github.com/aquynh/capstone.git cd capstone/ CC=afl-clang-fast ./make.sh
  1. Use code with caution.Bash
  2. ☐ Chúng ta đã bao gồm các tệp nhị phân vì afl-clang-fast không hoạt động giống nhau trên Ubuntu 20, nhưng quy trình là quan trọng. Trong môi trường của bạn, bạn sẽ tự xây dựng chúng trên nền tảng của mình.
  3. ☐ Không có 7
  4. ☐ Bây giờ chúng ta đã sẵn sàng để biên dịch và liên kết mã của mình, hãy sử dụng trình biên dịch afl. Nhập afl-clang-fast-static capstest.c capstone/libcapstone.a -o capstest và nhấn Enter. Kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image32.png)
  5. ☐ Như ảnh chụp màn hình ở trên cho thấy, một số cảnh báo được hiển thị. Điều này sẽ xảy ra khi chúng ta sử dụng các loại mã và hàm được đo lường.
  6. ☐ Tiếp theo, chúng ta tạo các đầu vào của mình. Nhập dd if=/dev/urandom of=inputs/rand bs=64 count=1 và nhấn Enter. Kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image33.png)
  7. ☐ Không có 11
  8. ☐ Bây giờ đầu vào đã được tạo, chúng ta đã sẵn sàng chạy công cụ fuzzing của mình. Tuy nhiên, trước khi làm điều đó, chúng ta muốn đảm bảo rằng lõi không trỏ đến nguồn bên ngoài. Mở một cửa sổ khác và nhập sudo -s. Nếu bạn không có quyền root, chúng ta không thể chạy lệnh này. Sau đó, nhập echo core > /proc/sys/kernel/core_pattern.
    ![alt text](image34.png)
  9. ☐ Bây giờ chúng ta đã sẵn sàng. Nhập afl-fuzz -i inputs -o findings ./capstest và nhấn Enter. Một ví dụ về kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image35.png)
  10. ☐ Tốc độ thực thi của chúng ta là 2k mỗi giây, và điều này không nhanh như tốc độ trước đó.
  11. ☐ Chúng ta vẫn có thể cố gắng cải thiện tốc độ. Có nhiều thủ thuật khác nhau có thể được sử dụng để tăng tốc quá trình. Phương pháp chúng ta sẽ sử dụng ở đây là fuzzing trong quy trình AFL. Điều này sẽ khởi động lại quy trình mỗi khi chúng ta nhận được một chuỗi đầu vào mới. Chúng ta đạt được điều này bằng cách sử dụng vòng lặp chứ không phải chỉ fuzz trên chương trình capstest. Một ví dụ về mã được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image36.png)
  12. ☐ Mã này bây giờ chứa một macro AFL_LOOP để phát hiện xem chương trình có đang chạy trong AFL hay không. Sau đó, nó sẽ gửi 1000 đầu vào khác nhau cho công cụ. Mỗi 1000 lần lặp, quy trình sẽ dừng lại và khởi động lại. Điều này sẽ ngăn chặn rò rỉ bộ nhớ.
  13. ☐ Xin lưu ý rằng nếu chương trình được khởi chạy từ bên ngoài AFL, thì vòng lặp và mã chỉ chạy một lần. Điều này cho phép chương trình được khởi chạy từ dòng lệnh và cho phép sử dụng các công cụ khác để đo lường được sử dụng đối với chương trình đó.
  14. ☐ Trong một terminal khác, hãy nhập afl-clang-fast-static capstest2.c capstone/libcapstone.a -o capstest2.
    ![alt text](image37.png)
  15. ☐ Tiếp theo, sau khi mã được biên dịch, chúng ta đã sẵn sàng chạy lại fuzzer. Nhập afl-fuzz -i inputs -o findings ./capstest2 và nhấn Enter. Một ví dụ về kết quả của lệnh này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image38.png)
  16. ☐ Như ảnh chụp màn hình ở trên cho thấy, bây giờ chúng ta gần đạt 13k mỗi giây, đây là một sự gia tăng đáng kể. Tất cả những gì bạn đã thêm là ba dòng mã. Bạn cũng có thể chạy AFL trên nhiều lõi CPU khác nhau từ các cửa sổ terminal khác nhau và kết hợp kết quả như một master và slave thiết lập.
  17. ☐ Không có 21
  18. ☐ Như ảnh chụp màn hình cho thấy, tổng số thực thi bây giờ là 1,7M, đây là một sự gia tăng đáng kể.
  19. ☐ Mục tiêu bài tập đã đạt được.

Bài tập 5: Các khả năng bổ sung của Address Sanitizer

Mục tiêu bài tập:

Trong bài tập này, chúng ta sẽ khám phá công cụ Address Sanitizer và xem xét một số chức năng không được bật theo mặc định.

Các nhiệm vụ trong bài tập:

  1. ☐ Chúng ta đã thấy một số lợi thế của công cụ Address Sanitizer trước đó. Tiếp theo, chúng ta sẽ tìm hiểu thêm về chúng.
  2. ☐ Truy cập máy ảo Ub20 Fuzzing: AFL ADV và đăng nhập bằng mật khẩu studentpassword.
  3. Sử dụng sau khi trả về: Address Sanitizer phát hiện khi một biến được sử dụng sau khi nó ngừng tồn tại, tức là sau khi hàm trả về. Tuy nhiên, nó không phát hiện được khi một biến được sử dụng sau khi hàm trả về nếu biến đó nằm trong phạm vi của hàm. Việc này có thể được kích hoạt bằng cách đặt biến môi trường ASAN_OPTIONS = “detect_stack_use_after_return=1”.
  4. ☐ Tương tự như tệp trước đó, chúng ta sẽ bắt đầu với một chương trình ví dụ. Trong thư mục gốc, hãy tạo một tệp có tên file4.c. Nội dung của tệp được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image39.png)
  5. ☐ Bây giờ chúng ta có một chương trình ví dụ để làm việc, hãy biên dịch nó. Nhập gcc -g -O -fsanitize=address file4.c -o file và nhấn Enter.
    ![alt text](image40.png)
  6. ☐ Tiếp theo, chúng ta có thể phát hiện việc sử dụng ngăn xếp sau khi trả về bằng cách nhập biến môi trường ASAN_OPTIONS=detect_stack_use_after_return=1 ./file.
    ![alt text](image41.png)
  7. ☐ Như ảnh chụp màn hình ở trên cho thấy, nếu không đặt use_after_return, lỗi này sẽ không bị phát hiện.
  8. ☐ Chúng ta đã trình diễn một trong các chức năng bổ sung của Address Sanitizer.
  9. ☐ Vì vậy, chúng ta có thể có các tùy chọn bổ sung để giúp chúng ta phát hiện thêm nhiều lỗi hơn.
  10. ☐ Mục tiêu bài tập đã đạt được.

Bài tập 6: Fuzzing với Peach

Các nhiệm vụ trong bài tập:

  1. ☐ Trong bài tập này, chúng ta sẽ khám phá công cụ Peach Fuzzer. Khung Peach có thể được sử dụng trên Windows, Linux và OS X. Mono là bắt buộc trên Linux và OS X. Trong phần này, chúng ta sử dụng bản phát hành Windows Server 2016 64-bit để chạy Peach. Nền tảng của bạn và kết quả của bạn có thể hơi khác một chút nếu bạn sử dụng một nền tảng khác.
  2. ☐ Bạn sẽ nhận thấy rằng phiên bản cộng đồng không được cập nhật thường xuyên như công cụ thương mại, nhưng nó sẽ phục vụ mục đích của chúng ta và khám phá các khái niệm về fuzzing.
  3. ☐ Để bắt đầu fuzzing bằng Peach, chúng ta cần tạo một tệp được gọi là tệp Peach Pit. Các tệp này là các tài liệu XML mô tả cấu hình fuzzing cho phiên bản. Một ví dụ về dữ liệu được chứa trong tệp Pit được hiển thị trong bảng sau:
XMLMô tả
GeneralXác định các vấn đề không liên quan đến các tham số fuzzing (ví dụ: tên).
ConfigurationXác định cấu trúc của dữ liệu sẽ được fuzz trong Peach (ví dụ: đường dẫn Python).
Data ModelXác định ngôn ngữ mô tả dữ liệu.
State ModelXác định máy trạng thái cần thiết để biểu diễn chính xác các giao thức, trong trường hợp mô hình dữ liệu đơn giản là không đủ để nắm bắt tất cả các đặc tả giao thức.
Agents and MonitorsXác định cách Peach sẽ phân phối khối lượng công việc fuzzing và giám sát phần mềm mục tiêu để tìm lỗi/lỗ hổng.
Test ConfigurationXác định cách Peach sẽ tạo từng trường hợp thử nghiệm và chiến lược fuzzing sẽ được sử dụng để sửa đổi dữ liệu.
  1. ☐ Tệp Peach Pit khá dễ tạo, và Peach cung cấp một số mẫu có thể được kiểm tra và sửa đổi cho phù hợp với các tình huống fuzzing khác nhau.
  2. ☐ Vì các tệp này là tệp XML, nên bất kỳ trình soạn thảo văn bản nào cũng hoạt động. Một ví dụ về một trong các tệp XML được hiển thị trong ảnh chụp màn hình sau. Dành vài phút và xem xét dữ liệu có trong hình ảnh.
    ![alt text](image42.png)
  3. ☐ Chúng ta sẽ chỉ sử dụng mẫu mặc định trong C:\Peach\Samples\HelloWorld.
  4. ☐ Nhấp vào Ctrl + Alt + Delete để đăng nhập.
  5. Administrator làm hồ sơ người dùng mặc định được chọn. Nhập Pa wOrd và nhấn Enter.
    ![alt text](image43.png)
  6. ☐ Mở File Explorer và điều hướng đến ổ C:. Bây giờ, nhấn Shift + nhấp chuột phải vào thư mục Peach và nhấp vào Mở cửa sổ lệnh tại đây từ menu ngữ cảnh như được hiển thị trong ảnh chụp màn hình.
    ![alt text](image44.png)
  7. ☐ Trong terminal, hãy nhập peach -t samples\HelloWorld.xml và nhấn Enter. Điều này sẽ xác thực tệp.
    ![alt text](image45.png)
  8. ☐ Bây giờ chúng ta đã xác thực tệp, chúng ta có thể bắt đầu quá trình bắt đầu fuzzing với tệp. Nhập peach samples\HelloWorld.xml Default và nhấn Enter. Điều này sẽ bắt đầu quá trình fuzzing.
  9. ☐ Như được hiển thị trong ảnh chụp màn hình, đây là một công cụ mạnh mẽ có thể làm hỏng máy khi nó đang chạy. Trên thực tế, đôi khi, bạn có thể phải dừng nó để thực hiện bảo trì.
  10. ☐ Để thoát khỏi fuzz, hãy nhấn Ctrl + c.
    ![alt text](image46.png)
  11. ☐ Không có 14
    ![alt text](image47.png)
  12. ☐ Bạn sẽ nhận thấy rằng có thể mất nhiều thời gian để các lần lặp tăng nhanh. Lưu ý yêu cầu cài đặt WinDbg và sửa lỗi trong đường dẫn. Một ví dụ về điều này được hiển thị trong ảnh chụp màn hình.
    ![alt text](image48.png)
  13. ☐ Luôn có khả năng bạn có thể phải sửa lỗi đường dẫn cho các tệp khác.
  14. ☐ Kết quả của phiên kết thúc có thể được kiểm tra trong thư mục session trong một thư mục được đặt tên là ngày giờ hiện tại tại thời điểm tạo thư mục, theo sau là một số ngẫu nhiên được thêm vào tên tệp.
  15. ☐ Nếu phiên fuzzing thành công, một thư mục bổ sung được đặt tên là Faults sẽ xuất hiện trong thư mục session. Thư mục Faults chứa các thư mục riêng biệt cho từng lớp lỗi được phát hiện. Mỗi trong số các cụm lỗi này chứa một hoặc nhiều trường hợp thử nghiệm bao gồm thông tin sau:
    • Trường hợp thử nghiệm bị biến đổi đã gây ra sự cố
    • Báo cáo gỡ lỗi được thu thập về chương trình tại thời điểm xảy ra sự cố. Báo cáo này bao gồm thông tin về trạng thái của bộ xử lý, các thanh ghi bộ xử lý, một phần của ngăn xếp và thông tin được thu thập từ plugin WinDbg, cung cấp phân tích tự động khai thác và đánh giá rủi ro bảo mật.
    • Phiên bản gốc của trường hợp thử nghiệm đã được fuzzer biến đổi để tạo ra lỗi cụ thể này.
  16. ☐ Phiên bản có thể được kiểm tra bằng cách kiểm tra tệp cuối cùng được tạo trong thư mục Logs trong thư mục phiên, có tên là status.txt. Một ví dụ về điều này được hiển thị trong ảnh chụp màn hình.
    ![alt text](image49.png)
  17. ☐ Một cách khác để xem quá trình fuzzing và số lần lặp được thực hiện bởi Peach là bằng cách sử dụng peach -t <tên tệp.xml> -debug. Bạn sẽ nhận thấy giá trị này trong terminal nếu bạn chạy lệnh.
  18. ☐ Một điều cần lưu ý là nếu bạn đang sử dụng tùy chọn “-strategy” trong phiên fuzzing, chiến lược được chọn trước đó để xác định thứ tự các trường hợp thử nghiệm không tạo ra nhiều khác biệt.
  19. ☐ Theo mặc định, Peach đi kèm với 27 bộ biến đổi khác nhau, tùy thuộc vào loại phần tử (số, mảng, chuỗi văn bản, blob hoặc cấu trúc dữ liệu). Những bộ biến đổi này thực hiện các thay thế trên phần tử bằng cách sử dụng các phép biến đổi khác nhau, để cố gắng gây ra ngoại lệ như tràn số, truy cập con trỏ không hợp lệ hoặc tràn bộ đệm. Một số bộ biến đổi quan trọng nhất là như sau:
    • ArrayNumericalCaseMutator: Biến đổi mảng bằng cách thêm hoặc bớt các phần tử, nhân đôi các phần tử hoặc chèn số không.
    • BlobMutator: Thực hiện các phép biến đổi khác nhau trên một blob dữ liệu, chẳng hạn như làm hỏng các bit riêng lẻ, đảo ngược thứ tự các byte, chèn hoặc xóa các byte hoặc thay thế các byte bằng các giá trị ngẫu nhiên.
    • DataElementDuplicateMutator: Nhân đôi các phần tử.
    • DataElementRemoveMutator: Xóa các phần tử.
    • DataElementSwapNearMutator: Hoán đổi các nút lân cận.
    • NumericalEdgeCaseMutator: Tạo một dãy số xung quanh các giá trị cực trị dựa trên kích thước của một phần tử số, bao gồm cả số âm. Với gợi ý NumericalString, nó cũng có thể được áp dụng cho các phần tử chuỗi.
    • NumericalSizeNearMutator: Tạo một dãy số xung quanh các giá trị cực trị dựa trên kích thước của một phần tử số, bao gồm cả số âm. Với gợi ý NumericalString, nó cũng có thể được áp dụng cho các phần tử chuỗi.
    • ValidValuesMutator: Biến đổi các phần tử bằng cách nhân tất cả các giá trị bằng một danh sách các giá trị được cung cấp, được phân tách bằng dấu chấm phẩy.
  20. ☐ Một số gợi ý cho phép chuyển thông tin cấu hình cho từng phần tử bằng cách thêm các thuộc tính bổ sung vào XML. Một ví dụ về điều này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image50.png)
  21. ☐ Hầu như tất cả các bộ biến đổi đều hoạt động theo mặc định cho mọi phần tử, trừ khi nó bị vô hiệu hóa rõ ràng bằng cách đặt thuộc tính mutable của phần tử thành false. Một ví dụ về điều này được hiển thị trong ảnh chụp màn hình sau.
    ![alt text](image51.png)
  22. ☐ Chúng ta phải lưu ý rằng mặc dù đã đặt thuộc tính mutable của một phần tử thành false, Peach vẫn có thể biến đổi nó nếu một nút con khác có thuộc tính _mutable* được đặt thành true. Hành vi mặc định của Peach là làm cho tất cả các phần tử trong mô hình dữ liệu của chúng ta có thể biến đổi được. Đây là lý do tại sao tất cả các bộ biến đổi đều khả dụng. Chúng ta lưu ý rằng fuzzer này có thể dễ dàng tạo ra hàng trăm hoặc thậm chí hàng triệu lần lặp khi fuzzing của chúng ta tiếp tục. Như đã đề cập ở phần đầu, khái niệm về fuzzing là tạo ra nhiều lần lặp.
  23. ☐ Như bạn đã thấy, Peach là một công cụ fuzzing rất mạnh. Do đó, bây giờ chúng ta sẽ đề cập đến khái niệm về fuzzing thế hệ. Đối với điều này, chúng ta sẽ sử dụng vulnserver, một ứng dụng nhỏ được Stephen Bradshaw tạo ra và thường được sử dụng để kiểm tra và được đặt tại Desktop.
  24. ☐ Không có 27
    ![alt text](image52.png)
  25. ☐ Để chạy máy, nhấn shift + nhấp chuột phải vào thư mục Peach và nhấp vào Mở cửa sổ lệnh tại đây từ menu ngữ cảnh như được hiển thị trong ảnh chụp màn hình.
    ![alt text](image53.png)
  26. ☐ Trong terminal, hãy nhập vulnserver.exe và nhấn Enter.
    ![alt text](image54.png)
  27. ☐ Để xác minh rằng chương trình đang chạy và đã mở một cổng, hãy mở một terminal khác và nhập netstat -abno | findstr 9999 và nhấn Enter. Ở đây, bạn cần ghi lại PID của quy trình, là 1672. Điều này sẽ khác trong trường hợp của bạn.
    ![alt text](image55.png)
  28. ☐ Để xác minh rằng PID này là PID đã mở cổng, hãy nhập tasklist /svc | findstr <PID> và nhấn Enter.
    ![alt text](image56.png)
  29. ☐ Bây giờ chúng ta biết rằng mã đang chạy và máy chủ đang lắng nghe trên cổng 9999, đã đến lúc kết nối với nó và xác minh rằng chúng ta có thể truy cập máy chủ. Trong terminal, hãy nhập Desktop\netcat và nhấn Enter.
    ![alt text](image57.png)
  30. ☐ Bây giờ, hãy nhập localhost 9999 và nhấn Enter. Ngay sau khi kết nối với máy chủ, hãy nhập HELP và nhấn Enter.
    ![alt text](image58.png)
  31. ☐ Mở File Explorer và điều hướng đến ổ C:. Bây giờ, nhấn shift + nhấp chuột phải vào thư mục Peach và nhấp vào Mở cửa sổ lệnh tại đây từ menu ngữ cảnh. Trong terminal, hãy nhập peach -t tr.xml và nhấn Enter. Để cửa sổ đang chạy.
    ![alt text](image59.png)
  32. ☐ Chuyển sang terminal Peach khác, hãy nhập peach fuzz\TRUNC.xml TestRUN và nhấn Enter.
    ![alt text](image60.png)
  33. ☐ Để biết điều gì đang xảy ra, trong một dòng lệnh khác, hãy nhập netstat -an | findstr 9999 và nhấn Enter.
    ![alt text](image61.png)
    ![alt text](image62.png)
  34. ☐ Bạn có thể thấy các cảnh báo, hoặc máy chủ dễ bị tấn công có thể bị lỗi và bạn cần khởi động lại thử nghiệm. Tùy thuộc vào mức độ may mắn (hoặc không may mắn) của bạn, bạn có thể phải tạo nhiều trường hợp thử nghiệm, thậm chí hàng nghìn hoặc hàng triệu, để tạo ra lỗi có thể gỡ lỗi được. Chìa khóa là quá trình xem lại thư mục Logs.
  35. ☐ Không có 38
    ![alt text](image63.png)
  36. ☐ Đóng tất cả các cửa sổ đã được mở. Các mục tiêu bài tập đã đạt được.

Bình luận về bài viết này

Thịnh hành