FUCTF Season 1

Lần đầu viết writeup dưới vị trí của tác giả, mong mọi ý kiến đóng góp từ mọi người Source code các challenge: https://github.com/matuhn/MyCTFChallenge

Mình sẽ viết mọi thứ dễ hiểu nhất có thể, vì giải này nhắm tới các bạn, những người vừa biết đến CTF, và tất nhiên mình cũng sẽ không solve mà chỉ viết ra hướng. Mình bản thân cũng chơi trước các bạn 1 năm và cũng đang lận đận thôi, thành viên team z3r0_n1ght nhưng những giải team đã đạt được không có công của mình trong đó, nên đừng blame mình chưa có gì, tội nghiệp mình… Writeup này chủ yếu miên man về các vấn đề không liên quan và chỉ hướng dẫn cách giải, các tiền bối nếu có đọc và thấy nói sai chỗ nào thì cũng bỏ qua cho em

Writeup của các đội chơi

Team WriteUp
FUHN_HolyCTF Link
FUHCM_EatSleepPoopRepeat Link
FUHCM_ch0jvjkj3nthUc Link
FUHN_ChoDongXuan Link

1/Baby Warmup

Bài này là bài mình viết dành riêng cho các bạn vừa tiếp cận với mảng web, vì giải này mục đích là thúc đẩy phong trào CTF của trường mình mà nhưng không hiểu sao có khá nhiều team đến gần cuối giờ mới solved bài này, kể cả team Top 1, Top 2 đã clear hết các bài khó :/

Walk through qua source code của bài này

Những thứ các bạn cần làm là sửa http header request thành POST, User Agent = ‘FUCTF Browser’ http header Referer có giá trị là 127.0.0.1, và giá trị cookie Privilege là ‘admin’

Để custom http header theo ý mình như thế này thì các bạn có thể dùng Burp Suite, hoặc curl

Flag: fuctf{w3lcom3_t0_w3b_w0rld!!!}

Btw có vài team đến đoạn cuối rồi submit cả cái base64 lên, mình hint là base64 thì lại submit fuctf{base64}… Tiếc cho 50 điểm, cũng là bài học luôn kiểm tra 1 string có phải dạng base64 hay không nha các bạn

2/ Only Dr.Strange can do this

Bài này mình code chóng vánh trước giờ thi 30p vì một vài sự cố với bài cũ, nhưng lại là bài có first blood chậm nhất trong các bài, mà cũng không biết bằng cách thần thánh nào đó, 1 đội đã tìm thấy writeup 1 bài tương tự nếu không muốn nói là giống y chang bài này, và đã xuất hiện cách đây 2 năm… Bài này ý tưởng từ việc học về 4 scope request, session, page, và 1 cái gì đó mình quên rồi trong giờ học Java Web ở trường, nhưng mà thôi bài này với bài kia không liên quan gì, chắc do ý tưởng gặp nhau nên nếu bạn nào có tìm được bài đó thì bạn đã học được cách Google để giải, còn phần mình thì mình đã biện hộ rồi…

Source Code:

Ở đây thì dễ dàng nhận thấy SESSION[‘number’] được lấy ra trước khi set, có nghĩa là cuối request thứ nhất sẽ set random number cho request thứ 2, theo vậy thì mình dễ dàng control được cho nó bằng null bằng cách gửi đi header không có Cookie PHPSESSIONID và param = empty string, khi đó type juggling diễn ra -> win

Link tham khảo

Flag: fuctf{th1s_1s_gu3ss_ctf}

Tản mạn 1 chút, trong lúc giải diễn ra và cả sau giải, có vài team report có trường hợp click liên tục vào guess thì ra flag, mình cũng ngồi suy nghĩ và ráng làm lại y chang vậy thì mình làm được 1 lần, tất nhiên là với cái khoảng random trong bài thì muốn ăn hên ra cũng không có thể nào khả thi cho việc 3,4 người cùng ăn hên 1 lúc, các bạn cùng tìm hiểu với mình xem Race Condition in PHP Session Và tất nhiên mình cũng không khẳng định đó là race condition vì nó nằm ngoài kiến thức của mình, chỉ là đó cũng là 1 cách, và còn có team giải được bằng Integer Overflow nữa

3/ Old School

Như description đã nói

I made a ping service for you guys. You can find this kind of system anywhere like root-me,... But 
this service has a difference to prevent hacker 

Bài này mình lấy idea từ root-me, và 1 report của Hackerone về việc RCE bằng cách dùng { để escape command và ‘,’ thay cho space. Nắm được cách bypass rồi thì sẽ có thể chọn curl nội dung trang index về hoặc nslookup mỗi 63 char về dns server hoặc up reverse shell, rất nhiều cách

Link tham khảo về bypass:

Hacker One

Một cách khác

Flag: fuctf{s0m3_t1m3_c0mm4nd_1s_3x3cut3d_but_y0u_c4n’t_s33!}

4/ Bet Bủng

Trước tiên (dành cho những bạn vừa tiếp cận) thì mình phải đọc về PHP Object Serialize

Bài này khi mua vé số thì sẽ được gen ra 1 vé số có dạng base64 Ví dụ: TzoxMToia2hvYWRlcHRyYWkiOjM6e3M6NzoiamFja3BvdCI7TjtzOjU6ImVudGVyIjtzOjI6IjExIjtzOjU6InZhbHVlIjtpOjEwMDA7fQ Vứt bừa vào 1 cái tool base64decode thì được: O:11:”khoadeptrai”:3:{s:7:”jackpot”;N;s:5:”enter”;s:2:”11”;s:5:”value”;i:1000;} Đây là dạng Object PHP Serialization, nếu bạn search google thì sẽ có rất nhiều writeup hướng dẫn cách bypass, ở writeup này thì mình sử dụng con trỏ Reference để bypass

O:11:”khoadeptrai”:3:{s:7:”jackpot”;N;s:5:”enter”;R:2;s:5:”value”;i:1000;}

Trỏ đến variable thứ 2 (trừ cái Object) để cho giá trị bet luôn luôn bằng jackpot Đem base64 xong đập vào /bet.php thì bạn sẽ dễ dàng win, chả quan tâm nó quay ra số gì luôn, nhưng để win thì phải mua được shiba. Shiba thì mình bán cả tỷ hay sao ấy (Mình thích Shiba mà :D)

Tới đây sẽ có 2 luồng suy nghĩ:

  1. Bạn sẽ tiếp tục ôm payload đó và brute banh xác để lên 1 tỷ
  2. Bạn sẽ tiếp tục sửa Object để được bet nhiều hơn

Ở cách thứ nhất thì cũng ok nhưng bạn sẽ mất khoảng 10000000 request hay sao đó :)))

Ở cách thứ hai thì điều đầu tiên bạn làm là sửa biến value đúng ko?. Nhưng bài này mình có gài thêm OTP, là 1 chức năng bị khóa, nhưng đâu có lí do gì mà mình code cả cái khung nhập OTP rồi disable nó đi đúng không? :/

Cứ sửa bừa object thành:

O:11:”khoadeptrai”:3:{s:7:”jackpot”;N;s:5:”enter”;s:2:”11”;s:5:”value”;i:99999999999;}

Đập vào, bùm, You need valid OTP to bet more…

Okay ngó qua trang market thì mình có bán Source, mua ngay thì được 2 file PHP

bet.php

buy.php

Okay dễ dàng nhận thấy Object ở file bet.php thì có $otp nhưng buy.php thì không (Tất nhiên rồi vì mình đang disable chức năng OTP mà :D)

Phần check OTP:

if ($obj->otp == (rand(0,50).'ilovedoge'.rand(0,99999999).'nottrytoguessthis'))

GuessCTF… Tất nhiên là không tìm cách đoán cho ra cái otp này rồi, PHP có 1 cái gọi là type juggling, như thế nào thì các bạn search Google nha. Chỗ này bypass bằng Type Juggling, có 2 cách 1 là dùng boolean variable (như cách của team EatSleepPoopRepeat) hoặc dùng type juggling so sánh number với string brute đến khi có win 999999999 -> win

Flag: fuctf{s3r1al1z3_1s_1nt3r3st1ng_r1ght?}

5/ dendakhongduong

Ye và đây là challenge 100 điểm mà mãi mới có first blood, chắc do đề guessing quá mức =))) Hint : I’m interested in this one https://en.wikipedia.org/wiki/Sound . . . . . . . . . . . . . . . and this one https://en.wikipedia.org/wiki/Raw_image_format

Như hint mình có ấn tượng với sound wave và cũng như là raw image. Nhưng ứng dụng cả 2 vào thì sao? Mình sẽ xem sound wave bằng raw file :)

Flag: fuctf{y0u_ar3_my_sug4r_sug4r}

6/ voLeeSongnghiBeautiful

Dẫn lại cái ảnh nào

Bài này khá nhiều người solve, do ra đề toang rồi

1 số Link tham khảo

https://www.computerhope.com/jargon/l/leastsb.htm

https://en.wikipedia.org/wiki/Bit_numbering#Least_significant_bit

https://github.com/RobinDavid/LSB-Steganography

Flag: fuctf{LSB_1s_one_kind_of_St3g0}

Bonus

Ra đề xàm quá nên…:(

Có những team 4h57, 4h58 vẫn tích cực request tới các bài của mình, mà vì 1 số sự cố mình mất logs rồi, nhưng yeah cảm ơn các bạn vì tinh thần đó, và cảm ơn cả những bạn vẫn làm sau giải

Khoảng 4h 10/06/2019, Hà Nội

Và cả Hồ Chí Minh

Cảm ơn các bạn vì đã tham gia FUCTF Season 1. Hẹn gặp lại!!!

Written on June 9, 2019