Ngày 19/05 vừa qua Khoa mạng máy tính và Truyền thông Trường đại học CNTT đã tổ chức ngày hội SEC DAY 2018 dành cho sinh viên trong khu vực TP.HCM. Mình đã tham gia 2 phần:
- SEC Talk( buổi sáng) đây là phần chia sẽ rất hay từ các anh đi đầu trong ngành ATTT VN cũng như những chủ đề đến từ các thành viên MeepwnCTF Team.
- SEC GAME ( UIT Hacking Contest 2018 ) đây là phần mà mình hứng thú nhất, vì đây là đầu tiên tham gia một giải CTF on-site và cũng không tránh khỏi việc ăn hành :(.
Đội mình tham gia vào bảng Junior(beginner) và kết thúc ở vị trí thứ 3 của bảng này.Và sau đây là phần Writeup của mình về các challenge (Crypto :> ). Trong lúc thi mình solve được 3 bài: 2 bài crypto 100(chall1 và chall2) và một bài re150. Sau khi thi mình đã try hard hết sức và may mắn làm ra bài crypto400, bài crypto crypto300 do kiến thức mình hạn chế về ECC nên tạm gác lại sau :3.
Và đây là source các challenge: link
- Crypto100 - 32
cipher: PU7T6P3COBXXC6RAFRTWC2LNEBTXU3LEEBWXU2JAMJ3XUIDMOZUSA3LBNFVHW33JORXA====
Ngay khi vừa thấy thì mình nhận ra đây là bài cho điểm :3. Decrypt base32, reverse string, và sau cùng là Ceasar
=> Flag: flag{base and rot are very easy, right???}
2. Crypto100 - POP
Nhìn vào thì mình nghĩ ngay đến việc reserve lại cách encrypt trên. Mình mất khoảng 10 phút :( để mò xem reserve sao cho đúng
thực ra thứ tự trên như sau: ord(flag[i])^(i + i<<2)
do đó reserve lại như sau: ord(cipher.decode('hex')[i])^(i - i<<2)
=> FLAG: flag{Be careful with operator priority}
3. RE150
Bài này teamate mình đã làm phần convert từ opcodes python về python, sau đó mình đã hỗ trợ phần còn lại (crypto :3). Sau khi thi xong thì mình cũng convert thử thì cảm thấy re python opcodes khá dễ chịu hơn so với C :(. Các bạn có thể tham khảo thêm tại đây: link
Sau khi chúng ta convert xong:
Nhìn sơ qua thì hiểu được ý đồ author là buộc mình giải hệ PT để tìm flag =))
My script: link
=> FLAG: flag{revers1ng_for_fun_7th_grade_maths_for_pr0f1t}
4. Crypto400-SuperSecureServer
Đây có lẽ là bài mà mình try hard nhiều nhất và học được nhiều nhất (tất nhiên ngậm hành nhiều nhất :( )
I have a special thanks for #qd for this interesting challenge =))
Sau khi solve 2 bài crypto100 một cách nhanh nhất có thể, sau đó là ngồi ngậm hành 2 bài crypto300 và crypto400. Bài 300 thì về ECC, do kiến thức mình còn hạn chế nên mình loại bài này khỏi tầm mắt ngay và lao vào crypto 400 ( thực ra cả 2 bài đều 300 points nhưng mãi vẫn chưa đội nào solve được bài SuperSecureServer nên tác giả đã quyết định tăng lên 400 points + hint để cho hấp dẫn hơn =))) ).
Do mình cũng đã làm một số bài kiểu connect server thế này nên việc lựa chọn giữa 2 bài crypto300 mình chọn bài này và focus hết quãng thời gian còn lại. Nhưng kết thúc cuộc thi vẫn ngậm ngùi ra về :(
Hiện tại thì challenge đang chạy và bạn có thể connect và thử sức:
nc meepwn.team 54321
Thử register với uname = abc và password = abc
Thì server trả về đoạn credential:
Tiếp tục thử login lại với credential server trả về nhưng Invalid creds! :sad:
=> Điều này có nghĩa là mỗi session cred được add hoặc gán theo một cách nào đó với một đoạn random
Còn nếu login trên cùng 1 session thì Valid =)). Qua tầm 30 phút thì nhận ra là server không đặt timeout, điều này có nghĩa là hoàn toàn có thể thực hiện trên cùng 1 session mà chẳng cần quan tâm cái random kia =)))
Decode base64 đoạn creds ta có:
uname=abc&passwd=616263&ROLE=0&sign=45856fd53559a50f9b7ed97b50ebafb827891480
Nhìn sơ qua ta thấy được rằng:
1) passwd được encode('hex')
2) Hai args có vẻ quan trọng trong việc login là ROLE và sign
3) đoạn random mà mình đề cập có thể gán vào sign bằng cách nào đó (sau khi có 2 hint thì mình đoán sign này được form như sau: sha1(random+'uname=abc&passwd=616263&ROLE=0').hexdigest())
Check hash type thử thì mình biết được đây là sha1
Đến đây mình nghĩ sẽ modify ROLE=1 (maybe uname=admin) => Solved
Nhưng fail :(, mình đã lãng quên cái arg sign. Đến đây mình bí hoàn toàn và sau nửa thời gian, author đi dạo một vòng phòng thi thì mình liền gạ hỏi hint =)) cơ hội vcl
Author cho hint đầu là bài crypto200 SVATTT Quals 2015 do a l4w.io ra, và hint thứ 2 là WU của author về một lỗi tương tự trong đề matesctf =))))
Đọc qua 2 bài trên thì mình mới biết là hash length extension :( . Nhưng cũng nhờ WU đầy chi tiết của author mà mình đã modify thành công creds với uname = admin và ROLE=1.
Nhưng cuộc đời không như là mơ. SERVER CHỈ TRẢ VỀ NỮA FLAG :). Đến đây ta phải modify ROLE=2 để tiếp đến phần tìm part2 của FLAG.
Đến đây thì mỉnh ngậm hành cho đến hết giờ :(
view-source: link
Xem qua source thì ta thấy như sau:
- ta cần nhập vào 8 bytes(encoded hex) để tiến hành mã hóa double DES
- nếu như E( pad(key), E(pad(passd),uname) ) == 'iamgroot' thì server sẽ trả về cho ta part2 của flag
- uname và passwd ta có thể controll do server chỉ check ROLE=2 ở part2
- ta controll luôn cả key (input 8 bytes encoded hex)
Sau một lúc nỗ lực google thì tìm ra 1 bug là semi-weak keys
Có nghĩa là sẽ tồn tại một cặp key k1,k2 sao cho:
E(k1,E(k2,plaintext)) == plaintext
Bạn có thể đọc thêm tại đây : link
Lúc này hoàn toàn có thể encrypt với cặp key thỏa semi-weak keys:
E(k1,E(k2,'iamgroot')) == 'iamgroot'
Việc còn lại là exploit thôi =))
Sau khi làm tay thì mình cũng tự code exploit (khá là sida khi không chạy được 1 seesion để ra cả 2 part, chịu khó chạy 2 lần nhé =)))) )
Here my script: link
Kết: Cảm ơn Khoa mạng máy tính và Truyền thông Trường đại học CNTT, cũng như là các diễn giả đã mang lại những kiến thức mới cũng như là những kỉ niệm khó quên cho mình, cảm ơn các a thành viên meepwn team và UIT-r3s0L đã ra các challenge hay. Hi vọng năm sau mình sẽ có thêm cơ hội để tiếp tục tham gia SEC DAY cũng như là SEC GAME một lần nữa.
Thanks for reading and have a nice day !!!