Summary (441 pts)

Deskripsi

sum it up baby

nc 103.152.242.228 1011

Author : MockingJay

Pada soal ini kita diberikan sebuah service dan source code-nya yakni chall.py.

#! /usr/bin/python3

import hashlib
import subprocess
from binascii import hexlify

wl_cmd = b'echo lol'
wl_hash = hashlib.sha1(wl_cmd).digest()[:3]

def main():
    while True:
        print('\nWelcome to my secret service, have fun!\n')
        input_cmd = input('> ').encode('latin1')
        
        if input_cmd == b'exit':
            print('Bye-Bye ๐Ÿ‘‹๐Ÿ‘‹๐Ÿ‘‹')
            exit()
        
        if hashlib.sha1(input_cmd).digest()[:3] != wl_hash:
            print(f'Unknown command, try this command instead : {wl_cmd.decode("latin1")}')
            continue

        if b'flag.txt' in input_cmd:
            print(f'bruh use another method h3h3h3h3')

        try:
            res = subprocess.check_output(['/bin/bash', '-c', input_cmd])
            print(res.decode())            
        except subprocess.CalledProcessError as e:
            print(f'Command returned non-zero exit status {e.returncode}')

if __name__ == '__main__':
    main()

Jadi intinya begini: Kita bisa memasukkan command bash melalui input pada service Syaratnya, 3 byte pertama dari hasil hash input kita harus sama dengan 3 byte pertama dari hasil hash bโ€echo lolโ€ Selain itu, input kita tidak boleh mengandung โ€œflag.txtโ€ Hash yang digunakan adalah sha1 (ini tidak terlalu relevan dengan penyelesaian dari soal)

Di sini vuln-nya adalah pengecekan hasil hash yang hanya pada 3 byte pertama. Apabila kita mencoba memasukkan input berbeda sebanyak lebih dari 256^3 maka kemungkinan terjadi collision akan sangat tinggi (adapun karena di sini kita hanya bisa menggunakan karakter printable, jadi saya menggunakan 4 byte untuk slot karakter random, sehingga ada 100^4 kemungkinan). Maka dari itu, kita buat saja versi input yang berbeda-beda, tapi tujuan command-nya sama, yaitu membaca flag.txt.

Oh iya, karena command yang kita inputkan tidak boleh ada โ€œflag.txtโ€-nya, maka diperlukan workaround. Setelah beberapa trial and error, saya akhirnya menggunakan cat *; echo โ€œ{hal random}โ€.

Untuk mencoba segala kemungkinan tersebut dengan โ€œhal randomโ€, saya menggunakan script berikut.

Didapat cat *; echo โ€œ8R=0โ€. Memasukkannya ke service, kita mendapat isi dari semua file yang ada di directory server, termasuk flag.txt.

Flag: slashroot7{easy_crypt0_chall_f0r_ez_first_chall}

Last updated