Hướng dẫn php serialization root me - php serialization root me

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: //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

TeamWriteUp
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{th2s_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 //en.wikipedia.org/wiki/Sound . . . . . . . . . . . . . . . and this one //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

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

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

//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òn gì vui hơn ra đề khiến các bạn cay cú muốn try hard :]].

Các bạn có cảm thấy giải ra 1 challenge mà không cần bất kì sự trợ giúp nào vui không? Nếu cảm thấy vui + cay cú, thì hãy tiếp tục làm đi, còn nếu chưa cũng tiếp tục chơi đến khi nào bạn cảm thấy cay cú vì bản thân mình cũng là thằng nhóc chơi vì thứ hạng thôi, nhưng khi bạn đẩy bản thân vào một môi trường “chojvjkjenthuc” thì các bạn sẽ thấy thứ hạng chả là mẹ gì :]] Yeah và đó cũng chỉ là lời từ mình thôi, nếu bạn cảm thấy cần học hỏi thì cứ học hỏi, còn nếu thấy ừ trời thằng này gà với nói xàm bỏ mẹ, thì cũng không sao, những lời thằng gà hơn bạn nói cũng sẽ giúp bạn vào 1 ngày nào đó, thằng dở hay thằng giỏi thì cũng đều là thầy nếu bạn muốn học :]

À mà nếu bạn chưa đạt được giải nào trong cuộc thi FUCTF lần này thì cũng đừng nản, yeah ai cũng có con đường riêng, nếu muốn bạn có thể dùng cách nào đó để đạt giải nhưng 5-10 năm sau thì sao? Chả ai nhớ tới bạn đã đạt giải đó, thậm chí cả khi bạn đã tự lực thì người ta cũng chỉ nhớ đến bạn của lúc trước thôi. Lúc trước mình cũng vậy, chỉ cố có được cái giải to to thôi, làm mọi cách để có: xin hint, xin poc solve, thậm chí là xin flag, nhưng cũng nhờ đó tìm được vài người bạn nước ngoài khá tốt, như Forensic, 1 ít Web, 1 ít Crypto mình học từ 1 người bạn [Unblvr của OTA], giải không ra bạn có thể hỏi bất kì ai, chả sao cả, quan trọng là sau đó bạn học được gì thôi. Nếu phải chọn tự build 1 team mới và tiếp tục làm 1 thằng dự bị của team 09 thì yeah, còn gì sướng bằng ở trong 1 tập thể chơi vì kiến thức chứ, nếu team bạn vẫn đang theo tiêu chí đó thì tốt còn không thì chả sao cả, bất cứ khi nào bạn cũng có thể thay đổi suy nghĩ. Chơi CTF để vui, để có kiến thức mà, đúng không?

Lan man thế là đủ rồi, cảm ơn bạn đã đọc tới đây, FUCTF là 1 giải truyền cảm hứng về CTF và cũng như tinh thần của nó, team 09 luôn chào mừng bạn đến kênh Slack của bọn mình FUCTF Slack à và nhớ đăng kí bằng mail @fpt.edu.vn.

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

Bài Viết Liên Quan

Chủ Đề