Trong thế giới đầy log và dữ liệu lớn Splunk không chỉ là một phần mềm, mà là một cây cầu kết nối giữa các ứng dụng, hệ thống và thiết bị hạ tầng mạng. Splunk không chỉ tìm kiếm và giám sát, mà còn là công cụ để có thể săn tìm những mối đe dọa đối với tổ chức.
Với khả năng linh hoạt, Splunk có thể cân nhiều loại dữ liệu khác nhau như Syslog, CSV, Apache-log, Access_combined… điều này khiến nó trở thành công cụ mạnh mẽ. Splunk được xây dựng trên nền tảng Lucene và MongoDB khiến splunk có thể phiêu lưu trong thế giới phức tạp của log và thông tin mạng.
Là một SOC Analyst, mình đã làm quen với Splunk từ khi bước chân vào con đường làm về Giám sát bảo mật hệ thống. Công việc của mình hằng ngày có thể coi như hầu hết là làm việc với Splunk để có thể giám sát hệ thống, và phát hiện các cảnh báo bảo mật.
Cài đặt và triển khai Splunk.
Để cài đặt Splunk, mình sử dụng môi trường Ubuntu Linux 20.04
Các bạn có thể download Splunk tại tranghttps://www.splunk.com. Sau 7749 bước đăng kí và nhập thông tin thì mình có đường link download. Ở đây mình sử dụng Splunk version 9.0.5 để thực hiện chạy CVE.
Sau khi download thành công, mình tiến hành cài đặt package qua lệnh apt install. Splunk sẽ được cài đặt vào thư mục mặc định là /opt/splunk.
Chạy lệnh /opt/splunk/bin/splunk start—accept-license để chấp nhận license
Sau khi enter ‘y’ để xác nhận thì Splunk sẽ cho ta tạo credentials cho admin account.
Okey mọi thứ đã xong. Start splunk và access vào web interface thôi.
CVE-2023-46214
Ở phần này, mình chỉ tập trung chủ yếu vào tìm hiểu sơ về cách mà CVE này khai thác và tận dụng lỗ hổng để RCE vào hệ thống và chạy POC.
Các version Splunk bị ảnh hưởng bởi CVE này là dưới 9.0.7 và 9.1.2.
Lỗ hổng này attack khai thác từ việc tải file malicious XSLT lên Splunk Enterprise có thể dẫn tới việc remote code execution (RCE).
Đi sơ về phân tích code 1 chút, đầu tiên là hàm generate_malicious_xsl()
Hàm này tạo ra một đoạn mã XSL có chức năng gửi một yêu cầu reverse shell đến máy attacker và lưu vào file shell.sh ở path /opt/splunk/bin/scripts/.
Hàm login()
Hàm này đơn giản chỉ là đăng nhập vào trang Splunk sử username với password được truyền vào.
Tiếp theo là hàm upload_file()
Đoạn này thực hiện việc up file revershell shell.xsl đã tạo lên server ở path /en-US/splunkd/__upload/indexing/preview và gán nội dung của shell.xsl vào text_value.
Next, get_job_search_id()
Hàm này tóm tắt lại là gửi một yêu cầu POST đến Splunk, phân tích cú pháp phản hồi json trả về từ server, nếu thành công nó sẽ truy cập giá trị sủa sid và gán vào jsid.
trigger_xslt_transform()
Sử dụng một yêu cầu GET để kích hoạt quá trình chuyển đổi XSLT thông qua endpoint /en-US/api/search/jobs/{jsid}/results.
Cuối cùng là hàm trigger_reverse_shell()
Sử dụng một yêu cầu POST để thực hiện lệnh shell script thông qua endpoint /en-US/splunkd/__raw/servicesNS/{username}/search/search/jobs. Command runshellscript là một lệnh tìm kiếm có khả năng chạy lệnh shell trực tiếp từ một tìm kiếm Splunk.
Tóm lại workflow của PoC thực hiện như sau:
Xác thực với user và password để vào hệ thống Splunk
Tạo tệp in XSL
Tải tệp tin XSL lên Splunk
Tạo 1 job search ID để tìm kiếm sid
Chuyển đổi XSLT
Reverse shell
Cài đặt Agent lên server chạy Splunk để lấy logs
Trước khi chạy PoC để RCE server thì mình thực hiện cài agent để lấy logs để phục vụ cho việc Detection.
Mình sử dụng Elastic Cloud để monitor và cài Auditbeat lên server.
Download và cài đặt Auditbeat version lên server.
Thêm cloud.id và cloud.auth vào /etc/auditbeat/auditbeat.yml để set thông tin kết nối cho Elastic Cloud:
Setup Auditbeat
Start Auditbeat và check logs xem đã nhận data chưa
sudo service auditbeat start
Okey naiiiii.
Run PoC
Download PoC về bằng git clone
Chúng ta cần truyền parameters như Splunk URL, username Splunk, passoword Splunk, IP và Port reverse shell
Vì máy mình đang chạy local nên cần dùng ngrok để tunel tcp ra ngoài
ngrok tcp 444
Tạo một socket để lắng nghe bằng netcat
Trước khi chạy exploit mình thực hiện capture network bằng SSH và Wireshark
Nice, chạy PoC thôi
[+] Authentication successful
[+] CSRF token obtained
[+] Malicious XSL file uploaded successfully
[+] Job search ID obtained
[+] New CSRF token obtained
[+] Successfully wrote reverse shell to disk
[+] Reverse shell executed!
And 1 century later
[+] Got shell??????????? Wtf sao không lên Shell được. Ho li shit :<<<<
Mọi workflow thành công hết rồi mà sao chưa lên shell được nhỉ. Mình tiến hành check lại code và debug 7749 bước
Check xem folder /opt/splunk/bin/scripts/ file shell.sh đã được load lên
Hmmm file shell đã có nhưng tại sao không lên được mà tác giả có thể RCE???
Sau 7749 bước thì mình phát hiện do tác giả k define /bin/bash lên đầu file shell.sh nên khi thực hiện lệnh về shell thì nó bị failed
Mình thêm 2 dòng code vào hàm generate_milicous_xsl()
Define #/bin/bash
<xsl:text>#!/bin/bash</xsl:text> #
**
**một ký tự xuống dòng (line feed) trong Unicode
<xsl:text>
</xsl:text>
Okay chạy lại PoC thôi.
Nice =)) Mình đã RCE thành công vào hệ thống với quyền root.
Identification attack
Phát hiện sớm cuộc attack với SIEM system
Đây là logs mà hệ thống ghi được từ cuộc attack. Bắt đầu exploit từ 06:38:07 -> 06:38:37 mất khoảng 30s để exploit vào hệ thống. Logs sinh ra trên hệ thống gồm chạy runshellscript.py và shell.sh qua process bash và python3.7.
process where event.type in ("start", "process_started") and
process.name in ("sh", "bash", "zsh", "dash", "zmodload") and
process.args : ("*/dev/tcp/*", "*/dev/udp/*", "*zsh/net/tcp*", "*zsh/net/udp*") and
/* noisy FPs */
not (process.parent.name : "timeout" and process.executable : "/var/lib/docker/overlay*") and
not process.command_line : ("*/dev/tcp/sirh_db/*", "*/dev/tcp/remoteiot.com/*", "*dev/tcp/elk.stag.one/*", "*dev/tcp/kafka/*", "*/dev/tcp/$0/$1*", "*/dev/tcp/127.*", "*/dev/udp/127.*", "*/dev/tcp/localhost/*") and
not process.parent.command_line : "runc init"
Digital Forensics
Thu thập memory
Để thu thập memory dump, mình viết bash script sử dung LiME để dump và cài đặt các package cần thiết.
Cấp quyền cho script và tiến hành dump.
Mình lưu file memory dump vào thư mục evidence + timestamp dump và có cal hash của file mem để đảm bảo tính toàn vẹn của evidence.
Sử dụng lệnh scp để tải file từ server xuống local để thực hiện forensic.