[Write-up] rgbCTF 2020

2020/10/14 07:36:29

Một vài bài write-up nho nhỏ trong cuộc thi rgbCTF 2020

Lưu ý: Toàn bộ tài nguyên trong bài có thể download tại: Google Drive

Mục lục

[Misc] Hallo?

Đề bài

The flag is exactly as decoded. No curly brackets.

NOTE: keep the pound symbols as pound symbols!

~BobbaTea#6235, Klanec#3100
hmm.mp3
Size: 889.53 KB
MD5: d7457e4a06a6fb5f0b2cddefeb2924a1

Bài giải

Sau nghi nghe qua file âm thanh, ta thấy đây có vẻ là tiếng bấm của các điện thoại cũ. Âm thanh phím của các điện thoại này được tái tạo bằng cách kết hợp 2 sóng có tần số khác nhau được tổ chức dưới dạng lưới. Thuật ngữ trong ngành gọi nó là Dual Tone Multi Frequency.

Có hai hướng tiếp cận để giải quyết vấn đề này.

Để nhanh, chúng ta sử dụng công cụ dtfm-decoder.

Mã nguồn này sử dụng âm thanh đầu vào là file wav trong khi file đề bài là mp3. Vậy nên ta cần chuyển đổi chút.

$ ffmpeg -i hmm.mp3 hmm.wav

Sau đó ta dùng lệnh để decode.

$ python3 dtmf.py ../hmm.wav

Ta thu được.

77774222228333#99933338#386333#8662666337777#

Kiểm tra với audacity, ta thấy kết quả trả về có vẻ không chính xác.

Ta thêm tham số để hiển thị theo timeline.

$ python3 ./dtmf.py -v ../hmm.wav

Ta thu được

0:00 ....................
0:01 ................777.
0:02 ..7.7...777.........
0:03 ....................
0:04 ....................
0:05 .........44.........
0:06 ....................
0:07 ..............222..2
.
.
v.v.

Dựa vào audacity và bảng timeline decode được, ta tiến hành căn từng phím bấm và được kết quả

777 4 22 222 8 333 # 999 33 33 8 # 3 8 3 333 # 8 666 66 33 7777 #

Dùng công cụ Multi-tap Abc Decoder

Ta thu được:

RGBCTFYEETDTDFTONES

Chuyển về định dạng thường và thêm các dấu thăng (#) bị mất, ta cuối cùng thu được kết quả chính là flag của challenge.

Flag: rgbctf#yee#dtmf#tones#

[Pwn/Rev] Object Oriented Programming

Đề bài

There's this small up and coming language called java I want to
tell you about


~Quintec#0689
src.zip
Size: 6.85 KB
MD5: ea5c341ca73f54b8dd8f52e34403760a

Bài giải

Ta tiến hành biên dịch chương trình Java.

$ find -name "*.java" > sources.txt
$ javac @sources.txt && java Main

Sau một hồi đọc code, thuật toán có thể được mô tả như sau:

Đầu tiên người dùng nhập chuỗi 16 kí tự, chương trình sẽ mã hóa bằng cách lấy từng kí tự xor với 1 khóa nào đó.

Để tìm khóa, ta đơn giản là chạy code và in ra màn hình.

System.out.println("Debug key:" + (int) secureEncryptionKey);

Output: Debug key: 2

Sau đó, chuỗi được mã hóa sẽ chia nó thành bốn nhóm.

String[] chunksOfEncryptedStringOfLengthFour = splitStringIntoChunksOfLength(encryptedString, FOUR);

Mỗi nhóm được chia làm 2 phần, 2 kí tự đầu dùng để gọi class, 2 kí tự sau dùng để gọi phương thức. Gọi phương thức sẽ trả về 1 chuỗi 2 kí tự dùng để gọi phương thức kế tiếp, đủ 3 lần gọi phương thức coi như vượt qua vòng kiểm tra.

for (int loopArbitraryCounterIterator = 0; loopArbitraryCounterIterator < THREE; loopArbitraryCounterIterator++) {
    ...
}

Nếu không tìm thấy class hay phương thức thì sẽ coi như thất bại.

Để có thể by pass được phần kiểm tra này, ta viết 1 đoạn code đơn giản để phát hiện ra những class và phương thức đáp ứng yêu cầu (gọi đệ quy 3 lần tiên liếp) (Xem thêm file trong thư mục solution của challenge). Rồi ta được:

String test[] = {
    "bvwp",
    "cdch",
    "fggg",
    "glvg", 
    "gqwt",
    "gxjp",
    "iyuc",
    "mouw",
    "prpk",
    "qawq",
    "qgam",
    "vhnt",
    "xqfb"
};

Sau đó, chương trình sẽ ghép các kết của của phương thức cuối cùng trong từng lần gọi của 4 nhóm rồi so với:

scanner.getClass().getPackageName().replace(".", "") // javautil

Vậy nên, ta điều tra kết quả trả về của từng nhóm phù hợp:

String test[] = {
    "bvwp",    // -> jv
    "cdch",    // -> cq
    "fggg",    // -> il
    "glvg", // -> ja
    "gqwt", // -> la
    "gxjp", // -> ek
    "iyuc",    // -> vi
    "mouw",    // -> qm
    "prpk",    // -> va
    "qawq",    // -> ne
    "qgam",    // -> ut
    "vhnt",
    "xqfb"
};

Ghép lại ta được:

glvgprpkqgamfggg

Đây là chuỗi ta cần có sau khi encrypt. Để chuyển thành chuỗi người dùng nhập vào, ta chỉ cần encrypt nó thêm 1 lần nữa. Sau đó truyền chuỗi này vào chương trình, cuối cùng ta thu được kết quả.

Nice. Flag: rgbCTF{enterprisecodeee}

[Beginner] Name a more iconic band

Đề bài

I'll wait.

The flag for this challenge is all the passwords in alphabetical order, each separated by a single white-space as an MD5 hash in lower case

md5(passwordA passwordB passwordC ...)

Example: if the passwords were "dog" and "cat", the flag would be
rgbCTF{md5("cat dog")}
rgbCTF{b89526a82f7ec08c202c2345fbd6aef3}


~Klanec#3100
data.7z

Bài giải

Ta giải nén thu được 1 file dữ liệu, ta đoán đây là file được dump ra từ memory của bộ nhớ hệ điều hành. Sử dụng volatility để kiểm tra imageinfo.

$ volatility -f data imageinfo

Ta thu được kết quả:

Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418
                     AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
                     AS Layer2 : VirtualBoxCoreDumpElf64 (Unnamed AS)
                     AS Layer3 : FileAddressSpace (/mnt/hgfs/rgbCTF/iconic/data (1)/data)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf8000183f110L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xfffff80001840d00L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2020-07-04 03:41:04 UTC+0000
     Image local date and time : 2020-07-04 04:41:04 +0100

Hiển thị hivelist.

$ volatility -f data --profile Win7SP1x64 hivelist

Ta lấy virtual address của SAM và System rồi sử dụng để trích xuất hash mật khẩu.

Volatility Foundation Volatility Framework 2.6
Virtual            Physical           Name
------------------ ------------------ ----
...
0xfffff8a00105c010 0x0000000034ae1010 \SystemRoot\System32\Config\SAM
...
0xfffff8a000023010 0x0000000001cb5010 \REGISTRY\MACHINE\SYSTEM
...

Rồi ta tiến hành dump hash theo câu lệnh

$ volatility -f data --profile Win7SP1x64 hashdump -y 0xfffff8a000023010 -s 0xfffff8a00105c010 > hashes.txt

Với tùy chọn -y là địa chỉ của SYSTEM, -s là địa chỉ của SAM.

Ta thu được 1 file hash.

Administrator:500:aad3b435b51404eeaad3b435b51404ee:756c599880f6a618881a49a9dc733627:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
pablo honey:1001:aad3b435b51404eeaad3b435b51404ee:7aaedbb86a165e8711cb46ee7ee2d475:::
the bends:1002:aad3b435b51404eeaad3b435b51404ee:dcbd05aa2cdd6d00b9afd4db537c4aa3:::
ok computer:1003:aad3b435b51404eeaad3b435b51404ee:74dea9ee338c5e0750e000d6e7df08e1:::
kid a:1004:aad3b435b51404eeaad3b435b51404ee:c9c55dd07a88b589774879255b982602:::
amnesiac:1005:aad3b435b51404eeaad3b435b51404ee:7b05eefac901e1c852baa61f86c4376f:::
hail to the thief:1006:aad3b435b51404eeaad3b435b51404ee:8eb2b699eeff088135befbde0880cfd4:::
in rainbows:1007:aad3b435b51404eeaad3b435b51404ee:419c1a5a5de0b529406fb04ad5e81d39:::
the king of limbs:1008:aad3b435b51404eeaad3b435b51404ee:a82da1c9a00f83a2ca303dc32daf1198:::
a moon shaped pool:1009:aad3b435b51404eeaad3b435b51404ee:4353a584830ede0e7d9e405ae0b11ea4:::

Sử dụng crackstation đẻ crack các hash này, ta thu được.

supercollider
anyone can play guitar
burn the witch
idioteque
karma police
lotus flower
my iron lung
pyramid song
there, there
weird fishes/arpeggi

Sắp xếp các mật khẩu này theo alphabet rồi ghép chúng lại.

anyone can play guitar burn the witch idioteque karma police lotus flower my iron lung pyramid song supercollider there, there weird fishes/arpeggi

Sau đó hash md5 ta thu được.

cf271c074989f6073af976de00098fc4

Flag: rgbCTF{cf271c074989f6073af976de00098fc4}

Quay lại trang chủ