Flare-on 10 WriteUp (Part 2)
Tiếp tục phần trước, phần này mình sẽ trình bày tiếp các challenge tiếp theo.
Challenge 06: Flaresay
Bài 6 cho chúng ta 01 tập tin PE 64 bit, sau khi kiểm tra và phân tích qua bằng CFF explorer thì có 1 vài điểm đáng chú ý:
- Section của PE trống, Data Directory cũng vậy. Chương trình không có Import Address Table, Export Address Table và resouces.
- Phần e_lfanew có giá trị khá lớn (0x99a0), phần dos stub khá dài.
- Tập tin vẫn thực thi bình thường trên windows x64.
Từ đây có thể đoán được có thể chương trình sẽ chạy trong cả nền DOS. Phân tích phần x64 trước bằng IDA kết hợp với debug bằng x64 dbg, có thể thấy một số đặc điểm sau:
- Hàm get_data_sub_408e50 sẽ trả về địa chỉ của các dữ liệu cần thiết, trong đó:
- Id 1: 16 byte trống
- Id 2: 84 bytes data khác
- Id 3: chuỗi “Winning”
Luồng thực thi của của chương trình sẽ là:
- Đọc key và kiểm tra checksum: 0x31d9f5ff
- Nếu key đúng, tiến hành giải mã data_id_2, sau đó truyền data đã giải mã cùng với data_id_3 là chuỗi “Winning” vào hàm msgbox_loc_409993 để in ra màn hình.
Hàm decrypt_data_409070 có sử dụng trường PEB.BeingDebugged trong quá trình giải mã để anti debug
Phân tích hàm decrypt_data_409070, cố gắng tìm cách để giải mã flag và nhưng thấy bất lực và cảm thấy cần phải quay xe sang hướng khác. Nhờ 1 phần các thông tin trên nền x64 bit, có thể đoán phần buffer tại data_id_2 sẽ cần được sửa đổi để khi chạy ở chế độ 64 bit sẽ giải mã và show flag. Phần phân tích chương trình ở nền dos bắt đầu bằng việc setup môi trường bằng DOSBox. Tìm hiểu thêm về DOS binary thì có thể dùng IDA để phân tích binary này và cần debug thì có thể sử dụng TurboDebuger trong môi trường của DOSBox.
IDA hỗ trợ khá tốt nền dos khi chỉ rõ chức năng và tham số cần thiết của các ngắt. Quá trình phân tích bằng IDA và debug qua TurboDbg cho ra một số thông tin hữu ích:
- Chương trình sẽ khởi tạo màn hình chính sau đó start game.
- Tại màn hình chính có 1 đoạn code kiểm tra phím bấm người dùng và so sánh với chuỗi phím bấm “HHPPKMKMBA”. Nếu người dùng nhập đúng chuỗi kỹ tự, màn hình sẽ nhấp nháy và chuỗi người dùng nhập sẽ được sử dụng để tính toán giá trị của 1 biến đặc biệt sẽ gây ra ảnh hưởng của quá trình khởi tạo buffer cho từng vòng chơi ở dưới.
Phần gameplay khá rõ ràng bao gồm các bước:
- Khởi tạo từng giá trị của 1 buffer có độ lớn 0x128 bytes tương ứng với 0x128 vòng chơi.
- Tiếp tục tạo ra thứ tự bấm phím tương ứng với từng giá trị đã khởi tạo trong buffer trên.
- Mỗi vòng sẽ tiến hành kiểm tra phím bấm của người dùng với phím tương ứng với giá trị trong buffer đã tạo trước đó.
- Khi người dùng không bấm đúng các phím trong init buffer, chương trình sẽ in ra màn hình thông báo thất bại.
- Nếu vượt qua được 0x128 vòng chơi, màn hình chiến thắng sẽ hiện ra
- Khi phân tích code, thấy được trước khi hiện ra màn hình chiên thắng, chương trình sẽ gọi hàm write_file và nhận tham số là một buffer, tiến hành tìm kiếm vị trí của buffer data_id_2 (sẽ được sử dụng ở mode 64 bit) và ghi một đoạn dữ liệu vào vùng nhớ này.
- Kiểm tra lại code và phát hện ra, buffer được ghi vào file được khởi tạo các giá trị mỗi khi người dùng vượt qua được 1 round chơi.
Phân tích đến đây, có thể nghĩ đến cách vượt qua các vòng chơi như sau:
- Cần patch lại đoạn code khởi tạo ở màn hình chính để buffer init ra không được gen ngẫu nhiên mà gen theo seed được thiết lập.
- Patch lại bước kiểm tra ký tự nhập vào ở mỗi vòng chơi để chương trình tự chỉnh sửa bufffer sẽ ghi vào tập tin gốc
- Sau khi patch và chạy chương trình trong nền dos, màn hình chiến thắng sẽ hiện ra khi hoàn thành hết các vòng chơi, lúc này phần key đúng sẽ được thiết lập và khi chạy chương trình ở chế độ 64 bit sẽ thu được flag.
Flag: Ha$htag_n0_rc4_aNd_Th3n_s0me@flare-on.com
Challenge 07: Flake
Bài này cung cấp tập tin PE và 1 file config ở dạng base64. Sau một hồi phân tích bằng các cách như dùng ida, đọc strings trên file và trên mem, theo dõi bằng procmon, debug chạy thử chương trình,… thì có một vài điểm sau:
- Chương trình khá to, được build bằng cách sử dụng Nuitka để convert từ script python qua code c/c++ và build để tạo ra file pe.
- Do sử dụng Nuitka nên code trong IDA rất khó phân tích.
- Khi chạy chương trình sẽ có cả phần GUI và phần console.
- Sử dụng strings và procmon và tìm các chuỗi liên quan thì phát hiện được cách sử dụng và giải mã config
- Một số string đặc biệt liên quan: module flag, snake, get_flag, check_snake_length,..
Sau khi thử chỉnh sửa các thông số trong file cấu hình và không thu được kết qua, tìm kiếm được một vài hướng tiếp cận khác khi phân tích binary tạo ra bởi Nuitka:
- pyinject để inject interactive shell
- pydbg để có thể debug chương trình
- chèn code thông qua các thư viện chuẩn
Sử dụng pyinject với script được inject vào chương trình như sau:
Sau khi có shell và mò mẫm trong shell, thu được flag bằng cách gọi hàm get_flag trong module flag với tham số xk là biến toàn cục của chương trình.
Flag: n0Pe_N0t_T0dAy_Nu1TkA@flare-on.com
Challenge 08: Amongrust
Đề bài bao gồm một tập tin PE và 1 file pcapng, file PE 64 bit được viết bằng rush. Dựa theo một số bài viết về dịch ngược rush, đặc biệt là bài viết tại “https://research.checkpoint.com/2023/rust-binary-analysis-feature-by-feature/”, kết hợp cả phân tích tĩnh và động ta thu được một vài thông tin sau:
- Chương trình chứa một chuỗi fake flag RU5T_R3_iS_heLLA_FuN@flare-on.com
- Sau đó chương trình copy file svchost.exe gốc trong system32 vào thư mục %APPDATA%\Microsoft\Windows\Start Menu\Programs\StartUp và thực hiện sửa file này
- Chương trình tiếp tục tìm kiếm các tập tin .exe khác của người dùng và thực hiện hành vi tương tự, đặc điểm chung của những file sau khi sửa là đều có icon amongus và khi thực thi sẽ in ra màn hình link rút gọn trỏ tới video rick-roll trên youtube.
- Dựa vào các thông tin trên, kiểm tra một vài refrences gọi đến các api để thực hiện các việc kể trên bao gồm CreateFile, WriteFile, FindFirstFile. FindNextFind,… kết hợp kiểm tra stacktrace trên xdbg và đọc code rust xoắn não trên ida sau khi sử dụng một vài plugin về rust như IDA Rust Untangler, tìm tới được đoạn code trong hàm tại địa chỉ 0x140007E30 lây nhiễm các file .exe.
- Hàm infect_file_0x140006780 sẽ nhận các tham số để lây nhiễm vào tập tin pe 64 bit, trong đó có 2 tham số lạ được truyền qua r8, r9. Sau một hồi phân tích, ta có thể thấy chương trình sử dụng mã hóa xor với key là “@cPeterr” để giải mã 2 tham số này, trong đó r8 là địa chỉ trỏ tới dữ liệu, r9 là kích thước của dữ liệu đó. Tiến hành export và giải mã 2 mảng dữ liệu này, ta thu được 2 tập tin PE, 1 tập tin giống với các tập tin đã bị lây nhiễm ở trên, tập tin còn lại chứa các hành vi khác.
- Tập tin còn lại khi thực thi sẽ mở ra một socker tại cổng 8345 để chờ client kết nối tới.
- Tiến hành kiểm tra dữ liệu file pcapng qua cổng 8345, phát hiện một số command được một client gửi đến. Command đều ở bản rõ nên ta đoán được flow và một số điểm đặc biệt:
- Client gửi 1 mảng data và nhận về ACK_K, 1 mảng data khác và nhận về ACK_N khi bắt đầu kết nối
- Thực thi một số lệnh trong đó có 2 lệnh upload các file kèm theo kích thước:
+ upload C:\Users\user\AmongRust\wallpaper.PNG 122218
+ upload C:\Users\user\AmongRust\wallpaper.ps1 708
- Thực thi tập tin ps1 vừa upload sau đó xóa đi các dữ liệu đã upload lên
Ta sẽ tìm cách trích xuất 2 tập tin kia bằng cách gửi lại các dữ liệu mà client trong file pcapng đã gửi tới server tạo ra bởi tập tin này, bỏ qua một số lệnh thực thi whoami, mkdir, del và chỉnh sửa lại được dẫn của các tập tin png, ps1. Tiến hành export các data cần thiết (ack_k, ack_n, command upload và dữ liệu các file) từ file pcap sau đó dùng python tạo client gửi và nhận dữ liệu với server.
Sau khi gửi dữ liệu, server đang thực thi sẽ ghi lại các file đã upload và ta thu được flag nằm trong file png.
Flag: n0T_SuS_4t_aLl@flare-on.com
Challenge 09: Mbransomware
Chương trình cung cấp file dump của ổ đĩa had.img dạng raw và 1 máy ảo có thể mở bằng VMWARE. Theo như gợi ý qua tên của challenge, cần phân tích đoạn của mbr của ổ đĩa. Dùng bochs emulator để có thể giả lập và debug qua IDA.
Setup môi trường giả lập bochs để thực thi code và debug bằng IDA như sau:
- Cài đặt bochs, sau đó tạo file .bxrc với nội dung để chuẩn bị hệ thống giả lập và thực thi mbr:
megs: 512
romimage: file=”C:\Program Files\Bochs-2.6.11\BIOS-bochs-latest”
vgaromimage: file=”C:\Program Files\Bochs-2.6.11\VGABIOS-lgpl-latest”
boot: disk
ata0-master: type=disk, path=”Path\to\raw\image \mbransom\hda.img”, mode=flat
mouse: enabled=0
cpu: ips=90000000
display_library: win32
- Sau đó, load file .bxrc này vào ida và chọn config bochs là có thể bắt đầu thực hiện phân tích và debug.
- Code MBR sẽ được nạp tại địa chỉ 0x7C00, khi bắt đầu thực thi, chương trình sẽ copy 0x100 byte data tại địa chỉ 0x7c00 vào vùng nhớ có địa chỉ 0x600 và thực hiện jump đến địa chỉ 0x61d.
Quá trình debug tiếp tục và sau 1 hồi trace theo, chương trình sẽ giải mã đoạn code mới và thực hiện thực thi đoạn code này bắt đầu tại địa chỉ 0x1000. Vì vùng nhớ này sẽ không được lưu lại trên ổ đĩa mỗi khi debug, nên ta sẽ tiến hành dump khoảng 0x10000 byte đầu tiên của vùng nhớ ra rồi phân tích code bắt đầu tại address 0x1000 để tiện phân tích song song với việc debug.
- Để dump vùng nhớ trên IDA sử dụng plugin lazyida và tiến hành dump. Sau đó load vùng nhớ vừa dump lên ida ở mode 16 bit
-
Tại địa chỉ 0x1000, chương trình sẽ hiển thị đoạn ransomenote và chờ người dùng nhập key, sau đó sẽ tiến hành giải mã dữ liệu ổ địa và yêu cầu khởi động lại khi giải mã hoàn tất.
-
Khi người dùng nhập key, mỗi ký tự sẽ được kiểm tra để đảm bảo người dùng chỉ nhập các kí tự ‘0123456789abcdef’ và độ dài của key là 16 ký tự. Sau đó, key nhập vào sẽ được truyền vào hàm test_key để kiểm tra.
Quá trình kiểm tra gồm các bước.
- Convert 16 kí tự thành 4 word tương ứng và lưu vào mảng bắt đầu tại địa chỉ 0x2a5c
- 3 word đầu tại 0x2a5c sẽ được xor với vùng nhớ tại 0x19FC và so sánh với 0x5555
- Sử key để mã hóa dữ liệu “Test Str” và so sánh dữ liệu sau khi mã hóa với dữ liệu tại 0x19f4
- Key sẽ hợp lệ nếu vượt qua hết các bước kiểm tra. Đối với hàm encrypt dữ liệu, sử dụng plugin findcrypt sẽ xác định được đoạn code mã hóa này sử dụng thuật toán blowfish.
Dựa vào các thông tin trên, xây dựng được script để giải mã 3 word đầu tiên với key là 0x5555, sau đó bruteforce nốt word còn lại bằng thuật toán blowfish để tìm ra key giải mã.
Kết quả sử dụng key để chương trình giải mã dữ liệu, sau khi giải mã và reboot, sẽ thu được flag nằm trong file flag.txt
Flag: bl0wf1$h_3ncrypt10n_0f_p@rt1t10n_1n_r3al_m0d3@flare-on.com
Bài viết này mình xin dừng tạm ở đây, phần tiếp theo mình sẽ viết nốt những challenge còn lại.
Cảm ơn các bạn đã đọc!
By,
Blue_Team