Monthly Archives: October 2015

[Whitehat GrandPrix 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/peternguyen93/f4e9bf786c2df2ab968f

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

void find_flag(char *flag)
{
    char buf[256];
    make_flag(flag); //đổi flag
    while(1){
       gets(buf);
       printf("%s%s\n",buf,flag);
    }
}

Mã khai thác

https://gist.github.com/peternguyen93/e187ad6cee83346298ce

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/peternguyen93/c4dda7ef5dd7cb549a2f

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/Regular_expression_Denial_of_Service_-_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/peternguyen93/75839e252257e9da62e4

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/peternguyen93/c168c15919a3203acfe2

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/peternguyen93/0c34bc33d99ff71593a7