Tổng hợp writeup cuộc thi vòng loại SVATTT 2017

Thảo luận trong 'Thảo luận các cuộc thi CTF khác' bắt đầu bởi Sugi_b3o, 04/11/17, 11:11 PM.

  1. Sugi_b3o

    Sugi_b3o Moderator Thành viên BQT

    Tham gia: 30/08/16, 10:08 AM
    Bài viết: 188
    Đã được thích: 167
    Điểm thành tích:
    43
    Topic này tổng hợp writeup từ các bạn tham dự, cũng như các bạn yêu an ninh mạng muốn chia sẻ kiến thức, kinh nghiệm từ vòng loại của cuộc thi Sinh Viên với An Toàn Thông Tin 2017 do Vnisa (hiệp hội An Toàn Thông Tin Việt Nam) tổ chức.
    [​IMG]
    Cuộc thi vòng loại sinh viên với An Toàn Thông Tin 2017. Ảnh qdnd.vn​
     
    Chỉnh sửa cuối: 05/11/17, 10:11 AM
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    whf thích bài này.
  2. Sugi_b3o

    Sugi_b3o Moderator Thành viên BQT

    Tham gia: 30/08/16, 10:08 AM
    Bài viết: 188
    Đã được thích: 167
    Điểm thành tích:
    43
    Đề bài pwn400 năm nay hơi fail, khi mà cách giải của người chơi không được đúng ý tác giả. Còn bài pwn100 khá hay, là lỗi format string hay gặp, tuy nhiên nằm ở snprintf chứ không phải printf. Khá ít đội làm được bài pwn100 do chưa quen với snprintf.

    Bài pwn400

    Theo ý của tác giả, thì để giải bài này, người chơi cần phải viết được con shellcode chỉ dùng các ký tự printable. Tuy nhiên, cách giải đơn giản chỉ là viết rop, gọi tới hàm get_string với tham số là địa chỉ vùng ghi được, và nhảy luôn tới đó.

    [​IMG]

    Mã khai thác:

    [​IMG]

    Bài pwn100

    Lỗi format string cơ bản, với hàm bị lỗi là snprintf. Tác giả chỉ cho xâu format dài 0x7F byte, do đó ta không thể ghi đè dữ liệu thoải mái được. Tuy nhiên, để biến atoi thành system, thì ta chỉ cần ghi đè 4 byte thấp của atoi thành 4 byte thấp của system là được. Và với 0x7F byte thì ta hoàn toàn làm được.

    [​IMG]
    Mã khai thác:

    [​IMG]

    Link tải đề bài và mã khai thác: pwn_vongloai_svatt2017.zip
    Trích bài của Mod tmnt53
    Pwn400 – nokiacum
    Đầu tiên phải nói là, trên đề không cho trực tiếp file binary mà nói rằng mỗi một mã máy có 1 file binary khác nhau, khiến mình khá sợ khi mà mỗi lần request thấy cái mã số nó cứ nhảy 6 chữ số. Nhưng sau khi tải 4 5 file về thông qua netcat thì mình thấy toàn bộ các file đều giống nhau, không chắc có file nào khác không nhưng các file mình tải được là giống nhau hoàn toàn. Nên mình đã đưa ra giả thuyết đơn giản: cái trò nhiều file bin chẳng qua là làm màu :v.

    [​IMG]

    Tiếp tục sang phần chính, mình decompile 1 file mình tải về với IDA thì được đoạn code Login và get_string này.
    [​IMG]
    [​IMG]
    Khi để ý hàm kiểm tra sử dụng strncmp tức là bạn nhập ra sao cũng được, miễn là 6 kí tự đầu tiên trùng với chuỗi “anlpth” và tương tự với đoạn kiểm tra mật khẩu. Cùng với đó là đoạn nhập chuỗi từng kí tự một nhưng không giới hạn và kết thúc khi gặp kí tự NULL hoặc kí tự xuống dòng làm mình nghĩ đến việc buffer overflow. sau đó mình checksec thì thấy:

    gdb-peda$ checksec
    CANARY : disabled
    FORTIFY : disabled
    NX : disabled
    PIE : disabled
    RELRO : disabled​

    Chả có cái nào được bật cả :v Ê, thế thì mình up shell thôi :v và thế là mình thực hiện với việc dùng hàm get_string của tác giả để up shell lên BSS chạy. Cơ mà thế thì dễ vãi, 400 điểm mà dễ thế ????? ?????. Đây là code của mình sử dụng cho bài này.
    [​IMG]
    Hướng làm của tác giả
    Thật ra thì khi nhìn mặt idol Lê Ân có chút đau đớn với cách làm của mình thì anh cũng đã nêu ý tưởng rằng muốn các bạn upshell nhưng là ASCII shell nằm trên username hoặc password và sau đó trỏ về đó, đó là lý do chính mà tác giả sử dụng địa chỉ của nơi lưu trữ username là cố định và anh sử dụng hàm check_char để kiểm tra đầu vào.

    [​IMG]
    Với hàm này, nhưng gì được nhập vào username và password phải là printable.

    Vậy xử lý sao với cái này? Rất may là tôi vừa làm bài Death_note trên pwnable.tw nên nếu thực sự bài có yêu cầu phải làm vậy thì t tin mình vẫn làm được :v “trời phù hộ người tốt” Ơn trời. Các mã lệnh sử dụng được nằm trong bảng printable nằm ở đây.

    Trich blog kad96
     
    Chỉnh sửa cuối: 07/11/17, 09:11 AM
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    likehack thích bài này.
  3. Sugi_b3o

    Sugi_b3o Moderator Thành viên BQT

    Tham gia: 30/08/16, 10:08 AM
    Bài viết: 188
    Đã được thích: 167
    Điểm thành tích:
    43
    Forensics 100
    Mặc dù trong team mình hay làm crypto, nhưng gặp một bài forensics, và chỉ có 100 điểm thì dại gì không làm, nhỉ =))

    À ờ, đó là trong trường hợp bình thường thôi. Chứ trường hợp cái file pcap đề cho nó đến hai mươi mấy MB thì cũng hơi… ngán đó =))

    Load vào wireshark, nói thật là file pcap trừ khi có mấy protocol lạ lạ, còn lại thì cũng có mấy dạng, làm nhiều thì quen tay thôi. File pcap này có khá nhiều http protocol, nên việc đầu tiên mình làm là File / Export Objects / HTTP

    [​IMG]

    Forensics, giống như người ta ném bạn vào đống rác, sau đó bảo bạn tìm cho bạn cờ, nằm trong tờ giấy gói bánh mì vậy. Bới tung đống rác lên để tìm:

    [​IMG]

    nothing.py à =)) không tin, lừa nhau à =)) Save file lại, mở ra xem thử:

    [​IMG]

    Thuật toán chỉ đơn giản là cộng xong xor, vậy giờ làm ngược lại thôi, xor xong trừ thôi. Mình thì lười, nên mình copy hàm cộng, đổi tên biến, sửa dấu cộng thành dấu trừ…

    [​IMG]
    Trích Blog Quân Đoàn UIT ​
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    sunny thích bài này.
  4. Sugi_b3o

    Sugi_b3o Moderator Thành viên BQT

    Tham gia: 30/08/16, 10:08 AM
    Bài viết: 188
    Đã được thích: 167
    Điểm thành tích:
    43
    Crypto 100.
    Mình khá là bất ngờ khi nhìn vào dashboard, chỉ có một bài forensics và đến ba bài crypto, lại có đến hai bài 100. Hy vọng không quá khó, chứ mang tiếng chơi crypto, làm không được thì cũng… ahihi.

    Download file về, giải nén, mở source encrypt.pylên đọc:
    Mã:
    import gmpy2
    from ctf import MESSAGES
    
    N = 1552518092300708935148979488462502555256886017116696611139052038026050952686376886330878408828646477971459063658923221258297866648143023058142446317581796810373905913084934869211153276980011573717416472395713363686571638755823503877
    e = 3
    BS = 32
    
    to_int = lambda text: int(''.join(x.encode('hex') for x in text), 16)
    
    c = 0L
    cipher = []
    for chunk in [MESSAGES[i:i + BS] for i in range(0, len(MESSAGES), BS)]:
        c1 = int(hex(c)[2:-1][:BS*2+1], 16)
        c = gmpy2.powmod(c1 + to_int(chunk), e, N)
        cipher.append(hex(c)[2:])
    
    with open('cipher.txt', 'w') as f:
        f.write(' '.join(cipher))
    Có e, có N, chắc là RSA. Quăng vào factordb.com, tạch =))

    Xem kỹ hơn, ta thấy e quá nhỏ và N không quá lớn, đây là nguồn gốc của đủ thể loại tấn công RSA trên đời. c ban đầu bằng 0, vậy block đầu tiên của message sẽ là căn bậc ba của block ciphertext đầu tiên.

    [​IMG]

    Ơ nhưng mà tới đây rồi sao nữa =)) thấy hơi ngáo ngáo rồi =)) mình stuck ở đây luôn =))

    Và rồi một tiếng sau đó, mình nhận ra rằng, cuộc sống này thật đáng buồn. Đã code sẵn cái lib chuyên trị RSA, tự nhiên tới lúc cần thì không lấy ra xài =))

    [​IMG]

    Mọi chuyện đã quá dễ dàng khi ta có p và q…
    Mã:
    from qd import *
    n = 1552518092300708935148979488462502555256886017116696611139052038026050952686376886330878408828646477971459063658923221258297866648143023058142446317581796810373905913084934869211153276980011573717416472395713363686571638755823503877
    p, q = fermatfactor(n)
    #p = 39402006196394479212279040100143613805079739270465446667948293404245721771497210611414266254884915640806628012398823
    #q = 39402006196394479212279040100143613805079739270465446667948293404245721771497210611414266254884915641338868201294899
    
    f = open("cipher.txt").read()
    f = f.split(" ")
    
    print f
    a = []
    c = [0]
    
    for cipher in f:
        a.append(solvepq(int(cipher, 16), p, q, e=3)[0])
    
    for i in range(1, len(f)+1):
        c1 = int(hex(int(f[i-1], 16))[2:-1][:32    *2+1], 16)
        c.append(c1)
    
    print c
    flag = ""
    for i in range(len(a)):
        flag+= long_to_bytes(a[i] - c[i])
    print flag
    #What I'm trying to say here is... sometimes that *thing* you're searching for your whole life... is right there by your side all along. The flag is {Old_RSA_close_factor_problem}. And you don't even know it.
    Trích Blog Quân Đoàn UIT ​
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    likehack thích bài này.
  5. Sugi_b3o

    Sugi_b3o Moderator Thành viên BQT

    Tham gia: 30/08/16, 10:08 AM
    Bài viết: 188
    Đã được thích: 167
    Điểm thành tích:
    43
    Web 100.
    Bài này, là cái bài mình thấy khó hiểu nhất. Lần đầu tiên, mình thấy tất cả đề cho đều là thật, trừ cái flag troll.

    Tóm tắt ngắn gọn: check robots.txt, thấy /.git/, dùng gitdumper lôi source về, vào trang admin.php, có flag.

    [​IMG]

    Submit, fail -_- bị lừa.

    Qua trang index.php:

    [​IMG]

    Mình chỉ muốn nói, đôi khi chúng ta không tin vào những thứ mắt mình đang thấy, nhưng nó lại là sự thật.

    Server tắt mất rồi, nên xem tạm log qua Burp nhé các bạn =))

    [​IMG]

    [​IMG]
    Trích Blog Quân Đoàn UIT​
    WEB 100 - MrĐoàn UIT-NoPwn
    Thiết nghĩ người ra đề đầu tư khá kỹ về nội dung và mê kiếm hiệp cực kỳ :v. Cơ mà lại để misconfigured làm bài mất vui :3.

    Nhìn vào một bài web thì việc đầu tiên là coi robots.txt :v

    Mình thấy có một đường dẫn tới /.git/

    Theo thói quen thì google tìm tool mà lấy hết source từ git về thôi.

    https://github.com/kost/dvcs-ripper/blob/master/rip-git.pl

    Sau khi lấy hết source, nhìn vào trang index.php:

    [​IMG]

    Chắc người ra đề sensor cái password lại rồi, hardly bruteforce thì ai dám dụng vào, nhìn ngay cái dưới thì phát hiện thêm một cách login là dùng cookie “auth” có dạng là một đoạn được mã hoá sao cho sau khi qua hàm fnDecrypt($auth, $SECRET_ENCRYPT); thì phải có dạng là: TieuPhong:blabla

    Okay xem hàm fnDecrypt() trong secret.php

    [​IMG]

    Vậy là đoạn TieuPhong:blabla sẽ phải được mã hoá dạng

    mcrypt_encrypt(MCrYpt_RIJNDAEL_256,$sSecretKey,”TieuPhong:blabla”,MCRYPT_MODE_ECB,iv)

    Để ý kỹ thì iv được kèm vào đầu cái cookie “auth” của mình có độ dài 32bit.

    Như vậy, iv do mình kiểm soát luôn, tuỳ ý chỉnh sửa mà server dựa đó mà decrypt.

    Vậy mình viết hàm encrypt xong kèm iv tự mình chọn vào đầu cipher text rồi base64 lại là xong.

    POC:
    [​IMG]

    Như mình đã nói đầu bài, do misconfigured nên có cách giải “bựa” hơn. Password để vào admin chính là nùi dấu *************** kia. Đâu phải hardly bruteforce đâu!
    WEB 300 – SECOND ORDER SQLI - UIT.NoPwn
    Thiệt ra muốn xiaolin xíu về bài này mà thôi sợ bị bóc phốt nên nói thẳng ra đây là một bài Recon chứ không hẳn là web :v. Tuy nhiên qua bài này mình học được một kỹ thuật rất hay và đòi hỏi sự nhạy bén cao (mình chưa đủ trình).

    Nhìn thấy đường dẫn dạng:

    Weburl/index.php?page=login mình nghĩ ngay đến LFI. Thử lấy source bằng php://filter thì có tất cả những gì mình muốn :v.

    [​IMG]

    Để ý thấy tất cả các param mà mình có thể input đều bị: mysqli_real_escape_string() khiến cho nó không thể SQLi trực tiếp được. Ban đầu mình nhìn thấy biến $details có vẻ không gì cản phá mình control và chèn câu query vào. Lập tức google cách control cái $_SERVER[‘REMOTE_ADDR’].

    Điều bất ập đến cuộc đời khi mình tìm ra được challenge gốc của bài web 300 này.

    Plaidctf quals 2014 web-300: Whatscat

    Mừng quá :v cứ theo write up mà làm. Người ta chỉ tận tình cách set up PTR record và DNS reverse cho VPS. Từ đó control được đoạn dns_get_record(gethostbyaddr($_SERVER[‘REMOTE_ADDR’]) Rồi SQLi mà lấy dữ liệu ra thôi. Chi tiết cách làm.
    Trích blog mrdoan1996​
     
    Chỉnh sửa cuối: 06/11/17, 08:11 AM
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    likehack and DirtyBird like this.
  6. D4rkc0d3

    D4rkc0d3 W-------

    Tham gia: 07/10/15, 12:10 AM
    Bài viết: 51
    Đã được thích: 27
    Điểm thành tích:
    28
    Bài for100 năm nay ra đề chán,vứt cho một mớ hổ lốn xong cái file python thì lại quá ez =]]
    Nói chung năm đầu tiên ra đề về for ko hay,mong các năm sau có thêm stegano,etc...
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    Sugi_b3o thích bài này.
  7. Sugi_b3o

    Sugi_b3o Moderator Thành viên BQT

    Tham gia: 30/08/16, 10:08 AM
    Bài viết: 188
    Đã được thích: 167
    Điểm thành tích:
    43
    Theo mình thấy thì 3 năm trở lại đây thì 3 năm đều chỉ có 1 bài for :D
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  8. likehack

    likehack Active Member

    Tham gia: 08/01/17, 09:01 PM
    Bài viết: 28
    Đã được thích: 3
    Điểm thành tích:
    3
    server có mở lại để mình làm k ta !!! :p:p:p
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  9. sunny

    sunny Điều hành viên Thành viên BQT

    Tham gia: 30/06/14, 10:06 PM
    Bài viết: 1,638
    Đã được thích: 697
    Điểm thành tích:
    113
    Chắc là không bạn nhé. Vì đây chỉ là 1 cuộc thi loại, thi xong rồi là thôi :p
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  10. sunny

    sunny Điều hành viên Thành viên BQT

    Tham gia: 30/06/14, 10:06 PM
    Bài viết: 1,638
    Đã được thích: 697
    Điểm thành tích:
    113
    Thành phần ra đề năm nay có thay đổi so với năm ngoái.
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  11. DirtyBird

    DirtyBird New Member

    Tham gia: 23/03/17, 10:03 AM
    Bài viết: 2
    Đã được thích: 1
    Điểm thành tích:
    3
    Bài web100 mình không ngờ tới cách đó luôn :'(
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    likehack thích bài này.