-
nc(netcat)에 대한 설명과 echo로 http response 테스트 하기리눅스 2022. 6. 29. 08:56
적다보니 잡담이 길어졌다.
아래 한줄까지 하면 세줄요약
echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 80
nc는 network concatenate, 즉 netcat 이다.
centOS 7 환경에 패키지 이름은 nc
yum install nc
cat 명령은 파일을 순차적으로 읽어 출력으로 가져오는 동작을 한다.
nc 명령은 이 행위를 소켓까지 확장한다.
간단한 배너그래빙 비슷한 동작을 해보면
sshd를 대상으로 파이프를 냅다 열어버리는 동작이다. 프로토콜 소개가 Full-Text로 오는것을 볼 수 있다.
물론 내가 보낸 응답은 그냥 개행문자.
telnet에게 하는 동작과 굉장히 유사하나, Connection closed 에 대한 동작이 다르다.
중요한 내용은 아니지만 궁금하니까 패킷을 잡아서 보자
이 동작을 보면, telnet과 nc가 굉장히 비슷한 동작을 함을 알 수 있다. 다른점은 FIN을 받은 즉시 telnet은 구현 자체가 FIN을 받으면 어차피 데이터를 보내나마나니 바로 FIN으로 응답하는걸 볼 수 있으나 nc는 구현이 없다. 정말 파이프만 열어놨을뿐. 그러니 직접 인터럽트를 보내기 전까지는 FIN을 보내지 않는다는것이다.
그렇다면, 이를 무시하고 계속 무언가를 보내면 RST가 오지 않을까?
그렇다.
재미있는점은 nc는 LISTEN 상태도 동작한다는것이다.
다 나왔다. 데이터는 원하는대로 보낼 수 있고, LISTEN도 된다. 어차피 bash에서 파이프로 입출력을 리다이렉트 할 수 있고... HTTP를 테스트 한다면?
echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 80
정말 빠른 웹서버가 완성된다. 물론 nc는 1회 응답 후 종료되므로 필요하다면 while 로 감싸는 등의 동작을 할 수 있다.
while로 감쌀 수 있다는것은 들어오는 데이터의 검증도 부분적으로 가능하다는 뜻이다.
단순한 200 OK 외에도, 접속 후 응답 없는 상황 등, 필요한 온갖 상황을 만들 수 있다.
물론 테스트 할 수 있는 환경이 있다면 제일 좋겠지만 API 명세만 보고 동작을 테스트 해야 하는 상황에서는 제일 여러 상황을 만들기 좋았다.
* netcat은 인증 없는 평문 통신을 하고 백도어 쉘 등으로 악용도 가능한 도구다. 즉, 유효한 데이터는 nc를 통해 주고받아서는 안되며 공용 네트워크나 외부 네트워크에서 접근할 수 있는 시스템에서는 netcat을 데몬 처럼 LISTEN 하는 것은 피하는것이 좋다.
'리눅스' 카테고리의 다른 글
리눅스에서 CPU 100% 만들기 (CPU를 괴롭하는 여러가지 방법) (0) 2022.07.13 리눅스에 큰 더미 파일 만들기 (0) 2020.05.27