[Writeup] Vòng loại WhiteHat Grand Prix 2015: Pwn200 - Pwn300 - Pwn500 - Web100 - Web200 - Web300

Thảo luận trong 'Writeup WhiteHat Grand Prix' bắt đầu bởi sunny, 28/10/15, 10:10 AM.

  1. 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,882
    Đã được thích: 855
    Điểm thành tích:
    113
    Cám ơn BabyPhD đã chia sẻ Writeups này. (https://babyphd.net/2015/10/whitehat...x-2015-writeup)

    Pwn200:


    ASLR tắt, bug cho phép ghi đè 2 byte vào địa chỉ char *buf = malloc(20);. Với ASLR tắt thì địa chỉ map của [heap] section sex fix ở dạng 0x0804xxxx, do đó ta có thể điều khiểu *buf = got_table một cách dễ dàng. Phương pháp khai thác như sau:

    • Ghi đè free’s got = trở lại phần read để đọc > 40 bytes => stack overflow.
    • Ghi đè strtoimax’s = địa chỉ lệnh ret
    • Ghi đè memcpy => leave;ret => tiến hành trigger buffer overflow khi trở lại hàm read để đọc > 40 bytes. Ngoài ra do ASLR tắt nên địa chỉ map của libc luôn fix, nên công việc còn lại chỉ là bruteforce libc base addr.
    Mã khai thác: https://gist.github.com/peternguyen9...786c2df2ab968f

    [​IMG]


    Pwn300:

    Lỗ hổng stack base buffer overflow rất rõ ràng khi sử dụng hàm gets(buf), do binary được compiled 32 bit do đó ta có thể control địa chỉ flag và đọc được bất cứ dữ liệu nào của memory


    [​IMG]


    Mã khai thác: https://gist.github.com/peternguyen9...6cee83346298ce

    Pwn500:

    Binary sử dụng các kỹ thuật anti-debug và cấm sử dụng các syscall (execve,fork,clone). Ngoài ra lỗ hổng buffer overflow khá là rõ ràng, binary được compile bằng PIE. Tuy nhiên, hàm read không tự động viết null bye vào cuối, do đó ta có thể leak được canary và libc_base , thông qua các bước sau:

    • Leak canary.
    • Ghi đè địa chỉ return address về main
    • Leak libc_start_main => libc_base
    • Tiến hành sử dụng rop chain để build mã đọc flag và trả về.

    https://gist.github.com/peternguyen9...ef5dd7cb549a2f


    [​IMG]


    Web100:

    SQL Injection, do chưa filter đấu ‘\’. Ngoài ra trước khi hết thúc xử lý request, web100 gọi hàm re.findall(r'(y+)*’,row), hàm regex findall match tất cả các substring có thể match, ngoài ra chuỗi regex (y+)* với một chút google ta có kq sau https://www.owasp.org/index.php/Regu...ervice_-_ReDoS , đo đó có thể build một query cho phép ta có thể phân biệt được trạng thái đúng hoặc sai để blind flag dựa trên time base.

    https://gist.github.com/peternguyen9...252257e9da62e4

    Web200:

    Lỗ hỗng rất rõ ràng khi web app sử dụng pickle data serialization, thông qua đó ta có thể sử dụng code injection để có được shell trên server.

    https://gist.github.com/peternguyen9...5919a3203acfe2

    Web300:

    Lỗi LFI cho phép có thể lấy được mã nguồn của website, trong đó thấy được một script cgi lấy thông tin về thời gian. Script này bị lỗi command injection, do giới hạn các hàm connect back, để get shell ta lợi dụng file /run/cgicounter ta có thể đọc từng ký tự của command trả về.

    https://gist.github.com/peternguyen9...33d99ff71593a7
     
    Last edited by a moderator: 28/10/15, 10:10 AM
    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
  2. whf

    whf Super Moderator Thành viên BQT

    Tham gia: 06/07/13, 03:07 AM
    Bài viết: 1,066
    Đã được thích: 710
    Đ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