sunny
VIP Members
-
30/06/2014
-
870
-
1.849 bài viết
[Writeup] Vòng loại WhiteHat Grand Prix 2015: Pwn200 - Pwn300 - Pwn500 - Web100 - Web200 - Web300
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:
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
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:
https://gist.github.com/peternguyen9...ef5dd7cb549a2f
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
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.
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
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
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
Chỉnh sửa lần cuối bởi người điều hành: