---
# System prepended metadata

title: 'Tìm hiểu về ZipSlip, Symlink '
tags: [symlink]

---

# I. Symlink

Symlink hay còn gọi là Symbolic links, là một file đặc biệt trỏ đến một file hoặc thư mục khác trong hệ điều hành Linux .

Để tạo 1 symlink ta sẽ sử dụng command `ln` với option `-s`.

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

**Tính chất :** 
Với 1 symlink ta hoàn toàn có thể thao tác trực tiếp đến file hoặc thư mục gốc, ví dụ khi mình thay đổi nội dung của file link thì file /etc/passwd của mình cũng sẽ bị thay đổi theo. Hoặc khi xóa 1 file hay thư mục nào đó trong đường dẫn thì đường dẫn /etc của mình cũng sẽ bị như vậy.

## 1. Symlink attack

**Symlink attack chỉ thực hiện được ở webserver trên linux**

Để tấn công trong trường hợp này, trang web bị lỗi sẽ thỏa 2 điều kiện sau:
1. Cho upload file tar, zip hay bất cứ định dạng file nén nào
2. Webserver giải nén file đó (và in nội dung file bên trong ra?)

Bước 1 : Tạo một symlink 

Bước 2 : Nén nó lại

Ta cần sử dụng option đó là `-y` hoặc `--symlink`

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

Đối với thư mục

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


## 2. Demo Labs

### a. Đọc file tùy ý

Web có tính năng giải nén file zip được upload lên như sau

![image](https://hackmd.io/_uploads/rk-z1tJ9T.png)

Bây giờ mình sẽ thử tấn công để đọc file `/etc/passwd`

Đầu tiên tạo một symlink trỏ đến /etc/passwd

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

Tiếp theo tiến hành zip nó lại

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

Cuối cùng upload lên server 

Kết quả : 

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

Truy cập

![image](https://hackmd.io/_uploads/HkZ4-Yk5p.png)

### b. RCE

Như ta đã biết tính chất của một symlink là : khi thao tác đến symlink thì giá trị của file hoặc thư mục gốc cũng sẽ bị thay đổi.

Sẽ ra sao nếu như upload lên một symlink trỏ đến thử mục `/var/www/html` 

Sau đó một tiếp tục upload lên một một thư mục có cùng tên , nhưng bên trong đó sẽ chứa một file shell.php

**Giả thuyết** : Lúc này 2 thư mục sẽ được ghi đè lại với nhau , như vậy symlink sẽ bị thay đổi là add thêm file shell.php (`link/shell.php`) -> dẫn đến thư mục (gốc) `/var/www/html` cũng sẽ thay đổi theo -> `/var/www/html/shell.php`

**Kiểm chứng** :

Bước 1 : 

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


Sau đó upload lên server

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



Bước 2 : 

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



Tiếp tục upload lên server

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



Bước 3 : Truy cập 

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

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



# II. Zip Slip

## 1. Zip Slip attack

Trường hợp Path Traversal liên quan đến việc **thay đổi name file** bên trong file nén (zip), đó chính là lỗi Zip Slip

**Khai thác lỗ hổng Zip Slip**
- Để exploit lỗi Zip Slip này, người ta thường dùng công cụ cho phép thay đổi tên file sao cho có chứa `../` 
-  Một trong các công cụ nổi tiếng là [evilarc](https://github.com/ptoomey3/evilarc/blob/master/evilarc.py)
- Sau khi download file [evilarc.py](https://github.com/ptoomey3/evilarc/blob/master/evilarc.py) ta thực hiện lệnh
`python3 evilarc.py -d 2 -o unix shell.php`
- Trong đó:
     `-d`: số lượng `../` ta muốn thêm vào tên file
     `-o`: tạo file theo tiêu chuẩn của hệ điều hành nào
- File nén được tạo ra có tên là evil.zip

## 2. Demo Labs

Trang web có chức năng upload file

![image](https://hackmd.io/_uploads/Hk2w-1x56.png)

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

Mục tiêu của ta là upload shell được vào thư mục `/var/www/html`

Có 2 trường hợp xử lý 

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


- Nếu là file ảnh thì sẽ thực hiện upload lên server
- Nếu là file zip thì sẽ gọi hàm unzip để giải nén

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

Nhận thấy đoạn code giải nén bị lỗi path traversal

Để ý ở dòng 52 thì biến `$info['name']` chứa name_file bên trong thư mục zip được nối thẳng vào để tạo đường dẫn .

Do name_file ta có thể kiểm soát được nên ta có thể thêm `../` vào name_file để thực hiện path traversal ra ngoài `/var/www/html`

Thực hành exploit zip slip : 

Bước 1 : Tải công cụ  [evilarc.py](https://github.com/ptoomey3/evilarc/blob/master/evilarc.py) 


Bước 3 : Tạo một file info.php và thực hiện lệnh

`python3 evilarc.py -d 2 -o unix info.php`

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


Bước 4 : Upload và truy cập

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


# Trí tuệ

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


# Tham Khảo 

https://tsublogs.wordpress.com/2017/04/05/pentest-qa-cung-tsu-2-symlink-attack/

https://www.youtube.com/watch?v=hB7BzU0iTnY

https://clbuezzz.wordpress.com/2022/04/27/symlink-attack/

https://youtu.be/5mapJQ7TFyc?si=2SvL797y5qpT6mWj
