Hack The Box/Lab

Included - LFI 2 & tftp & lxd

YujinSec 2026. 5. 7. 07:34

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이미지도 필요함. 

https://hacktricks.wiki/en/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.html#lxdlxc-group---privilege-escalation

 

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로 권한 상승 ㄱㄱ. 

 

아래 익스플로잇을 활용할 거. 

https://hacktricks.wiki/en/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.html#lxdlxc-group---privilege-escalation

 

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