@ivRodriguezCA iOS CTF Writeups
This post hasn't been updated for 4 years
Đây là một bài viết về quá trình làm CTF của mình về CTF challenge ở một blog post khá hay. Nó có thể xem là một xuất phát điểm cực kì hợp lí cho những người bắt đầu chân ướt chân ráo chơi CTF như mình. Tổng quan thì bài CTF này có 3 version với độ khó tăng dần, đi lần lượt qua các kĩ thuật căn bản nhất trong iOS CTF như đọc hệ thống file, reverse, sử dụng hàm... Nào cùng đi vào chi tiết hơn nhé:
Version 1 (5 flag)
Flag 1
Đầu tiên, sau khi cài đặt app này thông qua side loading, thứ duy nhất mình thấy là một trang login mà không có button login.
OK, có vẻ chưa thể khai thác được gì ở trang này đâu, nên mình thử tìm kiếm trong các file của app này xem sao.
Khởi động passionfruite
passionfruit
Passionfruit mặc định sẽ chạy trên cổng 31337. OK đi tới giao diện của passionfruite nào.
Ở đây, ta thấy passionfruit có thể tracking toàn bộ app trong iphone kết nối tới. Giờ chọn app CTF chúng ta đang test (Handbook app).
Đây là giao diện trang general của passionfruit chứa các thông tin chung chung của app. Ta sẽ đi tìm kiếm các từ khoá flag ở trong các thông tin này đầu tiên.
Ở đây, ta thấy được một flag được lưu trong file Info.plist
.
flag-EC840814-CEBA-4731-8620-CB991D850B14
Flag 2
Tiếp theo, đi thêm một chút vào app Bundle, mình tìm thấy một file catalog Assets.car. Sau khi dump lỗi dung của nó với assetutil
, mình có các thông tin sau:
Thế là ít nhất cũng đoán được có một flag liên quan tới file này trong ảnh flag@3x.png. Tiếp theo là lấy ra thế nào, vì mình cũng chả rành mấy loại file này lắm.
Sau một thời gian tìm kiếm thì mình tìm thấy repo này trên github. Tải Asset Catalog Tinkerer về và cài đặt rồi dùng app này mở file Assets.car, mình xem được ảnh chứa flag:
nhưng mà nó nhỏ quá và không extract ra được. Sau đó mình tìm tới một repo khác là acextract. Dùng repo này có thể lấy ra được các tài nguyên luôn thay vì chỉ view như ở trên. Đơn giản tải acextract về và chạy command sau là mình đã lấy được ảnh:
chmod +x acextract2
mkdir out
./acextract2 -i Assets.car -o out
Và đây là ảnh xuất ra thư mục out mình tạo:
Flag 3
Cũng trong phần payload của app, thử extract strings trong binary của app (Vì app không có mã hoá), mình thu được flag tiếp theo:
Ở đây, mình tìm kiếm theo từ khoá là "flag" và thu được kết quả như trên. Có 2 nhóm thông tin là
và
thì phần thứ nhất là tên của các hàm có trong binary (trong LoginViewController). Có thể thấy khi mà dump file này ra, hoặc trực tiếp bằng passionfruit:
Cái thứ 2 chính là flag với %@-%@-%@-%@-%@-%@
là format của flag.
Vậy flag ta thu được sẽ là
flag-9861DA53-C08C-47C4-84D6-B48463AB738A
Flag 4
Tiếp theo, cũng trong Payload của app, đi vào Main.storyboardc
ta thấy có 2 tệp .nib
. Unpack chúng bằng editnib, đi vào trong BYZ-38-t0r-view-8bC-Xf-vdC.nib
, mình thấy có 3 tệp .nib
khác. Thử extract các string trong từng tệp, mình tìm thấy chiếc flag thứ 4:
Flag:
flag-5932744F-4810-4A6C-BD8F-66FF3E115ED6
Flag 5
Quay lại flag 3, ở phần trên mình có nói về các hàm có trong app. Trong đó có một hàm đáng chú ý khi có tên flag
. Mình sử dụng radare2
để tìm nhanh các đoạn strings trong code:
Quả nhiên nó được gán trong code. Dấu .
ở cuối nghĩa là nó vẫn còn dài nữa so với phần hiển thị nên search thêm lần nữa để hiển thị hết flag:
Vì format của flag là flag-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
nên flag thu được sẽ là:
flag-BD570736-D304-400A-A6B7-F61B02173428
Conclusion
Theo mình đánh giá thì đây là một bài ctf cơ bản, giúp làm quen với cấu trúc của iOS, các tool cũng như một vài kĩ thuật căn bản. Bài này chưa yêu cầu các kĩ thuật cao về reverse hay debug nhiều mà tập trung vào cấu trúc file hơn. Thậm chí có thể giải xong bài này mà không thực sự cần chạy nó trên simulator hay iPhone. Dù sao nó cũng là xuất phát điểm tương đối tốt cho những người bắt đầu học về iOS (như mình) )
Version 2
Flag 1
Khi mở app lên, ta sẽ thấy một form đăng nhập
Bấm vào Enter sẽ dẫn tới một trang, có vẻ chứa thông điệp mã hoá
Vì mình không giỏi crypto lắm nên cứ để đó đã. Cái làm mình chú ý là passionfruit ghi lại log một cú gọi API. Bắt bằng burp thì mình có request:
GET /analytics HTTP/1.1
Host: ctf.ivrodriguez.com
Accept: */*
Accept-Language: en-us
Connection: close
Accept-Encoding: gzip, deflate
User-Agent: Headbook/1 CFNetwork/1121.2.2 Darwin/19.2.0
Response trả về là một file text chứa flag:
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Thu, 09 Apr 2020 07:05:40 GMT
Content-Type: application/octet-stream
Content-Length: 42
Connection: close
X-Powered-By: Express
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Sat, 10 Mar 2018 20:44:54 GMT
ETag: W/"2a-16211a8c0d5"
flag-4056CEF3-DCCB-4D9B-9D0E-64428E9A50E3
Flag 2
Có vẻ ở giao diện chưa khai thác được gì hơn nên mình dùng IDA phân tích code một chút. Trong này, tìm kiếm từ khoá flag, mình thấy có một đoạn khá hay:
Good thing this flag is encrypted: Ov630qDn5AbOWX4JIUUeurVdgNdsjqiaM8ywYCT2Yj1eiMcT/MEPJJ5W9icdC5qb
Và "tình cờ" trong AppDelegate cũng có một hàm là decryptText
. Thế là đơn giản gọi hàm này với input là đoạn mã hoá kia mình có được flag:
Flag 3
Vẫn trong code của IDA tạo ra, mình thử gọi hết các hàm của app thì có hàm [TextHandler mainFunc]
được dùng để in ra flag
Flag 4
// Flag này mình chưa tìm được hi vọng được mọi người chỉ cách giải
Flag 5
// Flag này mình cũng chưa thấy luôn (dead)
Conclusion
Bài này là một bài nâng cao hơn một chút so với version 1. Nó vẫn tập trung vào các kĩ thuật căn bản tiếp theo trong khi làm CTF iOS như cách gọi hàm, reverse cơ bản, chặn bắt gói tin. Cũng giống version 1, đây là một xuất phát điểm tốt để tiến hành học iOS.
Ngoài ra, vẫn còn một version 3 của tác giả nâng cao hơn nữa mình sẽ làm khi có thời gian.
All Rights Reserved