🇻🇳
th13
  • info
  • JAVA
    • Notes: RMI linh tinh
    • [CVE-2013-2165] Phân tích RichFaces vulnerability thông qua CTF challenge
  • CTF WRITE UP
    • [Web]ImaginaryCTF 2021
    • [Web]CSAW CTF 2021
    • [Web]RaRCTF 2021
    • [Web]LIT CTF 07/2021
    • [Web]redpwn 2021
    • [Web]WeCTF 2021
    • [Web]WannaGame 21/05/2021
    • [Web]San Diego CTF 2021
    • [Web]picoMini by redpwn
    • [Web]WannaGame 17/04/2021
    • [Web]picoCTF 2021
    • [Web]BambooCTF/Calc.exe
  • saved
    • Tài liệu JAV Sờ cu 101
    • [NT230]PE file Injection
    • [WU][web]root-me
    • [WU]Lord of SQLinjection
    • [WU][Web]CyberTalents
    • [exploit][sqli]Challenge ngày Tết
Powered by GitBook
On this page
  • 1. Tổng quan
  • 2. Tìm hiểu
  • 3. Debug
  • 4. Tạo payload
  • 5. Kết quả

Was this helpful?

Edit on GitHub
  1. JAVA

[CVE-2013-2165] Phân tích RichFaces vulnerability thông qua CTF challenge

PreviousNotes: RMI linh tinhNext[Web]ImaginaryCTF 2021

Last updated 3 years ago

Was this helpful?

Bài viết dưới đây là bài viết những gì mình làm khi lần đầu phân tích CVE thông qua 1 challenge ctf tìm được trong quá trình mình học về Java security.

1. Tổng quan

  • Published: 2013-07-23

  • CVSS Score: 7.5

  • Description: ResourceBuilderImpl.java in the RichFaces 3.x through 5.x implementation in Red Hat JBoss Web Framework Kit before 2.3.0, Red Hat JBoss Web Platform through 5.2.0, Red Hat JBoss Enterprise Application Platform through 4.3.0 CP10 and 5.x through 5.2.0, Red Hat JBoss BRMS through 5.3.1, Red Hat JBoss SOA Platform through 4.3.0 CP05 and 5.x through 5.3.1, Red Hat JBoss Portal through 4.3 CP07 and 5.x through 5.2.2, and Red Hat JBoss Operations Network through 2.4.2 and 3.x through 3.1.2 does not restrict the classes for which deserialization methods can be called, which allows remote attackers to execute arbitrary code via crafted serialized data.

RichFaces là gì? RichFaces là một framework mã nguồn mở cho phép thêm các Ajax vào ứng dụng web JSF (một framework MVC tập trung xây dựng UI) mà không cần sử dụng Javascript.

2. Tìm hiểu

Mình biết CVE này thông qua wutfaces challenge trong matesctf nên mình sẽ sử dụng source code của challenge này, nhưng mình sẽ tập trung vào bug của Richfaces thay vì chain để solve bài này.

Tìm đọc các bài viết liên quan đến cve này để tìm version có lỗi và version nào đã được vá.

Resource của challenge đang sử dụng là version 4.3.2, là version cuối có bug này. Mình tìm source trên github và bắt đầu diff 2 version 4.3.2 và 4.3.3 với nhau.

Class ObjectInputStreamImpl bị xóa đi và được viết lại bằng class LookAheadObjectInputStream. Có thể ngửi được mùi chống bug java deserialization. Có một method sử dụng class này - decodeObjectData.

Và đó là tất cả diff của bản patched này.

3. Debug

Dựng lại source (challenge cung cấp cho mình 1 file war, mình run tomcat và thêm option để remote debug).

Đặt một breakpoint tại decodeObjectData để hy vọng luồng request của mình đi ngang qua đây

Đời không như mơ, không hề có request nào đi ngang qua đây. Lúc này mình dùng chắc năng find usages để trace ngược lại. Trong lúc trace thì mình biết được lý do request không đi qua decode object trên kia là bởi vì có 1 điều kiện ràng buộc (kiểm tra FLAG isSerialized())

Mình trace được flow sau:

Util.decodeObjectData

<-- DefaultCodecResourceRequestData.getData

<---- ResourceFactoryImpl.createResource

<------ ResourceHandlerImpl.handleResourceRequest

Và cuối cùng đã đưa mình đến handleResourceRequest của class ResourceHandlerImpl. Nơi này sẽ nhận mọi request resource từ client.

Đọc sơ đoạn code trước khi debug xem chia tiết. Đầu tiên là nắm được uri request lấy resources phải bắt đầu với /rfRes. Check network thì có những url khớp với trên được get.

Khi debug tới decodeResource thì đi sâu vào xem method này làm gì. Lúc này biết rằng method sẽ lấy các giá trị của param mình truyền (version, library, data byte, date object) sau đó kiểm tra giá trị của param do có hay không rồi sẽ gán FLAG true để nói rằng data này đã serialized. (FLAG này sẽ quyết định luồng request của mình rẽ vào method có bug theo ý mình muốn lúc đầu).

Sau luồng request của mình tiếp tục qua kiểm tra trong cache có chưa, nếu chưa thì server sẽ tạo resource ResourceFactoryImpl.createResource. Lúc này là đi vào flow mà mình vừa trace được.

createResource

--> createResource

-----> getData (lúc này check có phải object không, nếu không thì decodeByteData)

-------> decodeObjectData

Như vậy đã nắm được flow của request cũng như cách reach được vuln. Tiếp theo là viết script tạo payload exploit.

4. Tạo payload

Ở bài này sink của mình là method hashCode của class Bookholder .

Ghi object xuống file Stream file để convert sang Byte, sử dụng chính method của richfaces để encode bytes đấy sang String.

PAYLOAD:eAFb85aBtbiIQTArsSxRr7QkM0fPI7E4wzexgJX91sHDYgkXmRmY3Bi4cvITU9wSk0vyizwZOEsyilKLM!JzUioK7B0YQICnnANICgAxI9Aw2eT8XL2SzLwSA73y0pK0xOTUYj2n!PxsD6CW1KJTWlvWbpV7coeJgdmTgS0JKO6Z4sPA7ePvHu!s7-vr6OdSwiDkA3KPfk5iXrp-cElRZl66tQ8DJ0htSGZJTmohQx0Dc0UByOYSBpbkxJzkAiCdkp-XWgEArrNAXQ__

5. Kết quả

GET http:/domain/rfRes/<nameresource>?ln=<libraryname>&do=<payload>

=========END========

Enjoy it!

Mình tham khảo chain URLDNS để chạm tới sink hashCode này tại .

ysosrial