[SUA] 웹 해킹 스터디 1회차 - Root ME

2020. 5. 1. 06:21정보보안/웹 어플리케이션 해킹

728x90

최초 개정일 : 2020.05.01. ver 1.0

1주차 스터디 04.28

Summary

  • Java Script 난독화
  • Java Script : Eval() 함수
  • Java Script : String.fromCharcode () - decimal ASCII 에 해당 되는 값을 string으로 변환

 

본 스터디의 방향은 웹해킹 워게임 사이트를 대상으로 진행하기로 하였다.

대상 사이트는 Root Me > Web Client 이다.

이에 따른 문제와 문제 풀이 방법을 기록하며, 풀이 방법 중 Key Point를 남긴다.

[Root Me > Web Client]

0. Intro

Root ME 사이트를 사용하는 방법을 소개한다.

(사용법을 몰라서 헤맷기 때문에)

더보기
< 맨 처음 볼 수 있는 페이지, 가입을 할 수 있다>

이 페이지를 통해서 가입하게 되며, 가입할 때 이메일 주소창에Gmail을 사용할 것을 추천한다.

(Naver 메일로 가입 했더니 인증 메일이 오지 않았었다.)

가입후에는 Root Me > Web Client를 클릭해주며 되며 문제를 클릭하면 아래와 같은 페이지가 뜬다.

여기서 「Start the challenge」를 클릭하면 문제를 풀 수 있으며, 문제를 풀고난 뒤 찾은 password( flag 라고도 부른다)를 「Enter password」창에 입력하면 된다.

1. HTML - disabled buttons

더보기
< 1번 문제>

문제에서 입력 form와 button이 눈에 보이는데 클릭이 되지 않는다.

F12를 사용하여 보면 <input disable ... > 로 disable라는 말이 떡하니 자리잡고 있다.

*disable이라는 영어가 비활성화 이므로, 우리는 감으로 이를 enable 시키면 되지 않을까? 생각할 수 있겠다.🤔 *

< 1번 문제 솔루션 >

2. Javascript - Authentication

더보기

login이라는 버튼을 누르면 「Login()」 이라는 함수가 실행된다고 써져있다.

이 「Login()」 이라는 함수는, 함수이므로 Java Script를 봐야 한다고 생각 할 수 있다.

(HTML, CSS, Java Script에서 유일하게 프로그래밍 가능한 언어는 Java Script 입니다. HTML은 뼈대를 만들고, CSS는 골조에 살을 덧붙이는 용도이기 때문입니다.)

따라서, F12 > Sources 를 열어 login.js 를 보도록 합니다.

< 2번문제>

역시아 우리가 생각한대로 Login() 이라는 함수가 존재합니다.

그리고 조건문 if에 아이디와 패스워드가 특정 값일 경우 다른 메시지가 출력되는 것을 알 수 있습니다.

따라서 이 아이디 값과 패스워드 값이 Key가 될 수 있겠습니다.

[ F12 > Sources ]

3. Javascript - Source

더보기

이번에는 페이지를 띄웠는데 아무것도 뜨지 않습니다.

F12를 클릭해서 보면 body onload 시 (페이지를 열었을 시 ) 「login()」 이라는 함수가 바로 실행되도록 되어있네요.

바로 F12 > Sources를 열어봅시다

< 3번 문제>

네, 대놓고 패스워드가 써져 있네요? 꿀꺽 해줍시다.

< 3번 문제 해답>

4. Javascript - Authentication2

더보기

앗 login 이라는 버튼이 보이네요? 왠지 이 버튼을 클릭했을 때 어떠한 Action이 발생할 것 같습니다.

F12 > Elements로 해당 부분의 소스를 보니 클릭시 「connection()」 이라는 함수가 실행 된다고 써져 있네요.

함수는 Java Script만 가능하니까 F12 > Sources로 가보도록 합니다.

< 4번 문제>

여기 보시면 코드가 좀 길게 되어있어서 보기 어려울 수 도 있는데요.

자 일단 우리는 「패스워드」 를 찾아야 하니까. Password라는 단어에 주목해서 아래 라인을 보도록 합시다.

var TheSplit = TheLists[i].split(":");
var TheUsername = TheSplit[0];
var ThePassword = TheSplit[1];

이 부분이 보이시나요? TheSplit[0] 이라는 것은 TheSplit이라는 배열의 첫번째 인자를 가져온다는 것을 의미합니다.

그럼 TheSplit은 배열이네요 !

그리고 TheSplit은 TheList의 문장에서 :를 기준으로 토큰화 되었다는 것을 알 수 있습니다.

(문장인지 어떻게 알았냐고요? .split이란 함수는 string 대상으로만 쓸 수 있어요. 토큰화인지는 어떻게 아냐고요? .split이라는 함수는 python에서도 tokenizing할 때 사용하거든요. 저는 java script를 모르지만 python을 할 줄 알아서 .. 대충 비슷한 감으로 찍어 맞췄어요. 만약에 아에 전혀 감이 오지 않을 때에는 google에 「java script split」 이라고 검색하시면 될거에요 !)

<4번문제 솔루션>

따라서 TheList의 GOD이 ID가 되고 HIDDEN이 Passwd가 되겠네요.

 

5. Javascript - Obfuscation 1

더보기

Obfuscation은 난독화 입니다.

자바스크립트는 소스보기를 통해서 소스가 외부에 노출 되기 떄문에 이를 방지하고자 난독화를 사용하여 알아보기 어렵게 한 것 입니다.

처음에는 이 난독화가 어려워서 어떻게 해야하나 인터넷에 「자바스크립트 난독화」 도 쳐보고 고민을 많이 했습니다만.

결론은 그냥 F12 > Sources 에서 중단점(break point) 걸고 디버깅 해버리면 되는 거시어씁니다 🤣🤣

< 5번 문제 >

문제를 보시면 pass에 %(퍼센트)가 엄청 많이 되어있는것을 보실 수 있죠?

저는 이것을 보고 「%(퍼센트)인코딩」 을 떠올렸습니다. URI에 입력할 때 파라미터 조작에 많이 사용되죠.

그리고 자바 스크립트의 unescape() 함수를 찾아보면,%16진수의 ASCII 아스키코드 값을 ISO LATIN-1 문자로 변환하여 되돌려주는 함수이다.

라고 나옵니다.

이걸 일일이 해보긴 귀찮으니까, F12 > Console 을 사용해봅시다

콘솔창에 아까 봤던 자바스크립트 소스를 그대로 긁어다 치면 비밀번호가 등장합니다.

< 5번 문제 솔루션>

6.Javascript - Obfuscation 2

더보기

이번에는 아무것도 안떠요. F12를 눌러서 무엇이 있나 열어봅시다.

아하 !tag 쪽에 자바스크립트가 숨어있었군요!

앗 그리고 이번에도 %인코딩이 보이네요? 아까와 비슷한 방법으로 풀 수 있을 것이란 감이 옵니다.

< 6번 문제>

그리고 아까처럼 콘솔창에다가 쫙 긁어서 넣어주고 엔터를 쳐줍니다.

< 6번문제 솔루션>

이번 문제에서는 String.fromCharCode 라는 JavaScript 함수를 처음 보았는데요.

이는 ASCII code에 해당 하는 값을 string으로 변환 시켜주는 함수 같습니다.

 

7. Javascript - Native code

더보기

F12 > Element를 열면 아래와 같은 창이 나옵니다.

뜨헉 ... 이게 무슨 외계어 인가. 처음에 보고 엄청 당황하면서 구글검색을 막 때렸습니다.

하지만 나오는 것은 없엇고 ... ㅜㅜ

< 7번 문제>

자 이럴땐 어떻게 하느냐 ~ 드디어 알려드립니다. 검색을 삽질하면서 알아낸 ..!

8번 line에 파란색 보이시나요? 8번 위에 마우스를 대고 클릭하면 저렇게 Break point가 걸립니다.

< 7번문제 Break Point 걸기>

이제 디버깅을 할 수 있는데요. Step 이라는 F9를 누르면서 디버깅을 해나가다 보면 아래 같은 그림을 보실 수 있어요.

난독화를 몰라도 이렇게 볼 수 있다는 사실 !!😀

< 7번 문제 솔루션>

 

+추가합니다. toString 메소드를 이용해서도 풀 수 있습니다.

난독화된 함수의 맨뒤에 ()를 지운뒤 .toString()을 사용하면 아래와 같이 함수내용을 확인할 수 있습니다.

< toString Method>

8. Javascript - Obfuscation 3

더보기

이번에도 빈페이지가 나오는데요, F12를 눌러보시면

< 8번 문제>

Break point를 걸고 Debugging을 해보면 입력값에 상관없이 항상 같은 문장이 출력됩니다.

< 8번 문제 >

자꾸 가짜 패스워드라고 하는데요. 그래서 21번째 줄을 사용해봤습니다.

< 가짜 패스워드라고 함>

일단 헥사 값이 알아보기 힘드니까 unescape 함수를 쓰고 (왜썻는지는 저도 모르겠어요.. 감으로 그냥 이렇게 해야 할거 같은데 ... 아시는분 댓글로 알려주시면 ㅜㅜ..)"55 , 56 .." 이런 값은 ASCII에 대응 될거 같아서 String으로 변환 시켜 주었습니다.

먼저 "\x35" 와 같은 Hex ASCII 값을 String ASCII로 바꿔줍니다. ("55" ..)

그리고 이 string ASCII 값을 10진수의 ASCII의 해당되는것으로 보고 다시 한번 string ASCII로 치환해줍니다 (String.fromCharcode)

< 8번 문제 솔루션>

이 문제에서 관해서는

아래와 같은 참고자료들이 존재하는데요 ! 논문도 있고 ppt, report도 있으니 보시면 좋을것 같습니다.

4 related ressource(s)

< 악의적으로 사용되는 대표적인 것들 >

* Eval() 함수 : ()안에 문자열을 넣으면 eval('string')이 Code로 인식되어 실행 된다 .

이 경우 아래와 같이 활용 될 수 있다.

var x1 = "te ActiveX Co";
var x2 = "ntrol";
var x3 = x1 + x2;
var x4 = "Execu" + x3;
... 
eval(x4);