Bash 쉘만으로 HTTP 요청 보내기

by DD
1시간 전
조회수 2

Bash 쉘의 내장 기능인 /dev/tcp를 활용하여 curl 없이 HTTP 요청 전송 가능

최소 환경 컨테이너나 보안 제약 환경에서 유용하게 사용됨

실제 HTTP 클라이언트의 기능(리다이렉트, TLS 등)은 지원하지 않음

보안 우회 및 침투 테스트 시 유용한 트릭으로 언급됨

Bash /dev/tcp의 작동 원리 및 한계

커뮤니티에서는 Bash의 /dev/tcp 가상 파일 시스템이 실제 디스크 파일이 아닌, 쉘 내부에서 TCP 소켓을 열고 통신하는 메커니즘임을 강조합니다. 이는 DNS 조회 및 connect(2) 시스템 호출을 Bash가 대신 처리해주지만, HTTP 프로토콜의 복잡한 기능(리다이렉션, TLS, 압축 등)은 직접 구현해야 하는 한계가 있습니다. 따라서 간단한 연결 확인 및 디버깅 용도로는 유용하나, 실제 서비스 환경에서는 curl이나 wget 같은 전문 도구 사용이 권장됩니다.

보안 제약 환경에서의 활용 사례

다수의 사용자가 보안팀의 제약으로 curl, wget, netcat 등이 설치되지 않은 환경에서 이 기능을 활용한 경험을 공유했습니다. 특히 컨테이너 환경이나 최소화된 OS 이미지에서 네트워크 연결 상태를 확인하거나, 초기 침투 단계에서 페이로드를 다운로드하는 용도로 사용되었다고 합니다. 이는 보안 정책을 우회하면서도 필수적인 네트워크 통신을 가능하게 하는 트릭으로 작용했습니다.

유사 기능 및 대안 도구 비교

Bash의 /dev/tcp 기능은 KornShell(ksh)의 유사 기능에서 영감을 받았으며, POSIX 표준은 아닙니다. 대안으로 netcat(nc)이 더 범용적이고 강력한 TCP 통신 도구로 자주 언급됩니다. 또한, Perl의 IO::Socket이나 Python 스크립트를 활용하는 방법도 제시되었는데, 이는 더 복잡한 HTTP 통신 로직 구현이 필요할 때 유용합니다. 하지만 Bash의 내장 기능은 추가 설치 없이 즉시 사용 가능하다는 점에서 차별화됩니다.

HTTP 프로토콜 이해의 중요성

이 기능은 HTTP 프로토콜의 기본 구조(요청 라인, 헤더, 본문)를 수동으로 구성해야 하므로, 프로토콜에 대한 깊은 이해를 요구합니다. 댓글에서는 Connection: close 헤더의 중요성을 강조하며, 이를 생략할 경우 HTTP/1.1 기본 동작으로 인해 연결이 유지되어 문제가 발생할 수 있음을 지적합니다. 이는 개발자가 프로토콜의 세부 사항을 얼마나 잘 이해하고 있는지를 보여주는 좋은 예시로 작용합니다.

TIL: You can make HTTP requests without curl using Bash /dev/TCP