Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.
연구목적으로 사용하지 않고 악의적인 목적으로 이용할 경우 발생할 수 있는 법적은 책임은 모두 본인에게 있습니다.
해커의 언어, 치명적 파이썬 – CHAPTER 1 소개
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 포트 스캐너 만들기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – SSH 봇넷 구축하기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – FTP와 웹을 이용한 대규모 공격
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 컨피커 노력하면 된다
1.1 소개: 파이썬과 침투 테스트
– 현재 직면한 문제를 해결하기 위해 직접 자신만의 무기를 만들 수 있는 능력을 갖추는 것만이 진정한 침투테스터가 되는 길
1.2 개발 환경 구성하기
1.2.1 외부 라이브러리 설치
– python-nmap 설치(http://xael.org/norman/python/python-nmap/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
C:\>cd C:\Python27\install\python-nmap-0.1.4 C:\Python27\install\python-nmap-0.1.4>python setup.py install running install running build running build_py creating build creating build\lib creating build\lib\nmap copying nmap\example.py -> build\lib\nmap copying nmap\nmap.py -> build\lib\nmap copying nmap\__init__.py -> build\lib\nmap running install_lib creating C:\Python27\Lib\site-packages\nmap copying build\lib\nmap\example.py -> C:\Python27\Lib\site-packages\nmap copying build\lib\nmap\nmap.py -> C:\Python27\Lib\site-packages\nmap copying build\lib\nmap\__init__.py -> C:\Python27\Lib\site-packages\nmap byte-compiling C:\Python27\Lib\site-packages\nmap\example.py to example.pyc byte-compiling C:\Python27\Lib\site-packages\nmap\nmap.py to nmap.pyc byte-compiling C:\Python27\Lib\site-packages\nmap\__init__.py to __init__.pyc running install_egg_info Writing C:\Python27\Lib\site-packages\python_nmap-0.1.4-py2.7.egg-info C:\Python27\install\python-nmap-0.1.4> |
– 또는 easy_install 을 사용해서 설치.
– 책의 소스는 2.x를 기준으로 작성 -> 2.7 버전을 기준으로 스터디 진행
1.2.2 파이썬의 두 가지 모드
– 인터렉티브 모드(명령행)
– 스크립트 모드(파일실행)
1.3 파이썬 언어
1.3.1 변수
– 메모리에 저장되어있는 데이터
– 변수를 선언하면 파이선 인터프리터가 변수가 어떤 데이터 타입인지 메모리에 얼마나 많은 공간을 확보할것인지 결정
1.3.2 문자열
– http://docs.python.org/2/library/strings.html 참고
1.3.3 리스트
– 객체(모든 타입)를 배열로 저장하기 좋은구조
– 추가, 삽입, 제거, 인덱스화, 카운트, 정렬등의 기능제공
1.3.4 딕셔너리
– 객체(모든 타입)저장할수 있는 해시 테이블(키, 값)
1.3.5 네트워크
– 소켓 모듈에서 제공하는 라이브러리를 통해 네트워크에 연결
1.3.6 선택문
– 조건적 선택문(if)
1.3.7 예외 처리
– 런타임시 발생하는 오류(비정상 종료)를 처리하기 위해 사용
1.3.8 함수
– 여러번 재사용할수 있는 코드블록
– def 라는 키워드로 함수를 시작
– 변수를 객체로 전달
1.3.9 반복문
– 동일한 코드를 작성하지 않고 반복문을 사용하면 효율적
1.3.10 파일 I/O
– 파일을 제어
1.3.11 Sys 모듈
– 파이썬 인터프리터가 사용하거나 유지하는 객체에 접근
– http://docs.python.org/2/library/sys
1.3.12 OS 모듈
– 파이썬에서 제공하는 OS환경에 따른 지원모듈을 사용
– OS환경, 파일시스템, 권한등을 사용할 수 있다.
위의 기본 문법을 사용해서 만든… 취약점 스캐너
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 |
# -*- coding: utf-8 -*- import socket import os import sys def retBanner(ip, port): try: socket.setdefaulttimeout(2) s = socket.socket() s.connect((ip, port)) banner = s.recv(1024) return banner except: return def checkVulns(banner, filename): f = open(filename, 'r') for line in f.readlines(): if line.strip('\n') in banner: print '[+] Server is vulnerable: '+ banner.strip('\n') def main(): if len(sys.argv) == 2: filename = sys.argv[1] if not os.path.isfile(filename): print '[-] ' + filename +' does not exist.' exit(0) if not os.access(filename, os.R_OK): print '[-] ' + filename +' access denied.' exit(0) else: print '[-] Usage: ' + str(sys.argv[0]) + ' <vuln filename>' exit(0) portList = [21,22,25,80,110,443] for x in range(147, 150): ip = '192.168.95.' + str(x) for port in portList: banner = retBanner(ip, port) if banner: print '[+] ' + ip + ' : ' + banner checkVulns(banner, filename) if __name__ == '__main__': main() |
1.4 첫 번째 파이썬 프로그램
1.4.1 첫 번째 파이썬 프로그램을 위한 준비: 뻐꾸기의 알
– 딕셔너리 공격
– crypt 함수(salt 를 사용)
Salt 란?
Salt는 13글자로 이루어진 암호화된 패스워드에서 맨 앞의 2글자인데, 이것을 소금 (Salt)라고 부른다. 프로그램 중간에 있는 crypt function을 보면 입력 변수로 암호(word)와 소금 (salt)을 주게 되어 있다. 소금을 치는 이유는 같은 암호를 주더라도 소금이 달라지면 암호화된 패스워드도 달라지게 함이다. 만약 소금이 없다면 같은 패스워드인 경우 같은 암호화된 패스워드가 만들어질 것이다. 이런 경우 passwd화일을 살펴보면 자기와 같은 패스워드를 사용하는 사람을 찾아낼 수도 있을 것이다. 유닉스에서는 처음 패스워드를 만들 때, 소금은 시스템이 임의로 결정하도록 되어 있다.
1.4.2 첫 번째 스크립트 – 유닉스 패스워드 크래커
– 서로다른 기능은 분리해서 함수로 만드는 것이 나준에 재사용하기 좋다
– 암호화된 패스워드를 해시해서 첫번째 두문자를 사용하여 솔트를 제거.
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 |
# -*- coding: utf-8 -*- import crypt def testPass(cryptPass): salt = cryptPass[0:2] dictFile = open('dictionary.txt', 'r') for word in dictFile.readlines(): word = word.strip('\n') cryptWord = crypt.crypt(word, salt) if cryptWord == cryptPass: print '[+] Found Password: ' + word + '\n' return print '[-] Password Not Found.\n' return def main(): passFile = open('passwords.txt') for line in passFile.readlines(): if ':' in line: user = line.split(':')[0] cryptPass = line.split(':')[1].strip(' ') print '[*] Cracking Password For: ' + user testPass(cryptPass) if __name__ == '__main__': main() |
실핼결과
1 2 3 4 5 6 |
# python passwordCrack.py [*] Cracking Password For: victim [+] Found Password: egg [*] Cracking Password For: root [-] Password Not Found. |
– 최신의 Unix Linux 계열에서는 /etc/shadow 파일이 존재(SHA-512 사용)
1.4.3 두 번째 프로그램: 선을 위해 악을 사용하기
– 암호가 걸린 zip 파일을 딕셔너리 공격
1.4.4 두 번째 작품 – 압축파일 패스워드 크래커
– zipfile 라이브러리의 extractall() 함수를 사용
– 암호가 틀리면 예외 발생
– 쓰레드 기능을 사용해 한번에 여러개의 패스워드를 테스트
– optparse 사용
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 |
# -*- coding: utf-8 -*- import zipfile import optparse from threading import Thread def extractFile(zFile, password): try: zFile.extractall(pwd=password) print '[+] Found password ' + password + '\n' except: pass def main(): parser = optparse.OptionParser("usage %prog "+\ "-f <zipfile> -d <dictionary>") parser.add_option('-f', dest='zname', type='string',\ help='specify zip file') parser.add_option('-d', dest='dname', type='string',\ help='specify dictionary file') (options, args) = parser.parse_args() if (options.zname == None) | (options.dname == None): print parser.usage exit(0) else: zname = options.zname dname = options.dname zFile = zipfile.ZipFile(zname) passFile = open(dname) for line in passFile.readlines(): password = line.strip('\n') t = Thread(target=extractFile, args=(zFile, password)) t.start() if __name__ == '__main__': main() |
실행결과
1 2 3 |
> python 3-zipCrack.py -f evil.zip - d dictionary.txt [+] Found password secret |
1.5 요약
– 취약점 스케너
– 패스워드 파일 크랙
– 암호걸린 zip 파일 공격
6 Responses to 해커의 언어, 치명적 파이썬 – CHAPTER 1 소개