Web-Client) javascript 관련 문제
Wargame/Root-Me

Web-Client) javascript 관련 문제

1. Javascript- Authentication (5pt)

=> javascript를 이용해 관리자 권한을 갖는 문제인 것 같다.

 

=> 로그인 버튼에서 클릭하면 Login() 메소드가 실행된다. 헤드로 거슬러 올라가서 login.js 문서를 한번 살펴보자

 

=> 패스워드와 아이디가 그대로 노출되어있다. 이렇게 페이지를 만드는 사람은 없겠지만..

 

 

2. Javascript- source (5pt)

  - 이것도 javascript 소스가 어떻게 작동되는지 묻는 것같다.

 

-> login() function을 사용하고 있고 prompt창을 이용해 패스워드를 입력받고 있다. 노출되어있는 패스워드를 그대로 입력해주면 된다.

 

 

3. Javascript- Authentication 2 (10pt)

 

=> 그냥 username과 password가 : 로 Thelists 변수를 split한 내용이고, : 을 사이에 두고 split해서 로그인하면 권한을 얻을수있다.

 

 

4. Javascript- Obfuscation (10pt)

소스코드를 살펴보면 16진수로 escape된 문자열이 패스워드라는 것을 알수 있다. console을 통해 unescape해보자.

 var pass = '%63%70%61%73%62%69%65%6e%64%75%72%70%61%73%73%77%6f%72%64';
 var h=unescape(pass);
 console.log(h);

 => 성공.

 

 

5. JavaScript- Obfuscation 2

 아무것도 없다. 소스코드를 살펴보자.

굉장히 복잡한 문자열을 unescape하도록 되어있다.

 : going down 3floors가 부제여서 세번 unescape해주면 코드가 나오지 않을까 싶었다.

 

아스키코드로 문자열을 바꿔주면 될것 같다.

 

   비밀번호가 나오고, 이 비밀번호로 validate해주면 성공.

 

 

 

 

6. JavaScript- Native code

 이 문제를 풀기 전에 Native code가 무엇인지 부터 알아야 할 것 같다.

: 일단 native 코드는 컴퓨터의 기계어로 동작하는, 즉 OS에 의해 직접적으로 컴파일 되는 코드를 말한다. 이를 구동시키기 위해서는 인터프리터라고 불리우는 다른 프로그램이 반드시 요구된다.

 

그리고 소스코드를 살펴보면,..

É=-~-~[],ó=-~É,Ë=É<<É,þ=Ë+~[];Ì=(ó-ó)[Û=(''+{})[É+ó]+(''+{})[ó-É]+([].ó+'')[ó-É]+(!!''+'')[ó]+({}+'')[ó+ó]+(!''+'')[ó-É]+(!''+'')[É]+(''+{})[É+ó]+({}+'')[ó+ó]+(''+{})[ó-É]+(!''+'')[ó-É]][Û];Ì(Ì((!''+'')[ó-É]+(!''+'')[ó]+(!''+'')[ó-ó]+(!''+'')[É]+((!''+''))[ó-É]+([].$+'')[ó-É]+'\''+''+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(þ)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(ó-ó)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(É+ó)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(ó-ó)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+ó)+(ó-ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(ó-ó)+(É+ó)+'\\'+(ó-É)+(É+ó)+(ó+ó)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(þ)+(É)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(É+ó)+(É+ó)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(É+É)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(ó+ó)+(ó-ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(ó+ó)+(ó)+'\\'+(ó-É)+(ó+ó)+(ó)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(þ)+(ó)+'\\'+(ó-É)+(É+ó)+(ó-É)+'\\'+(ó-É)+(É+É)+(ó+ó)+'\\'+(É+ó)+(ó-ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(þ)+(É+ó)+'\\'+(þ)+(É+ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó+ó)+(ó-É)+'\\'+(ó+ó)+(É)+'\\'+(ó+ó)+(ó)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(ó-É)+(þ)+(ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+ó)+(ó-ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(É+É)+(É)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(ó+ó)+(ó+ó)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(þ)+(ó)+'\\'+(ó-É)+(þ)+(É+ó)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(ó+ó)+(ó)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(þ)+(ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+ó)+(ó-ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(É+É)+(ó+ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(É+ó)+(ó-É)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(É+ó)+(ó+ó)+'\\'+(É+ó)+(ó+ó)+'\\'+(É+ó)+(ó+ó)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(þ)+(ó)+'\\'+(ó-É)+(þ)+(É+ó)+'\'')())()

 

.. 일단 알아들을 수도 없고, 무슨 언어인지도 감이 안온다..

 그렇지만 일단 ()가 뒤에 있고, prompt로 입력을 받는 것으로 보아서 함수를 선언한 것으로 보인다.

 뒤에 ()를 제외하고 콘솔창에 넣어보자.

 

->pw 를 얻을 수 있다.

 

  +) 그렇지만 이게 대체 어떻게 암호화된 언어인가 궁금해서 구글링을 해보았더니... 일종의 타입 캐스팅이라고 한다.

http://www.hakawati.co.kr/364

 

자바스크립트 언어적 특징과 난독화

1. 개요 JavaScript Garden은 자바스크립트 언어의 핵심적인 내용을 모아 놓은 웹 문서이다. 이 문서는 자바스크립트 언어 자체를 설명하지 않고, 이 언어를 익히고, 사용하는데 있어 자주 겪는 실수, 미묘한 버..

www.hakawati.co.kr

 

 

7. JavaScript - Obfuscation 3(15pt)

  일단 소스코드를 열어보면 굉장히 복잡하게 또 암호화가 되어있다.

일단 pass 문자열은 faux password haha라는 의미이다. 따라서 pass_enc값"\x35\x35\2x..." 를 함수에 넣었을때 tab또는 tab2 변수의 값이 패스워드 일것이라고 짐작하였다. 

 

function dechiffre(pass_enc){ 
     
   var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65"; 
   var tab  = pass_enc.split(','); 
   var tab2 = pass.split(',');
   var i,j,k,l=0,m,n,o,p = "";
 i = 0;
 j = tab.length; 
 k = j + (l) + (n=0);
 n = tab2.length;                   
    for(i = (o=0); i < (k = j = n); i++ )
{o = tab[i-l];
p += String.fromCharCode((o = tab2[i])); 
           
                     if(i == 5)break;} 
                   
     for(i = (o=0); i < (k = j = n); i++ ){  o = tab[i-l];  }
                                
if(i > 5 && i < k-1){
p += String.fromCharCode((o = tab2[i]));} 
        
p += String.fromCharCode(tab2[17]); 
      pass = p;return tab;
    }
var h=dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30");
console.log(h);

=> 이때 tab2의 값을 pass문자열과 동일했고, tab이 패스워드임을 알수 있다.

'Wargame > Root-Me' 카테고리의 다른 글

Web-Server) LFI -(1),(2)  (0) 2020.02.14
Web-Server) Improper Redirect~ CRLF  (0) 2020.02.13
Web-Server) improper redirect  (0) 2020.01.16
Web-Server) Backup file  (0) 2020.01.16
Web-Server) HTTP header  (0) 2020.01.16