Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.
연구목적으로 사용하지 않고 악의적인 목적으로 이용할 경우 발생할 수 있는 법적은 책임은 모두 본인에게 있습니다.
해커의 언어, 치명적 파이썬 – CHAPTER 1 소개
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 포트 스캐너 만들기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – SSH 봇넷 구축하기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – FTP와 웹을 이용한 대규모 공격
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 컨피커 노력하면 된다
2.1 소개: 모리스 웜 – 오늘날에도 유효할까?
– 모리스웸이 사용한 공격기법 3가지
1. sendmail 프로그램 취약점
2. finger 데몬의 취약점
3. 사용자 이름과 패스워드 목록을 이용한 원격쉘(RSH)으로 공격
2.2 포트 스캐너 만들기
– 정보수집은 모든 사이버 공격의 첫단계
– 열려있는 TCP 포트를 찾기 위해 스캔
– IP주소와 Tcp port 를 알아야 연결 가능.
– 3way handshaking (http://charmpa.egloos.com/1491449)
2.2.1 TCP 풀 커넥트 스캔
– socket API import
* socket.gethostbyname(hostname)
* socket.gethostbyaddr(ip_address)
* socket.socket([family[, type[, proto]]])
* socket.create_connection(address[, timeout[, source_address]])
– TCP 스캔은 TCP 처음 연결 시 일어나는 3-웨이 핸드쉐이킹을 탐지하는 기법이다. 만약 핸드쉐이킹이 정상적으로 완료되었다면, 해당 TCP 포트는 정상적으로 열려 있는 것으로 판단할 수 있다. 서비스 거부 공격을 막기 위해, 포트 스캐너는 핸드쉐이킹 직후 연결을 종료한다. 이 방식은 일반적인 소켓 connect()를 이용하기 때문에, Nmap 등의 프로그램에서는 이 방식을 연결 스캔(connect scan)으로 부른다.
– TCP 풀 커넥트 스캔을 위한 5단계
1. 호스트 이름과 스캐닝 할 포트 목록을 입력
2. 호스트이름을 IPv4 인터넷 주소로 변환
3. 각 포트마다 연결 시도
4. 서비스 판단을 위한 가비지 데이터 전송
5. 어플리케이션에서 전송하는 배너값읽음
2.2.2 애플리케이션 배너 가져오기
– 열려있는 포트를 발견하면, 데이터를 전송하고, 응답을 기다림.
– 응 답을 수집하면, 공격대상과 포트에서 실행되는 어플리케이션을 알수 있다.
2.2.3 쓰레드 사용하기
– 각소켓이 스캔을 하는 데 보통 수 초가 소요
– 순차적으로 스캔하는 것보다 동시에 스캔하는것이 빠름
– 쓰레드 사용 -> 동시에 화면에 출력, 알아보기 힘들고, 순서도 안맞음
– 세마포어를 사용해 lock을 걸어 한번에 하나의 쓰레드만 화면에 출력할수 있도록 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/usr/bin/python # -*- coding: utf-8 -*- import optparse from socket import * from threading import * screenLock = Semaphore(value=1) def connScan(tgtHost, tgtPort): try: connSkt = socket(AF_INET, SOCK_STREAM) connSkt.connect((tgtHost, tgtPort)) connSkt.send('ViolentPython\r\n') results = connSkt.recv(100) screenLock.acquire() print '[+] %d/tcp open' % tgtPort print '[+] ' + str(results) except: screenLock.acquire() print '[-] %d/tcp closed' % tgtPort finally: screenLock.release() connSkt.close() def portScan(tgtHost, tgtPorts): try: tgtIP = gethostbyname(tgtHost) except: print "[-] Cannot resolve '%s': Unknown host" %tgtHost return try: tgtName = gethostbyaddr(tgtIP) print '\n[+] Scan Results for: ' + tgtName[0] except: print '\n[+] Scan Results for: ' + tgtIP setdefaulttimeout(1) for tgtPort in tgtPorts: t = Thread(target=connScan,args=(tgtHost,int(tgtPort))) t.start() def main(): parser = optparse.OptionParser('usage %prog -H <target host> -p <target port>') parser.add_option('-H', dest='tgtHost', type='string', help='specify target host') parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma') (options, args) = parser.parse_args() tgtHost = options.tgtHost tgtPorts = str(options.tgtPort).split(',') if (tgtHost == None) | (tgtPorts[0] == None): print parser.usage exit(0) portScan(tgtHost, tgtPorts) if __name__ == '__main__': main() |
실행결과 :
1 2 3 4 5 6 7 |
C:\Python27>python 1-portScan.py -H 192.168.134.129 -p 8888 [+] Scan Results for: home [+] 8888/tcp open [+] <HTML><HEAD><TITLE>Bad request</TITLE></HEAD> <BODY><H1>Bad request</H1> Your browser sent a query t |
2.2.4 Nmap 포트 스캐너 통합하기
– Nmap은 ACK, RST, FIN, SYN-ACK 등 다양한 기능 지원
– Nmap은 결과를 xml 형태로 저장
– XML 구문분석 라이브러리로 파이썬에서 값을 읽어옴(python-nmap 설치)
– 다른 종류의 포트 스캔
* TCP SYN SCAN : 하프오픈 스캔, SYN 패킷 보내고, 마지막 ACK를 안보냄, RST를 받으면 닫혀있음
* TCP NULL SCAN : TCP 플래그 헤더를 0으로 설정, RST를 받으면 닫혀있음
* TCP FIN SCAN : FIN을 전송(TCP 연결 종료), RST를 받으면 닫혀있음
* TCP XMAS SCAN : PSH, FIN, URG TCP 플래그를 활성화, RST를 받으면 닫혀있음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/usr/bin/python # -*- coding: utf-8 -*- import nmap import optparse def nmapScan(tgtHost,tgtPort): nmScan = nmap.PortScanner() nmScan.scan(tgtHost,tgtPort) state=nmScan[tgtHost]['tcp'][int(tgtPort)]['state'] print "[*] " + tgtHost + " tcp/"+tgtPort +" "+state def main(): parser = optparse.OptionParser('usage %prog -H <target host> -p <target port>') parser.add_option('-H', dest='tgtHost', type='string', help='specify target host') parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma') (options, args) = parser.parse_args() tgtHost = options.tgtHost tgtPorts = str(options.tgtPort).split(',') if (tgtHost == None) | (tgtPorts[0] == None): print parser.usage exit(0) for tgtPort in tgtPorts: nmapScan(tgtHost, tgtPort) if __name__ == '__main__': main() |
실행결과 :
1 2 |
C:\Python27>python 2-nmapScan.py -H 192.168.134.129 -p 8888 [*] 192.168.134.129 tcp/8888 open |
3 Responses to 해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 포트 스캐너 만들기