2014.03.09 12:53 [PROGRAMMING]/▶Python

<블로그 포스팅용>

상세 분석

등록된 웹사이트 URL을 기반으로 악성코드를 수집하는 mwcrawler.py를 windows 버전으로 포팅한 것입니다.

실행방법은 윈도우에서 더블클릭으로 실행하여 메뉴를 선택하면 수집이 시작됩니다.

메뉴중에 1번은 프록시 IP/PORT를 설정해서 수집을 할 수 있고 2번은 기존과 동일하게 선택과 동시에 바로 수집을 합니다.

수집된 파일의 저장되는 경로는 C:\malware\unsorted\디렉토리 형태로 저장됩니다.

-

스샷과 코드 수정한부분 등록 할 예정

-

코드 수정

1. 프록시서버를 사용하는 환경을 위하여 프록시 IP/PORT를 세팅할 수 있도록 수정했습니다.

2. magic 모듈을 제거하고 읽어들인 파일의 바이너리 데이터를 기반으로 exe, dll, sys, pdf, doc 등의 확장자를 검증하도록 pefile모듈을 사용하여 작성했습니다

3.일반적인 PE외의 charicteristics값중에 reserve나 debug등이 있을 경우 special PE 디렉토리에 저장하도록 수정했습니다.

4. 파일이 저장되는 경로를 윈도우경로로 수정했습니다.

5. 저장되는 경로가 잘못되어 발생하는 오류를 수정했습니다.

 

코드 수정 계획

1. 현재 디버깅용으로 수정하지 않아서 디버깅용 로그는 따로 관리하도록 할 계획입니다.(현재는 육안으로 보기에는 좀 지저분합니다 오류는 아니에요 ㅎㅎ;;)

2. 모든 URL이 페이지 수와 상관없이 21회 반복되는 문제를 동적으로 탐색하도록 수정할 계획입니다.

3. Thug 모듈을 제거할 계획입니다.

 

소스코드


 

win_mwclawler.py

  

위의 코드는 기존에있던 mwcrawler.py에서 윈도우에서 실행되되록 수정한 win_mwcrawler.py 입니다.

빨간박스로 체크된 부분이 제가 수정한 부분입니다.

우선 첫번째로 mwcrawler.py소스를 실행시키면 모듈관련해서 에러가 발생이 되는데요.

모듈이 없는 경우가 대부분이고 모듈선언이 잘못된 경우입니다.

 

첫번째 오류로 BeautifulSoup 관련해서 오류가 발생합니다. 만약 BeautifullSoup 모듈이 없다면 설치를 해야합니다.

하지만 제 시스템에는 모듈을 설치한 상태였기 때문에 모듈 미설치로 인한 오류는 아니고 모듈이름이 잘못되어 발생한 오류 입니다.

즉 from BeautifullSoup import BeautifullSoup as bs -> from bs4 import BeautifulSoup as bs 와같이 변경하면 됩니다.

 

그리고 두번째 에러는 import magic 모듈이 없다는 에러였습니다.

해당 모듈을 사용하는 부분을 확인해보니 다음과 같은 코드로 함수로 구현하여 사용 하고있었습니다.

 

def gettype(file):

ms = magic.open(magic.MAGIC_NONE)

ms.load()

return ms.buffer(file)

 

함수 이름이 gettype으로 이름만 봐도 어떤의도로 사용되어지는지 짐작할 수 있었습니다.

파일을 인자로 gettype(file) 함수를 호출하여 파일을 함수에 넣어 버리면 파일타입이 리턴되겠구나 예상했는데 비슷한거 같습니다.

https://pypi.python.org/pypi/python-magic/ 에서 확인하면 파일타입을 확인 할 수 있는 모듈로 나와있습니다.

그래서 이 모듈을 windows버전에서 설치하고 사용한 사례가 있어 몇번의 시도끝에 설치는 성공적으로 했으나 윈도우에 설치된 magic모듈의 코드내용과

wmcrawler.py모듈에서 사용된 모듈의 코드내용이 서로 일치하지 않아 에러가 발생합니다.

그래서 magic모듈의 기능이 파일타입을 체크하는 모듈이므로 해당되는 코드부분과 모듈 선언부분을 주석처리 하고 파일타입을 체크할 수 있는 모듈을 직접 작성했습니다.

작성한 모듈이름은 filecheck.py이고 관련 내용은 뒤에서 설명하겠습니다.

 

그리고 프록시 서버를 경유하여 외부 인터넷망과 연결할 경우 프록시 세팅을 가능하도록 ProxySetting함수를 만들고 프록시를 세팅한 header를 리턴하도록 구현하여 parse함수에

인자로 전달합니다.

parse함수는 프록시가 세팅된 header로 Request하고 BeautifullSoup모듈을 이용하여 Response데이터를 파싱할 수 있도록 수정하였습니다.

 

그리고 decisor 함수에서 리눅스 경로로 지정된 부분을 윈도우 디렉토리 형태로 변환 하였으며, 에러를 리턴한 URL과 커넥션을 성공한 URL을 구분하고 time모듈을 이용하여 각각 에러와 커넥션한 시간을 로그형태로 저장하도록 변경하였습니다.

 

그리고 SaveLogData,TimeAndLogSave,Gettiime함수를 만들어 저장되는 형태를 각각HTML 데이터로 저장하도록 하고 각 값들을 MD5(Virustotal과 연결), 악성코드URL, 샘플이 저장된 하드디스크 경로를 하이퍼링크로 만들어 저장할 수 있도록 구현했습니다.

  

filecheck.py

 

[그림.2]

 

mwcraler.py 원본 파일에서 사용되던 magic모듈 사용이 어렵기 때문에 파일체크를 할 수 있도록 간단히 만들었습니다.

기능은 각각 파일타입의 특성에따라 간단히 체크할 수 있도록 구현했습니다.

바이너리에서 'PE'시그니처를 찾고 찾은 위치에서부터 IMAGE_FILE_HEADER의 Charicteristics 값을 체크하여 exe파일인지 dll파일인지 체크하도록 했습니다.

 

그림추가

 

EXE파일과 DLL의 경우 IMAGE_FILE_HEADER의 Charicteristics 값에 차이가있습니다.

DLL같은경우 0x200 IMAGE_FILE_DLL값이 있고 EXE같은 경우는 0x200 IMAGE_FILE_DLL 값이 들어있지 않습니다.

이러한 차이점을 이용하여 코드로 구현하였습니다.

 

그림추가

 

그리고 SYS파일은 EXE와 DLL과 동일하게 실행파일입니다. 정확히는 드라이버 파일인데요.

이 파일의 특성은 IMPORT Adress Table에 다음과 같은 파일을 필수적으로 갖고있습니다.

ntoskrnl.exe, hal.dll, ndis.sys, bootvid.dll, kdcom.dll을사용 합니다.

해당내용의 확인은 Python의 PEFILE이라는 모듈의 코드를 보면 def is_driver(self)함수의 내용으로 확인 할 수 있습니다.

 

그리고 PDF,DOC,HTML파일을 각각 파일의 특성에 맞게 체크할 수 있도록 구현하였습니다.

 

[그림.3]

 

win_wmclawler.py를 실행하여 한개의 사이트를 대상으로 악성코드 샘플을 모두 수집했다면 수집한 과정의 로그들을 각각 그림.3과 같이 HTML로 저장이 됩니다.

c:\malware\log\14_01_12(2014년1월12일)의 디렉토리이며 하위 디렉토리에 connection_success_log, error_log의 디렉토리에 저장이 됩니다.

그리고 저장된 파일을보면 D140112_T141430_malc0de.com.html(D날짜_T시간(14시14분30초)_로그가 발생된 사이트) 형식으로 저장합니다.

[그림.4]

 

그리고 그림.4와같이 샘플당 1개씩 관련된 데이터를 정리하여 하이퍼링크를 걸어줍니다.

 

 

[그림.5]

 

MD5항목은 MD5해쉬값으로 Virustotal에 검색할 수 있도록 URL을 연결하여 악성코드 정보를 검색할 수 있습니다.

 

 

 

[그림.6]

 

그리고 URL은 악성코드가 다운된 URL을 하이퍼링크로 걸어 다시 다운받을 수 있게 했습니다.

[그림.7]

 

그리고 System Direcroy Open:Click기능 입니다.

각각 악성코드의 샘플의 저장 디렉토리  C:\malware\unsorted\exe\해쉬값(디렉토리) 형식으로 저장이 되고 해쉬값 디렉토리 밑에 샘플이 저장이됩니다.

이때 시스템 디렉토리의 경로를 하이퍼링크로 걸어 확인할 수 있도록 구현했습니다.

[그림.8]

 

다음은 Connection Error Log 입니다.

이부분은 간단히 에러가 발생된 시간과 에러코드 그리고 에러가 발생한 URL을 보여줍니다.

win_wmcrawler.py(windows version)와 wmcrawler.py(linux version원본파일)에서 동일하게 Request할때 403 에러가 발생하는 경우가 생깁니다.

그러나 URL을 브라우저를 통해 직접 접근해보면 악성코드는 정상적으로 다운이 되어지는데요.

테스트결과 이부분의 문제점이 urllib2로 구현할때 헤더세팅이 잘못 된것으로 보여집니다.

urllib2.request할때 웹서버에서 정상적인 요청이 아닐경우 403에러로 다운을 하지 못하는 경우가 발생하는것 같습니다.

[그림.9]

마지막으로 악성코드를 수집한 화면입니다.

해쉬값으로 검증하여 동일한 파일이 있는지 체크하기 때문에 파일이 중복되는 경우는 없습니다.

 


기능 추가

 

악성코드를 분석하기 위해 샘플을 수집하고 수집된 수많은 샘플들을 일일이 오픈하여 동적분석을 하거나 PEVIEW로 확인하여 예측하고 정리하기는 많은 시간이 소요됩니다.

그래서 기존의 win_wmcrawler.py를 수정하여 기능을 추가하였습니다.

악성코드 분석을 공부하시는 분들에게는 샘플을 쉽게 확보하고 골라서 분석할 수 있는 즐거움이 있을것같습니다. ㅎㅎ


[그림.11]

우선 기존의 악성코드를 수집하는 win_mwcrawler에는 수집한 파일을 대상으로 파일사이즈 및 실행파일에 대한 정보가 없었는데 이번에 그 기능들을 추가하여 수집한 샘플들의 정보를 확인하는데 있어서 시간을 단축 할 수 있도록 수정 하였습니다. 

수정한 win_mwcrawler 실행하고 악성코드 샘플들을 수집하고 나면 그림.11과 같이 각 악성코드 샘플마다 분석을 진행하게 되는데 파이썬 모듈인 Pefile을 사용하여 개발 하였습니다.

우선 처음 악성코드를 수집하게 되면 각 파일의 정보들 Date, FileType,MD5,URL,Filesize를 수집한 후에 해당 악성코드를 별도로 작성한 peinfo.py로 넘어가서 이곳에서 pefile모듈을 불러와 악성코드의 PE구조를 분석하고 리포트 하도록 동작합니다.


[그림.12]

 

악성코드가 PE분석이 완료되면 리포트 되는 형식은 다음과 같습니다.

IMAGE_DOS_HEADER
IMAGE_NT_HEADER
IMAGE_FILE_HEADER
IMAGE_OPTIONAL_HEADER
IMAGE_DATA_DIRECTORIES
IMAGE_SECTION_HEADERS
IMPORT_INFORMATION

 

헤더정보들과 IMPORT 정보들만 확인 가능하게 구현했고 IMPORT_INFORMATION 항목에서 악성코드가 사용되는 함수들을 확인 할 수있기 때문에 저 항목을 통해 대략 어떤 성향의 악성코드인지 파악하고 샘플을 분류할 수 있습니다.

다음은 각각 항목들을 클릭 했을때의 리포트 결과입니다.


[그림.13 IMAGE_OPTIONAL_HEADER]


[그림.14 IMAGE_DATA_DIRECTORIES]

[그림.15 IMAGE_SECTION_HEADER]


[그림.16 IMPORT_INFORMATION]

 [그림.17 peinfo.py]





 

실행시 주의사항: 백신의 실시간탐지 기능을 정지하고 돌려야합니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted by 미스터리 DKL
2014.01.08 14:58

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2014.01.06 17:22

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2013.11.11 21:13 [PROGRAMMING]/▶Python

※ 주의사항

아래 공격 코드는 연구 목적으로 작성된 것이며, 허가 받지 않은 공간에서는 테스트를 절대 금지합니다.

악의 적인 목적으로 이용할 시 발생할 수 있는 법적 책임은 자신한테 있습니다. 이는 해당 글을 열람할 때 동의하였다는 것을 의미합니다.

해당 문서의 저작권은 해당 프로젝트 참여 저자들에게 모두 있습니다. 외부에 공개시 법적 조치가 가해질 수 있습니다.

 

소스하이라이팅

http://cafe.naver.com/boanproject/book3608946/6573

개요

파이썬 기반으로 제작한 웹사이트 크롤링입니다.

개발한 목적은 웹사이트 점검시 수동점검과 자동점검을 진행하게되는데 스캐너같은경우는 스레드갯수만 조절이 가능하고 초당 리퀘스트 갯수를 조절 할 수가 없습니다.

또한 파로스나 burpsuite같은경우 크롤링기능을 사용할 수 있는데 크롤링할때 내가 원하는 페이지만 크롤링이 불가능합니다.

ex)www.test.com 이면 test.com만 크롤링하면되는데 http://www.test.com내의 www.pentest.com 의 링크가있을경우www.pentest.com url까지 모두 크롤링을 합니다.

그리고 마찬가지로 초당 리퀘스트설정이 없기때문에 과부하에 민감한 운영사이트에는 사용을 할 수가 없습니다.

그래서 python기반으로 초당 리퀘스트 세팅을 설정하고 점검사이트만 크롤링이 가능하도록 개발하였습니다.

그리고 원래 목적은 크롤링으로 개발하는 거였으나 크롤링을 완료하고 난 후에 주민등록을 검출할 수 있는 기능을 추가하였습니다.

이뿐만아니라 추후에 xss,sql injection 등등의 추가 모듈을 개발하여 적용하여 사용이 가능합니다.

 

 

 

 

 


테스트 환경 (해당 될시에만)

 운영 체제 (OS) : windows7, 가상 웹사이트


 

동영상 시연

본문 테스트 크기 10pt , 글꼴 (Verdana)

 

상세 분석

 

 

[그림.1]

 

알고리즘의 상단은 로그인하는 부분이고 하단은 크롤링기능을 하는 부분입니다.

 [그림.2]

 

그림2의 1,2,3의 URL을 수집합니다.

1번URL은 로그인 하기전의 Main page URL이고 2번은 로그인을 할때 Request보내는 URL입니다.

그리고 마지막으로 3번은 로그인을 완료하고 나온 다음페이지의 URL입니다.

총3가지의 URL을 수집합니다.

 

 [그림.3]

 

수집한 URL을 1.login 메뉴를 통해 입력합니다.

여기에서 가운데 URL을 보면 ID와 PASS 파라미터가 있습니다.

저렇게 입력을하게되면 저부분을 통해서 통으로 Request보내는 방식이 아닙니다.

저부분은 나중에 Mechanize 모듈을 이용하여 로그인 페이지의 Form을 찾고 Form 안의 태그에서 type='text'와 type='password'부분을 찾게됩니다.

자세한 과정은 이후에 설명하겠습니다.

 

 [그림.4]

 

그림.3번 과정을 거치고나면 2번메뉴를 세팅해야합니다.

2번메뉴는 프록시를 세팅하는 부분인데 이부분을 만들어 놓은 이유는 내부망에서 외부망으로 접속을할때 프록시서버를 경유하도록 하는 곳에서는 프록시를 설정 해야만 접속이 가능합니다. 프록시 세팅을 하지 않는다면 인터넷을 사용할 수 없습니다.

이러한 문제점을 해결 하기위해 프록시를 세팅할 수 있도록 기능을 만들었습니다.

프록시 세팅은 적용/미적용 으로 설정하여 사용이 가능합니다. 

 

 

 

 [그림.5]

 

프록시 세팅을한 후 3번메뉴 crawl start메뉴로 이동하면 ID와 PW를 입력할 수 있도록 나오게 되는데 이부분은 그림.5의 중간부분의 빨간 박스를 보면 각각 id, pass,, 0을 확인 할 수 있습니다. 

 

[그림.6]

 

우선 form 형식을 모두 리스트 형식으로 가저오고 가저온 폼안에 type='password'가 있는 리스트 데이터를 찾습니다.

그리고 해당폼에서 폼네임 Name='login_chk.asp' 값을 가저옵니다.

그리고 가저온 폼값에서 type='passwrod'를 찾고 이 위치를 중심으로 이값을 center라고 세팅한다고 가정합니다.

그리고 form 값 내의 center 에서 제일 가까운 type='text'를 찾습니다.

이렇게 하는 이유는 폼값내의 type='text'가 여러개 존재할 가능성도 있기 때문에 type='passwrod'에서 가장 가까운 type='text'는 99% 아이디를 입력받는 input 태그입니다. 

그렇기 때문에  center위치보다 작은 type='text'를 갖고있는 input 태그중에 type='password'와 가장 가까운 input 태그인것을 id를입력받는 폼으로써

해당태그의 name='' 값을 얻게됩니다.

그래서 얻게되는 값이 id, pass, login_chk.asp 가 되는것입니다.

이렇게 FORM/ID/PW 를 가저오는 이유는 Mechanize라는 python에서 사용되는 모듈을 사용하여 로그인 시스템을 구축하기 위해서입니다.

Mechanize를 사용해서 로그인을 할때는 반듯이 로그인 페이지의 Form값을 얻어와야합니다.

만약에 Mechanize에서 Form값을 인식을 하지 못할 경우에는 nr=0 또는 nr=1 와 같은식으로 0번째Form 첫번째Form을 지정하여 사용할 수 있습니다.

하지만 이렇게 간단히 되면 좋은데 그렇지 않습니다.

간혹 Form Name이 있는데도 불구하고 해당 html페이지의 폼값을 인식하지 못하는 경우가 있습니다.

이럴때를 대비해서 Urllib2 모듈을 사용하여 예외처리를 하는방식으로 결정했습니다.

하지만 Urllib2를 이용해서 로그인하는 방식은 로그인처리만 해놓고 크롤기능까지 가능하도록 구현은 하지않은 상태입니다.

언제든지 필요하면 구현가능 하지만 다른도구를 만들어 보고싶은게 있어서 아쉽지만 로그인 예외처리 방식은 잠시 보류합니다. 

 

 [그림.7]


이제 ID/PW를 입력하고 정상적으로 로그인이 되었는지 확인합니다.

그림.7번의 기능은 그냥 디버깅 확인용으로 구현한것입니다.

정상적으로 로그인 된 것을 확인 할 수 있습니다.


  [그림.8]

 

로그인을 성공하게 되면 크롤링이 몇초에 한번씩 request를 할것인지에 대한 설정을 할 수 있습니다. 

제가 점검용으로 사용할 크롤러를 만들기 위한 이유중에 한부분입니다.

보통 크롤러나 스캐너같은 경우 타켓사이트에대한 타임세팅을 할 수 없습니다.

스캐너같은경우는 스레드 설정은 가능하지만 역시 초당 리퀘스트 세팅을 할 수 없습니다.

그렇기 때문에 간혹 점검 하다보면 서버 과부하 문제로 자동툴사용을 금지요청을 하는경우도 있습니다.

하지만 리퀘스트당 초단위로 세팅하여 크롤링속도를 조절한다면 이러한 문제를 해결할 수 있을거라 생각했습니다.

시간이 조금 걸리겠지만 2초에 한번씩 리퀘스트를 해서 그 결과를 얻을 수 있다면 수동작업과 점검시간을 줄일 수 있을것입니다.

 

  [그림.9]


time setting을 마치고나면 본격적으로 크롤링을 시작하게됩니다.

그림.9을 보면 Request했을때의 에러가 발생하면 해당되는 URL에대한 HTTP ErrorCode를 추가했습니다.

그리고 정상적으로 존재하는 URL즉 Request에 성공한 URL은 Connect Success라는 명령어로 표시했습니다.

그리고 Request하고 Response하여 얻은 html페이지중에 하이퍼링크나 히든속성의 파라미터가 없을경우 None html page link이고

URL overrab은 html페이지에서 가저온 URL들중 중복된 URL입니다.

 

[그림.10]

크롤링의 간단한 원리는  그림.2번의 3번URL(Main) 부터 시작을 합니다.

메인 URL의 모든 하이퍼링크를 가저와 리스트형태로 저장합니다.

그리고 Hidden속성의 파라미터값과 value값을 결합합니다.

결합 후 현재 html을 불러온 url과 결합한 히든값을 재결합 합니다. 

즉 www.test.com + a=1&b=2 와 같이 결합니다.

하지만 이렇게 처리하려면 예외처리를 많이해야합니다. 물론 예외처리까지 어느정도 해놓은 상태이구요

예로들자면 www.test.com 의 url인경우와 www.test.com/ba/,www.test.com/ba 인경우 www.test.com/ba/login.asp? 등등의 경우라면 예외처리를 해야합니다.

www.test.com/ba + a=1&b=2 인경우 결합하게 되면 www.test.com/baa=1&b=2 와같은 url이완성이되며 이처럼 없는 url을 만들어냅니다.

그렇기 때문에 정상적인 url이 되도록 예외처리가 진행이 되어야합니다.

 


 

  [그림.11]

 

 크롤링의 동작순서는 첫번째 모든 하이퍼링크를 수집합니다. 그리고 수집하면서 히든속성의 값들을 URL로 구성하여 보관합니다.

이처럼 URL 을 수집합니다.

수집되는 URL중 중복되는 URL은 제외하고 하고 하이퍼링크URL을 Request 합니다.

그리고 종료되면 히든속성을 결합한 URL을 Request합니다.

이 두 과정이 진행될때 Request한적이 없는 URL만 추가로 수집하고 다시 Request하는 방식입니다.


  [그림.12]


히든속성으로 재결합된 URL이 크롤링을 마치면 각각의 결과들을 HTML페이지로 저장합니다.

그리고 제가 추가로 구현한 기능입니다.

보통 스캐너들에서 검출되는 주민등록번호라고 확인을해보면 죄다 가짜입니다.

그냥 숫자형태와 주민번호형태로 13자리이면 무조건 가저오는것 같습니다.

결론은 xss나 injection취약점에 대해는 잘 찾는 편이지만 그 외의 기능은 성실히 구현한것 같지않은 느낌이 듭니다.  

이것은 어디까지나 제가 사용해본 스캐너 경험담입니다. ㅋ 뭐 제각각입니다. xss/injection등도 오탐이 무지많은 멍청한 스캐너들도 많구요 ㅋ

각설하고 아무튼 수집된 URL을 대상으로 해당되는 페이지에 주민등록번호 유형의 숫자가 있을경우 수집을 합니다.

수집을 한 후 주민등록 검증방식으로 실제 사용되는 주민등록번호인지 가짜 주민번호인지 검증을 하게됩니다.

검증 결과는 실제 주민등록번호일경우 Original ok로 나오며, 가짜 주민번호일경우 Imitation false 로 표시했습니다.

 

  [그림.13]

로그형태로 한번보여주고...

 

  [그림.14]

 역시 스캔결과를 HTML페이지로 저장해줍니다.

scanresult.html을 오픈하면....

 

 [그림.15]

 

해당 결과에 대한 페이지를 그림과같이 보여줍니다.

실제 해당 페이지에 대한 링크를 클릭하면 어느위치에서 발생된 정보인지 쉽게 확인할 수 있구요
이와같이 추가모듈을 시험삼아 적용해 보았습니다.

물론 이외에 XSS/INJECTION 과같은 패턴을 모듈로 개발해서 붙이면 그럴듯한 스캐너가 될것같습니다.



posted by 미스터리 DKL
2013.11.06 10:33 [PROGRAMMING]/▶Python

[ 반복 메타 문자 ]

[메타 문자]

[의미]

*

0회 이상 반복

+

1회 이상 반복

?

0회 or 1회

{m}

m회 반복

{m, n}

m회부터 n회까지 반복

 

[ 매칭 메타 문자 ]

[메타 문자]

[의미]

.

줄바꿈 문자를 제외한 모든 문자와 매치됨

^

문자열의 시작과 매치됨

$

문자열의 마지막과 매치됨

[ ]

문자 집합 중 한 문자를 의미

|

또는(or)를 의미

{ }

정규식을 그룹으로 묶음

 

[ 이스케이프 기호 ]

[종류]

[설명]

\\

역슬래쉬 문자 자체

\d

모든 숫자와 매치됨 [0-9]

\D

숫자가 아닌 문자와 매치됨 [^0-9]

\s

화이트 스페이스 문자와 매치됨 [ \t\n\r\f\v]

\S

화이트 스페이스가 아닌 것과 매치됨 [^ \t\n\r\f\v]

\w

숫자 또는 문자와 매치됨 [a-zA-Z0-9_]

\W

숫자 또는 문자가 아닌 것과 매치됨 [^a-zA-Z0-9_]

\b

단어의 경계를 나타냄. 단어는 영문자 혹은 숫자의 연속 문자열

\B

단어의 경계가 아님을 나타냄

\A

문자열의 처음에만 일치

\Z

문자열의 끝에만 일치

 

[ 최소 매칭을 위한 정규식 ]

[기회]

[의미]

*?

*와 같으나 문자열을 취소로 매치함

+?

+와 같으나 문자열을 취소로 매치함

??

?와 같으나 문자열을 최소로 매치함

{m,n}?

{m,n}과 같으나 문자열을 최소로 매치함

 

[ 정규 표현식에서 사용 가능한 플래그 ]

[플래그]

[내용]

I, IGNORECATE

대, 소문자를 구별하지 않는다

L, LOCATE

\w, \W, \b, \B를 현재의 로케일에 영향을 받게 한다

M, MULTILINE

^가 문자열의 맨 처음, 각 라인의 맨 처음과 매치 된다

$는 문자열의 맨 끝, 각 라인의 맨 끝과 매치

S, DOTALL

.을 줄바꾸기 문자도 포함하여 매치하게 한다

U, UNICODE

\w, \W, \b, \B가 유니코드 문자 특성에 의존하게 한다

X, VERBOSE

정규식 안의 공백은 무시된다

 

[ re모듈의 주요 메소드 ]

[메소드]

[설명]

compile(pattern[, flags])

pattern을 컴파일하여 정규식 객체를 반환

match(pattern, string[,flags])

string의 시작부분부터 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

search(pattern, string[,flags])

string의 전체에 대해서 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

split(pattern, string[, maxplit=0])

pattern을 구분자로 string을 분리하여 리스트로 반환

findall(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 리스트로 반환

finditer(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 반복자로 반환

sub(pattern, repl, string[, count=0])

string에서 pattern과 일치하는 부분에 대하여

repl로 교체하여 결과 문자열을 반환

subn(pattern, repl, string[, count=0])

sub와 동일하나, 결과로(결과문자열, 매칭횟수)를

튜플로 반환

escape(string)

영문자 숫자가 아닌 문자들을 백슬래쉬 처리해서 리턴.

(임의의 문자열을 정규식 패턴으로 사용할 경우 유용)

 

[ Match 객체 ]

Match객체는 match(), search()의 수행 결과로 생성되며, 검색된 결과를 효율적으로 처리할 수 있는 기능 제공.

◎ Match객체가 지원하는 메소드와 속성

[메소드]

[속성]

group([group1, ...])

입력받은 인덱스에 해당하는 매칭된 문자열 결과의 부분 집합을 반환합니다.

인덱스가 '0'이거나 입력되지 않은 경우 전체 매칭 문자열을 반환합니다.

groups()

매칭된 결과를 튜플 형태로 반환

groupdict()

이름이 붙여진 매칭 결과를 사전 형태로 반환

start([group])

매칭된 결과 문자열의 시작 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 시작 인덱스를 반환)

end([group])

매칭된 결과 문자열의 종료 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 종료 인덱스를 반환)

pos

원본 문자열에서 검색을 시작하는 위치입니다.

endpos

원본 문자열에서 검색을 종료하는 위치입니다.

lastindex

매칭된 결과 집합에서 마지막 인덱스 번호를 반환. (일치된 결과가 없는 경우

에는 None을 반환)

lastgroup

매칭된 결과 집합에서 마지막으로 일치한 이름을 반환. (정규식의 매칭 조건에

이름이 지정되지 않았거나 일치된 결과가 없는 경우 None 반환)

string

매칭의 대상이 되는 원본 문자열입니다.

 

 

[ 예제 ] - re 모듈 함수

▶ re.match()와 re.search()의 차이

re.match()의 경우 대상 문자열의 시작부터 검색을 하지만,

re.search()함수는 대상 문자열 전체에 대해서 검색을 수행한다.

예) 아래와 같이 검색의 대상이 되는 문자열에 공백이 있는 경우나 또는

검색 키워드와 일치하는 문자열이 대상 문자열의 중간 이후에 존재하는 경우

re.match()함수는 검색을 못함.

 

▶ re.split() - 대상 문자열을 입력된 패턴을 구분자로 하여 분리

 

▶ re.findall() - 검색 문자열에서 패턴과 매칭되는 모든 경우를 찾아 리스트로 반환

 

▶ re.sub() - 패턴과 일치하는 문자열 변경

또한 변경할 문자열에 대해서 매칭된 문자열을 사용할 수도 있다.

 

 

[ 예제 ] - 정규 표현식 객체

▶ 동일한 패턴을 연속적으로 검색하는 경우, 정규식을 컴파일하여 정규표현식 객체를 생성.

 

▶ re.IGNORECASE 플래그로 대소문자 구분하지 않고 매칭 작업 수행

 

▶ re.MULTILINE 플래그를 설정하여 빈 라인을 제외하고 라인별로 분리

 

 

[ 예제 ] - Match 객체

▶ 일반적인 형식의 전화번호를 인삭하여 Match 객체가 지원하는 메소드 분석.

 

▶ 정규식 작성시 '(?<이름>..)' 형식으로 매칭 결과에 대해 이름을 부여하고,

groupdict() 메서드를 이용하여 사전 형태로 이름과 검색된 문자쌍을 얻음.

 

 

    

로우 문자열 표기법 (Raw string notation)

이스케이프 문자열을 표현하기 위하여 '\'(백슬래쉬)문자를 사용하기 때문에, 문자 '\'를 정규표현식

으로 표현하기 위해서는 '\\\\'로, 일반 문자열에선느 '\\'로 표현해야 합니다. 그래서 '\apple'이란

문자열을 검색하기 위해서는 아래와 같이 매우 복잡한 형식으로 표현해야 합니다.

 

 

로우 문자열 표기법은 문자열 앞에 'r'을 더한 것으로, \(백슬래쉬) 문자를 이스케이프 문자열로 처리

하지 않고 일반 문자와 동일하게 처리합니다. 이렇게 함으로써 정규표현식 및 문자열에서 '\'를 간단

하게 표현할 수 있습니다. 일반적으로 정규표현식에 사용되는 문자열에서는 이러한 편리함 때문에

많이 사용합니다.

 

 

출처:http://devanix.tistory.com/296

posted by 미스터리 DKL
2013.10.17 17:30 [PROGRAMMING]/▶Python

파이썬에서 제공해주는 뷰티풀 수프 웹페이지를 파서해주는 모듈이다

그러나 이 모듈에는 치명적인 버그가있다..

로그인 페이지에서 form태그를 파싱하는데 분명히 form태그가 있는대도 불구하고 긁어오지 못하는 현상이 벌어졌다.

그 원인은 바로

<html>

<head>

</head>

<script type = "text/javascript">

꽐라꽐라~

꽐라꽐라~

꽐라꽐라~

꽐라꽐라~

꽐라꽐라~

꽐라꽐라~

꽐라꽐라~

</script>

<body>

꽐라꽐라~

꽐라꽐라~

</body>

이건데.. 이것만봐서는 통..이해가 되질 않겠저?

결론은 헤드태그 다음에 바디태그가 없으면 헤드태그 이후의 태그들을 찾지못한다.

이런 바보같은 모듈같으니..

그냥 직접 만들어서 써야할듯하다 하,,,

인줄알았지만..... 몇번 삽질끝에 방법을 알아냈다 ;;;(이상하게 이럴리가 없는데 라고생각하고 삽질을 했다 될때까지 ㅠ)

버그가아니였다.. 역시 완벽한건가..ㄷㄷ

저런형식으로 form값을 가저오지 못할때는...

import bs4
import urllib2

url = 'http://www.****.co.kr/'

handle = urllib2.urlopen(url)
data = handle.read()
soup = bs4.BeautifulSoup(data)


html = str(soup)
so = bs4.BeautifulSoup(html)

위와같이 하면 해결된다.

원인은 soup자체가 UNICODE로 처리되는데 스트링으로 변경하지 않고 사용하게되면 폼을 찾지못하는 단순한 사용오류였던것이다...
 

posted by 미스터리 DKL
2013.10.02 17:44 [PROGRAMMING]/▶Python

어느날 리버싱을하면서 모르는 명령어가 발견이 됬다

분명이 몇번 봤던 명령어인데 머릿속에 들어오질 않았었던 것이다.

그래서 그때부터 인터넷과 어셈관련 문서들을 참조해 해결하곤 했었다.

이런일이 자주 일어나다보니(머리가 나빠서 OTL )아예 내가 한번 봤던 명령어는 내가만든 프로그램에 전부 저장해놓고 다음번엔 명령어 검색만으로 찾아내는식으로 만들어야겠다고 생각이 들었고 대충 어떤식으로 동작할지 그려보고 바로 코딩했다.

간략히 설명 하겠습니다.

 

개발언어 : python

개발도구 : pyscripter

 

 

어셈명령어는 정말 많다. 그걸 다외우려면 고생좀해야될것이다. 그리고 그걸 다외우고 다니는사람은 없을것 같은데.. 있을수도있다ㅎㅎ

무튼 저런식으로 명령어들이 있다. 저명령어가 뭐하는건지 찾아내려면 인터넷을 뒤지고 또뒤지고 뒤저서 자료를 모아야한다. 그런데 그걸 한번에 기억하는 천재가있으면 괜찮지만

사람은 잊어버릴수밖에없다 그럼 그때 똑같은 방법그대로 익혀야한다. 매번 인터넷과 문서뒤지기도 귀찮다.

 

 

예외처리좀 해야되는데 빨리써야함으로 그냥 기능만 정상작동되게 만들어놓고 사용중이다.

asmdic은 정말 간단하다.

 

<Command모드 기능설명>

FIND : ex:)FIND모드로 진입한다.

del : 데이터 사전 파일내용을 전부 삭제한다.

open : 데이터 사전 파일을 연다.(읽기전용이므로 수정이 불가능하다. 단! mod 명령어를 이용해 수정가능)

add : 데이터 사전파일에 어셈명령어를 추가한다.

mod : 하.. 스샷에 mod관련 설명이 없네요. 데이터사전파일은 읽기전용이라 수정이 불가하지만 mod명령어로 수정은 가능합니다.

 

<Find모드 기능설명>

exit: find모드에서 exit는 command모드로 돌아간다.

all : 데이터 사전에 있는 내용을 모두 출력한다.

find > [어셈명령어] : ex) find > jnz라고 입력하면 jnz관련 명령어를 출력해준다.

 

 

간략히 이런 기능의 프로그램이다.

겉으로 보이기엔 간단하지만 여기에 나름 속도 향상을 위해 깨알같이 MMF(Memory Map File) 기능으로 구현하였다.

그 이유는 출력을 예로 들겠다.

간단히 real10을 출력한다.

이때 일반적이면 컴퓨터 -> 레지스터 -> 메모리 -> 하드디스크 에서 파일에 엑세스하여 real10정보를 가저온다. 파일 크기가 작다면 체감상모르겠지만 데이터가 쌓이고 하다보면

굉장히 느려질것이다.

반면 mmf로 사용하게되면  컴퓨터 -> 레지스터 -> 메모리 -> 하드디스크에서 1번만 엑세스하여 메모리에 올려버린다.

그러고나면 컴퓨터 -> 레지스터 -> 메모리 이상태에서 데이터에 액세스 할 수 있기 때문에 빠른 데이터 처리가 가능하기 때문이다.

몇년전에 시스템프로그래밍 공부했던게 스치듯 기억나 적용해본 케이스이다.

 

 

그리고 데이터가 저장 될때는 위와같이 저장되며, 내용을 추가할때는 2라인과 같이 날짜와 적용한 시간을 넣어준다.

해당 파일은 읽기전용으로 저장된다.

마지막으로 데이터를 찾을때 대소문자 상관없이 검색할 수 있게 구현해놨다.

 

 

 

posted by 미스터리 DKL
2013.09.29 18:00 [PROGRAMMING]/▶Python

회사 pc는 설정을 이미 해놨고 집에서 다시 깔고 설정을 하려고보니 그 어디에도 자료가없다.

더구나 검색해도 나오지 않는다..OTL

리버싱하다 아이디어가 떠올라 어셈공부용 에디터프로그램을 하나 만들려고했는데 벌써 이설정 하려고 검색만 2시간한듯..하..

시간이..하..

다음에 이런 수고를 덜고 다른분들도 보고 도움이 되었으면 해서 올립니다.

 

 

개발할때 환경 중요하지요. 개발하는 기분이 틀리더군요 물론 개인적인 생각이지만요..ㅎㅎ

우선 세팅 화면은 이렇습니다.

 

Theme down > http://sutocom.net/2013/07/25/pyscripter-dark-theme/

테마를 다운로드 하는 주소구요

번거로우시면 제가 올린 파일 다운받으셔서 설정하셔도 됩니다.

 

 

DarkHighlight2.ini

 

Hacker BW.skn

 

 

 

테마 적용은 %APPDATA%\pyScripter\skins folder 에저장하라고 합니다.

그냥 skins 검색하셔서 pyscripter 하위 디렉토리에 있는곳에 저장하면됩니다.

참고로 제 경로입니다. C:\Users\DK\AppData\Roaming\PyScripter\Skins

 

 

이렇게 적용하면 끝입니다.

posted by 미스터리 DKL
2013.09.26 11:00 [PROGRAMMING]/▶Python

개요

웹사이트 취약점을 자동점검과 수동점검으로 진행하게 되는데 수동점검시 수많은 파라미터를 체크하기에는 시간이 부족할 수 있습니다.

그래서 중복되는 파라미터는 제외해서 url로 재구성하도록 만들어봤습니다.

하지만 이 도구를 사용해서 점검을 할 경우 중복되는 파라미터를 제외해주기 때문에 수동점검 속도는 올려주나 취약점을 놓칠수 있는 오류를 범할 가능성이 있습니다.

그렇기 때문에 한번 발견된 종류의 취약점중에 다수의 샘플을 얻을때 사용하는것이 효율적이라고 생각됩니다.

예로 xss 또는 sql injection 등의 취약점을 a라는 파라미터에서 발견되었고 해당사이트에 다수의 xss 취약점이 존재한다고 보고서를 작성할때 사용하면 좋을것이고

반면에 사이트에서 모든 xss 취약점 인자를 빠짐없이 다 찾는방식에서는 이 도구를 사용하면 안될것입니다.

python 문법을 인터넷으로 문법공부하고 바로 만들어본거여서 코드 가독성 및 안정성은 떨어지지만 여러 시행착오를 거처 완성했습니다.

이 도구를 만드는 목적은 실 생활에 필요한 도구?, 업무효율을 높일 수 있지않을까? 하고 설계 없이 생각한 대로 만들었는데 업무효율은 높일수 있지만 취약점 점검시 안정성은 떨어집니다.

 

 

사용된 언어 및 툴

Python3 / idle / pyscripter

 

동작 원리

간단한 동작원리 에대한 설명입니다.

url1.txt와 url2.txt 두개의 파일을 생성하고 url2.txt에서 사용자에게 url을 입력받는다.
url1에는 url2에서 입력받은 값을 복사하며 중복된 url은 복사하지 않는다. 즉 중복되지 않은 url만 url1.txt에 저장된다
ex) 처음 url2.txt에서 www.test.com?a=1&b=1&c=2 라는 url을 저장한다. 그럼 url1.txt에 해당 url이 없으면 저장하게된다.
그리고 두번째로 url2.txt에 www.test.com?ac=1&ba=1&c=2를 저장한다.
두번째로 저장하고 창을 닫으면 url1.txt와 url2.txt의 값이 같은지 securl.py에서 검사하게되고 값이 같을경우 추가하지않고 값이 없을경우 url1에 추가한다.


각 url의 파라미터 www.test.com?a=1&b=1&c=2 처음 1회는 ? ~ & 까지 그다음부터 끝까지는 위치를 기억한후 &전까지 탐색하여 딕셔너리로 저장한다.
그리고 dic1과 dic2를 하나씩 비교해서 같은값의 dic2의 키값으로 tmp변수에 저장한다. 즉 값이 같을때만 키값을 저장한다.
그리고 dic1의 키값을 뽑고 dic2의 비교한 키값을 저장하고 url2(dic2)에서 dic1과 dic2의 같은 키값을 제외한 같지 않은 키값의 파라미터만 재구성하여
url로 만들어 준다. 

 

시연

 

url2에 url주소를 입력하면 url1에 입력됬던 값드를 중복여부 체크후에 저장합니다.

 

[파라미터가 중복된 경우]

 

 그리고 위와 같이 url2의 파라미터가 url1에 있다면 all parameter match url pass 라고 알려줍니다.

하지만 파라미터는 중복이지만 full url은 url1에 없기 때문에 URL add를 합니다.

 

[파라미터가 중복이 되지 않은 경우]

 

test code aid : 1 2 3

test code tmp : 1

과 같이 나왔는데 이것은 url1의 3개의 파라미터  www.test.com?a=1&b=1&c=2 와 url2 의 파라미터  www.test.com?a=1&aid=74&bid=74를 비교하고 없는 파라미터만 보여주고

그 파라미터들만 재구성 합니다.

 

 

[파라미터가 중복이 된 경우]

 

그리고 동일한 url을 입력했을 경우는  URL overlab과 같이 중복검사 결과를 보여주고 url을 추가하지 않습니다.

 

[중복되지 않은 파라미터만 url로 재구성]

 

마지막으로 없는파라미터만 재구성하여 urllist.txt 파일에 저정합니다.

점검은 이 url로 점검을 진행하면 되는데 취약점 발견 누락이 발생할 수 있기 떄문에 처음에 설명한대로 사용하면 될것입니다.

개발 컨셉을 잘못잡아서 파이썬으로 처음만들어 본거지만 별 쓸모는 없는것 같네요...;

하지만 이것을 시작으로 더욱더 강력하고 사용자 편의 중심의 도구를 만들어 봐야겠습니다..

 

posted by 미스터리 DKL
2013.09.23 16:58 [PROGRAMMING]/▶Python

개요

 

이걸 만들게 된 계기는 업무를 하다보면 NAT IP를 확인 해달라는 요청이 옵니다. 그럴떄마다 브라우저 띄우고 주소입력하고 즐찾있으시면 클릭하면되지만 번거롭습니다.

그리고 업무할때 프로그램이 한두개 띄워저있지않고 보통 기본 5~10개이상 오픈되어있습니다.

이럴때 NATIP확인하려고 웹브라우저를 띄운다면? 물론 성능좋은 컴퓨터는 해당사항이 없겠지만 제가 사무실에서 쓰는 노트북은..OTL 끔찍합니다.

정말 최소한의 프로그램만 띄워놓고 작업해야합니다. 

웹브라우저사용과 콘솔로 사용하는것에대한 비교를 해봤습니다.

 

1. 브라우저 띄운다.

2. URL Request하여 Nat ip 홈페이지에 접속한다.

이두가지만 볼때 별거아닌것 같지만 컴퓨터 사양이 좋지 않거나 창이 많이 띄워저 있을때 엄청나게 느려집니다.

윈도우에서 브라우저 하나만 시작하기 위한 작업이 복잡하며 윈도내에 많은 상호작용이 일어나지요.

반면에..

 

1. cmd창을 띄운다

2. 명령어를 입력한다.

이 두가지는 리소를 많이 잡아먹지 않습니다. cmd창 자체가 도스창이지요 엄청 가볍습니다. 그리고 브라우저처럼 웹페이지를 해석하는 작업조차 필요없습니다.(그림다운 및 javascript 해석)

간단히 말하면 특정웹사이트에 특정 문자열만 간단히 파싱하는 것입니다.

하지만 파싱만한다면 정말 간단하고 재미없어서 약간의 기능을 추가했습니다.

사용자가 설치를 편리하기위해 자동으로 파일을 생성하고 생성 후에 실행된 파일은 자동으로 삭제되도록 하는 기능입니다.

언뜻보면 악성코드같지만 악성코드는 전혀 아닙니다.

 

동작방법

 

1차 계획(불가능)

1. natsetup.exe 파일을 실행하면 windows\system32 디렉토리에 nat.exe파일이 있는지 확인한다.

2. natsetup.exe를 nat.exe로 변경하여 system32디렉토리 밑에 복사한다.

3. 복사가 완료되면 자기 자신을 삭제한다.

 

하지만 여기서 자기자신을 삭제하는것은 불가능합니다.

그이유는 현재 실행중인 프로세스이기 떄문에 삭제가 되지않습니다.

이부분에서 고민을 조금 했습니다.

제가 생각해낸 방법은 실행과 동시에 nat.exe파일과 data.txt파일을 동시에 생성하여 system32디렉토리 밑에 복사합니다.

data.txt파일의 내용은 natsetup.exe가 실행된 위치를 임시로 저장하는 파일입니다.

그리고 2개의 파일이 복사가 완료되면 자기자신과 동일한 프로세스를 실행시킵니다. 이녀석이 하는 역할은 data.txt파일에 있는 경로를 읽고 원본 natsetup.exe

삭제하고 system32밑에 data.txt 까지 삭제하는 역할을 합니다.

 

2차 계획(가능)

1. natsetup.exe 파일을 실행하면 windows\system32 디렉토리에 nat.exe파일이 있는지 확인한다.

2. system32 디렉토리에 nat.exe파일이 있으면 실행하지않고 없으면 data.txt,nat.exe 파일을 복사한다.

3. 자신과 같은 프로세스를 생성하고 원본 프로세스(natsetup.exe)는 종료한다.

4. 새로 생성된 동일한 프로세스는 data.txt파일내의 경로를 읽고 그 경로를 파일을 삭제한다.

5. 마지막으로 data.txt파일을 삭제하고 종료한다.

 

 

 

 

간단한 시연 입니다.

실행을 합니다.

 

 

 

처음 설치하는경우 success라고 알려주고 종료됩니다.

 

 

종료됨과 동시에 자기자신은 삭제되고 system32 폴더내에 nat.exe파일을 생성합니다.

 

 

이제 어느 위치에서 nat라고 입력하면 쉽게 nat아이피를 확인할 수 있습니다.

 

 

확실히 악성코드를 리버싱으로 분석하다보니 응용도 다해보네요..ㅎㅎ

절대 이런기술들은 악의적으로 사용되어지면 안되겠습니다.

posted by 미스터리 DKL