본문 바로가기

SWUFORCE - 워게임

[드림핵 WEB] Level1 워게임 csrf-1 문제풀이

https://dreamhack.io/wargame/challenges/26/

 

 

 

드림핵 강의로 공부하고 이해한 내용을 정리했습니다 ~~ 🙏

너무너무 어려워서 혼자는 아직 무리네요 ~~ 🙏

 

https://dreamhack.io/lecture/courses/203

 

 

목표

 

CSRF를 통해 관리자 계정으로 특정 기능을 실행시키는 것

 

 

 

<코드 분석>

 

엔드포인트:/vuln

 

 

이용자의 파라미터에 "frame" , "script" , "on" 세 가지의 악성 키워드가 포함되어 있으면 이를 "*" 문자로 치환한다.

키워드 필터링은 xss 공격을 방지하기 위한 목적으로 존재한다. 본 문제는 xss 공격이 아닌 CSRF 공격을 통해서 관리자의 기능을 수행하는 것이기 때문에 일부 키워드를 필터링 한것이다.

 

*악성키워드 : 저게 왜 악성키워드인지는 모르겠다.. 검색해봐도 잘 안나오네.. 

 

 

 

엔드포인트:/memo

 

 

이용자가 전송한 memo 입력값을 가져옴 -> 정의한 memo 변수에 기록 -> 사이트에 기록된 메모를  render_template 함수를 통해 화면에 출력

 

 

*render_template 함수 : 파이썬 flask에서 제공하는 함수로 templates에 저장된 html을 불러올때 사용한다.

 

 

기본적으로 프로젝트 폴더 내의 'templates'라는 이름의 폴더를 기본 경로로 설정하기 때문에 먼저 templates라는 폴더를 만들고 내부에 html 파일들을 모아두면 손쉽게 사용할 수 있다고 한다. 경로에 맞게 코드를 작성하면 html을 보여줄 수 있다.

 

 

문제 파일을 다운 받았을 때 이 templates 파일은 어디에 쓰는거고 이 파일안에 왜 이 html 파일들이 주어지는 건지 몰랐는데 이제 이해하게 되었다 !!!

 

 

 

엔드포인트:/admin/notice_flag

 

 

이용자의 IP가 로컬호스트가 아닌 경우 -> Access Denied 메세지를 출력

 

userid 파라미터가 admin이 아닌 경우 ->  Access Denied2 메세지를 출력

 

목표 :  ①로컬호스트 (127.0.0.1)에서 접근하고, ②userid 파라미터가 admin일 경우  -> 메모에 FLAG 기록, Ok 메세지 출력

 

 

*로컬호스트 : 컴퓨터 네트워크에서 사용하는 호스트명으로 자기자신의 컴퓨터를 의미한다. 

로컬호스트를 IPv4 방식으로 표현했을 때에는 127.0.0.1, IPv6로 표현했을 때에는 00:00:00:00:00:00:00:01로 표현한다.

(127.0.0.1을 자주 들었는데 그게 뭔지 몰랐는데 이제 알게됐다... )

 

 

 

 

엔드포인트:/flag

 

 

이용자의 요청이 GET 메소드인 경우

-> 이용자에게  URL을 입력받는 화면을 출력

 

 

이용자의 요청이 POST 메소드인 경우

-> param 파라미터 값을 가져와 check_csrf 함수의 인자로 넣고 호출한다.

 

 

 

check_csrf 함수

 

로컬 URL 설정 -> URL 방문

 

check_csrf 함수는 인자를 다시 CSRF 취약점이 발생하는 URL의 파라미터로 설정하고, read_url 함수를 이용해 방문한다. 이때 방문하는 URL는 서버가 동작하고 있는 로컬호스트의 이용자로 방문해야되니까 127.0.0.1의 호스트로 접속하게 된다.

 

 

 

read_url 함수

 

관리자 쿠키가 적용되는 범위를 127.0.0.1로 제한되도록 설정

크롬 옵션을 사용하도록 설정

 

read_url 함수는 셀레늄을 이용해 URL을 방문한한다.

 

 

driver.get("http://127.0.0.1:8000/")

관리자가 CSRF-1 문제 사이트 접속

관리자 쿠키 적용 -> 인자로 전달된 url에 접속

 

 

 

<취약점 분석>

 

/vuln 기능은 이용자의 입력 값을 페이지에 출력한다. 이 때 입력값에서 framescripton 세 가지의 키워드를 필터링하기 때문에 xss 공격은 불가능하지만 필터링 키워드 이외의 꺽쇠 (<>)를 포함한 다른 키워드와 태그는 사용할 수 있기 때문에 CSRF 공격을 수행할 수 있다.

 

 

-> 취약점이 있는 /vuln 페이지에서 CSRF 공격이 가능하다. 따라서 공격 코드가 삽입된 /vuln 페이지를 다른 이용자가 방문할 경우, 의도하지 않은 페이지로 요청을 전송하는 시나리오의 익스플로잇을 구상해야 한다.

 

 

 

 

<익스플로잇>

 

 

*익스플로잇(Exploit) : 컴퓨터, 스마트 폰 등 전자 기기에 대한 보안 취약점을 이용하여 해커의 의도대로 공격하도록 설계된 명령, 스크립트, 프로그램

 

 

플래그를 얻기 위해서는 /admin/notice_flag 페이지를 로컬호스트에서 접근해야 한다.

이를 위해 CSRF 공격으로 /vuln 페이지를 방문하는 로컬호스트 이용자가 /admin/notice_flag 페이지로 요청을 전송하도록 공격 코드를 작성해야 한다.

 

로컬 호스트 환경의 이용자가 임의 페이지를 방문하게 하려면 /flag 페이지를 이용해야 한다. 

-> 위에서 해석한 코드를 보면 로컬호스트로 접속할 수 있기 때문에

 

 

<img> 태그를 사용해 테스트베드 URL에 접속하는 공격 코드를 작성한 뒤, 취약점이 발생하는 페이지에 해당 코드를 삽입한다.

 

 


먼저 CSRF 취약점 발생 여부를 확인하기 위해 HTTP 응답을 받을 웹 서버가 필요하다. 만약 외부에서 접근 가능한 웹 서버가 없다면 드림핵에서 제공하는 드림핵 툴즈 서비스에서 Request Bin 을 사용해 XSS, CSRF 공격을 테스트할 수 있다.

 

 

생성된 링크를 이용해

 

<img src="https://생성된 url 주소">

취약점이 발생하는 페이지에 코드를 붙여넣으면 이미지가 출력되고

 

 

생성한 테스트베드에 요청이 온 것을 볼 수 있다.

 

 


 

로컬호스트에 위치하는 이용자가 /admin/notice_flag 페이지를 방문하도록 해야하기 때문에 아래와 같이 공격 코드를 작성해야한다.

이때 ② userid 파라미터가 admin인지 검사하는 부분이 존재하기 때문에 해당 문자열을 포함해야 한다.

 

<img src="/admin/notice_flag?userid=admin" />

 

 

 

 

작성한 공격코드를 flag 페이지에 전송한다. 로컬호스트에서 http://127.0.0.1:8000/vuln?param=<img src="/admin/notice_flag?userid=admin"/>에 접속하게 된다. 

 

 

 

 

memo 페이지로 가면 수행한 CSRF 공격으로 관리자가 /admin/notice_flag 페이지를 방문한 것을 확인할 수 있는 플래그를 볼 수 있다.

 

 

DH{11a230801ad0b80d52b996cbe203e83d}

 

 

 

드디어 끝....

코드 분석 + html 태그 사용법 + 웹페이지에 대한 이해 등등

쉬운 문제라고 하지만 다양한 지식을 가지고 있으며 활용할 수 있는 능력이 요구 되는 문제이다

초보자가 연습하기 좋은 문제이긴 하다 혼자서 풀지는 못하겠지만....

 

 

 


 

일반 유저가 아닌 로컬호스트의 이용자만 실행할 수 있는 기능을 해당 이용자의 의도와는 무관하게 실행하도록 하는 것에 성공했습니다. CSRF 공격은 이번 문제에서 다뤄본 결과 외에도, 게시판 서비스에서 공격자가 특정 글을 공지사항으로 업로드 하거나, 삭제 하는 등의 기능을 실행할 수도 있으며 공격자의 계정을 게시판 관리자로 승격시키는 등의 행위로도 응용할 수 있습니다.