ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에게 netcat

    sshd를 대상으로 파이프를 냅다 열어버리는 동작이다. 프로토콜 소개가 Full-Text로 오는것을 볼 수 있다.

    물론 내가 보낸 응답은 그냥 개행문자.

    sshd에게 telnet

    telnet에게 하는 동작과 굉장히 유사하나, Connection closed 에 대한 동작이 다르다.

     

    중요한 내용은 아니지만 궁금하니까 패킷을 잡아서 보자

     

    tcpdump로 lo 패킷을 잡아 확인하기 위한 동작

     

    telnet 동작
    nc 동작

    이 동작을 보면, 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 하는 것은 피하는것이 좋다.

     

Designed by Tistory.