네트워크를 관리하고 시스템 간 트래픽 데이터 흐름을 모니터링하는 것은 위협적으로 들릴 수 있습니다. 그러나 Netcat을 사용하는 방법을 알고 있다면 그렇지 않습니다.
Netcat은 포트 스캐닝, 파일 전송 및 연결 활동을 테스트하기 위한 최소한의 웹 서버 생성과 같은 다양한 목적으로 사용할 수 있는 명령 줄 도구입니다. 이 자습서에서는 Netcat을 활용하여 Netcat의 가장 일반적인 사용 사례 중 일부를 살펴보면서 이점을 살펴볼 것입니다.
준비되셨나요? 계속해서 네트워킹 기술을 한 단계 높여 보세요!
준비 사항
이 자습서는 실습을 통해 진행될 것입니다. 따라오고 싶다면 다음 사항을 준비하세요.
- 두 개의 리눅스 머신: 하나(ubuntu1)는 수신 호스트로 작동하고 다른 하나(ubuntu2)는 송신 호스트로 작동합니다. – 이 자습서에서는 두 대의 머신에 모두 Ubuntu 20.04를 사용합니다.
열린 포트 검색
포트는 네트워크 트래픽이 기계에 들어오고 나가는 통로입니다. 포트가 닫혀 있으면 해당 포트에서 서비스가 수신 대기하지 않으며 트래픽도 통과할 수 없습니다. 그러나 포트가 열려 있으면 네트워크는 공격에 취약해집니다.
특정 포트가 보안 취약점이 있는지 확인하려면 Netcat을 사용할 수 있습니다. 펜테스터로서 공격을 수행하기 위해 열린 포트를 알아야 합니다. 이유가 무엇이든 열린 포트를 스캔하는 것은 일반적인 요구사항입니다.
Netcat을 사용한 포트 스캔의 기본 구문은 다음과 같습니다. 여기서:
호스트
– 스캔할 기계의 IP 주소 또는 호스트 이름입니다.시작포트
– 시작 포트 번호입니다.끝포트
– 끝 포트 번호입니다.
netcat 명령은 줄여서 사용할 수 있는 nc라는 별칭을 갖고 있어 명령을 간결하게 작성할 수 있습니다. 그러나 이 튜토리얼에서는 문서화를 위해 netcat을 사용합니다.
전송 호스트(ubuntu2)에 SSH로 접속하고 다음 명령을 실행하여 포트 1-100
사이의 열린 포트를 스캔하십시오.
이 튜토리얼에서는 149.28.86.131을(를) 전송 호스트의 IP 주소로 바꾸십시오.
대부분의 경우, 1-100
포트 범위가 충분합니다. 대부분의 서비스는 일반적으로 이 범위에 속하는 기본 포트 번호를 사용합니다. 예를 들어 SSH의 경우 22
, HTTP의 경우 80
등이 있습니다.
아래 목록은 포트 스캔 동작을 제어하는 각 플래그를 설명합니다:
-z
(제로 I/O 모드) – Netcat은 네트워크 연결로부터 읽거나 쓰지 않습니다. 이 옵션은 스캔 프로세스를 더 빠르게 만듭니다.-n
– Netcat에게 지연을 피하기 위해 DNS 조회를 비활성화하도록 지시합니다.-v
– Netcat이 모든 포트 스캔 프로세스를 자세히 표시하도록 합니다.
아래에서 포트 22 (SSH)로의 연결이 성공했지만 다른 모든 포트는 실패했습니다.

netcat
명령은 모든 스캔된 포트를 나열하므로 많은 정보와 필요하지 않은 정보가 표시됩니다. 이 경우 아래 명령을 실행하여 grep
명령을 파이프로 연결합니다. 이 명령은 열려 있는 포트와 끝에 “succeeded!”
메시지가 있는 것만 필터링합니다.
아래에서 예상대로 SSH 연결에 대한 포트 22가 열려 있는 것을 볼 수 있습니다.

호스트 간 안전한 파일 전송
포트 스캔 외에도 Netcat을 사용하여 두 대의 컴퓨터 간에 안전하게 파일을 전송할 수 있습니다. Netcat은 파일 전송을 위해 TCP 프로토콜을 사용하며 이는 UDP보다 신뢰성이 높습니다.
Netcat을 사용하여 파일을 전송하는 기본 구문은 다음과 같습니다:
호스트에서 다른 기계로 파일을 보내려면 다음 명령을 실행하십시오:
1. 수신 호스트(ubuntu1)에서 포트 4444에서 수신 대기를 시작하는 아래 명령을 실행하십시오.
이 명령에는 출력이 없지만 아래 옵션들은 명령이 청취 포트를 설정하는 방식에 영향을 줍니다.
-l
–netcat
에게 지정된 TCP 포트에서 들어오는 연결을 청취하도록 지시합니다. 포트는 원하는 숫자일 수 있지만, 기본 포트를 사용하는 다른 서비스가 없는지 확인하십시오.
> - 모든 들어오는 데이터를 지정된 경로의 파일(ata_file)로 리다이렉트하도록 netcat에게 지시합니다.
루트 사용자만 1000보다 작은 포트에 바인딩할 수 있으므로, 비루트 사용자로서 1000보다 큰 포트를 선택해야 합니다. 비루트 사용자로서 1000보다 작은 포트 번호를 사용하려고 하면 다음과 같은 오류가 발생합니다.

2. 보내는 호스트(ubuntu2)에서 다음 에코 명령을 실행하십시오. 이 명령에는 출력이 없지만 Hello from ATA라는 내용의 ata_file이라는 파일이 생성됩니다.
3. 이제 아래 netcat 명령을 실행하여 ata_file을 수신 호스트(ubuntu1)로 보냅니다. 수신 호스트(ubuntu1)에서 보내는 호스트와 동일한 포트 번호(4444)를 사용하십시오.
이 명령에는 출력이 없지만, < 옵션은 netcat이 지정된 파일에서 입력을 가져오도록 지시합니다.
4. 마지막으로, 수신 호스트(ubuntu1)로 전환하여 아래 cat 명령을 실행하여 ata_file의 내용을 확인하십시오.
전송이 작동했다는 메시지인 Hello from ATA 메시지가 아래에 표시됩니다.

다른 호스트로 디렉터리 보내기
지금까지 한 호스트에서 다른 호스트로 단일 파일을 성공적으로 보냈습니다. 그러나 모든 하위 디렉터리와 파일을 포함한 전체 디렉터리를 보내려면 어떻게 해야 할까요? Netcat은 디렉터리도 전송할 수 있습니다!
가정하자면, 보내는 호스트(ubuntu2)에 apache_backup이라는 백업 디렉터리가 있다고 가정합니다. 먼저 해당 디렉터리를 압축한 후, 해당 디렉터리를 수신 호스트(ubuntu1)로 전송하고 추출해야 합니다.
1. 수신 호스트(ubuntu1)에서 새 디렉터리인 apache_backup을 만들고 (cd) 해당 디렉터리로 이동하려면 다음 명령을 실행합니다.

2. 다음으로 아래 명령을 실행하여 포트 4444에서 수신 호스트(ubuntu1)로 보내는 호스트(ubuntu2)에서 보내는 압축 파일을 추출합니다.
이 명령에는 출력이 없지만, tar xf – 플래그는 Netcat(표준 입력)에서 입력을 받아 현재 디렉터리로 모든 파일을 추출합니다.
3. 보내는 호스트(ubuntu2)에서 다음 명령을 실행하여 디렉터리(apache_backup), 일부 텍스트 파일을 생성하고 이를 수신 호스트(ubuntu1)로 전송합니다.
이 명령에는 출력이 없지만, 전송이 작동하는지 다음 단계에서 확인하게 됩니다.
4. 마지막으로, 수신 호스트(ubuntu1)로 전환하여 포트 4444의 수신을 중지하고 ls 명령을 실행하여 apache_backup 디렉터리 내의 파일을 나열합니다.
아래에서 볼 수 있듯이, apache_backup 디렉터리의 파일이 성공적으로 수신 호스트의 apache_backup 디렉터리로 전송되었습니다.

다른 호스트로 전체 디스크 또는 파티션 보내기
다른 호스트로 전체 디스크 또는 파티션을 보내는 것은 야심찬 일 수 있지만, 파일과 디렉토리를 보내는 것과는 다릅니다. 이 작업은 특히 파일을 대량으로 이동하거나 삭제하기 전에 전체 디스크를 백업해야 할 때 유용합니다.
1. 수신 호스트(ubuntu1)에서 포트 4444에서 수신을 시작하도록 다음 명령을 실행합니다. 이 명령은 출력이 없지만 모든 수신 데이터를 /dev/sdb로 압축 해제합니다(bzip2 -d | dd).
/dev/sdb는 이 기계의 두 번째 하드 디스크입니다. 그러나 이 경우에는 /dev/sdb가 이 자습서를 위해이 기계에 연결된 빈 하드 디스크입니다.
2. 송신 호스트(ubuntu2)에서 아래의 fdisk 명령을 실행하여 기계의 모든 디스크와 파티션을 찾습니다.
아래에서 볼 수 있듯이, /dev/vda1/은 이 자습서에서 송신 호스트의 루트 파티션입니다. 출력은 기계의 구성에 따라 다를 수 있습니다.

3. 송신 호스트(ubuntu2)에서 다음 명령을 실행합니다. 이 명령은 출력이 없지만 /dev/vda1 파티션을 수신 호스트(ubuntu1)로 포트 4444를 통해 보냅니다.
파티션을 압축하고 수신 호스트로 보내는 작업은 파티션의 크기에 따라 시간이 걸립니다.
4. 프로세스가 완료되면 수신 호스트(ubuntu1)로 전환하면 아래의 출력이 표시됩니다.
디바이스에 여유 공간이 없는 오류는 /dev/vda1이(가) 아마도 /dev/sdb보다 큰 것으로 예상됩니다. 그러나 아이디어를 얻을 수 있죠! Netcat을 사용하여 전체 하드 디스크 또는 파티션을 다른 기계로 전송할 수 있습니다.

5. 마지막으로, 수신 호스트(ubuntu1)에서 명령을 실행하여 /dev/vda1 파티션을 마운트하고 파티션의 모든 파일을 나열합니다.
아래에서 볼 수 있듯이 /dev/vda1의 모든 파일 및 디렉터리가 성공적으로 /dev/sdb로 전송되었습니다.

최소한의 웹 서버 만들기
Apache 또는 NGINX와 같은 완전한 웹 서버를 구성하는 대신 Netcat을 사용하여 웹 서버 문제를 신속하게 식별할 수 있는 최소한의 웹 서버를 만들어 보세요.
최소한의 웹 서버를 만들려면:
1. 수신 호스트로 전환하고 아래 명령을 실행하여 웹 서버의 루트 디렉터리 (nc-webserver-docroot)와 HTTP 응답을 생성하는 셸 스크립트 (httpresponse.sh)를 만듭니다.

2. 다음으로, 선호하는 편집기로 index.html 파일을 /root/nc-webserver-docroot/ 디렉터리에 만들고 아래 코드로 파일을 채웁니다. 이 HTML 파일은 Netcat 웹 서버가 제공할 내용을 포함합니다.
3. httpresponse.sh 라는 셸 스크립트 파일을 만들고 /root/nc-webserver-docroot/ 디렉터리에 아래 코드를 채웁니다.
이 셸 스크립트는 /root/nc-webserver-docroot/index.html 파일의 내용을 HTTP 응답으로 반환하며, 이는 요청을 보내는 모든 클라이언트에게 Netcat 웹 서버에 의해 수행됩니다.
4. 이제 아래의 chmod 명령을 실행하십시오. 이 명령은 출력이 없지만 httpresponse.sh 파일을 실행 가능하게 (+x)합니다.
5. 아래 ncat 명령을 실행하여 포트 7777에서 Netcat 웹 서버를 시작하십시오.
다른 서비스에서 사용되지 않는 선택한 포트 번호로 포트 7777을 교체하십시오.
다음 옵션은 Netcat 웹 서버의 동작에 영향을 미칩니다:
-l
– Ncat이 들어오는 연결을 대기하도록 지시합니다.
-v
– 모든 들어오는 HTTP 요청을 터미널에 표시하는 자세한 모드를 활성화합니다.
-c - httpresponse.sh 스크립트의 경로를 지정합니다.
- -keep-open – 첫 번째 연결이 닫힌 후에도 Ncat 리스너를 열어두어 여러 클라이언트로 웹 서버를 테스트하는 경우 유용합니다.
Netcat 웹 서버가 실행되고 모든 사용 가능한 네트워크 인터페이스에서 포트 7777을 수신 대기하는 것을 확인하면 다음과 같은 출력이 표시됩니다.

6. 이제 다른 터미널을 열고 다음 명령을 실행하여 Netcat 웹 서버를 테스트합니다 (http://localhost:7777).
아래 출력에서는 Netcat 웹 서버가 예상대로 작동하고 /root/nc-webserver-docroot/index.html 파일의 내용을 HTTP 응답으로 반환할 수 있음을 보여줍니다.

7. 마지막으로, Netcat 웹 서버가 실행되고 있는 터미널로 돌아갑니다. curl 클라이언트에서의 HTTP 요청을 Netcat 웹 서버가 받고 처리한 것을 볼 수 있습니다.
축하합니다! 네트워킹 연결성을 테스트하기 위해 최소한의 Netcat 웹 서버를 만들었습니다!

결론
이 튜토리얼에서는 Netcat을 사용하여 네트워킹 및 디버깅 기술을 향상시키는 방법을 배웠습니다. 열린 포트를 스캔하고 파일을 전송하고 최소한의 웹 서버를 만들었습니다. 이 시점에서 강력한 네트워킹 유틸리티를 사용하여 많은 실제 네트워킹 문제를 해결할 수 있습니다!
이 새로운 지식으로 왜 이제 더 많은 네트워킹 기술을 습득하여 사이버 보안 분야의 전문가가 되지 않으시겠습니까?