2020. 5. 1. 06:21ㆍ정보보안/웹 어플리케이션 해킹
최초 개정일 : 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를 남긴다.
0. Intro
Root ME 사이트를 사용하는 방법을 소개한다.
(사용법을 몰라서 헤맷기 때문에)
![](https://blog.kakaocdn.net/dn/wY7JY/btqDO21bfQY/A1tLRy53p4rMEK8K5XCZ91/img.png)
이 페이지를 통해서 가입하게 되며, 가입할 때 이메일 주소창에Gmail을 사용할 것을 추천한다.
(Naver 메일로 가입 했더니 인증 메일이 오지 않았었다.)
가입후에는 Root Me > Web Client를 클릭해주며 되며 문제를 클릭하면 아래와 같은 페이지가 뜬다.
![](https://blog.kakaocdn.net/dn/cNYKHM/btqDO2fPgrS/WZxbGf4DdPRgtpfmkHXdA1/img.png)
여기서 「Start the challenge」를 클릭하면 문제를 풀 수 있으며, 문제를 풀고난 뒤 찾은 password( flag 라고도 부른다)를 「Enter password」창에 입력하면 된다.
1. HTML - disabled buttons
![](https://blog.kakaocdn.net/dn/bOjV9K/btqDOHCWb86/IgXbvp6DeQd2jP32aSlUb1/img.png)
문제에서 입력 form와 button이 눈에 보이는데 클릭이 되지 않는다.
F12를 사용하여 보면 <input disable ... > 로 disable라는 말이 떡하니 자리잡고 있다.
*disable이라는 영어가 비활성화 이므로, 우리는 감으로 이를 enable 시키면 되지 않을까? 생각할 수 있겠다.🤔 *
![](https://blog.kakaocdn.net/dn/kLdfj/btqDOkg2wB7/XK9fZTXfOaMgZSCfZxSLbk/img.png)
![](https://blog.kakaocdn.net/dn/Iy19F/btqDOJguCwX/iRkD0Mm7MQG8KfHM6QAvgk/img.png)
2. Javascript - Authentication
login이라는 버튼을 누르면 「Login()」 이라는 함수가 실행된다고 써져있다.
이 「Login()」 이라는 함수는, 함수이므로 Java Script를 봐야 한다고 생각 할 수 있다.
(HTML, CSS, Java Script에서 유일하게 프로그래밍 가능한 언어는 Java Script 입니다. HTML은 뼈대를 만들고, CSS는 골조에 살을 덧붙이는 용도이기 때문입니다.)
따라서, F12 > Sources 를 열어 login.js 를 보도록 합니다.
![](https://blog.kakaocdn.net/dn/dT4CSm/btqDQ9Ez5Rm/w2lajfdH0yhmFkvdezwmCk/img.png)
역시아 우리가 생각한대로 Login() 이라는 함수가 존재합니다.
그리고 조건문 if에 아이디와 패스워드가 특정 값일 경우 다른 메시지가 출력되는 것을 알 수 있습니다.
따라서 이 아이디 값과 패스워드 값이 Key가 될 수 있겠습니다.
![](https://blog.kakaocdn.net/dn/bSl1ST/btqDQ7038fB/VuKnS8QyvkiXS1PGt9s490/img.png)
3. Javascript - Source
이번에는 페이지를 띄웠는데 아무것도 뜨지 않습니다.
F12를 클릭해서 보면 body onload 시 (페이지를 열었을 시 ) 「login()」 이라는 함수가 바로 실행되도록 되어있네요.
바로 F12 > Sources를 열어봅시다
![](https://blog.kakaocdn.net/dn/IhCGO/btqDQ9du5FD/mb25352uNkyYGG5bVNv6y0/img.png)
네, 대놓고 패스워드가 써져 있네요? 꿀꺽 해줍시다.
![](https://blog.kakaocdn.net/dn/bbvXoT/btqDQ9du5D9/KC1T4VMMybxawKtsimcpYk/img.png)
4. Javascript - Authentication2
앗 login 이라는 버튼이 보이네요? 왠지 이 버튼을 클릭했을 때 어떠한 Action이 발생할 것 같습니다.
F12 > Elements로 해당 부분의 소스를 보니 클릭시 「connection()」 이라는 함수가 실행 된다고 써져 있네요.
함수는 Java Script만 가능하니까 F12 > Sources로 가보도록 합니다.
![](https://blog.kakaocdn.net/dn/bY3sZm/btqDQUHEapL/0PmF3fnfidKzsCjusxwIgk/img.png)
여기 보시면 코드가 좀 길게 되어있어서 보기 어려울 수 도 있는데요.
자 일단 우리는 「패스워드」 를 찾아야 하니까. 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」 이라고 검색하시면 될거에요 !)
![](https://blog.kakaocdn.net/dn/cMyKHz/btqDPMDO6ND/qDKgsoniNN7kH8QC0OXuk1/img.png)
따라서 TheList의 GOD이 ID가 되고 HIDDEN이 Passwd가 되겠네요.
5. Javascript - Obfuscation 1
Obfuscation은 난독화 입니다.
자바스크립트는 소스보기를 통해서 소스가 외부에 노출 되기 떄문에 이를 방지하고자 난독화를 사용하여 알아보기 어렵게 한 것 입니다.
처음에는 이 난독화가 어려워서 어떻게 해야하나 인터넷에 「자바스크립트 난독화」 도 쳐보고 고민을 많이 했습니다만.
결론은 그냥 F12 > Sources 에서 중단점(break point) 걸고 디버깅 해버리면 되는 거시어씁니다 🤣🤣
![](https://blog.kakaocdn.net/dn/YGVtL/btqDQcIKOAR/KKzllNfWKjKOzxCuyKEWc0/img.png)
문제를 보시면 pass에 %(퍼센트)가 엄청 많이 되어있는것을 보실 수 있죠?
저는 이것을 보고 「%(퍼센트)인코딩」 을 떠올렸습니다. URI에 입력할 때 파라미터 조작에 많이 사용되죠.
그리고 자바 스크립트의 unescape() 함수를 찾아보면,「%16진수의 ASCII 아스키코드 값을 ISO LATIN-1 문자로 변환하여 되돌려주는 함수이다.」
라고 나옵니다.
이걸 일일이 해보긴 귀찮으니까, F12 > Console 을 사용해봅시다
콘솔창에 아까 봤던 자바스크립트 소스를 그대로 긁어다 치면 비밀번호가 등장합니다.
![](https://blog.kakaocdn.net/dn/lzhIQ/btqDO2mxeZO/S29ACnQMbDSY0FvJtTwqzk/img.png)
6.Javascript - Obfuscation 2
이번에는 아무것도 안떠요. F12를 눌러서 무엇이 있나 열어봅시다.
아하 !tag 쪽에 자바스크립트가 숨어있었군요!
앗 그리고 이번에도 %인코딩이 보이네요? 아까와 비슷한 방법으로 풀 수 있을 것이란 감이 옵니다.
![](https://blog.kakaocdn.net/dn/b4Ht1e/btqDRxrGFjs/8KxOpMbYgtSmBzzXuEf9AK/img.png)
그리고 아까처럼 콘솔창에다가 쫙 긁어서 넣어주고 엔터를 쳐줍니다.
![](https://blog.kakaocdn.net/dn/Y2iqZ/btqDQTBYKEh/WNUPYFLIAot6SOh97c9rUk/img.png)
이번 문제에서는 String.fromCharCode 라는 JavaScript 함수를 처음 보았는데요.
이는 ASCII code에 해당 하는 값을 string으로 변환 시켜주는 함수 같습니다.
7. Javascript - Native code
F12 > Element를 열면 아래와 같은 창이 나옵니다.
뜨헉 ... 이게 무슨 외계어 인가. 처음에 보고 엄청 당황하면서 구글검색을 막 때렸습니다.
하지만 나오는 것은 없엇고 ... ㅜㅜ
![](https://blog.kakaocdn.net/dn/cygR2m/btqDQSXn3AB/1bJjqxK4HhK7ulCMK7KdSk/img.png)
자 이럴땐 어떻게 하느냐 ~ 드디어 알려드립니다. 검색을 삽질하면서 알아낸 ..!
8번 line에 파란색 보이시나요? 8번 위에 마우스를 대고 클릭하면 저렇게 Break point가 걸립니다.
![](https://blog.kakaocdn.net/dn/yBIAp/btqDQsR7Mu2/ZepQaRJDkbGFk70QnnwGt1/img.png)
이제 디버깅을 할 수 있는데요. Step 이라는 F9를 누르면서 디버깅을 해나가다 보면 아래 같은 그림을 보실 수 있어요.
난독화를 몰라도 이렇게 볼 수 있다는 사실 !!😀
![](https://blog.kakaocdn.net/dn/YHbZG/btqDOlmDuri/d2OZCPNb7POIAeXzAeut8k/img.png)
+추가합니다. toString 메소드를 이용해서도 풀 수 있습니다.
난독화된 함수의 맨뒤에 ()를 지운뒤 .toString()을 사용하면 아래와 같이 함수내용을 확인할 수 있습니다.
![](https://blog.kakaocdn.net/dn/vGVtZ/btqDQbwkv4u/7tlATSsHonlxWzcKckKk6K/img.png)
8. Javascript - Obfuscation 3
이번에도 빈페이지가 나오는데요, F12를 눌러보시면
![](https://blog.kakaocdn.net/dn/uT3Du/btqDO1Bcl6P/lNN8DKZ1PPsPrwjDrUgWW0/img.png)
Break point를 걸고 Debugging을 해보면 입력값에 상관없이 항상 같은 문장이 출력됩니다.
![](https://blog.kakaocdn.net/dn/0fJqk/btqDOkuvw7H/RhxpTb4eFGbA9IBGXrc4zk/img.png)
자꾸 가짜 패스워드라고 하는데요. 그래서 21번째 줄을 사용해봤습니다.
![](https://blog.kakaocdn.net/dn/Pi3Oq/btqDQTvcOgW/7RXqMsKxkvjcicV3TqbA11/img.png)
일단 헥사 값이 알아보기 힘드니까 unescape 함수를 쓰고 (왜썻는지는 저도 모르겠어요.. 감으로 그냥 이렇게 해야 할거 같은데 ... 아시는분 댓글로 알려주시면 ㅜㅜ..)"55 , 56 .." 이런 값은 ASCII에 대응 될거 같아서 String으로 변환 시켜 주었습니다.
먼저 "\x35" 와 같은 Hex ASCII 값을 String ASCII로 바꿔줍니다. ("55" ..)
그리고 이 string ASCII 값을 10진수의 ASCII의 해당되는것으로 보고 다시 한번 string ASCII로 치환해줍니다 (String.fromCharcode)
![](https://blog.kakaocdn.net/dn/cDtj1z/btqDQtKlGMd/JNrFB4kd73PQBZAwslJkA0/img.png)
이 문제에서 관해서는
아래와 같은 참고자료들이 존재하는데요 ! 논문도 있고 ppt, report도 있으니 보시면 좋을것 같습니다.
4 related ressource(s)
- Automatic simplification of obfuscated JavaScript code(Virologie)
- Spiffy: Automated JavaScript deobfuscation(Virologie)
- Automatic detection for javaScript obfuscation attacks(Virologie)
- DEFCON a different approach to JavaScript obfuscation(Virologie)
![](https://blog.kakaocdn.net/dn/bHAfbP/btqDPK0fYmR/3WqUDdoaRqQkhIzRwltnbK/img.png)
* Eval() 함수 : ()안에 문자열을 넣으면 eval('string')이 Code로 인식되어 실행 된다 .
이 경우 아래와 같이 활용 될 수 있다.
var x1 = "te ActiveX Co";
var x2 = "ntrol";
var x3 = x1 + x2;
var x4 = "Execu" + x3;
...
eval(x4);
'정보보안 > 웹 어플리케이션 해킹' 카테고리의 다른 글
1. HTTP 프로토콜의 명령어과 상태코드, 쿠키와 세션쿠키, 인코딩스키마 (0) | 2020.05.01 |
---|---|
웹 해킹 테스트 사이트 및 워게임 사이트 (0) | 2020.05.01 |
[SUA] WEEK1 - BOF, FOB, LDAP Injection (0) | 2020.04.24 |
[SUA] 1. 웹/어플리케이션 서비스의 구성 이해 (0) | 2020.04.24 |
[SUA] 0. 2020 1학기 웹해킹 스터디 OT (0) | 2020.04.23 |