Server: https://www.ctfsecurinets.com/
Scoreboard: 
Rank: 
Challenges:
- [MISC] Sanity Check – 10 pts
- [MISC] HIDDEN – 200 pts
- [MISC] EZ – 331 pts
- [CRYPTO] Useless Admin – 869 pts
- [CRYPTO] MAZE – 952 pts
- [CRYPTO] RSA/Encoding errors – 1000 pts
- [PWN] Welcome – 416 pts
- [REVERSE] Matrix of Hell! – 999 pts
[MISC] Sanity Check – 10 pts

Kết nối kênh chat, có ngay flag

Flag: Securinets{PReQu@l$_2K19}
[MISC] HIDDEN – 200 pts

Nội dung web không có gì đặc biệt.

Viewsource cũng không thu được gì. Tuy nhiên nhìn kỹ trang web, chú ý trên thanh địa chỉ sẽ thấy biểu tượng ổ khóa với dấu cảnh báo, click vào thì browser báo ‘Connect Is Not Secure’, như vậy có gì đó không đúng với certificate của website này. Click vào xem chi tiết certificate thì có được flag

Flag: Securinets{HiDDeN_D@tA_In_S3lF_S3iGnEd_CeRtifICates}
[MISC] EZ – 331 pts

Không biết ‘WORD’ ở đây có ý nghĩa gì, nhưng tác giả gợi ý chúng ta đi tìm nó, rồi mã hóa với sha1 để thu được flag. Click vào link thì tải về được 1 file ảnh png.

Có thể flag được giấu đâu đó trong file ảnh này. Phản ứng đầu tiên là thử lệnh strings xem có thu được gì không. Kết quả là … không thu được gì. Như vậy bài này có thể là dạng Steganography. Có nhiều phương pháp để giấu tin trong file ảnh, trong đó phương pháp được biết đến nhiều nhất là LSB (least significant Bit) – sử dụng bit thấp nhất của các pixel để chứa thông tin ẩn. Ta có thể dùng tool online https://stylesuxx.github.io/steganography/ hoặc tự viết source, cũng khá đơn giản. Sau khi đã extract ta thu được đoạn văn ẩn giấu:

Trong đoạn văn trên có đoạn bị xóa mất , như vậy ‘WORD’ mà đề bài đề cập chính là chỗ bị xóa mất này. Đoạn văn trên chắc hẳn được lấy từ 1 cuốn sách hay tiểu thuyết nào đó. Copy vào google tìm được là memorandum-book. Làm y như đề bài, đem đi sha1 nó sẽ thu được flag
Flag: Securinets{b47f0d2a8866a75696f94a515d0cdf54c7ea3174}
[CRYPTO] – Useless Admin – 869 pts

One time pad là một loại stream cipher được mệnh danh ‘Unbreakable’. Thế nhưng ở đây Admin đã sử dụng lại key stream để mã hóa cho nhiều đoạn plaintext (thế nên gọi là multi time pad). Khi dùng lại key stream nhiều lần sẽ tạo điểm yếu bảo mật.
Trên mạng đã có sẵn source cho multi time pad attack, chỉ việc đưa vào áp dụng thôi.
https://github.com/Jwomers/many-time-pad-attack/blob/master/attack.py
Kết quả thu được:
![]()
Kết hợp thử sai và kỹ năng google, ta dễ dàng tìm lại được flag là một câu nói của ngài Author Conan Doyle (tác giả chắc là fan của ngài).
Flag: Securinets{I wanted to end the world, but I’ll settle for ending yours}
[CRYPTO] MAZE – 952 pts

Tiếp theo là 1 bài về RSA. Download file chall.zip về extract ra sẽ được 1 folder trong đó có file cipher.txt chứa ciphertext và 101 file publickey ở dạng .pem.

Theo caption từ đề bài thì có lẽ key đúng nằm ở 1 trong số 101 file này. Bài này là một thể hiện của phương pháp Common factor Attack. Đại khái là nếu ta dùng một công cụ tạo số nguyên tố ngẫu nhiên để phát sinh nhiều key RSA, nếu công cụ đó được lập trình không tốt thì sẽ có một tỷ lệ nhỏ hệ thống sẽ tạo ra các số n có chung factor, tức là sẽ có ni, nj nào đó mà ni = p*q1 và nj = p*q2. Nếu điều đó xảy ra, ta dễ dàng factor ni, nj bằng cách tính gcd(ni, nj) = gcd(p*q1, p*p2) = p.
Có 1 tool trên github rất hay về RSA ở link. Trong đó đã có sẵn source cho nhiều loại attack RSA. Quăng đống file này vào tool trên sẽ có luôn private key.

Sau khi có private key, ta sẽ trích xuất n, e, d để decrypt ciphertext. Sourcecode trong file solve.py ở link bên dưới. Nếu bạn nào không thích cách làm phụ thuộc vào tool như trên thì có thể tham khảo source trong file solve2.py

Flag: securinets{rs4_1s_g00d_s0m3t1m3s!}
[CRYPTO] RSA/Encoding error – 1000 pts

Lại là 1 bài RSA nữa, bài này khá khoai, nếu không có hint thì khó mà giải ra, vì không đoán được ý đồ của tác giả. Download file .zip về giải nén ra ta được 1 file ảnh ctf_image.png. Đây là 1 ảnh mã QRCode. Dùng app QRCode trên điện thoại quét ảnh thì được hint: every information bit matter. Cũng chẳng khác gì phần description. Thử ‘strings ctf_image.png’ có thể thấy được 1 số strings lạ: ‘tExtComment’, ‘e = 2^16 + 1’, ‘output.txt’, những string này chắc chắn có hữu ích. Thử ‘exiftool ctf_image.png’ thì có

Như vậy, rõ ràng ta đã có được e = 2^16 + 1. Hơn nữa có gì đó liên quan đến file output.txt. Thử ‘binwalk ctf_image.png’ thu được 3 file trong đó có file output.txt

file output.txt gồm nhiều dòng, mỗi dòng gồm các nhóm 5 bit. Đến đây bắt đầu bế tắc. May nhờ có hint từ discord:
Đến đây đã khá rõ. p, q chính là kích thước file ảnh. p = 887, q = 521. Mã hóa sử dụng Repetition code để hạn chế lỗi truyền tin, giờ mới thấy cái tên bài có liên quan :v. Việc còn lại chỉ là code thôi

Flag: Securinets{xJbht0oWpsOa1e3WnXo9FDnUj3VZpZsuxMPVlYEN}
[PWN] – Welcome – 416 pts

ssh vào server, kiểm tra server thấy có các file sau:

File wrapper được set SUID như vậy đây là file mà ta cần exploit. Các file flag.txt, welcome, welcome.c đã restrict quyền read. Xem sourcecode wrapper.c

Ở đây tác giả cho ta nhập vào một lệnh, sau khi filter qua blacklist[] sẽ thực hiện lệnh với system(str). Đây là bài dạng bypass command filter. Có khá nhiều lời giải cho bài này, chẳng hạn:

Flag: securinets{who_needs_exec_flag_when_you_have_linker_reloaded_last_time!!!?}
[REVERSE] Matrix of Hell! – 992 pts

Chạy file rev, chương trình yêu cầu nhập PASSWORD, ta nhập bừa vào thì sẽ được thông báo ACCESS DENIED

Tiến hành decompile file rev bằng GHIDRA, sau khi đổi tên các biến cho dễ nhìn ta thu được pseudocode. Đoạn code đầu tiên tạo ra một mảng nào đó, tôi đặt là something.
Chuyển code sang python cho dễ xử lý, in mảng something ra xem ta thu được gì

Để ý rằng mảng something gồm các phần tử là các số trong khoảng 65-90, đây là mã ASCII của các chữ cái ‘A’ -> ‘Z’.
Tiếp theo, chương trình cho người dùng nhập vào password, lưu vào biến PASSWORD. Từ đoạn code
ta biết rằng PASSWORD phải có chiều dài là 14 ký tự.
Đoạn code thứ 2 tạo ra chuỗi ENCODED từ PASSWORD và something

Chuyển code trên sang python để xem đoạn code hoạt động thế nào

Phân tích code + tên đề bài, ta dễ suy ra được rằng something chính là ma trận bảng chữ cái với các dòng được đánh thứ tự từ ‘A’ -> ‘E’, các cột được đánh thứ tự từ ‘1’ -> ‘5’. ENCODED được tạo ra bằng cách tra từng ký tự của PASSWORD vào bảng. Ví dụ, ký tự ‘N’ với mã ASCII là 78 nằm ở ô C3, ký tự O có mã ASCII là 79 nằm ở ô C4, … Kết quả thu được chuỗi ENCODED tương ứng.
Tiếp tục với đoạn code quan trọng thứ 3

Vì sVar3 = strlen($ENCODE) < 28 nên bVar1 = c >> 0x37 luôn cho kết quả là 0. Vậy nên đoạn code trên có thể rút gọn thành

STRING sau đó được so sánh với chuỗi ‘B0C2A2C6A3A7C5@6B5F0A4G2B5A2’. Nếu STRING giống với chuỗi trên thì chương trình sẽ tiến hành tính FLAG và in ra màn hình.

Như vậy nhiệm vụ của ta đã rõ, ta sẽ phải tiến hành các bước reverse để tìm lai chuỗi PASSWORD đúng, nhập vào và chương trình sẽ in ra FLAG. Đến đây coi như đã hoàn thành 90% challenge, việc còn lại rất đơn giản, chỉ đơn thuần code 🙂 test.py, solve.py

Nhập PASSWORD vào ta nhận được FLAG

Flag: 1337_FD_DDLLLKMO_KUWRRRVL_HAHAHA
xin link fb or discord . để em contact với ạ
ThíchĐã thích bởi 1 người