
1. 기본 개념
0) nmap
- 옵션 따로 지정 안 하면 tcp만 스캔함.
-sU: udp만 스캔. (슈퍼 유저 권한인 sudo 필요함 + 시간 오래 걸리는데 그거 정상임 ㅇㅇ)
1) LFI = local file inclusion
: 서버에 존재하는 로컬 파일을 읽는 공격 기법
ex)
if ($_GET['file']) {
include($_GET['file']);
} else {
header("Location: http://$_SERVER[HTTP_HOST]/index.php?file=home.php");
}
-> 위 코드 취약점 패치하면?
if ($_GET['file']) {
include( __DIR__ . $_GET['file']);
} else {
header("Location: http://$_SERVER[HTTP_HOST]/index.php?file=home.php");
}
현재 파일 위치/file인자값 이런식으로 경로가 형성되어짐.
-> 대신 ../../../이런식으로 file인자 넣어버리면 소용 없어짐.
> etc/passwd 파일이란?
리눅스 사용자 계정 정보 파일.
>>구조
username:x:UID:GID:설명:홈디렉토리:쉘
username: 유저 명
x: 원래 비번 자리였다 안 씀 -> 지금은 /etc/shadow로 분리
uid: 사용자 id, 0=root
홈디렉터리: 로그인 시 위치
쉘: 로그인 후 실행되는 쉘
LFI 확인 기법)
해당 시스템에 확실히 존재하고, 모든 사용자가 읽기 가능한 파일 로드 시도하기
-> /etc/passwd 파일 읽기 시도.
2) tftp = trivial file transfet protocol
: ftp의 간단한 버전. 사용자 인증없이 기본적인 파일 전송 기능만 제공함.
- udp(=user datagram protocol, ip위에서 동작) 사용함.
- 누구나 tftp 서버에 연결해 원격 시스템에서 파일 업로드, 다운 가능함.
- 툴: tftp
https://help.ubuntu.com/community/TFTP
TFTP - Community Help Wiki
Background A network administrator may find the need to deploy a TFTP server quickly and cost effectively. The reader may find that there is more than one TFTP server package available for Ubuntu systems. apt-cache search tftpd including tftpd, atftpd, and
help.ubuntu.com
3) lxd
: 리눅스에서 lxc 컨테이너를 관리하기 위한 관리 api.
- 같은 lxd 그룹에 속해있는 구성원의 권한을 검증없이 마음대로 사용할 수 있음
- lxd 자체가 이미 root로 돌아가고 있으므로, 사실상 root권한 바로 사용 가능함!
- 단, lxd 자체는 일단 컨테이너 관리자로, 컨테이너를 만들려면 os이미지도 필요함.
lxd/lxc Group - Privilege escalation - HackTricks
Learn & practice AWS Hacking: HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)...
hacktricks.wiki
4) Alpine 이미지
: busybox 기반의 경량 리눅스 배포판.
> rootfs.squashfs: os 본체. /bin, /etc 등의 파일 가짐.
> lxd.tar.xz: lxd에 대한 설명서 파일.
-> 컨테이너가 루트 파일 시스템과 동일한 권한가지도록 설정 변경 필요:
security.privileged 플래그를 true로 변경.
-> 루트 파일 시스템을 컨테이너 내부의 /mnt 폴더에 마운트하기도 필요.
*마운트 = 다른 디스크를 현재 폴더에 연결해서 쓰는 것
2. 문제 풀이

일단 http로.

보면 file이라는 인자를 조작할 수 있음. 여기에 php적는 것.

LFI 취약점이 존재하나 확인 위해 비번 폴더 적어봄. 이게 읽히면 존재하는 것.


이렇게 보니 뛰어쓰기가 안 되어 더럽게 보인다,,,
curl로 요청해서 봐주자.


여기서 맨 마지막 줄에 tftp가 보임.
그럼 tftp가 타켓에도 연결이 된 상태인지 확인해보자. tftp는 udp이니 nmap에서 별도 옵션을 붙여줌.

진짜 한참 걸렸네,,
아무튼 tftp 존재한다!
그럼 tftp 접속을 위해 툴을 설치해야한다,, 근데 계속해도 안 됨. 뭔가 했지만 일단 busybox라는 곳에는 존재한다 함. 그걸로 하자.
아니면 curl로도 된다고 함.
그럼 이제 우리가 할 건?
셸을 따야 함.
고로 셸 따는 코드를 생성해서, 우리가 안 tftp 포트를 이용해 업로드 할 거.
일단 셸 따는 코드는 아래 링크를 사용함.
https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
그리고 그 중 아래 정보는 수정 ㄱ.


tftp에 연결해서 shell.php를 업로드해주자.

이제 셸 따는 코드는 업로드 했고, 걔를 실행해야 함.
그럼 걔가 실행될 때 우리 포트랑 연결이 되어야겠지?
고로 냇캣 리스너 먼저 켜주기. 앞에서 포트 1234로 적었으니 1234를 리스닝 상태로 해줘야 함.

이제 php업로드 한 걸 실행만 해주면 되는데,,, 중요한 건?
어디에 업로드 된 건지 모름. 그러나 이건 앞에서 본 파일 내용에도 나와있다.

혹은 구글 서치로도 나오듯이, 디폴트가 있음.
>>
tftpd-hpa의 기본 설정 파일: /etc/default/tftpd-hpa
파일들이 저장되는 기본 루트 디렉터리: /var/lib/tftpboot
고로 우린 /var/lib/tftpboot/shell.php를 실행하면 됨.
이거 실행은?
간단하게 curl로만 해주자. ㅎㅎ
앞에서 file인자 활용해서 LFI하는 건 알아냈으니 그 방법으로 실행해주는 거임.

아직은 www-data라는 기본 권한으로 user플래그를 얻을 수는 없음.
대신 우린 앞에서 확인한 tftp위에 적힌 mike권한을 따볼거임.
일단 우리 권한에 맞춰 폴더 경로 이동부터 해야 하는 듯,, >>설명 보니 이 폴더가 보통 웹 관련 정보를 가지고 있다고 해서, 저 경로로 시작하는 게 좋다 함.

저 파일 중 htaccess랑 htpasswd는 http에 대한 id/비번을 저장하는 파일임.
각각 이름/비번인 듯.
액세스는 뭐라는지 모르겠음. 근데 아래 보니 정보 획득 ㅇㅋ.

저건 http 에 대한 정보이지만, 역시나 중복될 수 있으므로 여기서 권한 상승 시도 ㄱ.
근데 그냥 su 하면 안 되고, 아래 명령어 먼저,,
python3 -c 'import pty;pty.spawn("/bin/bash")'

일단! 유저는 ㅇㅋ.

이제는 루트로 상승해야하는데,,, 이걸 어떻게 하냐!!!
바로 그룹 lxd를 활용할 거임. 뭐든 들어가지면 whoami랑 id랑 pwd 검색은 기본으로 해주자.

lxd로 권한 상승 ㄱㄱ.
아래 익스플로잇을 활용할 거.
lxd/lxc Group - Privilege escalation - HackTricks
Learn & practice AWS Hacking: HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)...
hacktricks.wiki
설명에 따르면, 먼저 alpine 이미지 먼저 다운
> 이미지 빌드 (그냥 공식 lxc 컨테이너 저장소에 이미 빌드된 alpine이미지 다운해주면 됨.)
https://images.lxd.canonical.com/
LXD Images
Images hosted on this server are available in LXD through the predefined remote images:. For detailed instructions about LXD image management, please refer to our How to Manage Images guide in the official documentation. Images are built daily and we retai
images.lxd.canonical.com
> http 서버 켜서 폴더 연결.
> lxd에 import:
(추가 설명)
=> 지금 타겟에 파일 2개 있음
lxd.tar.xz
rootfs.squashfs
저 둘을 import라는 걸 해서, lxd에게 이 파일 2개를 컨테이너 이미지로 등록하라!고 지시하는 거.
> 컨테이너를 root권한으로 실행: privileged=true
> 호스트 마운트: 호스트 전체 디스크를 컨테이너 안의 /mnt/root로 연결하기
*빌드 = 실행 가능한 형태로 포장하는 과정
*컨테이너 이미지 = 컨테이너를 만들기 위한 os 복사본
amd로 alpine찾아서 다운.

그 중에 아래 2개로.

다운한 폴더로 우선 이동한 뒤, http 서버를 키자. 그럼 이 폴더를 http로 접속할 수 있는 상태가 된 거임.

폴더 서버는 켜짐. 이제 mike컴에 연결 ㄱㄱ.
wget으로 다운받아주면 됨.


이제 lxc import해주기.
lxc image import lxd.tar.xz rootfs.squashfs --alias alpine
잘 되었나 이미지 목록도 출력해보면 굿!

마지막으로! alpine이미지가 루트 파일 시스템과 동일 권한 가지게만 설정하면 끝~
> security.privileged -> true로!!
> 이렇게 하면 컨테이너 상의 root가 진짜 root권한과 동일해진다는 뜻임.
lxc init alpine privesc -c security.privileged=true

/mnt폴더로 마운트.
지금은 컨테이너 안이므로, 호스트에 진짜 접근을 위해서는 둘 호스트-컨테이너를 연결해야 함.
이게 마운트이다.
lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true


lxc start privesc: privesc라는 컨테이너 켜라. 이 컨테이너 이름은 내가 root권한 설정할 때 적은 이름.
lxc exec privesc /bin/sh: 컨테이너 안으로 들어가서, 셸 실행
마운트 폴더로 가서 확인하면 끝!






'Hack The Box > Lab' 카테고리의 다른 글
| Voleur (0) | 2026.05.16 |
|---|---|
| Oopsie - 경로 하이재킹 (0) | 2026.05.08 |
| Planning - ffuf & netstat & cron (0) | 2026.05.07 |
| Base - swp & reverse shell 2 (0) | 2026.05.04 |
| Tactics - smb & impacket (0) | 2026.05.02 |