
vsftpd 3.0.5 - 높음 - 원격 - 권한 잔여 - cmds_denied가 RFC 별칭(XRMD)을 놓침
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
분류: 권한 잔존 도달 범위: 원격
vsftpd 3.0.5 - Chris Evans
나는 GitHub 미러나 배포판 포크가 아닌 공식 tarball을 고정했다. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied는 process_post_login(postlogin.c:140-184)에서 대문자로 변환된 토큰과 정확히 일치하는지 검사한다. 그런 다음 디스패치에서 RFC 775 별칭을 동일한 핸들러에 OR로 연결한다: RMD||XRMD(:263-264), 또한 CWD||XCWD, MKD||XMKD, PASV||P@SW, 그리고 별도의 EPSV / STOU / APPE. 운영자가 RMD를 거부 목록에 추가하더라도(흔한 DELE,RMD 조합) XRMD는 여전히 rmdir을 수행할 수 있다.
이 잔존 취약점은 운영자가 닫혔다고 생각한 거부 목록 하에서 인증된 FTP 무결성 문제이다. 인증 우회가 아니고, root도 아니고, chroot 탈출도 아니고, RCE도 아니다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔존 (cmds_denied 정확한 토큰) |
| 도달 범위 | 원격 (인증된 FTP) |
| CWE | CWE-863 |
| CVSS | High: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 제품 | vsftpd (Chris Evans) |
| 영향 받는 버전 | vsftpd 3.0.5 공식 tarball |
| 인증 | FTP USER/PASS (실습: 익명 ftp) |
| 라이선스 | GNU Affero GPL v3.0 |
| 실습 환경 | 127.0.0.1:18720 전용 |
누가: 운영자가 cmds_denied를 설정한 데몬에서 인증된 FTP 사용자(익명 또는 로컬). 기본값은 설정되지 않음. man 페이지에 나열된 가상 사용자 조합은 게스트 uid를 공유하므로 Unix DAC가 이들을 분리할 수 없다. 세션은 이미 일반적인 chroot 내부에서 매핑된 uid이다. cmds_denied는 해당 명령을 제거하기 위한 추가 제어였다.
| 메서드 + 싱크 | 권한 |
|---|---|
cmds_denied=RMD 후 XRMD labdir | handle_rmd -> 세션 uid가 Unix-rmdir할 수 있는 디렉터리에 대한 str_rmdir. 실습: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (디렉터리 사라짐). 두 번째 MKD labctrl은 RMD에서 여전히 550. |
| 메서드 + 싱크 | 권한 |
|---|---|
cmds_denied=MKD 후 XMKD dir | handle_mkd -> 세션 uid로 mkdir |
cmds_denied=CWD 후 XCWD path | handle_cwd -> chdir. 그런 다음 download_enable이면 RETR |
cmds_denied=STOR 후 STOU / APPE | handle_upload_common 생성 / 추가. write_enable 필요 |
cmds_denied=PASV 후 EPSV / P@SW | handle_pasv가 거부 목록이 막으려던 데이터 리스너를 연다 |
실습에서는 RMD 후 XRMD만 입증했다. 다른 별칭은 동일한 str_equal 게이트와 디스패치의 동일한 OR을 공유한다. 나는 그것들을 실행하지 않았다.
일급 잔존 취약점으로서 없음. cmds_denied는 숨김이 아니다. XRMD는 이름을 나열하지 않는다.
기준에 없음. 디렉터리 제거는 무결성 타격이다. 이후 해당 이름에 대한 CWD / RETR은 부작용으로 550이 된다.
cmds_denied (로그인 전에는 무시됨; USER/PASS/QUIT는 로그인 전 테이블로 유지됨)allow_writeable_chroot 기본 꺼짐; 실습은 /incoming 아래에만 쓰므로 거부가 여전히 유지됨)cmds_allowed fail-closed: XRMD를 포함한 목록에 없는 명령은 550 유지write_enable=NO는 여전히 쓰기 계열을 차단함 (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs site 대소문자 우회 (ftpcmdio.c str_upper)cmds_denied=CHMOD는 절대 일치하지 않음; chmod_enable=NO 또는 cmds_denied=SITE로 chmod를 차단나는 공식 3.0.5에서 hide/deny/cmds_denied를 찾았다. 게이트는 쉼표 토큰을 한 번 순회하며 대문자로 변환된 명령과 str_equal을 비교한다. handle_rmd 내부에는 두 번째 검사가 없다. RFC 775는 여전히 XRMD를 RMD로 제공한다. 흔한 조언은 cmds_denied=DELE,RMD이다. 그 문자열은 XRMD를 절대 명시하지 않는다.
잘못된 방향: SITE vs site를 우회로 취급하는 것. 명령은 대문자로 변환된다. cmds_allowed도 같은 방식으로 취급하는 것: 그 목록은 fail-closed이므로 나열되지 않은 별칭은 거부된 상태로 유지된다.
cd lab
./run.sh
루프백 127.0.0.1:18720. Compose 프로젝트 vsftpd-cmds-denied-alias. lab/에 공식 3.0.5 tarball (위의 SHA-256). cmds_denied=RMD, write_enable=YES, 익명, /incoming 아래에만 쓰기. 증인 VSFTPD-CMDS-DENIED-ALIAS-WITNESS. 마지막 줄:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
현대 명령을 거부할 때 RFC 별칭도 거부하거나, cmds_denied에서 별칭을 일치시키라 (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). cmds_allowed (허용 목록)를 선호하라.
벤더 접수는 [email protected] (vsftpd). 무급. 어떤 vsftpd 미러에도 공개 GitHub 이슈를 열지 말라.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]