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 를 얻을 수 있다.
+) 그렇지만 이게 대체 어떻게 암호화된 언어인가 궁금해서 구글링을 해보았더니... 일종의 타입 캐스팅이라고 한다.
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 |