DANH SÁCH CÁC THUẬT NGỮ TIẾNG ANH VÀ VIẾT TẮT Từ viết tắt Thuật ngữ tiếng Anh/Giải thích Thuật ngữ tiếng Việt/Giải thích API Application Programming Interface Giao diện lập trình ứng
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN
Trang 2Mục lục
DANH SÁCH CÁC THUẬT NGỮ TIẾNG ANH VÀ VIẾT TẮT 5
DANH MỤC HÌNH ẢNH 7
DANH MỤC BẢNG BIỂU 7
LỜI MỞ ĐẦU 8
Chương 1 Giới thiệu chung 9
1.1 Giới thiệu về kiểm thử xâm nhập 9
1.1.1 Kiểm thử xâm nhập là gì 9
1.1.2 Các giai đoạn kiểm thử xâm nhập 9
1.1.3 Các phương pháp kiểm thử xâm nhập 11
1.1.4 Kiểm thử xâm nhập và tường lửa ứng dụng web 12
1.2 Giới thiệu về lỗ hổng directory traversal 13
1.2.1 Directory traversal là gì 13
1.2.2 Đọc các file tuỳ ý bằng directory traversal 13
1.2.3 Những trở ngại thường gặp khi khai thác lỗ hổng path traversal 14
1.2.4 Cách phòng chống tấn công directory traversal 15
1.3 Giới thiệu về Fuzzing 16
1.3.1 Ví dụ đơn giản 16
1.3.2 Lịch sử 17
1.3.3 Triển khai Fuzzer 17
1.3.4 So sánh với phân tích mật mã 17
1.3.5 Các kiểu tấn công 18
1.3.6 Fuzzing ứng dụng 18
Trang 31.3.7 Fuzzing giao thức 19
1.3.8 Fuzzing định dạng file 19
1.3.9 Ưu điểm của fuzzer 19
1.3.10 Hạn chế của fuzzer 19
1.3 Giới thiệu về DotDotPwn 20
1.4 Lịch sử hình thành 20
Chương 2 Hướng dẫn cài đặt và sử dụng 22
2.1 Cài đặt DotDotPwn 22
2.2 Sử dụng DotDotPwn 22
2.2.1 Khởi động và các tuỳ chọn 22
2.2.2 Chế độ HTTP 23
2.2.3 Chế độ HTTP URL 24
2.2.4 Chế độ FTP 24
2.2.5 Chế độ TFTP 25
2.2.6 Chế độ PAYLOAD 25
2.2.7 Chế độ STDOUT 25
Chương 3 Bài lab và kịch bản demo 26
3.1 Dùng DotDotPwn để tạo đường dẫn bằng chế độ stdout 26
3.1.1 Yêu cầu 26
3.1.2 Tiến hành 26
3.2 Dùng DotDotPwn để quét chế độ http-url 28
3.2.1 Yêu cầu 28
3.2.2 Tiến hành 28
Chương 4 So sánh, đánh giá 31
Trang 44.1 So sánh 31
4.2 Đánh giá 32
Kết luận 33
Tài liệu tham khảo 34
Trang 5DANH SÁCH CÁC THUẬT NGỮ TIẾNG ANH VÀ VIẾT TẮT
Từ
viết tắt Thuật ngữ tiếng Anh/Giải thích Thuật ngữ tiếng Việt/Giải thích
API Application Programming Interface Giao diện lập trình ứng dụng
CSRF Cross-site Request Forgery Kỹ thuật tấn công giả mạo chính chủ
thể của nó DNS Domain Name System Hệ thống phân giải tên miền
DoS Denial Of Service Hình thức tấn công từ chối dịch vụ ERP Enterprise Resource Planning Hoạch định nguồn lực doanh nghiệp FTP File Transfer Protocol Giao thức truyền tải tập tin
HTTP Hypertext Transfer Protocol Giao thức truyền tải siêu văn bản
HTTPS Hypertext Transfer Protocol Secure Giao thức truyền tải siêu văn bản
bảo mật
PCI DSS Payment Card Industry Data
Security Standard
Tiêu chuẩn an ninh thông tin bắt buộc dành cho các doanh nghiệp lưu trữ, truyền tải và xử lý thẻ thanh toán
REST Representational State Transfer
Kiến trúc sử dụng trong việc giao tiếp giữa máy khách và máy chủ web
RPC Remote Procedure Call Cuộc gọi thủ tục từ xa
SOC 2 System and Organization Controls 2
Bộ tiêu chí được phát triển bởi Viện
Kế toán Công chứng Hoa Kỳ (AICPA)
SQL Structured Query Language Ngôn ngữ truy vấn dữ liệu
Trang 6SSL Secure Sockets Layer
Tiêu chuẩn của công nghệ bảo mật, truyền thông mã hoá giữa máy chủ Web server và trình duyệt
SSRF Server Side Request Forgery Kỹ thuật tấn công yêu cầu giả mạo
từ phía máy chủ
TCP Transmission Control Protocol Giao thức điều khiển truyền vận
TFTP Trivial File Transfer Protocol Giao thức truyền tải tập tin tầm
thường UDP User Datagram Protocol Giao thức dữ liệu người dùng
URL Uniform Resource Locator Định vị tài nguyên thống nhất
WAF Web Application Firewall Tường lửa ứng dụng web
XSS Cross Site Scripting
Lỗi bảo mật cho phép người tấn công chèn các đoạn script nguy hiểm vào trong source code ứng dụng web
Trang 7DANH MỤC HÌNH ẢNH
Hình 1 Quy trình kiểm thử xâm nhập 9
Hình 2 Minh hoạ lỗ hổng Directory Traversal 13
Hình 4 Trang web bWAPP 26
Hình 5 Thực thi câu lệnh 27
Hình 6 Nội dung file passwd 28
Hình 7 DotDotPwn ngay lập tức tìm ra được lỗ hổng 29
Hình 8 File passwd 30
DANH MỤC BẢNG BIỂU Bảng 1 Lịch sử hình thành 21
Bảng 2 Danh sách tuỳ chọn 23
Bảng 3 So sánh DotDotPwn với một vài công cụ khác 32
Trang 8Để đảm bảo hệ thống hay trang web là an toàn, người ta đã tạo ra các kỹ thuật kiểm thử xâm nhập (Penetration Testing) Các kỹ thuật này dùng để phát hiện ra các lỗ hổng, rủi
ro hay mối đe doạ bảo mật mà các hacker có thể khai thác trong ứng dụng phần mềm, mạng hay ứng dụng web Mục đích của kiểm thử xâm nhập là xác định và kiểm tra tất cả lỗ hổng bảo mật có thể có trong phần mềm
Một trong số các công cụ dùng để kiểm thử xâm nhập là DotDotPwn, có khả năng tìm kiếm lỗ hổng Traversal Directory
Trang 9Chương 1 Giới thiệu chung
1.1 Giới thiệu về kiểm thử xâm nhập
1.1.1 Kiểm thử xâm nhập là gì
Kiểm thử xâm nhập (Penetration Testing hay Pentest) là một quá trình mô phỏng
các cuộc tấn công tới hệ thống máy tính để tìm lỗ hổng có thể khai thác được Trong bảo mật ứng dụng web, kiểm thử xâm nhập web thường được dùng để tăng cường bảo mật cho tường lửa ứng dụng web (Web Application Firewall, WAF)
Kiểm thử xâm nhập liên quan đến việc cố gắng xâm nhập các hệ thống ứng dụng (ví dụ như các giao diện lập trình ứng dụng (API), các server frontend/backend) để tìm ra
lỗ hổng bảo mật
Thông tin thu được sau khi kiểm thử có thể dùng để tinh chỉnh các chính sách bảo mật và vá các lỗ hổng
1.1.2 Các giai đoạn kiểm thử xâm nhập
Quy trình kiểm thử xâm nhập gồm 5 giai đoạn
Hình 1 Quy trình kiểm thử xâm nhập
Trang 10Giai đoạn 1: Lập kế hoạch và trinh sát
Giai đoạn 1 bao gồm:
• Xác định mục tiêu và phạm vi của thử nghiệm, bao gồm hệ thống đích và các phương pháp sẽ được sử dụng
• Thu thập thông tin (ví dụ như mạng và tên miền, mail server) để hiểu rõ cách thức hoạt động của đối tượng và các lỗ hổng tiềm ẩn của nó
Giai đoạn 2: Rà quét
Giai đoạn tiếp theo để hiểu cách ứng dụng sẽ phản hồi lại với các hành động xâm nhập khác nhau Việc này thường làm bằng cách:
• Phân tích tĩnh: Kiểm tra code của ứng dụng để ước tính cách thức hoạt động của nó Các công cụ có thể quét toàn bộ code trong 1 lần chạy
• Phân tích động: Kiểm tra code của ứng dụng khi nó đang chạy Đây là cách quét thực tế hơn, vì nó cung cấp cái nhìn thực tế về hiệu suất của ứng dụng
Giai đoạn 3: Có được quyền truy cập
Giai đoạn này sử dụng các kỹ thuật tấn công ứng dụng web, ví dụ như cross-site scripting, SQL injection hay backdoor, để tìm ra lỗ hổng bảo mật của mục tiêu Sau đó người kiểm tra sẽ thử khai thác các lỗ hổng đó, thường bằng cách leo thang đặc quyền, đánh cắp dữ liệu, chặn lưu lượng truy cập, v.v., để hiểu được những thiệt hại có thể gây ra
Giai đoạn 4: Duy trì quyền truy cập
Mục tiêu của giai đoạn này là để xem liệu lỗ hổng có thể được sử dụng để khai thác lâu dài trong hệ thống hay không – đủ lâu để kẻ tấn công có thể truy cập sâu hơn Ý tưởng
là bắt chước các mối đe doạ nâng cao, thường tồn tại trong hệ thống hàng tháng để đánh cắp các dữ liệu nhạy cảm của tổ chức
Giai đoạn 5: Phân tích
Trang 11Kết quả của quá trình kiểm thử xâm nhập sẽ được tổng hợp thành một báo cáo chi tiết:
• Các lỗ hổng cụ thể đã được khai thác
• Các thông tin nhạy cảm bị truy cập
• Thời gian người kiểm tra tồn tại trong hệ thống mà không bị phát hiện
Những thông tin này sẽ được nhân viên bảo mật phân tích để giúp cấu hình WAF của doanh nghiệp và các ứng dụng khác, giúp vá lỗ hổng và chống các cuộc tấn công trong tương lai
1.1.3 Các phương pháp kiểm thử xâm nhập
a Kiểm tra bên ngoài
Các bài kiểm tra xâm nhập bên ngoài nhắm vào các tài sản của một công ty trên internet, ví dụ như ứng dụng web, trang web của công ty, email và DNS server Mục đích
là có được quyền truy cập và trích xuất dữ liệu có giá trị
b Kiểm tra nội bộ
Trong kiểm tra nội bộ, người kiểm tra có quyền truy cập vào một ứng dụng đằng sau tường lửa sẽ mô phỏng một cuộc tấn công của một kẻ nội gián Điều này không nhất thiết là phải mô phỏng một nhân viên có ý đồ xấu Một tình huống phổ biến là một nhân viên bị đánh cắp thông tin do cuộc tấn công lừa đảo
c Kiểm tra không thông tin
Trong kiểm tra không thông tin, người kiểm tra chỉ được cung cấp tên của doanh nghiệp mục tiêu Điều này giúp nhân viên bảo mật có một cái nhìn thực tế về cách một cuộc tấn công sẽ diễn ra
d Kiểm tra không thông tin song phương
Trang 12Trong kiểm tra không thông tin song phương, nhân viên bảo mật sẽ không được biết trước về cuộc tấn công giả Giống như trong thực tế, họ sẽ không có thời gian để tăng cường bảo mật trước khi một cuộc tấn công diễn ra
e Kiểm tra có chủ đích
Trong tình huống này, cả 2 bên người kiểm tra và nhân viên bảo vệ sẽ làm việc với nhau và đánh giá hành động của nhau Đây là bài huấn luyện có giá trị, cung cấp cho nhóm bảo mật thông tin phản hồi thực tế theo quan điểm của một kẻ tấn công
1.1.4 Kiểm thử xâm nhập và tường lửa ứng dụng web
Kiểm thử xâm nhập và WAF là các biện pháp bảo mật khác nhau nhưng có chung lợi ích
Đa số trong các phương pháp kiểm thử xâm nhập, người kiểm tra thường dùng dữ liệu của WAF (như log) để xác định và khai thác lỗ hổng của ứng dụng
Đổi lại, người quản trị WAF có thể hưởng lợi từ kiểm thử xâm nhập Sau khi kiểm tra xong, có thể cấu hình lại WAF để chống lại các điểm yếu đã được phát hiện
Cuối cùng, kiểm thử xâm nhập cũng thoả mãn một số quy trình kiểm tra bảo mật, trong đó có PCI DSS và SOC 2 Một vài tiêu chuẩn như PCI-DSS 6.6 chỉ có thể được đáp ứng thông qua việc sử dụng WAF được chứng nhận Tuy nhiên việc này cũng không khiến kiểm thử xâm nhập kém hữu ích hơn do những lợi ích và khả năng cải thiện WAF như đã nói ở trên [1]
Trang 131.2 Giới thiệu về lỗ hổng directory traversal
Hình 2 Minh hoạ lỗ hổng Directory Traversal
1.2.1 Directory traversal là gì
Directory traversal (hay còn được biết đến là path traversal) là một lỗ hổng bảo mật web cho phép kẻ tấn công đọc file bất kỳ trên server chạy ứng dụng đó Nó có thể là code ứng dụng và dữ liệu, thông tin xác thực cho hệ thống back-end, các file nhạy cảm của hệ điều hành Trong một vài trường hợp, kẻ tấn công cũng có thể ghi lên file bất kỳ, cho phép
họ chỉnh sửa ứng dụng hoặc hành vi, và cuối cùng chiếm toàn bộ quyền điều khiển server
1.2.2 Đọc các file tuỳ ý bằng directory traversal
Giả sử một ứng dụng mua sắm hiện các hình ảnh hàng hoá Hình ảnh được gọi qua HTML như sau:
<img src="/loadImage?filename=218.png">
URL loadImage nhận một tham số filename và trả về nội dung của file đó File hình ảnh được lưu trên ổ cứng ở địa chỉ /var/www/images Để trả về hình ảnh, ứng dụng đưa
Trang 14phần tên file được yêu cầu về thư mục gốc và dùng API của hệ thống file để đọc nội dung của file Trong trường hợp trên, ứng dụng đọc theo đường dẫn sau:
1.2.3 Những trở ngại thường gặp khi khai thác lỗ hổng path traversal
Nhiều ứng dụng đặt input của người dùng vào đường dẫn thực hiện một vài kiểu phòng thủ để chống lại tấn công path traversal, và chúng thường có thể bị bỏ qua
Nếu một ứng dụng tách hoặc chặn các chuỗi directory traversal từ tên file do người dùng cung cấp, thì có thể bỏ qua sự bảo vệ bằng nhiều kỹ thuật khác nhau
Trang 15Chúng ta có thể sử dụng đường dẫn tuyệt đối từ thư mục gốc của hệ thống, chẳng
hạn như filename=/etc/passwd, để trực tiếp tham chiếu file mà không cần dùng bất cứ chuỗi
truyền tải nào
Chúng ta cũng có thể dùng các chuỗi lồng nhau như ….// hay ….\/, mà sẽ trở về
thành các chuỗi thông thường khi phần chuỗi bên trong bị loại bỏ
Trong một số ngữ cảnh, ví dụ như đường dẫn URL hoặc tham số filename của một yêu cầu multipart/form-data, web server sẽ loại bỏ bất kỳ chuỗi duyệt thư mục trước khi
đưa input đến ứng dụng Chúng ta đôi khi có thể bỏ qua bước lọc này bằng cách mã hoá
URL, hoặc thậm chí mã hoá URL hai lần, chuỗi ký tự / trở thành %2e%2e%2f hoặc
%252e%252e%252f Các mã hoá không chuẩn khác, chẳng hạn như %c0%af hay %ef%bc%8f cũng có thể làm được điều này
Nếu một ứng dụng yêu cầu tên file do người dùng cấp phải bắt đầu tại thư mục ban
đầu, ví dụ như /var/www/images, thì ta có thể bao gồm cả phần thư mục được yêu cầu, theo
sau đó là chuỗi duyệt thư mục phù hợp Ví dụ:
filename=/var/www/images/ / / /etc/passwd
Nếu một ứng dụng yêu cầu tên file do người dung cung cấp phải kết thúc bằng một
đuôi mở rộng nào đó, ví dụ như png, thì ta có thể dùng null byte để loại bỏ phần đuôi mở
rộng bắt buộc Ví dụ:
filename= / / /etc/passwd%00.png
1.2.4 Cách phòng chống tấn công directory traversal
Cách hiệu quả nhất để phòng tránh lỗ hổng file path traversal đó là tránh đưa các input của người dùng vào API của hệ thống file Nhiều ứng dụng có chức năng này có thể được viết lại để mang lại hành vi tương đương nhưng an toàn hơn
Nếu như không thể tránh không đưa input của người dùng vào API của hệ thống file, thì 2 lớp bảo mật nên được dùng với nhau để tránh các cuộc tấn công:
• Ứng dụng nên xác nhận input của người dùng trước khi thực hiện nó Lý tưởng nhất là nên xác nhận bằng cách đối chiếu với một danh sách các giá trị
Trang 16được cho phép Nếu như chức năng này không thể thực hiện được, thì phần xác nhận nên xác thực được rằng input chỉ chứa những nội dung được cho phép, ví dụ như chỉ thuần ký tự chữ số
• Sau khi xác thực input được cấp, ứng dụng nên thêm phần input vào thư mục ban đầu và dùng API của hệ thống file và chuẩn hoá đường dẫn Cần phải xác thực được đường dẫn được chuẩn hoá xuất phát từ thư mục ban đầu như
1.3 Giới thiệu về Fuzzing
Fuzz testing hay Fuzzing là một kỹ thuật kiểm thử phần mềm hộp đen, về cơ bản bao gồm việc tìm ra các lỗi triển khai bằng cách chèn dữ liệu sai định dạng theo cách tự động
Fuzzing là nghệ thuật tìm lỗi tự động, và vai trò của nó là tìm lỗi lập trình phần
Trang 171.3.2 Lịch sử
Fuzz testing được phát triển tại Đại học Wisconsin Madison vào năm 1989 bởi Giáo
sư Barton Miller và sinh viên Công trình của họ có thể xem được tại
rằng các hệ điều hành hiện nay có thể bị tấn công bởi fuzzing đơn giản
1.3.3 Triển khai Fuzzer
Một fuzzer là một chương trình chèn tự động các dữ liệu bán ngẫu nhiên vào một chương trình/hệ thống khác và phát hiện lỗi
Phần sinh dữ liệu bao gồm các bộ sinh dữ liệu, và phát hiện lỗ hổng dựa vào các công cụ sửa chữa lỗi Bộ sinh dữ liệu thường sử dụng kết hợp các giá trị fuzzing tĩnh (các giá trị được biết là nguy hiểm), hoặc dữ liệu hoàn toàn ngẫu nhiên Các fuzzer thế hệ mới
sử dụng thuật toán di truyền để nối dữ liệu được chèn và quan sát kết quả Những công cụ như vậy chưa được công khai
1.3.4 So sánh với phân tích mật mã
Số lượng các giải pháp có thể thử là không gian các giải pháp có thể khám phá Mục đích của phân tích mật mã là giảm không gian này, có nghĩa là tìm ra cách có ít khoá để thử hơn là bruteforce thuần tuý để giải mã thứ gì đó
Trang 18được cấu trúc như GET (hoặc có thể crash luôn) Sẽ có thể tốn ít thời gian hơn nếu bắt đầu chuỗi với “GET”, và fuzz phần còn lại, nhưng hạn chế là sẽ
bỏ qua tất cả các kiểm tra với từ đầu tiên
Về vấn đề này, fuzzer thường cố gắng giảm số lượng các kiểm tra vô dụng, ví dụ như là các giá trị mà chúng ta đã biết rằng sẽ có ít khả năng hoạt động Chúng ta giảm tính không thể đoán trước và có lợi hơn về tốc độ
1.3.5 Các kiểu tấn công
Một fuzzer sẽ thử tấn công kết hợp theo kiểu:
• number (signed/unsigned integers/float…)
• chars (url, input dòng lệnh)
• metadata: văn bản do người dùng nhập (id3 tag)
• chuỗi nhị phân thuần tuý
Một cách tiếp cận chung tới fuzzing đó là định nghĩa các danh sách “giá trị nguy hiểm” (fuzz vector) cho mỗi loại, và chèn chúng hoặc tái hợp
• đối với số nguyên: số không, số âm hoặc số cực lớn
• đối với chữ cái: các ký tự/chỉ dẫn có thể giải thích được
• đối với nhị phân: ngẫu nhiên