Writeup Challenge Skill-Issue:Durgahayu

r gagap
3 min readAug 17, 2024

--

Diberikan sebuah link url untuk mengakses challenge nya, dalam url tersebut terdapat beberapa file seperti berikut ini

Challenge Skill Issue

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

--

--

No responses yet