แข่ง CTF ครั้งแรก : Thailand CTF Competition 2018

Nisaruj Rattanaaram
3 min readNov 11, 2018

--

จบไปแล้วนะครับกับการแข่งขัน Thailand CTF Competition 2018 ซึ่งจัดโดยสำนักงานพัฒนาธุรกรรมทางอิเล็กทรอนิกส์ (องค์การมหาชน) หรือ สพธอ. ภายใต้กระทรวงดิจิทัลเพื่อเศรษฐกิจและสังคม เพื่อเฟ้นหาทีมที่เป็นตัวแทนประเทศไทยไปแข่งในงาน Cyber SEA Game 2018

CTF คืออะไร?

CTF มาจาก Capture The Flag ในที่นี้ไม่ได้หมายถึงโหมดของเกมแต่อย่างใด แต่เป็นการแข่งขันเกี่ยวกับ information security โดยหลักๆจะมีสองประเภทได้แก่ แบบ Jeopardy เป็นการหาคำตอบที่เรียกว่า ‘flag’ ซึ่งซ่อนอยู่ในโจทย์ด้วยวิธีการต่างๆ กับ Attack/Defense ซึ่งเป็นการแข่งโดยแต่ละทีมจะมีเครือข่ายที่มีช่องโหว่ แล้วให้ทำการอุดช่องโหว่ของตัวเองและเจาะช่องโหว่ของทีมอื่น

CTF First Time

และเนื่องจากผมได้ไปเห็นโพสของเพจ สอนแฮ็คเว็บแบบแมวๆ เกี่ยวกับการแข่ง Thailand CTF 2018 บวกกับเทอมนี้ก็ได้ลงเรียนวิชา Individual Study ในเรื่องของ Penetration Testing และได้ลองทำโจทย์พวก CTF มาเล็กน้อย เพื่อเป็นการทดสอบความรู้ที่สะสมมาตลอดทั้งเทอม เลยชวนเพื่อนที่เรียนด้วยกันฟอร์มทีมลงสมัครซะหน่อย นับเป็นการแข่ง CTF ครั้งแรกของผมและเพื่อนๆ ช่วงสัปดาห์ก่อนแข่งก็เริ่มฝึกโจทย์ของ picoCTF 2017/2018 (ส่วนตัวชอบเว็บนี้เพราะคิดว่าโจทย์เหมาะกับผู้เริ่มต้นดี และก็มีคำใบ้ให้ด้วย) สุดท้ายเก็บมาได้ 5 ข้อ 500 คะแนน ถือว่าได้มากกว่าที่คิดไว้นิดหน่อย เย่ๆ ヽ(;▽;)ノ ข้างล่างนี้จะเป็น writeup ข้อที่ทีมเราแก้ได้ เผื่อจะเป็นประโยชน์ต่อคนที่สนใจครับ

50 — Des oeufs

Description: Download
Category: Forensics

เอาไฟล์ที่ได้เข้า Hex Editor จะสังเกตว่ามีชื่อไฟล์อยู่หลายไฟล์ และโครงสร้างก็ยังคล้ายๆไฟล์ zip แถมข้างบนสุดมีคำว่า ALZ จึงคิดว่าต้องเป็น Archive file (ALZip) เลยเปลี่ยน extension เป็น .alz แล้ว extract file ออกมาได้โฟลเดอร์ที่มีชื่อสัตว์นานาชนิดรวมทั้งหมด 11 โฟลเดอร์ แต่ละโฟลเดอร์มีไฟล์ New Text Document.txt แต่ละไฟล์ประกอบด้วยคำต่อไปนี้

You _Arch _Can _The _File! _Go ive _So _Great _Yes! lved

เลือกคำที่มาจากโฟลเดอร์ของสัตว์ที่ออกลูกเป็นไข่ (เพราะชื่อโจทย์คือ Des oeufs แปลว่าไข่ไงล่ะ!) แล้วนำมาเรียงเป็นประโยคได้เป็น You_Solved_The_Archive_File!

Flag: THCTF{You_Solved_The_Archive_File!}

สาระ: ALZip มาจากภาษาเกาหลีคำว่า ‘aljip’ ซึ่งแปลว่าไข่

100 — x=?

Description: solve admin password. Download
Category: Web

พอเห็นไฟล์ HTML ก็กดดู source code ตามเสต็ป เลยสังเกตได้ว่ามีการใช้ javascript ในการตรวจสอบ login โดยมี user คือ administrat0r นอกจากนี้โค้ดยังมีการเช็ค password โดยใช้เงื่อนไขดังนี้

สำหรับทุก i ตั้งแต่ 0 ถึง len(user)-1 และ flag = [1983,2176,3772,4751,5246,1391,6911,3848,4220,2953,2340,944,3764]

จากนั้นแก้สมการหา pass[i] ได้เป็น

นำมาเขียนสคริปต์ python

flag = (1983,2176,3772,4751,5246,1391,6911,3848,4220,2953,2340,944,3764)
user = "administrat0r"
result = ""
for i in range(len(user)):
result += chr((2*(flag[i]+1024)//ord(user[i]))-2*i)
print(result)

Flag: THCTF{>>Thj$~FL@&<<}

150 — Leakage

Description: What is password of fobos_88@yahoo.com ? Password is flag value
Category: Misc

ตามชื่อโจทย์เลยครับ เราต้องหาพาสเวิร์ดของอีเมล์นี้ซึ่งหลุดมาจากไหนสักที่ เริ่มจากเช็คว่ารหัสของอีเมล์นี้หลุดมาจากเว็บไหนโดยเข้าไปเช็คที่เว็บ haveibeenpwned พบว่าไปหลุดที่ Exploit.ln จากนั้นลองไปค้นไฟล์พาสเวิร์ดที่หลุดมาปรากฏว่าไปเจอลิงก์โหลดใน reddit เข้า (ประมาณ 10GB) พอโหลดมาก็ค้นหาสตริงด้วยคำสั่ง grep -r “fobos_88@yahoo.com” จะเจอ fobos_88@yahoo.com:16101988

Flag: THCTF{16101988}

150 — Focus on blockchain transaction

Description: 0x053D4d46afF534B4495407B2934ff35d4a92EA4C
Category: Misc

จาก description ที่ให้มาก็คือ Ethereum Address อันนึง ซึ่งโจทย์บอกว่าให้โฟกัสที่ transaction เลยลองเข้าไปดูในแต่ละ trans สังเกตเห็นว่าตรงส่วน Input Data มีลักษณะเป็น hex ที่แปลงเป็น ascii ได้ เลยโหลดข้อมูล trans ทั้งหมดในรูป csv แล้วใช้สคริปต์ python ดึงข้อมูล input ออกมาทุก trans รวมกันได้เป็น

68615f326f72615f74695f692e5f6176655f7061735f74685f71696f6e2c69725f7043546e647274735f30756d7561632c5f65645f70617230667468616e6b5f796f66697377

หรือก็คือ ha_2ora_ti_i._ave_pas_th_qion,ir_pCTndrts_0umuac,_ed_par0fthank_yofiswไม่มีความหมายนั่นเอง อิอิ กำ

จากนั้นเลยสังเกตต่อว่าทุกๆ transaction ถูกส่งมาจาก address เดียวก็คือ 0x0d3865facf82fc52c7bd01dab3b34155dddf722f เลยลองทำด้วยวิธีการเดิมกับ transaction ของ address นี้ได้ hex ออกมา

77656c636f6d655f746f5f746861696c616e6e645f6374665f323031385f666c61675f666f725f746869735f615f7175657374696f6e5f69735f21212e5f77655f686176655f74687265655f70617274735f666f725f746869735f7175657374696f6e2c5f66697273745f706172745f69735f2254484354467b222e5f616e645f7365636f6e645f706172745f69735f22763174346c316b5f31735f345f63302d6630756e6433725f222e5f796f755f6d7573745f636f6d62696e655f656163685f70617274735f746f6765746865722c5f616e645f6c61737465645f706172745f69735f2230665f337468337233756d7d225f7468616e6b5f796f755f666f725f615f66696e64696e675f616e737765722e5f

แปลงออกมาเป็นอักขระ …

welcome_to_thailannd_ctf_2018_flag_for_this_a_question_is_!!._we_have_three_parts_for_this_question,_first_part_is_”THCTF{“._and_second_part_is_”v1t4l1k_1s_4_c0-f0und3r_”._you_must_combine_each_parts_together,_and_lasted_part_is_”0f_3th3r3um}”_thank_you_for_a_finding_answer._

Flag: THCTF{v1t4l1k_1s_4_c0-f0und3r_0f_3th3r3um}

สคริปต์ Web scraping

import requests as reqdef getInput(tx):
r = req.get('https://etherscan.io/tx/' + tx)
idx = r.text.find('</textarea>')
return r.text[r.text.rfind('>', 0, idx)+3:idx]
res = ''
f = open('/path/to/csv/file/data.csv', 'r')
f.readline()
for line in f:
line = line.split(',')[0].strip('"')
res += getInput(line)
print('HEX: ' + res)

50 — Simple Crypto

Description: Decode Me : I8[7I8M*L#9_V%9FK%=5V#H%A9,_G^AiE:_BM$,cH$,9DKAMYD00
Category: Crypto

หลังจากลองใช้ caesar แกะดูสักพัก บังเอิญสังเกตเห็นว่า 00 ตัวท้ายน่าจะเป็น == แล้วถอดต่อด้วย base64 อีกรอบ เลยนำรหัสมาถอดด้วย caesar แบบใช้คีย์เป็นตาราง ascii (Shift 13 ครั้ง) ได้เป็น

VEhDVEZ7Y0Flc2FSX2JBc0U2NF9lTkNvRGlOZ19pU19FQXNZfQ==

base64 แน่ๆ … ถอดออกมาจะได้ flag

Flag: THCTF{cAesaR_bAsE64_eNCoDiNg_iS_EAsY}

สรุป

และนี่คือ 5 ข้อที่ทีมเราแก้ได้ครับ หลังจากนี้ก็ต้องไปแสดงวิธีแก้โจทย์ให้อาจารย์ดูอีกที (เพราะเป็นส่วนหนึ่งของการบ้านสัปดาห์นี้ 555) ถ้าหากพบข้อผิดพลาดประการใดสามารถบอกได้นะครับ สุดท้ายนี้ผมหวังว่าผู้อ่านจะได้รับสาระจากบทความนี้ไม่มากก็น้อยนะครับ สวัสดีครับ

--

--

Nisaruj Rattanaaram
Nisaruj Rattanaaram

Written by Nisaruj Rattanaaram

Cybersecurity Engineer | HTB CPTS, Sec+, PenTest+, CEH | CTF Player

No responses yet