[SVATTT 2016] simplehttp – web300

Challenge:

Why do I have to use Apache/Nginx when I can build it myself with less than 60 lines of code.
main.rb

Chào các bạn, mình đã trở lại với bài writeup web cuối (giống năm ngoái), tuy nhiên vị trí đã khác đi vì mình hông còn đi thi nữa T_T

Đối với những bài cho source thì mình luôn tôn trọng tác giả làm ra => đọc source trước, fuzzing sau.

Trace source thì ta có thể để ý những điểm nóng:

handlers = {
:index => {:path => '/guest/', :func => method(:index ), :perm => 0},
:hello => {:path => '/guest/hello', :func => method(:say_hello ), :perm => 0},
:ip => {:path => '/guest/ip', :func => method(:your_ip ), :perm => 0},
:admin => {:path => '/admin/secret', :func => method(:admin ), :perm => 1},
:log => {:path => '/admin/log', :func => method(:admin_log ), :perm => 1},
}

Đoạn trên là handle trên url, dựa vào permission để cho phép truy nhập, tuy nhiên gặp đoạn check sau:

(puts NF_404; exit) if $HTTP[:perm] < 1 && $HTTP[:path].index("/guest/")!=0
(puts NF_404; exit) if $HTTP[:path][7..-1].index("/") || $HTTP[:path][7..-1].index("%2f")

Đoạn này hàm ý là Nếu perm=0 và url path không bắt đầu bằng /guest/ thì bum trang 404 ra.
Ngoài ra nếu phát hiện %2f hay / trong urlpath phía sau /guest/ thì cũng tèo luôn.

Bypass: filter %2f thì mình xài %2F :3 như vậy ta có thể access và sử dụng chức năng của admin bằng câu sau

http://simplehttp.svattt.org:31332/guest/..%2Fadmin%2Fsecret

OK xong challenge, ez….

Đùa thôi :v mình đã sống đủ lâu để biết được rằng không có gì là dễ dàng:

notflag

“Sorry…the flag is in another castle 😦 Get shell if u can” ?
^quá là buồn luôn >_<, vậy là phải rce cái server này mới mong lấy được flag 😥

Tiếp tục phân tích thì có 2 nhận xét như sau:
– Nếu access được vào /admin/secret thì sẽ lưu được log vào thư mục /tmp/simplehttp/diachiipcuaminh/user.txt (với user nhập từ cookie)
– Nếu access được vào /admin/log thì sẽ mở file user.txt lên xem (với user nhập từ cookie)

Sau khi thử poison log các kiểu không thu được gì thì mình đành từ bỏ cách này, vì đơn giản là đuôi .txt bị kẹp vào thì cũng không thể chạy code bên trong file được. Trong lúc bế tắc không biết đi về đâu thì có một ông anh lỗi thời ném cho một câu:

“Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth.”

                                                             – Arthur Conan Doyle

Mình bỗng dưng được giác ngộ, và lôi source ra đọc lại, loại bỏ hết những dòng code không liên quan và những dòng code không-thể-nào-rce được, và kết quả từ 60 dòng còn lại 10 dòng…. và trong 10 dòng ấy có 1 dòng hấp dẫn mình cực kì:

def admin_log() !$HTTP[:user].nil? && File.exists?($HTTP[:user]+".txt") ? File.read($HTTP[:user]+".txt") : "None" end

Function này kiểm tra có cookie user hông? file user.txt có hông? hông thì None, có thì read.

Mà dựa vào khả năng chém gió thành bão của mình thì cá 1 ăn 10 func File.read này bị lỗi.

Let test:

readfile.png

Đại khái là hàm File.read sẽ gọi qua hàm Open, mà hàm này có một tính năng đặc biệt là khi gặp filename bắt đầu bằng | thì “a subprocess is created, connected to the caller by a pair of pipes” (dịch kiểu gì cũng hông hay nên để nguyên), do đó ta có thể chạy được command (như hình là cat /etc/passwd)

sai

Ok vậy chúng ta đang có những gì nè?
1 function nhập user qua cookie (giới hạn 17 kí tự)
1 function dựa vào user đó để tạo log user.txt
1 function đọc log lên hay chạy command 🙂

====> Tạo một trang log cứng để bypass check điều kiện File.exists? ở endpoint /admin/log

curl --cookie 'user=|ls>c' 'http://simplehttp.svattt.org:31332/guest/..%2Fadmin%2Fsecret'

Như vậy file log |ls>c.txt đã được tạo ra nhờ vào /admin/secret

Tiếp:

curl --cookie 'user=|ls>c' 'http://simplehttp.svattt.org:31332/guest/..%2Fadmin%2Flog'

=> chạy lệnh ls, đưa thông tin vào c.txt (vì chain với .txt)
Cuối cùng thì làm gì nè :3

curl -A "user-agent" --cookie 'user=c' 'http://simplehttp.svattt.org:31332/guest/..%2Fadmin%2Flog'

=>Đọc file log c.txt vừa có data lên thông qua /admin/log

Sau khi mò cả server thì mình thấy có 1 file rất là hay ho:

_here_you_are_flagggggggggg_simplehttp_abc@@@.txt

OOps……………….

Here Flag: SVATTT{lul_ruby_is_very_weird}

giphy

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s