Kỹ thuật tấn công Rosetta Flash
Giới thiệu
Rosetta Flash là 1 trong những kĩ thuật tấn công Web hay nhất năm 2014. Xếp thứ 4 trong Top 10 Web Attack Techniques of 2014 theo đánh giá của nhóm Whitehat Sec, chỉ xếp sau Heartbleed, Shellshock và Poodle.
Kỹ thuật Rosetta Flash được phát triển bởi Michel Spagnoulo, 1 chuyên gia an toàn thông tin của Google. Trong một bài viết gần đây, tôi đã đề cập đến SOP, chính sách này ngăn cản việc lấy thông tin từ một domain khác. Rosetta Flash cho phép tạo ra một file Flash chứa mã thực thi nguy hiểm, lợi dụng JSONP để bypass SOP và thực hiện 1 cuộc tấn công CSRF đến trang web có lỗ hổng. Rosseta Flash ảnh hưởng đến nhiều trang Web lớn như Youtube, Yahoo, Twitter, Instagram, eBay và cả Google. Facebook và Github may mắn nằm ngoài danh sách này.
Điều kiện để thực hiện thành công là máy tính nạn nhân phải cài đặt Flash player phiên bản dưới 11.2.202.394 đối với Linux và dưới 14.0.0.145 đối với Windows, OS X.
Michel Spagnoulo cũng phát triển 1 tool có tên là Rosetta Flash để thực hiện kỹ thuật này.
Một số kiến thức liên quan
1. JSONP
Mặc dù SOP sinh ra để đảm bảo an toàn cho ứng dụng web tuy nhiên chính sách này cũng có những hạn chế. Đối với các hệ thống lớn, như Google, luôn có nhiều domain khác nhau và đôi khi cần trao đổi thông tin giữa các domain. SOP mặc định sẽ gây khó dễ cho điều này. Và để “lách luật”, chúng ta có một cách là sử dụng JSONP.
JSONP thực chất là 1 kĩ thuật lấy dữ liệu JSON bằng cách gắn nhãn (padding) cho chuỗi JSON được trả về từ JSONP endpoint bằng 1 hàm callback. Hàm callback được định nghĩa trên JSONP client và sẽ thao tác với chuỗi JSON này.
VD 1 cách triển khai JSONP đơn giản:
JSONP endpoint: jsonp_example.com/json.php
Trên JSONP client: jsonp_client.com
Dữ liệu trả về:[CODE=php] JsonpHandle({“1”:“This”, “2”:“is”, “3”:“JSONP”, “4”:“example”})[/CODE]
Đoạn string này nằm trong thẻ script, trình duyệt sẽ hiểu nó là mã Javascript và thực thi hàm JsonpHandle.
Để tăng khả năng an ninh, các trang web lớn có hạn chế đối với hàm callback. Theo đó, tên hàm callback chỉ bao gồm các kí tự [a-zA-z0-9_\.] (VD: Google). Mục đích của việc này là chặn việc thực thi code Javascript 1 cách tùy ý.
2. Flash policy
Flash từ lâu đã được coi là một ứng dụng có tính bảo mật không cao. Đơn cử là việc Apple không hỗ trợ Flash trên một số thiết bị của họ như iPhone, iPad.
Flash có một chính sách tuân thủ SOP, quy định việc một ứng dụng Flash nằm trên domain A không được gửi request đến domain B, trừ khi domain B có chứa file crossdomain.xml với cấu hình phù hợp. Việc cho phép gửi request hay không được thực hiện bởi Flash player.
Kỹ thuật Rosetta Flash
1. Kịch bản tấn công
Trong 1 cuộc tấn công Rosetta Flash, hacker sẽ lừa nạn nhân click vào 1 website được điều khiển bởi hacker, trang này có chứa 1 đoạn mã Flash độc hại có khả năng bypass Flash policy và gửi request tùy ý đến website bị lỗi với session của nạn nhân, sau đó có thể chuyển dữ liệu nhạy cảm về một website do hacker kiểm soát. Như vậy đây là 1 cuộc tấn công CSRF.
Trên domain vuln.com có chứa 2 site:
· jsonp.php: JSONP endpoint
· secret.php: trang cá nhân của người dùng mà hacker muốn lấy dữ liệu
Cụ thể, hacker sẽ:
· Gửi 1 request đến JSONP endpoint, với hàm callback là đoạn code Flash do hacker tạo sẵn. Dữ liệu trả về cho trình duyệt có dạng:()
· Đoạn dữ liệu này sẽ được trình duyệt sẽ hiểu là 1 file Flash và được chuyển cho Flash player để thực thi.
· Flash Player của nạn nhân hiểu code Flash được lấy về từ domain vuln.com và gửi request cũng đến domain vuln.com, nó sẽ không check crossdomain.xml trên vuln.com và cho phép gửi request.
Flash Player nhận dữ liệu trả về từ vuln.com/secret.php, POST dữ liệu này về trang attacker.com/log.php. Ở domain attacker.com, hacker sẽ cấu hình crossdomain.xml để Flash player của nạn nhân cho phép gửi request đến.
Sau khi thực hiện request đến website bị dính lỗ hổng với session của nạn nhân, hacker có thể:
Lấy được nội dung trang web đó với quyền truy cập của nạn nhân.
· Thực hiện những hành vi không mong muốn như chuyển tiền, đổi mật khẩu …
2. Chi tiết kỹ thuật
Như đã nêu trên, các website có tính bảo mật cao sẽ giới hạn kí tự trong tên hàm callback truyền cho JSONP endpoint. Thông thường tên hàm callback sẽ chỉ được chứa những kí tự [a-zA-Z0-9_\.]. Vì vậy ta cần tạo ra 1 file Flash hợp lệ chỉ chứa những kí tự này.
File Flash thường có 3 dạng:
· Uncompressed
· Zlib-compressed
· LZMA-compressed
Tương ứng với 3 định dạng: không nén, nén với zlib hoặc nén với LZMA. Ở đây ta sẽ tạo ra file Flash nén zlib từ file Flash không nén. Mục tiêu là chuyển tất cả các byte về các kí tự hợp lệ.
File Flash nén zlib có 4 trường:
- Signature: Luôn luôn là CWS => hợp lệ
- Version
- File length
- Zlib data
May mắn cho chúng ta là Flash Player sẽ bỏ qua những trường không hợp lệ. Vì thế ta có thể đặt cho những trường này các giá trị [a-zA-Z0-9] và file Flash vẫn sẽ được thực thi.
3. POC
Phần này chúng ta sẽ giả lập 1 cuộc tấn công Rosetta Flash. Ở đây vulnerable.com là domain bị dính lỗ hổng, attacker.com là domain do hacker kiểm soát.
Ta sẽ tạo ra một file Flash có nhiệm vụ “GET” đến vuln.com rồi “POST” tất cả nội dung về attacker.com. Dữ liệu này được lưu trong biến x
Sau khi compile code Actionscript trên ra một file Flash ở dạng không nén, dùng tool Rosetta Flash để tạo ra file Flash hợp lệ, ta gắn vào thẻ
Thẻ param dùng để đọc những biến đầu vào cho file Flash. Ở đây có 2 biến:
- url: Trang web chứa dữ liệu nhạy cảm cùng domain với trang JSONP endpoint.
- exfiltrate: Trang web do hacker kiểm soát, dùng để lưu dữ liệu nhảy cảm lấy từ url.
Hacker sẽ lừa nạn nhân click vào trang web có nội dung như trên và tất cả nội dung của vuln.com/secret.php với quyền truy cập của nạn nhân sẽ được chuyển đến attacker.com/log.php. Như vậy hacker đã lấy được dữ liệu nhạy cảm.
Rosetta Flash là 1 trong những kĩ thuật tấn công Web hay nhất năm 2014. Xếp thứ 4 trong Top 10 Web Attack Techniques of 2014 theo đánh giá của nhóm Whitehat Sec, chỉ xếp sau Heartbleed, Shellshock và Poodle.
Kỹ thuật Rosetta Flash được phát triển bởi Michel Spagnoulo, 1 chuyên gia an toàn thông tin của Google. Trong một bài viết gần đây, tôi đã đề cập đến SOP, chính sách này ngăn cản việc lấy thông tin từ một domain khác. Rosetta Flash cho phép tạo ra một file Flash chứa mã thực thi nguy hiểm, lợi dụng JSONP để bypass SOP và thực hiện 1 cuộc tấn công CSRF đến trang web có lỗ hổng. Rosseta Flash ảnh hưởng đến nhiều trang Web lớn như Youtube, Yahoo, Twitter, Instagram, eBay và cả Google. Facebook và Github may mắn nằm ngoài danh sách này.
Điều kiện để thực hiện thành công là máy tính nạn nhân phải cài đặt Flash player phiên bản dưới 11.2.202.394 đối với Linux và dưới 14.0.0.145 đối với Windows, OS X.
Michel Spagnoulo cũng phát triển 1 tool có tên là Rosetta Flash để thực hiện kỹ thuật này.
Một số kiến thức liên quan
1. JSONP
Mặc dù SOP sinh ra để đảm bảo an toàn cho ứng dụng web tuy nhiên chính sách này cũng có những hạn chế. Đối với các hệ thống lớn, như Google, luôn có nhiều domain khác nhau và đôi khi cần trao đổi thông tin giữa các domain. SOP mặc định sẽ gây khó dễ cho điều này. Và để “lách luật”, chúng ta có một cách là sử dụng JSONP.
JSONP thực chất là 1 kĩ thuật lấy dữ liệu JSON bằng cách gắn nhãn (padding) cho chuỗi JSON được trả về từ JSONP endpoint bằng 1 hàm callback. Hàm callback được định nghĩa trên JSONP client và sẽ thao tác với chuỗi JSON này.
VD 1 cách triển khai JSONP đơn giản:
JSONP endpoint: jsonp_example.com/json.php
Trên JSONP client: jsonp_client.com
Dữ liệu trả về:[CODE=php] JsonpHandle({“1”:“This”, “2”:“is”, “3”:“JSONP”, “4”:“example”})[/CODE]
Đoạn string này nằm trong thẻ script, trình duyệt sẽ hiểu nó là mã Javascript và thực thi hàm JsonpHandle.
Để tăng khả năng an ninh, các trang web lớn có hạn chế đối với hàm callback. Theo đó, tên hàm callback chỉ bao gồm các kí tự [a-zA-z0-9_\.] (VD: Google). Mục đích của việc này là chặn việc thực thi code Javascript 1 cách tùy ý.
2. Flash policy
Flash từ lâu đã được coi là một ứng dụng có tính bảo mật không cao. Đơn cử là việc Apple không hỗ trợ Flash trên một số thiết bị của họ như iPhone, iPad.
Flash có một chính sách tuân thủ SOP, quy định việc một ứng dụng Flash nằm trên domain A không được gửi request đến domain B, trừ khi domain B có chứa file crossdomain.xml với cấu hình phù hợp. Việc cho phép gửi request hay không được thực hiện bởi Flash player.
Kỹ thuật Rosetta Flash
1. Kịch bản tấn công
Trong 1 cuộc tấn công Rosetta Flash, hacker sẽ lừa nạn nhân click vào 1 website được điều khiển bởi hacker, trang này có chứa 1 đoạn mã Flash độc hại có khả năng bypass Flash policy và gửi request tùy ý đến website bị lỗi với session của nạn nhân, sau đó có thể chuyển dữ liệu nhạy cảm về một website do hacker kiểm soát. Như vậy đây là 1 cuộc tấn công CSRF.
Trên domain vuln.com có chứa 2 site:
· jsonp.php: JSONP endpoint
· secret.php: trang cá nhân của người dùng mà hacker muốn lấy dữ liệu
Cụ thể, hacker sẽ:
· Gửi 1 request đến JSONP endpoint, với hàm callback là đoạn code Flash do hacker tạo sẵn. Dữ liệu trả về cho trình duyệt có dạng:
· Đoạn dữ liệu này sẽ được trình duyệt sẽ hiểu là 1 file Flash và được chuyển cho Flash player để thực thi.
· Flash Player của nạn nhân hiểu code Flash được lấy về từ domain vuln.com và gửi request cũng đến domain vuln.com, nó sẽ không check crossdomain.xml trên vuln.com và cho phép gửi request.
Flash Player nhận dữ liệu trả về từ vuln.com/secret.php, POST dữ liệu này về trang attacker.com/log.php. Ở domain attacker.com, hacker sẽ cấu hình crossdomain.xml để Flash player của nạn nhân cho phép gửi request đến.
Sau khi thực hiện request đến website bị dính lỗ hổng với session của nạn nhân, hacker có thể:
Lấy được nội dung trang web đó với quyền truy cập của nạn nhân.
· Thực hiện những hành vi không mong muốn như chuyển tiền, đổi mật khẩu …
2. Chi tiết kỹ thuật
Như đã nêu trên, các website có tính bảo mật cao sẽ giới hạn kí tự trong tên hàm callback truyền cho JSONP endpoint. Thông thường tên hàm callback sẽ chỉ được chứa những kí tự [a-zA-Z0-9_\.]. Vì vậy ta cần tạo ra 1 file Flash hợp lệ chỉ chứa những kí tự này.
File Flash thường có 3 dạng:
· Uncompressed
· Zlib-compressed
· LZMA-compressed
Tương ứng với 3 định dạng: không nén, nén với zlib hoặc nén với LZMA. Ở đây ta sẽ tạo ra file Flash nén zlib từ file Flash không nén. Mục tiêu là chuyển tất cả các byte về các kí tự hợp lệ.
File Flash nén zlib có 4 trường:
- Signature: Luôn luôn là CWS => hợp lệ
- Version
- File length
- Zlib data
May mắn cho chúng ta là Flash Player sẽ bỏ qua những trường không hợp lệ. Vì thế ta có thể đặt cho những trường này các giá trị [a-zA-Z0-9] và file Flash vẫn sẽ được thực thi.
3. POC
Phần này chúng ta sẽ giả lập 1 cuộc tấn công Rosetta Flash. Ở đây vulnerable.com là domain bị dính lỗ hổng, attacker.com là domain do hacker kiểm soát.
Ta sẽ tạo ra một file Flash có nhiệm vụ “GET” đến vuln.com rồi “POST” tất cả nội dung về attacker.com. Dữ liệu này được lưu trong biến x
Sau khi compile code Actionscript trên ra một file Flash ở dạng không nén, dùng tool Rosetta Flash để tạo ra file Flash hợp lệ, ta gắn vào thẻ
Thẻ param dùng để đọc những biến đầu vào cho file Flash. Ở đây có 2 biến:
- url: Trang web chứa dữ liệu nhạy cảm cùng domain với trang JSONP endpoint.
- exfiltrate: Trang web do hacker kiểm soát, dùng để lưu dữ liệu nhảy cảm lấy từ url.
Hacker sẽ lừa nạn nhân click vào trang web có nội dung như trên và tất cả nội dung của vuln.com/secret.php với quyền truy cập của nạn nhân sẽ được chuyển đến attacker.com/log.php. Như vậy hacker đã lấy được dữ liệu nhạy cảm.