Mask
VIP Members
-
03/07/2013
-
33
-
25 bài viết
Reflected File Download
I. Tổng quan
Reflected File Download (RFD) được nhà nghiên cứu bảo mật Oren Harif phát hiện và trình bày tại hội thảo Black Hat Châu Âu vào tháng 10/2014. Đây là một lỗ hổng Web cho phép kẻ tấn công giành quyền kiểm soát hoàn toàn máy tính của nạn nhân. Nó lừa người dùng tin rằng các tập tin được tải về từ một tên miền thực sự tin cậy như google.com, bing.com… Nhưng trên thực tế, các tập tin được tải về mà không hề được lưu trữ trên google.com hay bing.com. Khi người dùng thực thi file này, máy tính của người sử dụng sẽ bị tấn công cũng như bị đánh cắp dữ liệu.
1.1. Các bước khai thác
Giống như nhiều cuộc tấn công web khác, RFD bắt đầu bằng cách gửi một liên kết độc hại cho nạn nhân.
- Bước 1: Người sử dụng click vào link độc hại request tới một trang Web tin cậy.
- Bước 2: Tập tin thực thi được download và lưu trên máy người sử dụng. Tất cả các thông tin cho thấy các tập tin này được lưu trữ trên trang Web tin cậy.
- Bước 3: Người sử dụng thực thi tập tin được tải về. Tập tin này chứa các lệnh shell cho phép đánh cắp dữ liệu và kiểm soát hoàn toàn máy tính của nạn nhân.
1.2. Mức độ nguy hiểm
Thông qua lỗ hổng RFD, kẻ tấn công có thể:
- Chiếm quyền điều khiển hoàn toàn máy tính của người sử dụng: đánh cắp dữ liệu và thực hiện các hành động bằng việc thực thi các lệnh shell. Các lệnh này có thể cài đặt nhiều loại phần mềm độc hại cũng như kiểm soát hoàn toàn máy tính nạn nhân.
- Chiếm quyền điều khiển hoàn toàn trình duyệt: bằng cách thực thi các lệnh của hệ điều hành, kẻ tấn công có thể vô hiệu hóa bảo mật trình duyệt, đánh cắp tất cả các thông tin như cookie và mật khẩu được lưu trữ, truy cập tới một trang web bất kỳ và mạo danh người sử dụng.
- Khai thác lỗ hổng trên các phần mềm được cài đặt: kẻ tấn công có thể tấn công vào một phần mềm được cài đặt bằng cách tải về các tập tin để phục vụ khai thác phần mềm đó.
1.3. Điều kiện khai thác RFD
Để có thể khai thác lỗ hổng RFD cần ba điều kiện sau:
- Reflected: dữ liệu đầu vào được trả về trong nội dung response.
- Filename: kẻ tấn công có thể sửa đổi được tên file và phần mở rộng của file tới một phần mở rộng có khả năng thực thi.
- Download: nội dung response được download và nằm trong một file, file này được tạo bởi các trình duyệt web.
Ngày nay, JSON được sử dụng phổ biến. RFD không phải là vấn đề riêng của JSON, tuy nhiên, bản chất của các JSON API phù hợp với các điều kiện trên.
II. Khai thác RFD
2.1. Ngắt chuỗi để chèn lệnh thực thi
Chuỗi JSON thường kết thúc bởi dấu nháy kép (“) vì vậy ta có thể sử dụng dấu nháy kép để ngắt chuỗi và chèn các lệnh thực thi như hình trên.
2.2. Kỹ thuật chèn cách lệnh thực thi
- & - ngăn cách lệnh – thực hiện cả 2 hay nhiều lệnh. Ví dụ: {"a":"rfd"&calc&","b":"b"}
- && - điều kiện AND – thực hiện lệnh tiếp theo khi thực hiện thành công lệnh đầu tiên. Ví dụ: {"a":"rfd"&calc&&mspaint&&","b":"b"}
- | - Đầu ra của lệnh phía trước là đầu vào của lệnh tiếp theo – tiếp tục thực hiện khi lệnh phía trước thành công. Ví dụ: {"a":"rfd"&calc| notepad=","b":"b"}
- || - điều kiện OR – Thực hiện lệnh tiếp theo chỉ khi lệnh đầu tiên thất bại. Ví dụ: {"a":"rfd"||calc|| ","b":"b"}
- [0x0a] – ngăn cách giữa cách lệnh. Ví dụ: {"a":"rfd[0x0a]calc[0x0a]","b":"b"}
- …
2.3. Kiểm soát tên tập tin
Trường Content-Disposition trong HTTP headers trả về cho phép xác định tên tập tin mặc định khi nội dung trả về được lưu vào một file. Tuy nhiên nếu tên tập tin mặc định không được thiết lập trong trường này thì trình duyệt sẽ xác định tên tập tin thông qua URL, người sử dụng có thể thay đổi URL để tạo ra tên tập tin với các phần mở rộng như .bat, .cmd… theo ý muốn.
Đặc điểm của URI cho phép chúng ta gửi các tham số trong phần đường dẫn của URI bằng cách chèn thêm dấu chấm phẩy ( vào ngay sau phần path và trước dấu hỏi phần query. Ta có thể thêm bất kỳ nội dung gì vào phần này khi thực hiện truy vấn vì máy chủ web sẽ bỏ qua. Tuy nhiên nó lại rất có ý nghĩa trong việc xác định tên tập tin theo ý muốn.
- Internet Explorer và Firefox:
Phân tích tên tập tin từ https://example.com/api;/setup.bat, kết quả trả về tập tin “setup.bat”.
- Chrome và Opera:
Phân tích tên tập tin từ https://example.com/api;/setup.bat, kết quả trả về kết quả trong “api”. Mọi thứ sau dấu chấm phẩy cuối cùng sẽ bị bỏ qua.
Phân tích tên tập tin từ https://example.com/api;/setup.bat;ignored, kết quả trả về trong tập tin “setup.bat”.
- Tất cả các trình duyệt trừ Safari:
Phân tích tên tập tin từ https://example.com/api;/setup.bat;/setup.bat, kết quả trả về tập tin “setup.bat”
Các phần mở rộng phù hợp cho RFD:
- Windows Batch Scripts: .bat, .cmd
- Windows Script Host: .js, .vbs, .wsh, .vbe, .wsf, .hta
- Non-Default Scripting Engines: .pl…
2.4. Tạo sự kiện download
Làm thế nào để nội dung responses được trả về trong một download?
2.4.1. Content-Type và download
Dưới đây là cách xử lý khách nhau giữa các trình duyệt với trường Content-Type trong http headers.
Màu đỏ là Response được download như một file
Màu đỏ với phần mở rộng ở giữa (vd: .js) là Response được download như một file với phần mở rộng định trước (.js)
2.4.2. Trường Content-Disposition
Trường Content-Disposition trong htttp headers sẽ cho trình duyệt biết việc lưu response thành một file.
Bảng tóm tắt về việc xử lý của các trình duyệt khi trường Content-Disposition được thiết lập là “Content-Disposition: attachment”
2.4.3. Sử dụng thẻ
Trong trường hợp trường “Content-Dispostion” không xuất hiện trong header. Kẻ tấn công có thể sử dụng thẻ để đưa response tới một download.
Việc khai thác sẽ giống như thế này:
Các xử lý của các trình duyệt với thẻ :
2.5. Demo
- Video demo:
o Đánh cắp cookie và emails từ Gmail: https://www.youtube.com/watch?v=V9YYAiMZY9k
o Thực thi lệnh hệ thống: https://www.youtube.com/watch?v=XaTjst9pwq4
- Demo kịch bản chạy calculator trên máy tính nạn nhân:
Kẻ tấn công lừa nạn nhân click vào link http://www.google.com/s;/ChromeSetup.bat;/ChromeSetup.bat?gs_ri=psy-ab&q=%22||calc.exe||
GET request
Response Headers
Google đã fix lỗi này bằng cách thêm vào trường Content-Disposition với tên file mặc định là f.txt
Nội dung file được tải về
Thay đổi f.txt -> f.bat và thực thi
III. Giảm thiểu và phòng chống
Có thể giảm thiểu nguy cơ từ RFD bằng các cách dưới đây:
- Kiểm soát chặt chẽ URI
- Không sử dụng escape bằng “”, nên sử dụng biện pháp encode với các ký tự đặc biệt.
- Thêm tên tập tin mặc định trong trường Content-Disposition trong HTTP headers trả về. Content-Disposition: attachment; filename=1.txt
- Chặn truy cập trực tiếp tới API.
- Xóa các tham số tồn tại giữa phần Path và phần Query trong URI
- Thêm trường X-Content-Type-Options trong HTTP headers trả về như sau: X-Content-Type-Options: nosniff
Reflected File Download (RFD) được nhà nghiên cứu bảo mật Oren Harif phát hiện và trình bày tại hội thảo Black Hat Châu Âu vào tháng 10/2014. Đây là một lỗ hổng Web cho phép kẻ tấn công giành quyền kiểm soát hoàn toàn máy tính của nạn nhân. Nó lừa người dùng tin rằng các tập tin được tải về từ một tên miền thực sự tin cậy như google.com, bing.com… Nhưng trên thực tế, các tập tin được tải về mà không hề được lưu trữ trên google.com hay bing.com. Khi người dùng thực thi file này, máy tính của người sử dụng sẽ bị tấn công cũng như bị đánh cắp dữ liệu.
1.1. Các bước khai thác
Giống như nhiều cuộc tấn công web khác, RFD bắt đầu bằng cách gửi một liên kết độc hại cho nạn nhân.
- Bước 1: Người sử dụng click vào link độc hại request tới một trang Web tin cậy.
- Bước 2: Tập tin thực thi được download và lưu trên máy người sử dụng. Tất cả các thông tin cho thấy các tập tin này được lưu trữ trên trang Web tin cậy.
- Bước 3: Người sử dụng thực thi tập tin được tải về. Tập tin này chứa các lệnh shell cho phép đánh cắp dữ liệu và kiểm soát hoàn toàn máy tính của nạn nhân.
1.2. Mức độ nguy hiểm
Thông qua lỗ hổng RFD, kẻ tấn công có thể:
- Chiếm quyền điều khiển hoàn toàn máy tính của người sử dụng: đánh cắp dữ liệu và thực hiện các hành động bằng việc thực thi các lệnh shell. Các lệnh này có thể cài đặt nhiều loại phần mềm độc hại cũng như kiểm soát hoàn toàn máy tính nạn nhân.
- Chiếm quyền điều khiển hoàn toàn trình duyệt: bằng cách thực thi các lệnh của hệ điều hành, kẻ tấn công có thể vô hiệu hóa bảo mật trình duyệt, đánh cắp tất cả các thông tin như cookie và mật khẩu được lưu trữ, truy cập tới một trang web bất kỳ và mạo danh người sử dụng.
- Khai thác lỗ hổng trên các phần mềm được cài đặt: kẻ tấn công có thể tấn công vào một phần mềm được cài đặt bằng cách tải về các tập tin để phục vụ khai thác phần mềm đó.
1.3. Điều kiện khai thác RFD
Để có thể khai thác lỗ hổng RFD cần ba điều kiện sau:
- Reflected: dữ liệu đầu vào được trả về trong nội dung response.
- Filename: kẻ tấn công có thể sửa đổi được tên file và phần mở rộng của file tới một phần mở rộng có khả năng thực thi.
- Download: nội dung response được download và nằm trong một file, file này được tạo bởi các trình duyệt web.
II. Khai thác RFD
2.1. Ngắt chuỗi để chèn lệnh thực thi
2.2. Kỹ thuật chèn cách lệnh thực thi
- & - ngăn cách lệnh – thực hiện cả 2 hay nhiều lệnh. Ví dụ: {"a":"rfd"&calc&","b":"b"}
- && - điều kiện AND – thực hiện lệnh tiếp theo khi thực hiện thành công lệnh đầu tiên. Ví dụ: {"a":"rfd"&calc&&mspaint&&","b":"b"}
- | - Đầu ra của lệnh phía trước là đầu vào của lệnh tiếp theo – tiếp tục thực hiện khi lệnh phía trước thành công. Ví dụ: {"a":"rfd"&calc| notepad=","b":"b"}
- || - điều kiện OR – Thực hiện lệnh tiếp theo chỉ khi lệnh đầu tiên thất bại. Ví dụ: {"a":"rfd"||calc|| ","b":"b"}
- [0x0a] – ngăn cách giữa cách lệnh. Ví dụ: {"a":"rfd[0x0a]calc[0x0a]","b":"b"}
- …
2.3. Kiểm soát tên tập tin
Trường Content-Disposition trong HTTP headers trả về cho phép xác định tên tập tin mặc định khi nội dung trả về được lưu vào một file. Tuy nhiên nếu tên tập tin mặc định không được thiết lập trong trường này thì trình duyệt sẽ xác định tên tập tin thông qua URL, người sử dụng có thể thay đổi URL để tạo ra tên tập tin với các phần mở rộng như .bat, .cmd… theo ý muốn.
Đặc điểm của URI cho phép chúng ta gửi các tham số trong phần đường dẫn của URI bằng cách chèn thêm dấu chấm phẩy ( vào ngay sau phần path và trước dấu hỏi phần query. Ta có thể thêm bất kỳ nội dung gì vào phần này khi thực hiện truy vấn vì máy chủ web sẽ bỏ qua. Tuy nhiên nó lại rất có ý nghĩa trong việc xác định tên tập tin theo ý muốn.
- Internet Explorer và Firefox:
Phân tích tên tập tin từ https://example.com/api;/setup.bat, kết quả trả về tập tin “setup.bat”.
- Chrome và Opera:
Phân tích tên tập tin từ https://example.com/api;/setup.bat, kết quả trả về kết quả trong “api”. Mọi thứ sau dấu chấm phẩy cuối cùng sẽ bị bỏ qua.
Phân tích tên tập tin từ https://example.com/api;/setup.bat;ignored, kết quả trả về trong tập tin “setup.bat”.
- Tất cả các trình duyệt trừ Safari:
Phân tích tên tập tin từ https://example.com/api;/setup.bat;/setup.bat, kết quả trả về tập tin “setup.bat”
Các phần mở rộng phù hợp cho RFD:
- Windows Batch Scripts: .bat, .cmd
- Windows Script Host: .js, .vbs, .wsh, .vbe, .wsf, .hta
- Non-Default Scripting Engines: .pl…
2.4. Tạo sự kiện download
Làm thế nào để nội dung responses được trả về trong một download?
2.4.1. Content-Type và download
Dưới đây là cách xử lý khách nhau giữa các trình duyệt với trường Content-Type trong http headers.
Màu đỏ là Response được download như một file
Màu đỏ với phần mở rộng ở giữa (vd: .js) là Response được download như một file với phần mở rộng định trước (.js)
2.4.2. Trường Content-Disposition
Trường Content-Disposition trong htttp headers sẽ cho trình duyệt biết việc lưu response thành một file.
Bảng tóm tắt về việc xử lý của các trình duyệt khi trường Content-Disposition được thiết lập là “Content-Disposition: attachment”
2.4.3. Sử dụng thẻ
Trong trường hợp trường “Content-Dispostion” không xuất hiện trong header. Kẻ tấn công có thể sử dụng thẻ để đưa response tới một download.
Việc khai thác sẽ giống như thế này:
2.5. Demo
- Video demo:
o Đánh cắp cookie và emails từ Gmail: https://www.youtube.com/watch?v=V9YYAiMZY9k
o Thực thi lệnh hệ thống: https://www.youtube.com/watch?v=XaTjst9pwq4
- Demo kịch bản chạy calculator trên máy tính nạn nhân:
Kẻ tấn công lừa nạn nhân click vào link http://www.google.com/s;/ChromeSetup.bat;/ChromeSetup.bat?gs_ri=psy-ab&q=%22||calc.exe||
GET request
Response Headers
Google đã fix lỗi này bằng cách thêm vào trường Content-Disposition với tên file mặc định là f.txt
Nội dung file được tải về
Thay đổi f.txt -> f.bat và thực thi
III. Giảm thiểu và phòng chống
Có thể giảm thiểu nguy cơ từ RFD bằng các cách dưới đây:
- Kiểm soát chặt chẽ URI
- Không sử dụng escape bằng “”, nên sử dụng biện pháp encode với các ký tự đặc biệt.
- Thêm tên tập tin mặc định trong trường Content-Disposition trong HTTP headers trả về. Content-Disposition: attachment; filename=1.txt
- Chặn truy cập trực tiếp tới API.
- Xóa các tham số tồn tại giữa phần Path và phần Query trong URI
- Thêm trường X-Content-Type-Options trong HTTP headers trả về như sau: X-Content-Type-Options: nosniff