Steal My Bitcoin CTF PoC - PHP 메모리 누수부터 명령 실행까지 재현하는 Python 스크립트

1 week ago 27

Python 표준 라이브러리만 사용하는 단일 파일로 Steal My Bitcoin CTF의 요청 흐름을 재현함. 각 주소 누출을 검증한 뒤 다음 단계로 진행하고, 실행 중 주고받은 HTTP 데이터를 저장함 PHP의 세션 업로드 진행 상황 처리 중 메모리 부족을 유발해 재사용되는 워커에 오래된 상태를 남기고, 후속 요청의 세션 쿠키에서 힙 주소와 코드 주소를 얻음 두 주소를 바탕으로 위조한 HashTable 을 배치하고, PHP 정리 경로가 zif_system을 호출하도록 유도함. 새 난수 표식과 명령 출력으로 실제 실행 여부를 확인함 Alpine PHP 8.4.26의 4개 워커 CLI 서버에 맞춰 보정된 PoC로, 같은 PHP 버전이라도 빌드나 메모리 구성, 워커 수가 달라지면 실패할 수 있음 격리된 로컬 실험에서 10회 중 7회 실행 증거를 확인했으며 자동 재시도는 없음. 실제 챌린지에서 얻은 개인 키는 당시 상금 주소와 일치하지 않았고, 원래 실행 기록에도 증거상의 한계가 있음 프로젝트 범위와 실행 환경 stealmybitcoin_poc.py는 CTF 실행에 사용한 요청 순서를 재현하는 단일 파일로, Python 3.11 이상과 표준 라이브러리만 필요함 요청을 직접 구성하고, 누출 결과를 검증하며, 새 실행에서 수집한 HTTP 바이트를 기록함 디버깅 코드가 많이 남은 PoC이며, 추가 정리가 필요함 재현 절차의 기준은 실제 챌린지 서버가 아니라 로컬 Docker 실험 환경임 nginx 뒤에서 Alpine PHP 8.4.26 내장 CLI 서버를 워커 4개로 실행함 이미지 태그에 fpm이 들어가지만 실제 실행 방식은 php -S이며 SAPI는 cli-server임 버전 확인용 페이지와 더미 값을 반환하는 print-flag로 전체 흐름을 로컬에서 검증함 버전 문자열보다 바이너리 빌드가 중요함 Debian의 php:8.4.26-fpm은 같은 버전을 표시해도 바이너리 배치가 달라 코드 포인터 지문 검사를 통과하지 못함 추적기를 연결하기 위한 추가 권한은 PoC 자체에 필요하지 않음 스크립트는 챌린지 엔드포인트 또는 루프백 실험 URL만 허용하며, 다른 대상은 패킷을 보내기 전에 거부함 인자 없이 실행하면 도움말만 출력하고 네트워크에 접근하지 않음 의도적으로 PHP 메모리를 고갈시키므로 해당 동작이 허가된 환경에서만 실행해야 함 최대 20개 요청으로 구성한 실행 흐름 전체 실행은 상태 확인 1회, 주소 누출 배치 최...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵