Diberikan sebuah link url untuk mengakses challenge nya, dalam url tersebut terdapat beberapa file seperti berikut ini
Hal pertama yang saya buka disini adalah README.txt, tentu saja karena saya berpikiran bahwa terdapat dokumentasi atau clue di dalam file ini.
Setelah dibuka file tersebut, ternyata isinya adalah sebuah url sebagai berikut
http://durgahayu-chall.skill-issue.org
Selanjutnya mari kita buka file app.rb, dari ekstensinya saja kita mengetahui bahwa ini adalah file ruby. Source Code nya sebagai berikut
require 'puma'
require 'sinatra'
require_relative 'consts'
before "/#{FLAG_FILE}" do
halt 403
end
not_found do
status 404
body 'gada bro'
end
get '/' do
'Hello, world!'
end
get '/ping' do
'pong'
end
set(:probability) { |value| condition { rand <= value } }
# POST /read/app.rb HTTP/1.1
# returning its content
post '/read/:file', :probability => 0.25 do
filename = params[:file]
filepath = File.join(settings.cwd, filename)
unless filepath.start_with?(settings.cwd)
halt 403, 'yang bener aja'
end
if File.exist?(filepath) && File.file?(filepath)
content_type 'text/markdown'
"baik tuan, nih pesanannya 👇\n" +
"```\n" +
"#{File.read(filepath)}\n" +
"```"
else
halt 404
end
end
post '/read/:file' do
status 418
headers \
"Refresh" => "Refresh: 1; /"
body 'kok nyasar ke sini, ngab?'
end
Mari kita breakdown satu satu, dimulai dari atas
require 'puma'
require 'sinatra'
require_relative 'consts'
pada blok kode ini, berfungsi untuk meng-import berbagai library yang dibutuhkan untuk mejalankan program tersebut.
Puma : Merupakan sebuah Web Server
Sinatra : Merupakan sebuah Web Framework
require_relative ‘consts’ : Ini mengimport file consts.rb pada direktori yang sama
Selanjutnya pada blok kode ini
before "/#{FLAG_FILE}" do
halt 403
end
nah, pada blok ini berfungsi untuk mencegah jika route nya sesuai dengan yang di definiskan di FLAG_FILE maka akan menrespon dengan 403
Mari kita skip beberapa baris dan langsung ke hal yang menarik
set(:probability) { |value| condition { rand <= value } }
# POST /read/app.rb HTTP/1.1
# returning its content
post '/read/:file', :probability => 0.25 do
filename = params[:file]
filepath = File.join(settings.cwd, filename)
unless filepath.start_with?(settings.cwd)
halt 403, 'yang bener aja'
end
if File.exist?(filepath) && File.file?(filepath)
content_type 'text/markdown'
"baik tuan, nih pesanannya 👇\n" +
"```\n" +
"#{File.read(filepath)}\n" +
"```"
else
halt 404
end
end
dari potongan kode diatas, dapat dilihat bahwa pada endppoint /read ada kemungkinan terdapat directory traversal, hal ini disebabkan karena tidak adanya penjagaan file-file apa yang dapat dibaca, mari kita coba untuk membaca app.rb
sayangnya pada percobaan pertama gagal membaca app.rb hal ini disebabkan karena karena gagal memenuhi kondisi probability, probability disini didapat dari generate angka diantara 0.0– 1.0, hal itu dibuktikan dengan kode berikut
set(:probability) { |value| condition { rand <= value } }
Setelah kita tau bagaimana cara kerjanya, kita cukup mengulang request hingga mendapat kondisi yang di inginkan.
dan kita berhasil kita mendapat source code dari app.rb, seperti yang dijelaskan diatas, program ini juga meng-import file const.rb, coba kita lihat file tersebut
kita dapat clue baru bahwa flag-nya disimpan di file flag.txt, namun ketika kita mencoba mengakses nya selalu mendapat response 401, setelah beberapa hari ada stuck, saya mendapat hint baru. hint-nya adalah
proxy
setelah mencoba mengingat hal yang pernah saya baca, saya kepikiran mungkin saja ini dapat di-bypass dengan menambahkan request header yang berhubungan dengan proxy. Setelah mencari cari beberapa referensi.
dari referensi diatas, ternyata kita dapat me-bypass nya dengan menambahkan header
X-ProxyUser-Ip: 127.0.0.1
dan akhirnya mendapatkan flag nya:
FLAG : Dirg@hayuRepvblikInd0nesia-79