---
# System prepended metadata

title: '[CHH CTF ss2] - Video Link Extractor - CookieHanHoan CTF season 2 (Whitebox) (Hard)'
tags: [POC, CTF]

---

# Writeup - Video Link Extractor - CookieHanHoan CTF season 2 (Whitebox) (Hard)

## Giới thiệu
![](https://hackmd.io/_uploads/rJCFWwQza.png)

Tải Challenge (github or drive): 

https://drive.google.com/file/d/1jG_gLa9W_qcxhrAokVAbLgkEd2yS-uEX/view?usp=drive_link

[Link github](https://github.com/an040702/ctf/blob/main/arenas2-web-video-extractor.zip)

Challenge về PHP khá hay ho khi vận dụng deserialization và một chút vọc vạch

## Mục tiêu và đối tượng
1. Mục tiêu
    a. Flag là file flag.php
2. Đối tượng khoanh vùng
    a. Đầu tiên là đập vào mắt quả redirect khá chất lượng khi mình tự control được tham số
    ![](https://hackmd.io/_uploads/Hyt0bDQzp.png)
    b. Trong file utils thí lại có deserialize từ đường dẫn local đồng thời trong class utils có hàm _wakeup
    ![](https://hackmd.io/_uploads/rkQyfD7fa.png)

## Thực hiện
Đối với các đối tượng khoanh vùng trên thì mình có thể dựng lên một kịch bản, là bắt phía local kia sử dụng tính năng redirect sang host của mình để lấy dữ liệu, từ dữ liệu mà mình control được ở host thì sẽ lấy đó mà deserial ra và trigger hàm wakeup như sau

![](https://hackmd.io/_uploads/rylibzwXfT.png)

Vì deserial trigger hàm wakeup, mà hàm wakeup lại sử dụng include biến file (nên mình tạo object để control biến file này luôn). Như kiến thức về php thì đối với hàm include có thể trigger được code php bất kể file nào, nên mình sẽ control nó trỏ về file lỗi ở /tmp/xxx.log, nội dung file lỗi mình control nốt luôn dưới code sau:

![](https://hackmd.io/_uploads/HyIfzwmfp.png)

Nên tổng hợp lại sẽ có các step sau:

1. Tạo file log lỗi với code php
2. Gửi request với tham số host=local kèm redirect tới host chứa object mình muốn deserial

![](https://hackmd.io/_uploads/HkmmMDmMT.png)

Thử tạo code php để request tới host của mình control

Ở phía host mình tạo object như sau (file log được tạo bằng hàm time() nên là thời gian sẽ tính tới giây, điều này dễ để mình chạy intruder vì trong vòng 60s tương được 60 số đuôi thay đổi):

![](https://hackmd.io/_uploads/SyEEzv7Ma.png)

Gửi request redirect sang host mình để thực thi deserial và kiểm chứng xem có nhận được request /test như mình vừa viết trong log không

![](https://hackmd.io/_uploads/r1ZHGDQGT.png)


Và đúng như mình dự đoán thì trigger thành công và nhận được request /test

![](https://hackmd.io/_uploads/B1pSGDQGp.png)

Tương tự thì viết command để read file flag

![](https://hackmd.io/_uploads/BJLIGD7MT.png)

Làm tương tự bước trên để húp đươc flag

![](https://hackmd.io/_uploads/H1evzw7Gp.png)

Tadaaa khá là ezi game