더티 파이프 배포
이 챌린지에서는 CVE-2022-0847 취약점을 이용하여 읽기 전용 파일 "cat.txt"를 덮어쓰려고 합니다.
이 취약점을 이용하는 방법은 여러 가지가 있습니다.
의존성
- Linux Kernel 버전 5.8 이상 (취약)
- gcc (GNU Compiler Collection): 취약점 코드 컴파일용
첫 설정
- 취약한 환경 설정:
- Linux 사용자:
- 커널 버전 5.8 이상이면서 패치된 버전 미만의 Linux 배포판을 사용하세요:
- 패치된 버전은 5.16.11, 5.15.25, 5.10.102를 포함합니다.
- 다음 명령어로 시스템의 커널 버전을 확인하세요:
uname -r
- 커널이 이미 패치된 경우, 다운그레이드하거나 다른 Linux 설치를 사용하여 취약한 조건을 충족해야 할 수 있습니다.
- Windows 사용자:
- 가상 머신 설치:
- Oracle VM VirtualBox 또는 VMware 같은 가상 머신을 다운로드하여 설치하세요.
- 취약한 Linux 배포판 다운로드:
- Kali Linux 아카이브를 방문하여 이전 버전의 Kali Linux를 다운로드하세요.
- 권장 버전은 5.8~5.15 커널을 포함한 릴리스입니다(예: Kali 2021.1).
- 또는 일치하는 커널 버전을 가진 다른 Linux 배포판도 작동합니다(예: 이전 버전의 Ubuntu 또는 Debian).
- VM 설정:
- VirtualBox에서 새 가상 머신 생성:
- 최소 2GB RAM과 10GB 디스크 공간 할당.
- 다운로드한 ISO 파일을 사용하여 Linux 배포판 설치.
- 설치 후, 다음 명령어로 커널 버전을 확인:
uname -r
- 필요한 도구 설치:
- 환경 설정 후, 다음 도구가 설치되었는지 확인:
- gcc: 취약점 코드 컴파일 필수.
- make: 필요 시 프로젝트 빌드용.
- 패키지 관리자를 업데이트하고 도구 설치:
sudo apt update
sudo apt install gcc make -y
챌린지 시작
- 시작:
커널 버전을 반드시 확인하세요!
이 GitHub 링크(https://github.com/basharkey/CVE-2022-0847-dirty-pipe-checker.git)를 사용하세요.
cat.txt 파일이 읽기 전용 파일인지 확인하세요.
제한 사항:
공격자는 읽기 권한이 있어야 합니다 (splice()로 페이지를 파이프에 넣어야 하므로)
오프셋은 페이지 경계에 있지 않아야 합니다 (해당 페이지의 최소 1바이트가 파이프로 스플라이스되어야 하므로)
쓰기는 페이지 경계를 넘을 수 없습니다 (나머지 부분에 대해 새로운 익명 버퍼가 생성되므로)
파일 크기를 조정할 수 없습니다 (파이프가 자체 페이지 채우기 관리를 가지며 페이지 캐시에 추가된 데이터 양을 알리지 않으므로)
- 취약점 배포:
- 파이프 생성.
- 파이프를 임의의 데이터로 채웁니다 (모든 링 항목에 PIPE_BUF_FLAG_CAN_MERGE 플래그 설정).
- 파이프를 비웁니다 (struct pipe_inode_info 링의 모든 struct pipe_buffer 인스턴스에 플래그가 설정된 상태로 남김).
- 대상 파일(O_RDONLY로 열림)에서 대상 오프셋 바로 직전부터 파이프로 데이터를 스플라이스합니다.
- 파이프에 임의의 데이터를 씁니다. 이 데이터는 PIPE_BUF_FLAG_CAN_MERGE가 설정되어 있으므로 새로운 익명 struct pipe_buffer를 생성하는 대신 캐시된 파일 페이지를 덮어씁니다.
cat.txt를 덮어쓰고, 다음을 변경합니다:
I'm a cat
1444
에서
I'm a dog
2025
- check_cat.sh를 사용하여 작동 여부를 확인하세요.
chmod +x check_cat.sh
./check_cat.sh
챌린지 재생성
다음을 사용하세요:
chmod +x cat_generate.sh
./cat_generate.sh
챌린지 게시
힌트는 hints.txt에 있습니다.