반응형

출처: http://noplanlife.com/?p=763


지난 포스팅 보러가기

치명적 파이썬 (Violent Python) – 0x01 Zip파일크래커
치명적 파이썬 (Violent Python) – 0x02 포트스캐너

이번 포스팅에서는 챕터 2에서 다룬 SSH 공격 도구를 다룰 예정이다.

먼저 포스팅을 시작하기 전에 한가지 짚고 넘어갈 문제가 있는데…
책에 나온 코드들의 indent가 한마디로 “개판 5분전” 이라는 것이다.

1395488990667

파이썬은 다른 언어와 달리 ‘줄맞춤’을 통해 각 문장의 시작과 끝을 구분하는데
책에 있는 코드 그대로 따라했다가는 에러메시지 붙잡고 허송세월 날릴 수 있으므로,
pycharm 에서 제공하는 Code Inspector 와 같은 도구를 통해 오류를 잡아가기 바란다.
(아니면 아래 코드를 참고해도 좋다)

먼저 첫번째는 pexpect 라이브러리를 활용하여 SSH 서버에 접속하는 방법이다.

 

pexpect를 통한 SSH 서버 접속

pexpext는 리눅스 계열 운영체제에서만 동작하며, pip 를 통해 설치할 수 있다.

상세한 설명은 http://pexpect.readthedocs.org/en/latest/ 을 참고하기 바란다.

pexpect는 어떤 프로그램에 대한 응답값(키워드, 프롬프트 등)을 미리 지정해준 뒤
해당 조건에 부합되는 경우 직접 명령어를 전송할 수 있는 라이브러리 이다.

선언할때는 spawn() 메서드를 호출하며, 이 때 파라미터로 호출하고자 하는 내용을 넣어주면 된다.

다음으로 변수를 하나 선언한 후, expect메서드에 프로그램 실행시 예상되는 키워드 값들을 넣어주면 되는데,
이 때, 매칭되는 값이 있으면 1, 없으면 0 값을 반환하게 된다.

위와 같이 expexet 메서드에 타임아웃 메시지, ssh_newkey 스트링, 혹은 ‘password’라는 문자를
리스트 형태로 넣어주게 되면, 셋 중 하나라도 부합되면 1값을 반환하게 된다.

 

실행 결과

아래는 전체 코드를 실행한 결과이다. 아주 깨끗하게 shadow파일의 root영역을 가져왔다.

 

좀 더 간단하게 – SSH Brutu Forcing – 

pexpcet의 경우 Prompt 라던가 접속 관련 함수를 만들어줘야 하는 번거로움이 있는데
pxssh 라이브러리를 활용하면 이러한 부분을 간단하게 해결할 수 있다.

지난 시간에 다루었던 딕셔너리 파일을 이용한 Brute Forcing 기법을 접목하여,
패스워드를 모르는 SSH 서버를 공격해보자.

큰 틀안에서 보면 달라진 부분은 많지 않다.

먼저 Optparse를 통해 호스트 네임과 사용자 이름, 그리고 딕셔너리 파일을 입력받는다.
그 후 pxssh 라이브러리를 통해 ssh에 서버에 접속하여 임의의 패스워드를 입력한다.

패스워드를 찾는데 성공하면 값을 출력하고, 접속에 실패하면 메시지에 따라 에러를 핸들링한다.
접속 에러가 너무 많이 발생하는 경우에는 프로그램을 종료하게 되어있다.

 

실행 결과

사실 칼리나 백트랙과 같은 도구에서 비슷한 방식의 도구들을 이미 제공하고 있기 때문에,
만들어서 쓰는게 크게 의미가 없을 수도 있겠지만, colorama 등의 추가 라이브러리르 사용한다면
결과 값을 사용자 입맞에 맞게 커스터파이징 하는 재미가 있을것으로 보인다.

 

반응형
반응형

출처: http://egloos.zum.com/mcchae/v/11088170


지난번 TCL+Expect를 통하여 윈도우에서 CLI 자동화에 대하여 약간 살펴보았는데,
윈도우용 python expect 모듈인 pexpect가 제대로 동작하지 않는 것으로 알고 있었습니다만,
구글의 도움과 몇가지 시행착오를 통하여 드디어 성공하였습니다.
(그동안 한 두번 시도를 했다가 실패한 적도 있네요)

물론 리눅스와는 Child Process 관련 작업 및 Terminal IO 등의 문제 때문에 완벽한
호환은 아니더라도, 어느 정도(대부분의 필요한 정도는 가능합니다) 
작업이 가능한 것은 확인하였습니다.

다음은 그 방법입니다.

우선 윈도우용 파이썬이 필요합니다.
다음 다운로드 사이트 에서,

python 2.7.6 Windows Installer 를 다운받습니다.
(64bit용 윈도우 7 OS에서도 잘 동작했습니다)



위와 같은 winpexpect 사이트에 들어가셔서,


상단 오른편의 Download를 누르고, Tags를 눌러 위와 같은 것의 winpexpect-1.5 zip을 다운받았습니다.

그 다음은, pywin32 사이트 에서,


위에서 Browse All Files를 눌러, 최신 Build (이 글을 작성하는 당시 Build 218이 최신 이었음)에서


64bit 윈도우에서도 python2.7 win32 버전을 설치했으므로, 상단에서도 pywin32-218.win32-py2.7.exe 를 다운받았습니다.

그 다음, winpexpect를 설치하기 위해서는 윈도우용 setuptools가 필요한데,

pypi/setuptools#windows 에 들어가셔서,


우측 상단에 ez_setup.py 를 다운받습니다.

이제 다음과 같이 설치가 가능합니다.



1) python-2.7.6.msi 로 파이썬 인터프리터를 설치합니다.

2) pywin32-218.win32-py2.7.exe 로 pywin32 모듈을 설치합니다.

3) 명령창에서 ez_setup.py 를 설치합니다.


4) winpexpect 설치
명령창에서 setup.py install 을 실행합니다.


이제 winpexpect를 이용하여 다음과 같은 파이썬 프로그램이 가능합니다.


import sys
from winpexpect import winspawn as spawn

with open('foo.out','w') as ofp:

 child = spawn('cmd.exe', logfile=ofp)
 child.expect ('>')
 child.sendline ('plink 
toor@192.168.189.128')


 child.expect ('password:.*')
 child.sendline ('r')

 child.expect ('~\$ ')
 child.sendline ('cp /etc/hosts /tmp/hosts')

 child.expect ('~\$ ')
 child.sendline ('cat /tmp/hosts')

 child.expect ('~\$ ')
 child.sendline ('')

 child.expect ('~\$ ')
 child.sendline ('exit')

 child.expect ('>')
 child.sendline ('exit')



참고할 만한 사항입니다.

- spawn은 winspawn 인데 as로 aliasing 시켜서 사용하였습니다.
- spawn시에 logfile에 write file stream을 줌으로써 모든 상황이 해당 파일로 기록되게 할 수 있습니다.
- 바로 command out으로 출력을 할 경우 결과가 제대로 capture 되지 않아 그 위에 있는 cmd.exe를 
  우선 실행시키고 나서 필요 명령을 실행시켰습니다.
  (Linux의 shell 을 실행하고 나서 하위 명령을 수행한 형태)


어느분께는 도움이 되셨기를...

반응형
반응형

출처: http://thecoollife.tistory.com/642


[파이썬, Python] 하위 폴더를 포함한 파일 리스트 출력하기 예제 2.


os.walk를 이용한 예제에서 출력 file 명 형식을 약간 바꿔보았습니다. 

현재 folder를 기준으로 하위 폴더명만을 포함한 파일명을 나열하도록 수정했습니다. (실행 결과 참조)


#!/usr/bin/python

import os.path


folder = os.getcwd()

print 'Current folder : %s' % folder


for path, dirs, files in os.walk(folder):

    print '\nFolder: ', path

    if files:

    sub_path = path[len(folder)+1:]

        for filename in files:

            print ' Files: ', os.path.join(sub_path, filename)


exit(0)


실행 결과:

D:\myPython>python filelist2.py

Current folder : D:\myPython


Folder:  D:\myPython

 Files:  example.py

 Files:  fileList2.py


Folder:  D:\myPython\folder1

 Files:  folder1\1.wav


Folder:  D:\myPython\folder1\folder11

 Files:  folder1\folder11\11.wav

 Files:  folder1\folder11\111.wav


Folder:  D:\myPython\folder1\folder12


Folder:  D:\myPython\folder2

 Files:  folder2\2.wav


os.walk에대한 좀 더 자세한 내용은 아래를 참고 하세요.

https://docs.python.org/2/library/os.html#os.walk



fileList4.py


반응형
반응형

출처:http://thecoollife.tistory.com/704


[파이썬, Python] py2exe로 실행파일 만들기


Python으로 여러가지 편리한 툴을 만들어 쓰면, 굉장히 편리한 경우가 많죠!

Python 소스 상태로 사용할 경우의 장점은 OS에 무관하게 쓸 수 있다는 장점이 있죠.


하지만, Python이 설치되어 있지 않은 환경에서는 사용할 수 없다는 단점이 있습니다.

그리고, Python 소스에서 특정한 라이브러리를 include하였을 경우에는, 사용하려는 환경의 Python에도 동일한 라이브러리가 설치되어 있어만 한다는 단점이 있습니다.


이러한 단점을 보완하기 위해서, windows 환경을 사용하는 사람들끼리는 Python 소스를 exe 파일로 만들어서 제공하는 방법이 있습니다.

Python 소스를 exe로 만들 때, 가장 많이 사용하는 것이, py2exe입니다.



[py2exe 다운로드 및 설치]


우선, 아래 Link로부터 설치파일을 받아서 py2exe 설치를 합니다.





PC에 Python2.7 이 설치되어 있다면, "py2exe-0.6.9.win32-py2.7.exe"을 받습니다.

(만약 PC에 Python2.5가 설치되어 있다면, "py2exe-0.6.9.win32-py2.5.exe"를 받으면 됩니다.)




다운로드 받은 설치 실행 파일을 실행시켜서, "다음 (Next)"만 클릭하면 손쉽게 설치가 됩니다.





[py2exe 사용법]


1. setup.py 생성


다음과 같은 setup.py 를 하나 만듭니다. 아래 예제에서 exe로 만들 파일이름은 "test.py"입니다.


from distutils.core import setup

import py2exe, sys, os


includes  = [

 "encodings",

 "encodings.utf_8",

]

 

options = {

 "bundle_files": 1,                 # create singlefile exe

 "compressed": 1,                 # compress the library archive

 "optimize": 2,                 # do optimize

 "includes": includes,

}

 

setup(

 options = {"py2exe" : options},

 console = [{'script': "test.py"}],

 zipfile = None,

)



2. setup.py 실행


아래와 같이 setup.py를 실행시키면, exe파일이 dist 폴더 아래에 생성됩니다.


python setup.py py2exe



3. 기타


위의 예제 setup.py를 실행하면, 아래와 같은 경고문구가 발생합니다. 


*** binary dependencies ***

Your executable(s) also depend on these dlls which are not included,

you may or may not need to distribute them.


Make sure you have the license if you distribute any of them, and

make sure you don't distribute files belonging to the operating system.


   WSOCK32.dll - C:\Windows\system32\WSOCK32.dll

   USER32.dll - C:\Windows\system32\USER32.dll

   ADVAPI32.dll - C:\Windows\system32\ADVAPI32.dll

   SHELL32.dll - C:\Windows\system32\SHELL32.dll

   KERNEL32.dll - C:\Windows\system32\KERNEL32.dll



4. dll_excludes 옵션


아래 예제와 같이, dll_excludes 옵션을 사용하면 *.dll 파일이 포함되지 않도록 할 수 있습니다.


from distutils.core import setup

import py2exe, sys, os


includes  = [

"encodings",

"encodings.utf_8",

]

 

options = {

 "bundle_files": 1,                 # create singlefile exe

 "compressed"  : 1,                 # compress the library archive

 "optimize"    : 2,                 # do optimize

 "dll_excludes": ["WSOCK32.dll", "USER32.dll", "ADVAPI32.dll", "SHELL32.dll", "KERNEL32.dll"],

 "includes": includes,

}

 

setup(

 options = {"py2exe" : options},

 console = [{'script': "test.py"}],

 zipfile = None,

)


5. 예제 파일 첨부


setup.py


6. 기타 옵션


Using "bundle_files" and "zipfile"

An easier (and better) way to create single-file executables is to set bundle_files to 1 or 2, and to set zipfile to None. This approach does not require extracting files to a temporary location, which provides much faster program startup.


Valid values for bundle_files are:

3 (default)

don't bundle

2

bundle everything but the Python interpreter

1

bundle everything, including the Python interpreter


If zipfile is set to None, the files will be bundle within the executable instead of library.zipNote: you will still be required to include the MSVC runtime DLL with your application, which should be located in the dist directory along side the executable (named MSVCRXX.dll, where XX = revision number).


Here is a sample setup.py:

Toggle line numbers
   1 from distutils.core import setup
   2 import py2exe, sys, os
   3 
   4 sys.argv.append('py2exe')
   5 
   6 setup(
   7     options = {'py2exe': {'bundle_files': 1}},
   8     windows = [{'script': "single.py"}],
   9     zipfile = None,
  10 )

(출처: http://www.py2exe.org/index.cgi/SingleFileExecutable) 

반응형

+ Recent posts