오늘 개학이라 학교 갔습니다.

오랜만에 보는 씨끄러운 친구들때문에 공부가 안됬습니다.

또 해킹캠프 결과가 나왔는데 떨어졌습니다.

집에 와서 데스크탑을 켰더니 블루스크린 코드F4가 떳습니다.

결국 윈도우 설치된 ssd를 제외한 나머지 하드들을 제거한후 윈10을 설치했습니다.

그리고 해결

문제는 생기부 적는거 생각하느냐고 블로그 쓰는걸 까머........읍읍


고로 오늘은 쉴려고 합니다.

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

돌아왔습니다.  (0) 2018.06.04
해킹 캠프 선발  (0) 2017.08.21
프로젝트 진행 순서  (0) 2017.07.26


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


오늘은 portscan입니다.

사실 포트스캔 같은 경우는 Nmap만 잘 사용할 줄 알면 장땡이긴 해서

(사실 그렇게 따지면 책을 볼 필요가 거의 없죠...)

하지만 실력좋은 해커가 되기 위해서는 자신이 사용하는 도구가 어떻게 동작하는지 알아야되며


자신만에 도구도 가지고 있어야됩니다,


저도 그러기 위해서 이 책을 공부하기로 선택한거니까요ㅋㅋ'

(이 책이 끝나면 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
import optparse
import socket
from socket import *
def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket(AF_INET, SOCK_STREAM)
        connSkt.connect((tgtHost, tgtPort))
        connSkt.send("ViolentPython\r\n")
        results = connSkt.recv(100)
        print '[+]%d/tcp open'% tgtPort
        print '[+] '+str(results)
        connSkt.close()
    except:
        print '[-] %d/tcp cloded'% tgtPort
def portScan(tgtHost, tgtports):
    try:
        tgtIP = gethostbyname(tgtHost)
    except:
        print "[-] Cannot resolve '%s': Unkown hpst" %tgtHost
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print '\n[+] Scan Result for : ' + tgtName[0]
    except:
        print '\n[+] Scan Result for : '+ tgtIP
    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print 'Scanning port ' +tgtPort
        connScan(tgtHost, int(tgtPort))
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()
cs



일단 connScan함수가 중추가 됩니다. host와 port를 인자로 받아서 연결하고 'ViolentPython'이란 문자열을 보내는 걸로

포트가 열려있는지 확인을 하는겁니다.


물론 이 방법으로 실제 서버에 포트 전채를 스캔하면 당연히 로그가 잔뜩떠서 신고당하는데요.

그걸 방지하기 위해서는 패킷을 잘게 쪼게서 보내면 된다는 얘기를 들었는데

그건 나중에 기회가 되면 다뤄 볼려고 합니다.


portScan함수는 이제 connscan함수를 사용해서 실제 결과나 오류를 다루고 있습니다

main함수는 역시 도구를 사용할때 중요한 옵션을 다룹니다.


하지만 위에 방식으로 코드를 짠다면 대규모로 검색해야될때는 순차적으로 검색되니까 엄청난 시간이 소요된다고 합니다.

그래서 책에서는 다음 단계로 Thread를 사용해 동시에 검색이 가능하게 구현해주었습니다.

코드는 이렇습니다.

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
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)
        connSkt.close()
    except:
        screenLock.acquire()
        print '[-] %d/tcp cloded'% tgtPort
    finally:
        screenLock.release()
        connSkt.close()
def portScan(tgtHost, tgtports):
    try:
        tgtIP = gethostbyname(tgtHost)
    except:
        print "[-] Cannot resolve '%s': Unkown hpst" %tgtHost
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print '\n[+] Scan Result for : ' + tgtName[0]
    except:
        print '\n[+] Scan Result for : '+ tgtIP
    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print 'Scanning port ' +tgtPort
        connScan(tgtHost, int(tgtPort))
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()
cs

일단 thread를 사용하기 위해서 모듈을 불러오고

동시에 스캔을 한다는 것은 출력도 동시에 된다는 거니

Semaphore(value = 1)으로 하나씩 출력되게 하고

screenLoack.acquire()

을 출력전에 선언해서 다른것이 출력되지 않도록 락을 걸게 해줍니다.

스캔결과나 다음에 있는 nmap연동하기는 내일 해볼려고 합니다.(돌리는건 칼리에서 해야될거 같은 느낌이...윈도우는 방화벽에 걸릴거 같아요..)


오늘은 여기서 마치도록 하겠습니다.

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


일단


뭔가 에러는 않나지만 작동이 안되네요...일단 올리고 난 다음에 리눅스 환경에서 해볼 예정입니다.


일단 사용중인 파이썬 버전은 2.7버전이며 책에서 사용중인 버전은 2.6.5버전입니다.


제가 방금 한 환경은  window10이고 리눅스는 kali 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
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', desr='dname', type='string',\
    help='specify dictionary file')
    (option, args) = parser.parse_args()
    if (option.zname == None) | (option.dname == None):
        print parser.usage
        exit(0)
    else:
        zname = options.zname
        dname = options.dname
 
cs


일단 https://colorscripter.com/ 에서 붙인뒤에 사용할 예정이며 syntaxhighlighter도 사용해볼 예정입니다.


이번 코딩으로 칼리에서 자주사용되는 옵션이 어떻게 지정되고 구현됬는지 알게됬습니다.

optparse로 parser.add_option으로 사용할 옵션 지정, 이름, 타입, 설명을 지정해주고 저렇게 하는거였다니...

옵션만 빼면 입력 받은 zip파일을 선택한 사전 파일에서 단어를 하나하나 집어넣어 검증하는 대표적은 사전대입 방식이니 그리 어렵지 않은거 같습니다.


만약 그냥 바로 지정해 주고 싶다면 이렇게 해주시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import zipfile
def extractFile(zFile, password):
    try:
        zFile.extractall(pwd= password)
        return password
    except:
        return
def main():
    zFile = zipfile.ZipFile('evil.zip')
    passFile = open('dictionary.txt')
    for line in passFile.readline():
        password = line.strip('\n')
        guess = extractFile(zFile, password)
        if guess:
            print '[+] Password = ' + password + '\n'
            exit(0)
if __name__ == '__main__':
    main()
cs



저렇게 해서 간단하게 해주면 되는데 왜 윈도우에서 작동을 안하는지....


만약 리눅스에서 돌려서 되면 바로 글 추가 해보도록 하겠습니다.


--------------------------------------------------------------------------------------------------------------------------------------------------------------------


2017-08-15 오전 12시 8분 수정




칼리애서 쓰고 돌려봤는데 또 안되네요..정사적은 출력은 

[+] Password = secret

인데 말이죠...아무것도 안뜨고...흠...뭐가 문제일까요...

(참고로 사용한 명령어는 <<zip -P secret evil.zip>> 으로 zip 파일을 만들었습니다.)

이번에 해공예보다는 파이썬 관련 플밍실력좀 높이고자


<<해커의 언어, 치명적 파이썬>>

이란 책을 가지고 공부를 시작헀습니다.

일단 작성한 최종코드를 블로그에 올릴것이며 이 책이 끝난다면 그담에는 Github에서 오픈소스에 참가해볼 예정입니다.

마지막입니다.



이번에는 포맷스트링입니다.(아직도 별 이해 못했습니다..ㅠ)



일단 버그있는거 확인했습니다. 12byte뒤에 입력이되는것도 확인됬고요



일단 익스플로잇에 사용할 쉘을 환경변수에 등록하고 주소를 출력합니다.(gdb는 main심볼이 삭제되서 출력이 안되네요...)



뭔가 이번에는 dtors라는걸 이용해서 공격을 진행하더라구요..일단 힘들게 주소 2바이트씩 나누는 계산을하고 코드를 삭성했습니다.

08049598이 dtors(소멸자)주소이며 69714가 환경변수 주소인 fcf2에 40을 뺸 값이며 49933이 1bfff - 69754를 뺀값입니다.


1bfff인 이유는 음수가 되버리니까 1을 앞으로 붙여서 양수가 나오도록 하는것이라고 하는군요



휴..성공했습니다.



결국 정말 오늘 다 해벼렸네요ㅋㅋㅋㅋㅋㅋ


뭔가 level20은 많이 부족했고 뭔가 설렁설렁 넘어간 느낌이 들지만...

느낌으로 넘겨버립시다ㅋㅋㅋㅋㅋ


FTZ는 여기서 마치도록 하겠습니다! 다른 할거를 빨리 찾아봐야겠네요ㅎㅎ(해공예도 뭔가 빨리 끝날거 같은 기분이...)

'포너블 > Hackerschool F.T.Z' 카테고리의 다른 글

20170813 F.T.Z level19  (0) 2017.08.13
20170813 F.T.Z level18  (0) 2017.08.13
20170813 F.T.Z level17  (0) 2017.08.13
20170813 F.T.Z level16  (0) 2017.08.13
20170812 F.T.Z level15  (0) 2017.08.12

19입니다ㅋㅋㅋㅋ



넘나 쉽게 느껴지지만 함정이 하나 설치되 있다죠....일단 해봅시다ㅋㅋ



처음에는 간단히 ret주소에 system + dummy(4byte) + /bin/sh를 넣어 쉘은 얻었지만 

권한 상승은 안됬습니다. 여기서 setuid가 안결려있다는걸 알게됬죠ㅋㅋ


17번 문제에서 엄청난 풀이를 보여준 친구가 ROP면 대부분 다된다고 해서 함 찾아본다음 끄적끄적 해봤는데


결국 실패...그냥 setuid설정한 쉘코드 구해서 그냥 환경변수 등록해서 헀습니다.



잘 올라갔습니다.



이렇게 해서 주소 구해주고요



가볍게(?) 성공했습니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


빨리 마지막을 향해!


'포너블 > Hackerschool F.T.Z' 카테고리의 다른 글

20170813 F.T.Z level20  (0) 2017.08.13
20170813 F.T.Z level18  (0) 2017.08.13
20170813 F.T.Z level17  (0) 2017.08.13
20170813 F.T.Z level16  (0) 2017.08.13
20170812 F.T.Z level15  (0) 2017.08.12

얼마 안남았습니다ㅋㅋㅋㅋㅋ 18ㄱㄱ~



코드가 쓰잘데기 없이 깁니다. 다만 여기서는 개념 하나와 올라간 변수들 그림만 잘그리시면 정말 쉽습니다.


일단 string[-1] 이 되면 시작주소가 1바이트 뒤로 갑니다.


소스를 보면 check에 deadbeef를 넣으면 게임이 끝나지만


메모리 구조가

string

check


이렇게 되있기때문에 string시작주소를 -4로 해서 check영역에 침범해서 deadbeef를 넣어주면 됩니다.



\x08을 입력받으면 count주소가 -1이 더해지기때문에 4를 곱한뒤 리틀엔디언으로 deadbeef를 넣어주면 쉘을 얻으실 수 있습니다.


'포너블 > Hackerschool F.T.Z' 카테고리의 다른 글

20170813 F.T.Z level20  (0) 2017.08.13
20170813 F.T.Z level19  (0) 2017.08.13
20170813 F.T.Z level17  (0) 2017.08.13
20170813 F.T.Z level16  (0) 2017.08.13
20170812 F.T.Z level15  (0) 2017.08.12

바로 17을 풀어봅시다.



이번에는 shell함수가 없으니  직접 쉘을 환경변수에 올려서 사용하거나 eggshell을 사용하는 방법으로 갔습니다.(eggshell은 http://geundi.tistory.com/122에서 참고했습니다.)



디스어셈블 안해도 되요ㅋㅋ



이번꺼는 eggshell을 쓴건데 멋지게 실패했네요..아마 aslr때문일거 같기도 한데 말이죠....



이번에는 /bin/sh 주소를 10번 넣고 system주소를 넣었더니 성공?했습니다.(제가 아니라 제친구가 옆에서 풀어줘서 저도 왜 저렇게 돌아가는지....)



이번에는 ROP입니다. 위에 있는 libc-2.3.2.so에서 가젯을 찾아 저렇게 했는데 말이죠..(도데체 제 친구는 저걸 어떻게 한거지...)


뭐 일단 성공은 했으니 넘어가죠ㅋㅋㅋ 환경변수는 테스트 안해봤지만 성공합니다.


'포너블 > Hackerschool F.T.Z' 카테고리의 다른 글

20170813 F.T.Z level19  (0) 2017.08.13
20170813 F.T.Z level18  (0) 2017.08.13
20170813 F.T.Z level16  (0) 2017.08.13
20170812 F.T.Z level15  (0) 2017.08.12
20170811 F.T.Z level14  (0) 2017.08.11


오늘은 16부터 시작해서 20까지 다 포스팅 해버릴 예정입니다. 솔직히 끝내고 바로 해킹 맛보기를 제데로 볼려고 했는데


지금의 저로써는 포렌식을 제외하면 별로 의미가 없더라구요;;;;


일단 다 포스팅 하면 해공예도 볼려고 합니다.


제일 중요한건 shell()가 있다는 것과 *call 이라는 함수포인터 변수가 있다는 겁니다.


buf는 20이지만 48바이트만큼 입력을 받고 있으니 이걸 이용해서 *call에 printit대신에 shell함수 주소를 넣어주면 될거 같습니다.



<<objdump -d attackme>>명령어로 저렇게 함수 주소를 알아낼 수 있습니다.



자 바로 call하기전에 브포를 걸어서 


얼마나 dummy값을 넣어야되는지 계산해야되므로 AAAA넣고 돌려줍시다.


제가 표시해둔곳이 printit함수 주소가 들어간 곳이고요 0x41414141이 제가 입력한 AAAA가 있는부분이니까


A를 40개만 넣고 shell함수 주소를 넣으면 될거 같습니다.



성공! 다른것도 빠르게 쓰도록 하죠ㅋㅋ




'포너블 > Hackerschool F.T.Z' 카테고리의 다른 글

20170813 F.T.Z level18  (0) 2017.08.13
20170813 F.T.Z level17  (0) 2017.08.13
20170812 F.T.Z level15  (0) 2017.08.12
20170811 F.T.Z level14  (0) 2017.08.11
20170810 F.T.Z level13  (0) 2017.08.10

미리 풀었음에도 불구하고 스샷을 안찍어서 재빠르게 찍고온 CodeByO입니다...



level14랑 * 만 빼면 똑같습니다. 하지만 *의 비중이 너무 크다는....


일단 포인터로 선언되면 *check에서 deadbeef말고 함수 주소를 넣어야된다는게 포인트 입니다.


뭐 buf에다가 deadbeef를 넣고 buf주소를 check에다가 넣는 방법도 있지만


심플하게 deadbeef가 저장된 주소를 찾아서 넣어줍시다.









간단하네요ㅋㅋ



이야 pwnable.kr과 비교할 수 도 없는 쉬움입니다ㅋㅋㅋ 이거 먼저 풀걸 그랬어요ㅠ



오늘은 뭔가 날로 먹는 느낌이 들지만 여기서 마치도록 하겠습니다ㅋㅋㅋㅋㅋㅋ


'포너블 > Hackerschool F.T.Z' 카테고리의 다른 글

20170813 F.T.Z level17  (0) 2017.08.13
20170813 F.T.Z level16  (0) 2017.08.13
20170811 F.T.Z level14  (0) 2017.08.11
20170810 F.T.Z level13  (0) 2017.08.10
20170809 F.T.Z level 12  (0) 2017.08.09

+ Recent posts