SvATTT 2017 Finals — Jeopardy Writeups
Writeup vòng chung kết SV ATTT 2017 của đội giải nhì N/A. Bài viết gốc có thể xem tại đây.
Một cuối tuần thật vui khi những nhẫn giả sinh viên tụ họp lại với nhau. Kì thi thì cũng diễn ra rồi, giải thì cũng trao rồi. Mình sẽ kể câu chuyện theo dòng thời gian từ lúc sau khi thi vòng loại Sinh viên với An toàn Thông tin. Rồi sau đó lại xàm xí một chút về bản thân. À, trước hết, mình khá chắc chắn rằng sau cuộc thi này, các đội đều bị ám ảnh bởi tiếng còi xe cứu thương và bài Lạc Trôi
Trước khi thi vòng loại, team mình được đội VNSEC recommend tham gia kì thi Cyber Sea Game nên cùng một lúc mình phải lo cho 2 cuộc thi. Hai cuộc thi cực kì gần nhau, hôm qua mình bay từ Đà Nẵng về Hà Nội, và mai mình sẽ bay từ Hà Nội đến Bangkok. Vì vậy, đội mình phải bàn bạc chiến thuật rất kĩ để không mắc phải sai lầm nào trong khi thi. Do kì thi chung kết ở Đà Nẵng, mà mình chưa được đi thi chung kết SvATTT ở nơi nào khác ngoài Hà Nội, nên mình rất muốn được “đi chơi” thử xem nó như thế nào. Vòng loại cũng không phải điều gì quá khó khăn nên mình tính là cứ thể hiện hết sức có thể và cố gắng ở vòng chung kết.
Hôm thi vòng loại, mình đã chuẩn bị sẵn quần áo từ trước để hôm sau đến chỉ để chụp ảnh thôi :)) Sau hôm thi đó, team UET và BK có rủ nhau đi ăn Pizza, được giao lưu với team BK, có những thành viên của ACEBEAR, mình đã thấy team này là một team khá mạnh, có thứ hạng hơn mình trong kì thi Codeblue CTF diễn ra ngay trước kì thi SvATTT final, có thể là một đối thủ đáng gờm ở vòng chung kết. Thêm nữa, ở miền Bắc còn đội PTIT_bobo. May mắn, PTIT_bobo có những thành viên của Piggybird nói riêng và cũng là đồng nghiệp ở Viettel nói chung. Vậy nên ý tưởng của mình ban đầu là sẽ cùng PTIT_bobo bắn r3s0L — đối thủ đáng gờm nhất. Bên cạnh đó, team KMA — Bl4ckH0l3 có những thành viên rất mạnh nên cũng rất đáng lưu ý.
Rồi sau đó, đội mình chuẩn bị đi thi 2 cuộc thi liên tiếp, mình đã giặt hết tủ quần áo để có thể dùng đủ cho 7 ngày :)) Thứ 6, đội mình bay vào Đà Nẵng. Sáng hôm sau thi chung kết, bọn mình bắt đầu cuộc thi bằng tâm lý thoải mái nhất.
Những giờ đầu tiên, khi các đội khác chưa có điểm, đội mình đã giải được 2 bài jeopardy và thử tấn công bài deamon để kiếm những điểm số đầu tiên. Mãi về sau, @john mới nhận ra là deamon noteservice khá dễ. Dù có hơi muộn, bọn mình cũng ghi được những điểm Total Point đầu tiên. Khi ấy, team mình đang xếp thứ 4.
Sau bữa cơm trưa khá ngon mà team chủ nhà — ĐH Duy Tân cung cấp, mình mới hỏi với teammate là “Bảng điểm yên ắng nhỉ, thế bây giờ có bắn không?”. Với 3 phiếu còn lại của team vote rằng “Thế nào cũng được”, mình được toàn quyền quyết định về việc bắn theo chiến thuật như nào. Khi ấy, mình có 2 bài jeopardy. Mình sẽ bắn r3s0L và BK, nhưng bắn thế nào? Với hai bài jeopardy với writeup ở dưới, mình đánh giá Onion khó hơn SflagContract, có thể là do mình lần đầu tiên firstblood crypto chăng? Khi đó mình lấy Onion tấn công r3s0L và SflagContract tấn công BK (hai đối thủ đáng sợ nhất mà mình đánh giá trước kì thi). Ngay sau đó, mình đã nhầm. Mình có thể chờ một chút và tấn công Onion vào BK thì điểm số có thể sẽ khác. Cân nhắc rằng, r3s0L đã giải được 1 weapon và có thể bắn mình bất cứ lúc nào.
Ngồi không 3 tiếng, không thể giải được bài deamon crypto, @mao và @john cũng khá là choke khi lao vào 2 bài khó. Đội mình khá là “tự trôi” trên bảng xếp hạng. Đến những tiếng cuối cùng, zoro@UIT bị PTIT_bobo bắn. Khá là chắc kèo rằng team mình và PTIT sẽ giành giải nhì, trừ khi @john ra được bài pwn nữa để cạnh tranh với r3s0L.
Đến vài round cuối cùng, mình giải được ra bài Shellcap, thực ra bảng điểm đã chắc kèo rồi và mình không muốn có sự thay đổi trong bảng xếp hạng nữa. Mình có hỏi các đội khác xung quanh rằng: “Các bạn có muốn nghe Lạc Trôi không ạ?” Thế nên sau đó, mình đã bắn r3s0L. Có một điều đặc biệt cuối giờ, uẩn khúc, thị phi, mọi câu hỏi từ BTC dồn về phía mình: “Tại sao lại bắn Axe làm gì hả em?”, “Tại sao không bắn PTIT để giành #2?”. Đây là ý tưởng của mình:
- Nếu bắn PTIT để lên vị trí thứ 2, rất có khả năng Bl4ckH0l3 sẽ lên giải nhì, và tiền thưởng cho giải ba khá ít so với giải nhì 🙂 Trường mình thì lại không “hỗ trợ” gì cho các sinh viên có đam mê về CTF, chỉ “hỗ trợ” các đội thi ACM nên thứ hạng đối với mình nói riêng với cả team nói chung không quan trọng lắm.
- Các bạn có nhận thấy rằng website VNISA rất ưu ái r3s0L không? Mình chỉ muốn bắn r3s0L để cho các bạn đỡ nhiều điểm thôi. Chẳng lẽ sau cuộc thi, các mặt báo sẽ viết title “Đội r3s0L của trường Đại học Công nghệ Thông Tin — TPHCM giành chiến thắng với số điểm gấp 4 lần đội giành giải nhì” ?
Và UET và PTIT cùng giành giải nhì 🙂 Một cuộc thi rất hay, rất gay cấn, rank thay đổi theo từng round, và những pha attack Trạc Lôi đến thót tim. Đây cũng là one last ride của đội N/A. Cảm ơn @quangnh89, @g4mm4, @peter đã ra những challenge rất hay. Cảm ơn @superkhung đã code client rất đẹp trong một khoảng thời gian ngắn. Cảm ơn đồng đội @john, @mao, @milu đã sát cánh bên mình. Chúc mừng @bomotodo, @bit, @anhdaden, @ducnt đã giành chiến thắng thuyết phục.
À, phần mình xàm về các thứ xung quanh cuộc sống thì để sau nhé 🙂 See you later.
1. SflagContract
[link]
Đầu tiên, trước khi BTC release đề, bọn mình được download trước client để thử đăng nhập và mình có nhìn thấy được description của đề. Vậy nên bọn mình làm bài này trước.
Trong link này hầu hết là các hàm, và không có gì hay ho cả, trừ đường link kia. Vậy ta bấm vào thôi nhỉ.
Ta thấy được transactions gần nhất (Age có thể khác) có TxHash là 0xf540b4… có vẻ như là BTC đã dàn xếp từ trước. Lại thử bấm vào xem có gì vui không.
Sau khi “nghịch nghịch” một chút, ta có flag.
Magic 🙂
2. Onion
Offline challenge. Can generate challenge set for each team, prevent sharing.
File: final.svattt.org/challs/onion.zip
Vòng chung kết này có mỗi 2 bài crypto. Vậy là cũng nhiều so với “mong đợi” của mình là chẳng có bài crypto nào. Vậy thì bắt tay vào làm thôi 😀
Dịch ngược code, ta thấy:
- FLAG gốc có độ dài 72 (chắc là để mã hóa cho nhiều)
- Hàm process() chuyển FLAG về dạng binary 01, và chia ra thành các số nhỏ hơn với size = 9 (từ 0 đến 511)
- Hàm transform() thay đổi các số đó bằng một cách kì diệu
- Hàm enlarge() cộng số đó lên 0x636f đơn vị (chắc để dọa các bạn)
- Sau đó tính equation theo cặp (flag[i],flag[i+1])
Bài này không hẳn là crypto, chỉ là ACM với một chút steganography đơn giản. Dịch ngược lại thì sẽ có flag 😀
Cách làm của mình là brute để giải phương trình, do các số chỉ có giá trị từ 0..511 nên độ phức tạp của code là O(2¹⁸) là khá nhỏ so với các bài ACM thường. Sau khi có FLAG, ta dịch ngược đoạn mã lại và có FLAG ban đầu.
Đây là code của mình [link]
3. Shellcap
Ghost in the shell. Shell in the cap. Submit svattt{secret hash}
File: http://final.svattt.org/challs/shellcap.pcapng
Hint: Shellcode is splitted into packets. Format: Offset|Data
Recover the shellcode, disassembly and find the secret hash.
Đây là một bài forensics kết hợp với reverse. Gặp file pcap, ta mở luôn nó bằng Wireshark cho nóng nhỉ.
Gặp nhiều TCP thế này thì tội gì không Follow TCP Stream 😀
Với mỗi packet, ta thấy bên đỏ gửi đi 3 bytes. Dễ thấy rằng, bytes đầu tiên chỉ là 0x01, 0x02, 0x03, 0x04 nên ta đoán được đây có thể là một loại offset nào đó. Bên cạnh đó, ta thấy packet cuối cùng có tên mã là 2129.
Để ý thấy, nếu trừ 1 packet đầu do thiết lập kết nối TCP thì còn 2128 packet ~ 2128 bytes ? Nhưng ngẫu nhiên, ta thấy số 0x0422 ở packet ngay phía trên “là lạ”. Trùng hợp một nỗi, 0x0422 = 1058 ~ (2128/2). Thêm hint từ đề bài cho nữa, mình khi đó đoán là có thể offset|data thì offset có thể là 12 bit hoặc 16 bit. Mình thử parse data ra thì nó được đoạn mã bắt đầu bằng 0x558B. Bằng “phương pháp nghiệp vụ”, mình biết ngay đó là shellcode chuẩn =)) [code parse]
Thế là ném vào IDA thôi 🙂
Đoạn mã trên cùng ta có thể thấy được là nó làm nhiều thứ gì đó mà bạn phải học assembly thì mới hiểu được :)) Tua xuống đoạn cuối, ta thấy hình như nó so sánh xem hash có phải đúng không, nếu không đúng thì quit.
Thế thì mình thử ‘grep’ lại các byte đó thôi 😀
Ghép tất cả lại, ta được flag: svattt{59bde2468ac7398fb6ead5be7b6525a63608059d}
MAGIC 🙂
4. shcat
ssh test@128.199.179.111 pw:goodluckguys
Thực ra team mình chưa làm được bài này trong kì thi, nhưng mình bị “một đội nào đó” bắn bởi bài này nên mình rất muốn biết xem nó là thế nào. SSH tới server đó, ta có được một vài thông tin cơ bản.
Flag rõ ràng nằm trong file flag, nhưng ta không có quyền đọc nó, chỉ có user “svattt” mới đọc được. Thêm vào đó, ta đọc trong /etc/passwd có một thứ hay ho.
Về cơ bản, mình hiểu rằng khi đăng nhập, user “test” sẽ chạy file /bin/bash, còn user “svattt” sẽ chạy file /home/svattt/shell. Bên cạnh đó, file “shell” này cần một argument nếu không sẽ bị coi là h4x0r 😦 Vì vậy ta thử “cat” một chút xem sao. Hmm, password là gì nhỉ? “goodluckguys” ?
MAGIC 🙂
Originally published at minhtt159.wordpress.com on November 19, 2017.