티스토리 뷰

수업 노트/natas

natas11 solution

오리지날초이 2023. 4. 9. 13:17

URL : http://natas11.natas.labs.overthewire.org/

id : natas11

password : 1KFqoJXi6hRaPluAmk8ESDW4fSysRoIg

(2023. 03 기준)

 

 

RGB 값을 입력하면 백그라운드 컬러로 반영이 되는 페이지입니다.

 

뷰 소스코드를 사용해서 살펴보니 복잡하네요..

 

 

쿠키를 사용하기 때문에 proxy 를 이용해야 하나 싶지만

결국 쿠키에 포함되는 data 필드는 

showpassword 와 bgcolor 값을 받아와서 json_encode 와 xor_encrypt 와 base64_encode 로 변환된 값입니다.

 

proxy 보다는 웹페이에 구현되어 있는 함수를 잘 해석하고 이를 추적할 수 있어야 합니다.

굉장히 까다롭고 어려운 문제입니다.

 

더보기

먼저 코드의 흐름을 읽어보면 상단부에 구현되어 있는 사용자 함수는 필요할 때 호출이 되는것이고

메인 코드는 아래임을 파악할 수 있습니다.

 

우선 loadData($defaultdata) 가 작동하고 그 결과가 $data 에 전달되며

array_key_exists("bgcolor", $_REQUEST) 가 존재하면 $data['bgcolor''에 그 값을 반영하며 

saveData($data) 로 값을 저장합니다.

 

그리고 그 값에서 $data["showpassword"] 를 확인했을 때 value 가 "yes" 이면 문제가 해결되는 구조입니다.

 

loadData() 를 살펴보기 전에 $defaultdata 를 살펴보니 상단부에 초기화가 되어 있네요. 

$defaultdata = array( "showpassword"=>"no""bgcolor"=>"#ffffff");

 

array[0] array[1] .. 과 같은 배열 인덱스가 아닌  key, value 를 가진 php 배열이며, 

key 값 showpassword, bgcolor 이고, value 값은 각각 no, #ffffff 임을 알 수 있습니다.

 

해당 array 를 loadData 에 전달하면 아래 로직이 동작합니다.

 

함수내 작동하는 $mydata 는 우리가 전달한 초기값 $defaultdata 와 동일합니다.

첫 if 문에서는 php 에서 넘겨받은 쿠키변수에 data 필드가 있는지 체크하네요. 

 

굳이 프록시를 사용할 것도 없이 웹브라우져의 개발자 도구를 사용해서

실제 쿠키를 확인해보니 data 필드값이 존재하는 것을 확인할 수 있습니다.

 

 

기본값 #ffffff 의 경우 쿠키는 

MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY%3D 이고

url 인코드로 보이는 %3D를 디코딩 하면

MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY=

로 값이 변환됩니다.

 

이 부분을 확인했으니 다음 순서인

 $tempdata json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true); 

구문 동작을 확인해 봅시다.

 

php online compiler 를 활용해서 간단하게 실제 쿠키의 data 값을 base64 디코딩 됨을 확인해보았습니다.

 

json 형식의 데이터가 생소할 수도 있는데

url 인코딩과 같이 웹상에서 데이터를 표현하고 전송하는 흔한 인코딩 형식입니다.

json 인코딩이 적용된 예를 살펴보면 아래와 같습니다.

 

 

해당 결과값을 사용자 함수인 xor_ecrypt() 를 이용해서 다음 단계로 나아가야 합니다.

그런데 구현되어 있는 xor_encrypt 를 이용하려고 하니 $key 값이 가려져 있네요.

이 $key 값을 구해내는게 이번 문제의 핵심입니다.

 

해당 함수는 문자열을 입력받아서 문자열의 첫글자부터 마지막 글자까지 ^ 연산을 하며

결과 문자열을 만들어내는 로직입니다.

그리고 key 값의 길이와 상관없이 key 값도 순환하며

text[$i] 와 key[$i % strlen($key)] 이 ^ 연산을 합니다.

 

php  에서 ^ 연산은 비트 연산자로서 두 비트가 다를 때 1을 반환합니다.

즉 0^0= 0, 0^1=1, 1^0=1, 1^1=0 의 결과값이 나옵니다.

 

그런데 이 xor 연산은 중요한 특징이 있는데 A^B=C 일때 A^C=B 가 성립한다는 점입니다.

즉 text[$i] ^ $key[$i] = result[$i] 의 원래 로직을 이용해서

text[$i] ^ result[$i] = $key[$i] 를 구해낼 수 있는거죠.

 

해당 페이지 로직의 가장 마지막 부분인 saveData($data); 를 살펴보면


function 
saveData($d) {
    
setcookie("data"base64_encode(xor_encrypt(json_encode($d))));
}

 

가 작동해서 최종 쿠키값이 우리가 이미 알고 있는

MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY=

이 되었음을 확인할 수 있습니다.

 

이를 이용해서 xor_encrypt() 의 $key 를 구해봅시다.

 

$defaultdata 와 $cookie 를 이용해서 순환반복되는 키값 KNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLK 을 구했습니다.

 

이제는 $key를 이용해서 실제 cookie 에

array( "showpassword"=>"yes""bgcolor"=>"#ffffff"); 값을 담을 수 있습니다.

 

$array 를 json 에 xor 에 base64 로 인코딩해서 구해진 값을 웹브라우저의 개발자도구를 이용해서 반영해봅시다.

 

 

쿠키값 반영 후 원래 페이지에서  새로고침을 눌러주면 해당 쿠키가 적용되어서

문제가 해결된 것을 확인 할 수 있습니다.

 

 

natas 사이트에서 통하는 취약점은 실제로 아주 오래전에는 통했을지도 몰라도

지금은 먹히지 않는게 대부분입니다.

 

혹시라도 natas 에서 배운 기법을 활용해서 현실세계에서 웹취약점을 탐색하는 행위는

하지 않기를 강력하게 권고합니다.

 

natas 는 보안 학습을 위해 제작된 사이트로 취약점 탐색 행위를 하는것을 허용하게끔 설계되었고

그 영향력이 제한적이지만 동일한 방식으로 현실에 존재하는 개인/상업 사이트에 취약점 점검을 한다면

여러분은 법적인 책임을 지게 될 수 있습니다.

 

국내외 대부분의 사이트들은 침입탐지 시스템 등을 운영하고 이상 탐색 행위를 추적할 수 있습니다.

 

이곳에서는 웹보안에 대한 기본적인 개념을 익히는데 만족하고

그 외 다양한 시도는 사전 협의된 테스트 환경이나 본인이 감당할 수 있는 실험 환경 등에서만

진행하길 바랍니다.

 


 

728x90
반응형

'수업 노트 > natas' 카테고리의 다른 글

natas13 solution  (0) 2023.04.20
natas12 solution  (0) 2023.04.19
natas10 solution  (0) 2023.04.06
natas9 solution  (0) 2023.03.13
natas8 solution  (0) 2022.05.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함