kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

Cyber Security

비박스 환경을 활용한 웹 모의해킹 완벽 실습 - bee-box 환경 구성, bWAPP 실행

까마기 2020. 1. 22. 12:15
반응형
안녕하세요. 오늘은 웹 취약점 점검 VM인 bWAPP을 실행하고 실습 환경을 구성해 보도록 하겠습니다.
* bee-box란 mysql과 php로 만들어진 bWAPP이 설치되어 있는 리눅스 VM이다. bWAPP은 100여 가지가 넘는 웹 취약점이 있고 이를 해킹 및 대응할 수 있어 테스트와 공부하기 좋은 사이트입니다.
 
 
1. bee-box site 접속 및 bee-box_v1.6.7z download(VM)

 

vm 실행 및 서비스 시작
- 실습 환경 구성
 
2. 각자의 기호에 맞춰 구성, 포트포워딩 이용해 호스트 피시에서 서비스 접근 가능하도록 설정
(NAT-port forwarding)
 
3. 호스트 피시에서 접근
 
 
VM 시작 및 실습환경 구성 끝.

 

 

HTML 인젝션

low level login

id : bee

pw : bug

 

 

  1. HTML 태그 삽입(난이도 하)

 

 

 

htmli_get.php 페이지를 대상으로 HTML 인젝션 공격을 위한 HTML 태그 입력

 

<h1>Success</h1>

<img src=http://192.168.129.130/bWAPP/images/bee_1.png>

 

Go-->

 

 

 

 

위와 같이 테스트 사이트에 공격을 시도 -> success 메세지와 함께 벌모양의 이미지 태그가 삽입된 페이지 생성 ->

GET Method로 요청하기 때문에 웹 브라우저의 URL 입력부분에 변수가 노출되며, Firstname과 Lastname 이라는 변수에 입력한 HTML 태그가 보인다. 

이 상태에서 외부 사용자가 테스트 사이트(예를 들어 실제 서비스되는 사이트라고 가정)에 접근하여 이 html 태그가 삽입된 페이지를 정상페이지로 오해하고 접근

 

 

 

 

  1. HTML 태그 삽입 공격 (HTML Injection 취약점 여부 판단하기)

 

security level 변경 -> medium -> set 클릭 -> Current : medium으로 변경 후 확인

 

First name과 Last name에 low level과 동일하게 입력

 

 

위와 같이 medium단계에서는 태그( "< >") 를 필터링 하기 때문에 문자열이 그대로 노출된다.

 

-> 따라서 태그에 사용되는 "<" 와 ">" 를 URL인코딩하여 입력해보자

 

URL인코딩은 ASCII(아스키)코드의 HEX 값에서 %를 붙인 값으로, 두 문자를 URL 인코딩하면 '<' 는 %3C,  '>' 는 %3E 로 변환된다.

 

---> 테스트

 

%3Ch1%3ESuccess%3C%2Fh1%3E      :  해딩 태그, 제목 표기에 사용

%3Cimg src=http://192.168.74.140/bWAPP/images/bee_1.png%3E            :   이미지태그, src속성에 입력한 경로의 이미지 출력

 

--> HTML 태그 삽입 성공

 

 

 

  • 대응 방안

난이도 상에서는 난이도하에서 입력한 HTML 태그를 입력하면 태그로 해석하지 않고 문자열로 출력한다. 마찬가지로 난이도 중에서 사용한 인코딩 태그들도 실행하지 않고 문자열로 출력한다. HTML 태그를 입력하여도 태그로 해석하지 않는 이유는 우회 단계를 거치기 때문이다.

 

 

low level 

medium level

 

더블 인코딩 : 인코딩에 사용하는 %문자 자체도 인코딩하는 것 -> %문자의 인코딩 값은 %25

high level

security level 'low'에서 사용한 html 태그를 first name, last name에 입력하고 go를 하면 태그로 해석하지 않고 문자열로 출력한다. -> 우회과정을 거치기 때문?

  • 대응방안 : HTML 태그 입력 우회

  • xss_check3 함수를 통하여 입력 데이터를우회하고 있는데, 해당 함수는 htmlspecialchars 함수로 입력값을 우회하고 있다. 이 함수는 HTML에서 사용하는 특수 문자를 UTF-8형식으로 반환하며 변환하는 특수문자는 &, ", ', < ,> 이다.

HTML Injection - Stored(Blog) : HTML 인젝션 저장(블로그)

 

HTML 태그를 저장하여 관리자가 의도하지 않은 내용을 출력하게 하는 공격이 가능

블로그에 실린 텍스트 필드에 내용을 입력하고 Go 버튼을 클릭하면 입력 내용을 전송하고 다른 페이지로 이동

 

  1. htmli_post.php 페이지의 형식을 사용하기 위하여 개발자 도구로 페이지 형식 복사

  2. 크롬 브라우저 개발자도구(F12 키)에서 body -> div -> form 검색

해당 양식을 찾고 마우스 우클릭하여 Edit as HTML 클릭

 

 

위 화면에서 First Name과 Last name 에 각각 입력 후 'Go' 버튼

--> 입력한 코드가 실행된 htmli_stored.php 페이지 -> Enrty 안에있는 텍스값에 데이터 입력 후 GO -> htmli_post.php로 이동한것 확인

 

  • 대응방안

난이도 중/.상으로 세팅 -> 다시 태그 입력 후 Submit -> Html 태그를 문자열로 출력

html injection reflected(post) form 태그 내용을 문자열로 출력한 화면

 

--> 위와 같이 HTML 태그를 입력하여도 해석하지 않는 이유는 우회 단계를 거치기 때문이다.

 

htmli_stored.php 페이지의 코드를 살펴보면 난이도 하에서는 필터링하지 않지만 난이도 중/상은 xss_check_3 함수로 'Entry' 항목에 들어가는 내용을 필터링한다.

 

cd /var/www/bWAPP

vi htmli_stored.php

 

xss_check_3 함수는 functions_external.php에 정의되어 있고 htmlspecialchars 함수로 입력값을 우회한다. htmlspecialchars 함수는 HTML 에서 사용하는 특수문자를 UTF-8로 변환하며, 변환하는 특수문자는 '&, ", ', <, >' 이다.

  • UTF-8

 

  • 따라서 iframe 인젝션을 막으려면 htmlspecialchars 함수를 사용하여 웹 브라우저에서 iframe 태그에 사용되는 문자들을 HTML 태그로 해석하지 않게 입력 데이터를 UTF-8로 인코딩한다.

 

  • iframe은 HTML 문서 안에서 또 다른 HTML 문서를 출력하는 태그로, 어느 위치든 상관없이 인젝션 공격이 가능하다.

  • iframe 인젝션은 독립적으로 만들 수 있어서 HTML 인젝션 중에서도 공격에 자주 사용

  • HTML 인젝션에서 사용하는 태그와 마찬가지로 페이지 내에 iframe 태그를 인젝션하는데, 주로 악성 URL을 삽입한 후 사이즈를 0으로 설정하여 숨기는 방법을 사용

 

따라서 사용자가 의도하지 않은 악성 웹 사이트에 접속하거나 경고창을 띄울 수 있다.

 

 

iframe 인젝션

 

- iframe 인젝션을 막으려면 htmlspecialchars 함수를 사용하여 웹 브라우저에서 iframe 태그에 사용되는 문자들을 HTML 태그로 해석하지 않게 입력 데이터를 UTF-8로 인코딩한다.

- iframe은 HTML 문서 안에서 또 다른 HTML 문서를 출력하는 태그로, 어느 위치든 상관없이 인젝션 공격이 가능하다.

- iframe 인젝션은 독립적으로 만들 수 있어서 HTML 인젝션 중에서도 공격에 자주 사용

- HTML 인젝션에서 사용하는 태그와 마찬가지로 페이지 내에 iframe 태그를 인젝션하는데, 주로 악성 URL을 삽입한 후 사이즈를 0으로 설정하여 숨기는 방법을 사용

 

따라서 사용자가 의도하지 않은 악성 웹 사이트에 접속하거나 경고창을 띄울 수 있다.

- iframei.php 페이지는 GET 방식으로 데이터를 전송받으므로 URL에 변수를 노출한다.

- 변수는 다음과 같다

 

- ParamUrl : 연결할 주소를 받아옴

- ParamWidth, ParamHeight : 내용을 출력할 크기 지정

- 개발자도구로 iframe 태그 확인 : iframei.php 페이지는 iframe 태그를 사용하여 bWAPP 디렉터리에 있는 robots.txt 파일의 내용을 출력

- URL에서 ParamUrl 변수의 값은 robot.txt이다. 이 변수에 입력한 내용이 iframe 태그에 추가되어 기존 iframe 태그를 강제로 닫고 URL에 노출된 변수에 악의적인 iframe 태그를 주입하는 방법을 사용

  • iframe 태그로 사용자 모르게 악의적인 HTML 페이지를 출력하는 공격을 하기 위하여 HTML 페이지를 먼저 만든다.

  • 웹 서버가 없는 경우 비박스의 웹 서버에 HTML 파일을 생성한다.

root@bee-box:~# cd /var/www/bWAPP

root@bee-box:/var/www/bWAPP# vi bad.html

<html>

<head>

<h1>Iframe Injection</h1>

<script>alert("Succeed")</script>

</head>

</html>

:wq

root@bee-box:/var/www/bWAPP# ll | grep bad.html

-rw-r--r--  1 root root        90 2017-01-02 19:22 bad.html

 

  • bad.html 파일을 생성하고 나면 iframei.php 페이지로 이동하여 상단 URL 부분에서 ParamUrl 변수에 악의적인 HTML 페이지를 호출하는 iframe 태그를 입력한다. 

  • ParamUrl 변수의 값이 원래 페이지의 iframe 태그에 추가되기 때문에 "></iframe> 을 입력하여 원래 페이지의 iframe 태그를 닫는다.

  • 그리고 /var/www/bWAPP 디렉터리 안에 생성한 bad.html 페이지를 iframe의 src 속성에 입력한다.

 

http://192.168.56.1:9999/bWAPP/iframei.php?ParamUrl=robots.txt"></iframe><iframe src="bad.html" width="250" height="250"></iframe>&ParamWidth=250&ParamHeight=250

 

- 변수에 iframe 태그를 입력하고 엔터를 누르면 웹 브라우저에서 bad.html 파일의 코드를 해석하고 iframe 인젝션 결과로 'Succeed'라는 메세지를 경고창으로  출력한다.

- 확인을 클릭하면 robots.txt 내용 옆에 bad.html에 입력한 헤딩 태그를 출력하고 그 옆에는 정상 iframe 태그에 들어가는 넓이와 높이 속성이 문자열로 출력한다. 정상 iframe 태그글 강제로 닫았기 때문에 속성이 노출된 것이다.

- 사용자 몰래 iframe 인젝션 공격을 하기 위하여 iframe의 'width' 속성과 'height' 속성을 0으로 수정한다.

- iframe 태그를 주입한 후 웹 개발자 도구로 iframei.php 페이지의 소스 코드를 확인하면 원래 있던 iframe 태그가 닫히고 악의적으로 주입한 iframe 태그가 추가된 것을 볼 수 있다.

 

http://192.168.56.1:9999/bWAPP/iframei.php?ParamUrl=robots.txt"></iframe><iframe src="bad.html" width="0" height="0"></iframe>&ParamWidth=250&ParamHeight=250

-> iframe의 넓이와 높이를 전부 0으로 만들어도 'Succeed'라는 경고창은 출력된다. 그러나 이전과는 다르게 'bad.html'에 입력한 헤딩 태그를 출력하지 않는다. 따라서 공격자는 iframe 인젝션으로 경고창을 출력하여 원래 사이트에서 정상적인 응답인 것처럼 사용자를 속일 수 있다.

 

 

- 그러나 정상 iframe 태그의 높이와 넓이가 위 그림 처럼 같이 출력된다면 페이지가 이상하다는 것을 발견할 수도 있다. 따라서 스크롤을 내리지 않으면 전혀 눈치 채지 못하도록 속성을 아주 큰 값으로 설정한다.

 

http://192.168.56.1:9999/bWAPP/iframei.php?ParamUrl=robots.txt"width="250"height="1000"></iframe><iframe src="bad.html" width="0" height="0"></iframe>&ParamWidth=250&ParamHeight=250

* 경고창을 닫아도 정상적인 웹페이지로 보인다.

 

 

 

  • 대응방안

난이도 상에서는 URL의 ParamUrl 변수에 iframe 태그를 입력하여도 아무 반응이 없다. 이는 결과를 출력하기 전에 우회단계를 거치기 때문에 웹 브라우저에서 입력 데이터를 태그로 해석하지 않아서이다.

htmlspecialchars 함수로 입력값을 우회하는 단계를 거치게 끔하여 URL에 입력 데이터를 태그로 해석하지 않게 한다.htmlspecialchars 함수는 html에서 사용하는 특수문자를 UTF-8로 반환한다.

 

OS 커맨드 인젝션

 

  • 취약한 변수로 시스템 명령어를 주입하여 서버 운영체제에 접근하는 공격이다. 보통 웹 페이지에서 서버의 시스템 Shell을 호출할 때 관리자가 의도한 명령이 아닌 다른 명령어를 주입하여 서버 정보를 알아낸다.

 

1) 난이도 하

 

  • commandi.php는 입력한 주소의 DNS 주소를 출력, 이때 DNS를 조회하는 시스템 명령어인 nslookup 명령어를 사용

  • 아래와 같이 텍스트 필드에 파이프라인과 함께 원하는 명령어를 입력

ex) # | ls ../../../

  • 파이프라인을 사용한 OS  커맨드 인젝션의 결과로 서버 시스템의 가장 상위에 있는 디렉터리 정보 출력

  • nc(넷켓) 실행하여 리스닝 모드로 비박스 서버 정보를 외부에서 파악해보기

  • -l : listen 모드 nc를 띄워며, 타겟 호스트는 입력하지 않는다. -p와 같이 사용하며, nc를 Server로 쓸때 사용

 

nc -e 옵션 사용하기 : 칼리 리눅스에서 비박스서버의 정보를 알기 위하여 명령어를 실행 -> 비박스에서 실행

 

반응형