[Whitehat_Challenge04] Make Team IA great again!!!

Team IA
Team IA
Aug 28, 2017 · 6 min read

Đàn ông con trai nói ít làm nhiều đê, vào luôn bài đầu tiên cho nó nóng.

Misc01

A python code was encoded. Please try to get flag from this file.Download file here:http://material.wargame.whitehat.vn/challenges/4/Misc01_D7210F18B2D5D162E259C0BE089D4090.zip

Sau khi download file về, giải nén ra ta thấy 1 file đc encode dưới dạng base64:

Tiến hành decode thôi:

base64 --decode python_beginer.py
exec(chr(101)+chr(120)+chr(101)+chr(99)+chr(40)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(56)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(57)+chr(55)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(51)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(51)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(54)+chr(49)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(51)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(51)+chr(52)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(57)+chr(57)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(52)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(52)+chr(57)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(54)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(57)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(57)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(52)+chr(57)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(54)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(52)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(57)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(50)+chr(49)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(54)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(52)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(52)+chr(56)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(48)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(57)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(52)+chr(57)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(57)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(49)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(50)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(51)+chr(52)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(52)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(53)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(48)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(49)+chr(54)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(51)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(50)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(56)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(57)+chr(55)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(51)+chr(41)+chr(43)+chr(99)+chr(104)+chr(114)+chr(40)+chr(49)+chr(48)+chr(41)+chr(41))

Khi mang đoạn mã python này vào chạy trực tiếp thì có lỗi như sau :

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
File "<string>", line 2
priint flag

Không hiểu vô tình hay hữu ý, tác giả đã đánh thừa 1 chữ "i", thôi thì không thể exec trực tiếp được thì mình print. Check it out:

exec(chr(102)+chr(108)+chr(97)+chr(103)+chr(32)+chr(61)+chr(32)+chr(34)+chr(115)+chr(99)+chr(114)+chr(49)+chr(112)+chr(116)+chr(95)+chr(119)+chr(49)+chr(116)+chr(104)+chr(95)+chr(112)+chr(121)+chr(116)+chr(104)+chr(48)+chr(110)+chr(95)+chr(49)+chr(115)+chr(95)+chr(101)+chr(122)+chr(34)+chr(10)+chr(112)+chr(114)+chr(105)+chr(105)+chr(110)+chr(116)+chr(32)+chr(102)+chr(108)+chr(97)+chr(103)+chr(10)

Bạn nào ra đề quả thật biết làm nản lòng người chơi ngay từ bài đầu tiên, đến đây rồi con không cho flag. Ok fine, exec --> print và lấy flag nào:

flag = “scr1pt_w1th_pyth0n_1s_ez”
priint flag
Submit: WhiteHat{6c67866ad716bc4bb5ff9e7a09d15cb04707f238}

Crypto01

Decode the image to get an answer. Tool: GoogleDownload file here:http://material.wargame.whitehat.vn/challenges/4/Crypto01_6B9F0BC772601E6C6770473DD97E3005.zip

Tiếp tục công cuộc download và giải nén xem chúng ta thu được gì :( :

Cũng có vẻ đơn giản. Nhìn như kiểu chữ tượng hình thời đại Ai Cập 10000 năm vê trước. Tìm hình ảnh này với "tool" mà tác giả đã gợi ý.

Rất bất ngờ đây đúng là chữ tượng hình như mình đã phán đoán, cụ thể là kiểu mã hóa là Gnommish, ngôn ngữ của thần tiên =))))).

Decode và thu được thông điệp sau:

flag is have fun
Submit: WhiteHat{eeb5dd49132e82a02cacec1c0fc4889bd6373192}

Pwn02

Thật sự thì tác giả của cuộc thi tạo cho mình một cảm giác người đó vô cùng lạnh lùng và cù nhây cũng k kém. Đề bài tiếp tục vô cùng ngắn gọn và súc tích

Can you inject me?nc chall04-pwn02.wargame.whitehat.vn 26082

Kinh nghiệm của a #K4iTungPham truyền lại thì cứ cứ gặp blackbox là truyền NULL byte thử xem response ntn.

Văng lỗi tùm lum luôn kìa. Về ý tưởng của đề bài có vẻ khá giống 1 bài mình đã từng làm, mấu chốt là sử dụng các Built In functions của python. Mình sẽ truyền thử vào str(vars()) và xem kết quả trả về ntn:

Đúng như dự đoán thì mấu chốt sẽ là sử dụng python Built in function. Tuy nhiên khi mình sử dụng hàm open(__file__).read() để lấy nội dung của file python đang chạy thì lại không khai thác được gì nhiều.

Hướng đi thì chắc chắn là đúng rồi, chỉ có điều có lẽ sẽ có tips n tricks gì ở đây thôi :'(. Đọc lại thêm về built in func thì có hàm __import__ rất là hay ho.

Đến đây thì mình sẽ dùng os.listdir() của python, list ra tất cả các file đang có trong thư mục /home/inject2 và nếu may mắn thì sẽ có flag trong các file này. Go go power rangerssssssssssssss:

Ahihi flag kìa, ez as pie, thank you for ez points, should we talk now.

Flag: __S!mplePython__
Submit: WhiteHat{ecba22de83a9dec71f7bef247f77299d32728819}

Crypto02

Phong cách vẫn vô cùng lạnh lùng của tác giả với len(đề_bài) = 56 kí tự.

Find flag in http://chall04-crypto02.wargame.whitehat.vn

Follow the link và thu được source code :

Sau khi nghiên cứu source code được cung cấp thì chúng ta biết được workflow của bài này như sau :

Input(Dưới dạng Base64) --> Plaintext = Salt + Input + Flag --> Padding Plaintext --> Encrypt AES ECB Mode

Với AES ECB thì đa phần sẽ nhằm vào điểm yếu của ECB Mode.

Việc đầu tiên trước khi tiến hành mã hóa đó là padding. Sau khi được pad, plaintext được chi ra thành từng block với độ dài là 16 bytes.

Điểm yếu chết người với mode ECB của hàm mã hóa AES đó là nếu 2 block có cùng giá trị thì sau khi được mã hóa, chúng vẫn tiếp tục có giá trị bằng nhau. Cụ thể hơn nhé:

Plaintext = Pblock[1] + Pblock[2] + ... + Pblock[n]
giả sử trong plaintext: Pblock[2] = Pblock[3]
Ciphertext = Cblock[1] + Cblock[2] + ... + Cblock[n]
==> Cblock[2] = Cblock[3]

Lý thuyết là như vậy, áp dụng vào bài này như thế nào đây ???

Việc đầu tiên khi làm với một hộp đen thì chúng ta nên tiến hành fuzz 1 chút và quan sát kết qủa trả về, hi vọng trong đó sẽ có bất thường.

Quan sát thấy khi input = 'A’*8 thì độ dài của ciphertext bắt đầu thay đổi, cụ thể hơn là dài thêm 16 bytes = 1 block. Điều này có nghĩa với len(input)=8 thì s = 'something!' + input + flag = 32 bytes, tức là được chứa vừa đủ trong 2 blocks, block '39f94b1a93af341e248b31fa23669c5b' chính là padding được thêm vào trong quá trình pad plaintext.

Từ đây ta có thể tính được độ dài của flag :

3 * 16 = len('something!') + 8 + len(flag) + 16 
==> len(flag) = 14

Tiếp tục, từ đây chúng ta sẽ tiến hành bruteforce từng kí tự có trong flag, từ flag[0] --> flag[13]. Tại sao có thể làm như vậy ư, hãy nhìn nhé:

Input = ('something!' + 'a'*6) + ('a'*16) + ('a'*16) + flag
Plaintext = Input + chr(2) * 2 (pad thêm 2 bytes)
Ciphertext = Cblock[0] + Cblock[1] + Cblock[2] + Clbock[3]

Như đã giải thích ở trên, với Input có Pblock[1] = Pblock[2] như trênthì hiển nhiên Cblock[1] = Cblock[2].

Khi giảm số lương kí tự 'a' truyền vào ở Pblock[2] đi 1 và thay kí tự cuối cùng trong Pblock[1] là 1 kí tự để bruteforce. Ta có:

Pblock[1] = 'a'*15 + bruteforce
Pblock[2] = 'a'*15 + flag[0]

Công việc còn lại là tiến hành kiểm tra tất cả các kí tự có thể, khi nào ciphertext trả ra có Cblock[2] = Cblock[1] thì quá trình bruteforce thành công, flag[0] = kí tự tương ứng đang brute.

Tiếp tục lặp lại từ flag[1] --> flag[13] chúng ta sẽ thu được flag.

À quên không nói, mình lấy bảng chữ cái giới hạn là những kí tự có thể in được, alaphabet = string.printable

Source Code:

Kết quả không ngoài dự đoán, GGWP

Flag Easy_point_c13
Submit WhiteHat{1ffe5f92c181a89dd267cfd4b6ec2c80c6202391}

P/s : Thực ra ban đầu khi làm bài này, mình k nghĩ là len(salt)=len(something!)=10 đâu. Mình có ngồi tính toán lại bằng tay, cơ mà sau một thôi một hồi thì cũng thu được len(salt)=10. Vậy nên mặc định trong bài này mình coi như len(salt)=10 để tính toán.

Tuy nhiên đừng nhầm tưởng là Salt = ‘something!’ nhé các bạn :D.

Last but not least, mark my worlds: We will comeback stronger and better.

  • --Thank you for your attentions--
  • Author : H3xX0r

Team IA

cTf Team

)

Team IA

Written by

Team IA

Team IA

Team IA

cTf Team

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade