Ghi chú:
The group regularly changes cryptographic keys, and we believe this server is being used to coordinate them. If you can discover how the keys are being derived, then we'll be able to decrypt all their past communication!
/proc
trong Linux là một hệ thống tệp ảo đặc biệt cung cấp một giao diện giống như tệp để truy cập thông tin về hệ thống và các tiến trình đang chạy. Nói cách khác, nó không phải là một hệ thống tệp thông thường lưu trữ dữ liệu mà là một cửa sổ thể hiện trạng thái đang chạy của hệ thống.
Ta sẽ kết nối với Instance
, chúng ta có thể truy cập vào danh sách thư mục từ một Linux root
. Vì chúng ta để có thể duyệt đến bất kỳ tệp nào chúng ta muốn, chúng tôi có thể sử dụng hệ thống tệp /proc
. Khi duyệt đến
/proc/self/maps hoặc /proc/self/cmdline
chúng ta có thể khám phá đường dẫn sẽ có sự thay đổi./proc/self/exe
cũng tải xuống tệp thực thi. Mình đã để tệp đó để mọi người có thể tải.Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.
Mở file trong IDA64, ta thấy có xuất hiện của các regex strings
kèm theo method + function
Method | Regex strings | Function |
---|---|---|
GET | ^/exec$ |
pingGet |
POST | ^/exec/([a-zA-Z0-9]+) |
execPost |
GET | ^/secret$ |
execGet |
GET | secretGet |
|
GET | defaultGet |
pingGet
, hàm GET REQUEST với đường dẫn "/ping", thực hiện triển khai giao thức giao tiếp ping/pong
bằng cách sử dụng SimpleWeb Framework
để xử lý các HTTP request và response
.execPost
, hàm đọc dữ liệu từ một request
và phân tích nó dưới dạng JSON, kiểm tra xem một số trường dữ liệu có tồn tại trong yêu cầu không. Nếu các trường dữ liệu cần thiết được tìm thấy, hàm tiếp tục giải mã một số dữ liệu hexa từ yêu cầu, tạo một đối tượng payload
và liên kết nó với một tên trong một bản đồ.execGet
, hàm sẽ tìm kiếm tệp trong danh sách chương trình. Nếu tìm thấy chương trình , server sẽ thực thi chương trình đó và gửi kết quả như là phản hồi.secretGet
, khi ta truy cập đến /secret endpoint
, password
sẽ được truyền vào bằng tham số được điền. Kiểm tra password
của ta có giống của chương trình không. Từ đó, ta biết ta cần truy cập với đường dẫn /secret?password=<password>
defaultGet
xử lý GET REQUEST
mặc định trong ứng dụng server. Hàm khởi tạo và trích xuất đường dẫn tệp và thư mục từ GET REQUEST
. Nếu đường dẫn trích xuất là một thư mục, hàm sẽ tạo một danh sách các tệp trong thư mục đó và gửi nó như là một phản hồi.Ta truy cập với đường dẫn /secret?password=!IEN*113hRt^9@Z8Rz9hmy!E
. Ta có thể upload python bytecode
, thêm nó vào trong danh sách các tệp và thực thi nó.
Ta cần tạo một POST REQUEST
đến /exec endpoint
ở dạng json
và tạo một GET REQUEST
đến /exec/<program>
để thực thi tệp đó.
Trong hàm secretGet
, chương trình tạo chuỗi mới v24 bằng cách ghép các phần tử HTML cố định với nhau. Đoạn mã xây dựng phần HTML liên quan đến chương trình vào biến toàn cục Program
, phần HTML của form tải lên cùng với một đoạn mã JavaScript để xử lý tải lên tệp và gửi dữ liệu lên máy chủ. Đoạn python bytecode
của ta cũng sẽ được lưu vào biến Program
.
Trang web cung cấp cho ta creds, key, stats
.
Hàm executePython()
thực hiện đúng như tên gọi của nó - load python object từ bytecode
. Thực thi mã Python bằng cách nhập nó như một module bằng PyImport_ExecCodeModule
. Gọi hàm main
từ module bằng cách sử dụng PyObject_CallMethod
. Kiểm tra nếu là chuỗi Unicode, xử lý cả chuỗi bằng thành chuỗi UTF8 và chuỗi byte
.
Chúng ta cần tạo ra một đoạn mã Python và biên dịch nó thành mã bytecode. Đoạn mã Python này sẽ ghi ra tất cả các module được load trong chương trình.
Ta thử thực thi các chương trình creds, key, stats
đồng thời quan sát dump file
được tạo, ta phát hiện chỉ khi thực tệp key
thì hệ thống mới load các module mới, trong đó có: binascii, unhexlify, hexdigest, hashlib, hasher
Ta có thứ tự thực thi sau:
dump.dmp
dump.dmp
lên web server.load module
key
, load các module mới
dump
đã ghi lại thông tin load module
của hệ thống.Tiến hành trích nội dung từ tệp dump
Dùng https://kt.gy/tools.html để xem nội dung chuỗi hexa.
Mr. Abilgate, the CFO of a Fortune 500 company, has reportedly been the victim of a recent spree of ransomware attacks. The behavior of the malware seems consistent with our current APT target's tactics, but the ransom note makes us think it's a targeted attack. We suspect bad faith from corporate espionage gone wrong. Could you investigate?
Tôi làm bài này theo hướng giải của HTB. Sau khi đọc bài này, mình đã học được rất nhiều, cũng như các viết script mình cũng sẽ có sự thay đổi. Các bạn nên đọc tại đây.
A dark wizard placed a curse on you - if you open your mouth to say anything, it'll strike! Only by perfectly reciting the counter-spell can you escape…
Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.
Mở file trong IDA64, ta thay đổi kiểu dữ liệu từ char s[8]
thành char s[56]
.
Ta sẽ cần phân tích hàm install_filter()
và lệnh syscall
ở dưới cùng.
Seccomp (viết tắt của "short for secure computing") là một cơ sở bảo mật máy tính trong nhân Linux, cho phép một quá trình thực hiện quá trình chuyển đổi một chiều sang trạng thái "an toàn" trong đó nó không thể thực hiện bất kỳ lệnh gọi hệ thống nào ngoại trừ
exit()
,sigreturn()
,read()
,write()
. Nếu nó thử bất kỳ lệnh gọi hệ thống nào khác, kernel sẽ chỉ ghi nhật ký sự kiện hoặc chấm dứt quá trình bằngSIGKILL hoặc SIGSYS
.
Tóm lại: rule seccomp chỉ cho phép thực thi các syscall: open, read, write, mprotect, alarm, exit và exit_group.
Tiến hành sử dụng seccomp tools để dump rule seccomp:
Luồng chương trình thực thi như sau:
arch == ARCH_X86_64
và sys_number ==0x258
args[0] != 0
Nếu đúng
-> đến dòng 41
-> đến dòng 75
-> đến dòng 109
-> dòng 143
= Exit
Nếu sai
, cứ thực hiện 5 phép toán thì gán A = 0 (dòng 8, 42, 76, 110)
. Mỗi lần thực hiện phép toán, kí tự kế tiếp = kí tự trước đó - kí tự hiện tại
Ta thực hiện trích dữ liệu để tính toán.
Từ đó, ta viết chương trình giải mã:
Welcome back to the eighties! Some mediocre game programmer from the 80s has hidden an old ROM inside a modern executable. Can you find it and beat the game to gain the flag?
Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.
Mở chương trình trong IDA, chương trình yêu cầu ta nhập dữ liệu từ bàn phím. Với dữ liệu được nhập, chương trình tiếp tục mã băm MD5 của nó. Giá trị băm sẽ được lưu vào byte_5150
Tại hàm sub_1205
, với giá trị băm MD5 đó, chương trình thực hiện so sánh. Nếu trả về đúng thì mã băm của ta chính xác, nếu sai thì sử dụng giá trị băm theo dữ liệu từ bàn phím.
Ta có thể tính toán cơ bản, giá trị băm MD5 đúng là E7D52842CBE43040630B6B1E01093BC4
.
Tại hàm sub_1397
nhận tham số gồm: mã băm MD5, bytecode, buffer và n = 1010.
Chương trình sử dụng mã băm MD5 là key trong thuật toán mã hóa AES để giải mã dữ liệu từ biến bytecode.
Ta có thể dùng CyberChef để tìm ra giá trị được giải mã
Tiếp đó, chương trình cho ta nhập cheatcode
gồm 4 kí tự, với cheatcode này ta sẽ mã hóa giá trị tại byte_50E0
và thực hiện so sánh giá trị như sau:
Ta dễ dàng tìm được giá trị cheatcode = 6507
Một công cụ chỉnh sửa sprite 8-bit nhỏ gọn dành cho máy Atari VCS (Atari 2600) là một công cụ thú vị cho cả các đam mê và nhà phát triển, cho phép họ tạo ra đồ họa tùy chỉnh để sử dụng trong các trò chơi Atari 2600. Atari 2600, nổi tiếng với đồ họa 8-bit đặc trưng của mình, đã thu hút các game thủ suốt nhiều thập kỷ.
Thật ra bạn có thể tìm ra flag từ đoạn giải mã AES rồi. Ta biểu diễn các số hex theo hệ máy Atari
You finally manage to make it into the main computer of the vessel, it's time to get this over with. You try to shutdown the vessel, however a couple of access codes unknown to you are needed. You try to figure them out, but the computer start speaking some weird language, it seems like gibberish…
Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.
Mở chương trình trong IDA.
Ta có thể dự đoán chương trình sẽ tạo một máy ảo (VM) và chạy chương trình trên đó. Ta mở hàm vm_create
để quan sát thêm.
Hàm vm_create được sử dụng để tạo ra một đối tượng máy ảo (VM) và cấp phát bộ nhớ cho ba mảnh bộ nhớ khác nhau trên heap.
Tiếp theo làm hàm vm_run
Hàm vm_run
gọi hàm vm_step
Khi giá trị của v1 > 0x19
thì điều kiện không hợp lệ trong quá trình thực thi của VM và thoát chương trình. Hàm sử dụng con trỏ hàm original_ops
thể hiện máy ảo này có một tập hợp các lệnh được quản lý thông qua một mảng các con trỏ hàm.
1. vm_add |
6. vm_muli |
11. vm_push |
16. vm_print |
21. vm_jge |
---|---|---|---|---|
2. vm_addi |
7. vm_div |
12. vm_pop |
17. vm_putc |
22. vm_xor |
3. vm_sub |
8. vm_cmp |
13. vm_mov |
18. vm_je |
23. vm_store |
4. vm_subi |
9. vm_jmp |
14. vm_nop |
19. vm_jne |
24. vm_load |
5. vm_mul |
10. vm_inv |
15. vm_exit |
20. vm_jle |
25. vm_input |
Lười quá không làm nổi nữa!! Sau khi đọc bài này, mình đã học được rất nhiều, cũng như các viết script mình cũng sẽ có sự thay đổi. Các bạn nên đọc tại đây.
Can you find the password?
Enter the password as flag in the following form: HTB{passwordhere}
Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.
IDA chưa thể decompile chương trình được. Ta sẽ tạo hàm
từ 0x8048937
đến 0x08048AE6
để IDA có thể decompile hàm main()
.
Chương trình thực hiện kiểm tra đã được truyền bốn tham số chưa. Sau đó sub_80491A0() ^ 0x63
để tạo một hàm mới. Ta dùng IDAPython để viết patch script.
Chương trình giải mã các chuỗi thành các chuỗi đọc được như sau:
s ^ 0x14
nhằm tạo chuỗi input password:
v3 ^ 0x14
nhằm tạo chuỗi you win.
(v6 + v5) ^ 0xA
để tạo và trả về chuỗi younevergoingtofindme