---
# System prepended metadata

title: Trần Minh Tuấn - AT180249 - MB

---

    Tuyển Thành Viên Ban Chuyên Môn KCSC - Write-Up
    Họ Tên: Trần Minh Tuấn - AT180249 - Miền Bắc

# Pokemon Hof Panel Level 1

## Đề bài: http://103.162.14.116:10003/
![image](https://hackmd.io/_uploads/BJiLvfhUT.png)


## Phân tích
- Đề bài cho em 1 src code, ngay khi vào em đọc ngay đoạn code php của file index:

```
<?php
include("./classes/trainer.php");

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_POST["name"])) {
        $name = $_POST["name"];
        $starter = $_POST["starter"];
        $user = new Trainer($name, $starter);
        $serializedUser = serialize($user);
        $base64Encoded = base64_encode($serializedUser);
        setcookie("trainer_data", $base64Encoded, time() + 3600);
        header("Location: ./champ.php");
    }
}

?>
```
Đoạn code gọi đến file trainer.php và sau đó kiểm tra xem có tồn tại phương thức POST và có tồn tại POST['name'] hay không, nếu có nó sẽ gắn biến name và starer. Sau đó tạo 1 đối tượng Trainer và mã hóa nó bằng serialize và base64. Cuối cùng là đặt session cho nó và chuyển hướng về file champ.php
- Code champ.php:

```
<?php
include("./classes/trainer.php");
include("./classes/utils.php");
function isChampion($user) {
    return $user->getChampion();
}

if (isset($_COOKIE["trainer_data"])) {
    $base64Encoded = $_COOKIE["trainer_data"];
    $serializedUser = base64_decode($base64Encoded);
    $user = unserialize($serializedUser);
    if (isChampion($user)) {
        $title = "Champion Pannel";
        $msg = "Hello, " . $user->getname() . " KCSC{level1_fakeflag}";
    } else {
        $title = "Trainer Pannel";
        $msg = "Access denied. You are not a champion.";
    }
} else {
    $title = "Something's wrong!!!";
    $msg = "No trainer data found. Please choose your starter.";
}
?>
```
Mục đích của đoạn code là kiểm tra xem có tồn tại trainer hay không, sau đó thực hiện giải mã và kiểm tra 1 làm nữa xem trainer có phải isChampion hay không. Nhưng dù là có phải hay không thì nó cũng không trả về flag mà em muốn
- Đến với file trainer: 

```
<?php 

class Trainer {
    public $name;
    public $starter;
    public $isChampion;

    public function __construct($name, $starter) {
        $this->name = $name;
        $this->starter = $starter;
        $this->isChampion = false;
    }
    public function getname() {
        return $this->name;
    }
    public function getChampion() {
        return $this->isChampion;
    }
    public function setname($name) {
        $this->name = $name;
    }
}

?>
```
Mục đích của nó là tạo ra một đối tượng Trainer gồm 3 thuộc tính name, starter , ischampion , 3 phương thức là  getname để lấy tên thuộc tính name, getChampion để lấy thuộc tính isChampion , setName để đặt thuộc tính name cho Trainer, và 1 hàm __contruct để khởi tạo đối tượng
- File utils:
```
<?php
class Utils {
    private $error;
    private $logfile;

    function __construct() {
        $this->logfile = "_error.log";
    }

    public function __toString() {
        $this->writelog();
        return "Error: " . $this->error;
    } 

    public function writelog() {
        file_put_contents("/tmp/logs/".date('H_i_s').$this->logfile, $this->error);
    }

} 
?>
```
hàm này tạo ra đối tượng utils để lưu nhật kí và báo lỗi

## Phương hướng và khai thác
- Em thấy ở file index thì bài này nó dùng cookie được tạo ở file index gồm các thuộc tính của đối tượng trainer, nên em nghĩ nếu thay đổi được nó bằng admin thì có thể đăng nhập vào bằng quyền admin. 
- Đăng nhập vào bằng bằng bất kì tên tài khoản nào và em thực hiện bắt lấy request:

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

- Tại request thì em thấy nó gửi lên tham số name và starter em đã chọn. Nhưng tại respone thì em để ý có đoạn set cookie, như đã phân tích nó được mã hóa bằng base 64. Decode nó thử:

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

- Kết quả không ngoài dự đoán giờ thì em chỉ cần thay đổi các giá trị và set lại cookie cho nó để solve bài lab

![image](https://hackmd.io/_uploads/BkQwKz3UT.png)
![image](https://hackmd.io/_uploads/HyWoYf2La.png)

# Mi Tom Thanh Long

## Đề bài: http://103.162.14.116:10002/
![image](https://hackmd.io/_uploads/HyFG5G38p.png)
## Phân tích
- Vào bài lab, em có lượn quanh các tab để xem có gì đặc biệt, thì em thấy trên thanh url có xuất hiện tham số page

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

Thường thì các tham số kiểu này trên thanh url rất dễ bị khai thác, em thử path travelel nó thành công
![image](https://hackmd.io/_uploads/S19asG3UT.png)

- Đọc nguồn trang thì em thấy có địa chỉ của các file mà các các tab trên thanh menu chuyển hướng tới bằng thẻ a:

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

## Phương hướng và khai thác

- Vì tham số page của url có thể khác thác nên em có ý tưởng là sẽ rce để đọc các tập tin hệ thống
- Sau 1 thời gian em tìm trên 1.  [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master) thì em tìm được payload này:

`pHp://FilTer/convert.base64-encode/resource=index.php`

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

- Như vậy bây giờ em chỉ cần đọc file flag.php nữa là thành công

![image](https://hackmd.io/_uploads/ryhFCGnI6.png)
# Apply To KCSC
## Đề bài: (http://103.162.14.116:10001/)
![image](https://hackmd.io/_uploads/r1QkxmhUp.png)
## Phân tích
- Vào bài lab là 1 form điền thông tin đăng kí join vào KCSC:

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

- Em upload thử 1 vài thông tin bất kì, nội dung thông tin được đẩy đi sẽ là những thứ em điền tại form. Nhưng ở đây có 1 điều bất cập là nó chỉ cho nộp những cv có đuôi là pdf dưới 1 mb, vì vậy em biết là nó sẽ chỉ xử lí những file có đuôi là pdf, nhưng mà em vẫn muốn thử đổi tên file và nội dung của cv gửi đi xem kết quả sẽ như thế nào

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


Nó vẫn báo thành công nhưng khi em xem thì nhận được thông báo lỗi

- Em để ý thấy là bên reponse thì server của nó là apache. Em biết được nếu server là apache thì khả năng cao nó sẽ dùng được file `.htaccess`. Vì vậy em sẽ tiến hành upload 1 file .htaccess

## Phương hướng và khai thác: 
- Em sẽ tiến hành upload 1 file .htaccess với payload là: `AddHandler application/x-httpd-php .php .pdf` để yêu cầu server xử lí file có đuôi php của em như 1 file pdf

![image](https://hackmd.io/_uploads/rJ7_X73L6.png)
- Upload thành công em kiểm tra thử phía server đã xử lí file php của em chưa bằng cách upload lại 1 file có đuôi và nội dung php

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

- Vậy là nó đã xử lý file pdf giờ thì chỉ cần upload file shell lên và đi tìm flag nữa là xong

![image](https://hackmd.io/_uploads/H1pbLQ3U6.png)
![image](https://hackmd.io/_uploads/BJ77L72L6.png)

# A gift for pwners
- Bài này flag gồm 3 phần mở file đọc thì mình thấy được 2 phần là `KCSC{A_gift_` và `pwners_0xdeadbeef}` nó bị khuyết mất 1 phần. Và phần còn lại mình dùng ida để đọc

![image](https://hackmd.io/_uploads/H1g5wX3La.png)
![image](https://hackmd.io/_uploads/HJQ5wX28a.png)
- Phần còn lại là `for_the_`
- Flag: `KCSC{A_gift_for_the_pwners_0xdeadbeef}`

# Ez_Ceasar
- Bài này cho em 1 đoạn code của mã caeser:
```
import string
import random

alphabet = string.ascii_letters + string.digits + "!{_}?"

flag = 'KCSC{s0m3_r3ad4ble_5tr1ng_like_7his}'
assert all(i in alphabet for i in flag)

key = random.randint(0, 2**256)

ct = ""
for i in flag:
    ct += (alphabet[(alphabet.index(i) + key) % len(alphabet)])

print(f"{ct=}")

# ct='ldtdMdEQ8F7NC8Nd1F88CSF1NF3TNdBB1O'
```
- Có bản mã ct và bắt đi tìm lại bản rõ. Code giải mã

```
import string

alphabet = string.ascii_letters + string.digits + "!{_}?"

flag = 'KCSC{s0m3_r3ad4ble_5tr1ng_like_7his}'
assert all(i in alphabet for i in flag)

ct = 'ldtdMdEQ8F7NC8Nd1F88CSF1NF3TNdBB1O'
key_range = len(alphabet)

for key in range(key_range):
    decrypted_flag = ""
    for i in ct:
        decrypted_flag += (alphabet[(alphabet.index(i) - key) % len(alphabet)])
    
    print(f"Key {key}: {decrypted_flag}")

```

![image](https://hackmd.io/_uploads/Hkc4t7nUp.png)
- Flag: `KCSC{C3as4r_1s_Cl4ss1c4l_4nd_C00l}`