域内攻击手法——AS-REP Roasting攻击和Kerberoasting攻击

一、AS-REP Roasting攻击

1、AS-REP Roasting攻击原理

AS-REP Roasting是一种对用户账户进行离线爆破的攻击方式。但是该攻击方式使用上比较受限,因为其需要用户账户设置不要求Kerberos 预身份验证选项,而该选项默认是没有勾选的。Kerberos 预身份验证发生在 Kerberos 身份验证的第一阶段(AS_REQ&AS REP),它的主要作用是防止密码离线爆破。默认情况下,预身份验证是开启的,KDC 会记录密码错误次数,防止在线爆破。
当关闭了预身份验证后,攻击者可以使用指定用户向域控制器的 Kerberos 88 端口请求票据,此时域控不会进行任何验证就将 TGT 和该用户 Hash 加密的 Login Session Key 返回。因此,攻击者就可以对获取到的用户 Hash 加密的 Login Session Key 进行离线破解,如果字典够强大,则可能破解得到该指定用户的明文密码。

2、AS-REP Roasting攻击前提

  • 域用户勾选“不要求Kerberos预身份验证”在这里插入图片描述

  • 需要一台可与KDC 88端口进行通信的主机

3、AS-REP Roasting攻击抓包分析

我们对域内用户 Mary 勾选“不要求 Kerberos 预身份验证”选项和不勾选“不要求 Kerberos 预身份验证”选项两种情况下,使用工具向 AS 发起 AS-REQ,在这个过程中使用 WireShark 抓包分析

  • 勾选“不要求 Kerberos 预身份验证”选项

    在这里插入图片描述第一个包是以用户 Mary 身份发起一个 AS-REQ 请求。由于设置了“不要求 Kerberos 预身份验证”属性,因此是不需要预认证的。可以看到在 AS-REQ 包中可以看到是没有 pA-ENC-TIMESTAMP 字段的。

    在这里插入图片描述

    第二个包是 KDC 的 AS-REP 包,该包中返回了 TGT 以及用户 Mary Hash 加密的 Login Session Key。攻击者就是取得这串加密字符后进行本地离线爆破。

    在这里插入图片描述

  • 不勾选“不要求Kerberos预身份验证”选项
    在这里插入图片描述当取消了“不要求Kerberos预身份验证”属性,是需要预认证的。可以看到在AS-REQ包中可以看到pA-ENC-TIMESTAMP 字段。该字段是用用户Hash加密时间戳。

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

4、AS-REP Roasting攻击过程

AS-REP Roasting 攻击过程主要有两步:

  • 第一步,获取 AS-REP 响应包中用户 Hash 加密的 Login Session Key
  • 第二步,对上一步获得的 Hash 进行解密。对于获取加密的 Login Session Key 的方式又分为域内机器和非域机器两种获取方式

1)获取AS-REP响应包中用户Hash加密的Login Session Key

域内机器的获取方式
  • Rubeus
    Rubesu 是由国外安全研究院 harmj0y 用 C# 编写的针对 Kerberos 协议进行攻击的工具,可以发起Kerberos请求,并将请求票据导入内存中,Rebeus 提供了大量的用于 Kerberos 攻击的功能,比如 TGT 请求/ST请求/AS-REP Roasting攻击/Kerberoasting攻击/委派攻击/黄金票据/白银票据等。
    如果当前主机在域内,可以通过执行如下命令运行 Rubeus,该工具会自动搜索域内勾选了“不要求 Kerberos 预身份验证”选项的用户,并以该用户身份发起 AS-REQ,由于不需要预身份验证,所以 KDC会直接返回 AS-REP包。然后该工具会将 AS-REP 包中返回的用户 Hash 加密的 Login Session Key 以 John 工具能破解的格式保存在指定文件中。

    Rubeus.exe asreproast /format:john /outfile:hash.txt
    

    运行 Rubeus 工具获取域内设置了“不要求Kerberos预身份验证”的用户,搜到了用户 mary,然后以用户 mary 身份发送 AS-REQ 包,并将 KD C返回的用户 Has h加密的 Login Session Key 保存为 hash.txt 文件。

    在这里插入图片描述

  • ASREPRoast.ps1脚本
    如果当前主机在域内,则可通过执行如下命令导入 ASREPRoast.ps1 脚本并进行操作。该脚本会自动搜索域内设置了不要求 Kerberos 预身份验证的域用户,并以该用户身份发送 AS-REQ,由于不需要预身份验证,所以域控会直接返回 AS-REP 包。然后该工具会输出不要求 Kerberos 预身份验证的用户名、DN 以及用户 Hash 加密的 Login Session Key。最后使用 select 语句过滤出 Hash。

    Import-Module .\ASREPRoast.ps1
    Invoke-ASREPRoast | select -ExpandProperty Hash
    

    在这里插入图片描述

非域机器的获取方式
  • 对于非域内的机器,就无法通过上面两种方式来获取 Hash 了。要想获取域内勾选了“不需要 Kerberos 预身份验证”选项的账户、可以使用 Adfind 执行如下命令来进行过滤查询,前提是拥有一个有效的域账户和密码。查询出符合条件的域账户之后,再使用 Impacket 下的 GetNPUsers.py 脚本获取针对指定用户的用户 Hash 加密的 Login Session Key。

    AdFind.exe -h <域控IP>:389 -u <域用户> -up <密码> -f "useraccountcontrol:1.2.840.113556.1.4.803:=4194304" -dn
    

    如图使用 Adfind 过滤域内勾选了“不需要 Kerberos 预身份验证”的账号,过滤出了用户 Mary。
    在这里插入图片描述然后使用 Impacket 下的 GetNPUsers.py 脚本把上一步过滤出来的域账户写入 user.txt 文件中。运行如下命令获取针对指定用户的用户 Hash 加密的 Login Session Key,该格式可以被 John 直接爆破。

    python GetNPusers.py -dc-ip <域控IP> -usersfile user.txt -format john <域名>/
    

    在这里插入图片描述

2)对上一步获得的Hash进行解密

  • john
    使用 john 对上一步获取到的 Hash 进行爆破,命令如下,但是爆破成功与否与字典强度有关。

    john --wordlist=<密码字典路径> <hash值>
    

    在这里插入图片描述

  • hashcat
    而如果想用 hashcat 进行爆破,由于第一步获取的 Hash 格式并不能直接被 hasheat 所爆破,因此要手动添加 $23 到如图所示位置。
    在这里插入图片描述然后使用如下命令进行爆破,爆破出明文密码为admin!@#45

    hashcat –m 18200 <hash值> <密码字典路径> -–force
    

    在这里插入图片描述

    hashcat命令格式:https://hashcat.net/wiki/doku.php?id=example_hashes

二、Kerberoasting攻击

1、Kerberoasting攻击原理

Kerberoasting 是域渗透中经常使用的一项技术,是 Tim Medin 在 DerbyCon 2014 上发布的一种域口令攻击方法,Tim Medin 同时发布了配套的攻击工具 kerberoast。此后,不少研究人员对 Kerberoasting 进行了改进和扩展,在 GitHub 上开发发布了大量工具,使得 Kerberoasting 逐渐发展成为域攻击的常用方法之一。
Kerberoasting 攻击是在 TGS_REP 的过程中用户将会收到由目标服务实例的 NTLM hash 加密生成的 ST(service ticket),如果获得这个 ST 票据,由于该 ST 是用服务 Hash 进行加密的,因此客户端在拿到该 ST 后可以用于本地离线爆破。如果攻击者的密码字典足够强大,则很有可能爆破出 SPN 链接用户的明文密码。如果该服务在域内被配置为高权限运行,那么攻击者可能接管整个域。
整个过程的核心点在于,攻击者和 KDC 协商ST加密的时候,协商的是使用 RC4_HMAC_MDS 加密算法。而该加密算法较容易被破解,因此攻击者能在本地进行离线爆破。

2、服务主体名称SPN

1)简介

SPN(ServicePrincipal Names,服务主体名称)是服务实例的唯一标识符,当域内存在大量的服务时,域控为了方便管理会对服务进行标识,那么域控标识所使用的方法就是SPN。Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联。如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。

2)SPN类型分类

SPN可以分为以下两种类型:

  • 注册在活动目录的“机器账户computer”下
    在这里插入图片描述
  • 注册在活动目录的“域账号Users”下
    在这里插入图片描述

注册在活动目录的机器账户(CN=Computer)下。当某一个服务的权限为 Local System 或者 Network Service 时,SPN 会注册在机器账户下,同时所加入域的每台机器都会自动注册两个SPN:“Host/主机名”和“Host/主机名.DC名”。
注册在活动目录的域账号(CN=Users)下。当某一个服务的权限为一个域用户时,SPN会注册在活动目录的域账号下。(默认只有机器用户或者域管理员用户才有权限去注册SPN(将服务注册在域用户的权限))

3)SPN的格式定义

如下为 SPN 格式定义,其中<serviceclass> 服务类和<host>主机名为必要参数,<port><server name>为可选参数。

# SPN的格式
<serviceclass>/<host>:<port>/<service name>
  • <service class>:服务的名称,例如:LDAP、MSsql、SMTP等。
  • <host>:服务所在主机名,host有两种形式,可以是FQDN(webadmin.god.org)和NetBIOS(webadmin)这两种形式任意一种。
  • <port>:服务的端口号,如果使用的是默认端口可以省略。
  • <server name>:服务的专有名称,可以省略

4)SPN服务注册

Kerberos 协议关于 Client 请求 Server 的某种服务,假设我们需要请求某个 Server 的 Http 服务并且我们还想经过 Kerberos 协议的认证,那么就需要给 Server 注册一个 SPN,给 Server 注册 SPN 之后 Kerberos 就会将服务器实例和服务登录账号关联,在 SPN 服务注册方面我们使用本地 Windows 自带的一个二进制的文件— Set SPN 进行注册。

setspn -U -S MySQL/webadmin.god.org:3306/ webadmin      // 在主机webadmin上为webadmin用户注册SPN服务
setspn -L webadmin                                  	// 列出在webadmin帐户中注册的SPN
setspn -q */*                                   		// 查询当前域内所有的SPN

常见的SPN实例名称:

常见服务SPN服务实例名称
SQL ServerMSSQLSvc/adsmsSQLAP01.adsecurity.org:1433
Hyper-V HostMicrosoft Virtual Console Service/adsmsHV01.adsecurity.org
ExchangeExchangeMDB/adsmsEXCAS01.adsecurity.org
VMWareVCenterSTS/adsmsVC01.adsecurity.org
RDPTERMSERV/adsmsEXCAS01.adsecurity.org
WSManWSMAN/adsmsEXCAS01.adsecurity.org

以普通域用户注册 SPN 服务主体时,需要域管理员的权限

3、Kerberoasting攻击抓包分析

我们通过使用 Impacket 执行请求注册于用户 Mary 下的 SPN 的服务票据。在此过程中使用 Wireshark 进行抓包分析。

python GetUserSPNs.py -request -dc-ip 192.168.3.21 god.org/mary:admin!@#45 -outputfile hash.txt -request-user webadmin

在这里插入图片描述第1个 AS-REQ 包是用户 Mary 向 KDC 的 AS 请求TGT。

在这里插入图片描述第2个 AS-REP 包是KDC返回的TGT,正常情况下,TGT的加密方式为AES256。
第3个 TGS-REQ 包用上一步得到的 TGT 向 KDC 的 TGS 服务请求针对用户webadmin 链接的SPN的服务票据。可以看到,请求协商的加密类型有HMAC-MDS,DES 和DES3。

在这里插入图片描述第4个 TGS-REP 包是 KDC 的 TGS 服务返回的由指定 SPN 链接的用户的密码 Hash 加密的服务票据。可以看到,加密类型为 HMAC_MDS,而正常 TGS-REP 包的 ST 的默认加密类型为 AES256。

在这里插入图片描述

4、Kerberoasting攻击攻击过程

1)攻击过程

  • 攻击者提供一个正常的域用户密码对域进行身份认证,KDC 在验证账户和密码的有效性后,会返回一个 TGT。该 TGT 用于以后的 ST 请求。
  • 攻击者使用获得的 TGT 请求针对指定 SPN 的 ST 。在请求服务票据的 TGS-REQ 过程中,攻击者可以指定其支持的 Kerberos 加密类型为 RC4_HMAC_MD5(ARCFOUR-HMAC-MDS),因为 RC4_HMAC_MD5 加密算法相比于其他加密算法更容易被破解。
  • 如果攻击者的 TGT 是有效的,不管提供的域账户有无访问该指定 SPN 服务的权限,KDC 都会查找哪个账户在 ServicedPrincipalName 属性中注册了所请求的 SPN,然后用该用户的 Hash 以 RC4_HMAC_MDS 加密类型加密 ST 并在 TGS-REP 包中发送给攻击者(这一步不管用户有没有访问服务的权限,只要 TGT 正确,就都会返回 ST 服务票据,这也是 Kerberoasting 能利用的原因。也就是说,任何一个用户,只要 hash 正确,就可以请求域内任何一个服务的 ST 票据)
  • 攻击者从 TGS-REP 包中提取加密的 ST。由于该 ST 是用链接到请求的 SPN 的账户 Hash 加密的,因此攻击者可以本地离线破解。如果攻击者的字典足够强大,则可以爆破出该 SPN 所链接账户的明文密码。

注意:Kerberoasting 攻击一般只针对注册在用户下的 SPN,因为机器账户的密码是随机生成的128位字符,是不可能爆破出来的。

2)实战思路

  • 查询域内注册于域用户下的 SPN
  • 请求指定 SPN 的 ST
  • 导出请求的 ST
  • 对该导出的 ST 进行离线爆破

5、SPN的发现

  • setspn命令
    如果当前主机在域内,并且使用域用户进行登录,如果没有登录就提权到 system 用户,可以使用过以下命令进行查询。

    setspn -q */*             	   // 查询当前域内所有的SPN
    setspn -T examples.com -q */*  // 查看指定域内所有的SPN,如果指定域不存在,默认切换查找本域的SPN或本域重复的SPN
    
  • RiskySPN
    RiskySPN 是一个 PowerShell 脚本的集合,专注于检测与 SPN 相关的账户是否滥用,该脚本可以帮助我们自动识别弱密码服务票据,根据用户账户和密码过期时间来查找最容易包含弱密码的票据。执行如下命令,该脚本会自动查找并过滤出(自动去除注册于krbtgt下的kadmin/changepw)当前域内注册于域用户下的可能包含弱密码的 SPN 的详细信息。

    Import-Module .\Find-PotentiallyCrackableAccounts.ps1
    Find-PotentiallyCrackableAccounts -FullDate
    

    项目地址:https://github.com/cyberark/RiskySPN

  • GetUserSPNs
    GetUserSPNs 是 Kerberoast 工具集中查询注册于域内用户下的 SPN 的脚本,该脚本会查询域内所有注册于用户下的 SPN,包括注册于 krbtgt 下的 kadmin/changepw。

    Import-Module .\GetUserSPNs.ps1
    

    在这里插入图片描述
    服务主体名称(SPN)也可以从未加入域的系统中发现,impacket 工具包下的 python 版 GetUserSPNs 可以为我们做到这点,但是,无法使用基于 token 的身份验证,因此与 Active Directory 进行通信需要获取有效的域凭证

    在这里插入图片描述

  • PowerView.ps1
    PowerView.ps1 是 PowerSpolit 中 Recon 目录下的一个 PowerShell 脚本,该脚本可用于查询过滤出域用户下注册了 SPN 的用户,包括 krbtgt 用户,并返回用户的详细信息。

    Import-Module .\PowerView.ps1
    Get-NetUser –SPN
    

    在这里插入图片描述

6、请求SPN服务票据

当过滤出注册于用户下的 SPN 之后,我们就需要请求这些 SPN 的服务票据了。

  • impacket - GetUserSPNs
    Impacket 中的 GetUserSPNs.py 脚本可以请求注册于用户下的所有 SPN 的服务票据,也可以请求注册于指定用户下的 SPN 的服务票据。该脚本使用命令如下:

    # 请求注册于用户下的所有SPN的服务票据,并以 hashcat 能破解的格式保存为指定文件
    python GetUserSPNs.py -request -dc-ip <域控IP> <域名>/<域用户账号>:<密码> -outputfile <文件名>
    # 请求注册于指定用户下的SPN的服务票据
    python GetUserSPNs.py -request -dc-ip <域控IP> <域名>/<域用户账号>:<密码> -outputfile <文件名> -request-user <指定域用户>
    

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

  • Rubeus
    Rubeus 中的 Kerberoast 支持对所有用户或特定用户执行 Kerberoasting 操作,它的原理在于先用 LDAP 查询域内所有注册在域用户下的 SPN(除了kadmin/changepw),再通过发送 TGS 包,直接输出能使用 John 或 hashcat 爆破的 Hash。该工具使用命令如下:

    # 请求注册于用户下的所有SPN的服务票据,并以hashcat能破解的格式保存到指定文件
    Rubeus.exe kerberoast /format:john /outfile:<文件名>
    # 请求注册于用户下的指定SPN的服务票据,并以hashcat能破解的格式保存到指定文件
    Rubeus.exe kerberoast /spn:<serviceclass>/<host>:<port>/<service name> /format:john outfile:<文件名>
    

    在这里插入图片描述

  • mimikatz
    使用 mimikatz 请求指定 SPN 的服务票据,请求的服务票据将保存在内存中,然后从内存中导出票据

    # 申请指定的SPN服务票据
    kerberos::ask /target:<serviceclass>/<host>:<port>/<service name>
    kerberos::ask /target:MsSQL/dbadmin.god.org
    # 查看票据
    kerberos::list
    # 导出所有票据
    kerberos::list /export 
    

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

7、离线破解用户服务票据HASH

通过前面几步取得了 .kirbi 票据文件或 hashcat、John 能直接破解的文件,接下来就需要本地离线破解服务票据了。

  • tgsrepcrack脚本
    kerberoast 是用于攻击 Kerberos 实现的一些工具的集合。该工具中的 tgsrepcrack.py 脚本可以对 mimikatz 导出的 kirbi 格式的票据进行爆破。

    python2 tgsrepcrack.py <密码字典> <票据>
    
  • hashcat
    针对 Impacket 和 Rebeus 请求的票据格式,可以使用 hasheat 执行如下命令来进行爆破。

    hashcat –m 13100 <hash值> <密码字典路径> -–force
    

    在这里插入图片描述

8、Kerberoasting 攻击防御

  • 确保服务账户和密码为强密码,具有随机性并定期修改。
  • Kerberoasting能成功的最大因素就是KDC返回的ST是用RC4_HMAC_MD5加密算法加密的,攻击者可以比较简单地进行爆破。如果配置强制使用AES256-HMAC方式对Kerberos 票据进行加密,那么即使攻击者获取了 ST,也无法将其破解。但这种加密方式存在兼容性问题。
  • 许多服务账户在域中被分配了过高的权限,从而导致攻击者在破解出该服务账户的密码后,能迅速进行域内权限提升。因此,应该对域内的服务账户权限进行限制,采取最小化权限原则。
  • 防守方在检测Kerberoasting攻击时,可以进行日志审计,重点关注事件ID为4769(请求Kerberos服务票据操作)的日志。如果有过多的4769 日志,可以对事件ID为4769的日志进行筛选,筛选出票据加密类型为0x17(RC4-HMAC)的日志,如图所示。
    在这里插入图片描述
    参考书籍:
    《域渗透攻防指南》(谢兆国 张秋圆)

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

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

相关文章

20240727 每日AI必读资讯

&#x1f310;OpenAI向Google宣战&#xff0c;重磅推出AI搜索引擎SearchGPT &#xff01; - 将 AI 与实时网络信息结合 提供生成式UI结果 - SearchGPT 结合网络最新信息可以直接回答问题&#xff0c;同时注明相关来源链接。 - 还可以像与人对话一样提出后续问题&#xff0c;…

进程概念(三)----- fork 初识

目录 前言1. pid && ppid2. forka. 为什么 fork 要给子进程返回 0&#xff0c; 给父进程返回子进程的 pid &#xff1f;b. 一个函数是如何做到两次的&#xff1f;c. fork 函数在干什么&#xff1f;d. 一个变量怎么做到拥有不同的内容的&#xff1f;e. 拓展&#xff1a;…

小红书电商首提“生活方式电商”定义,个性化需求也能做成好生意

近日&#xff0c;小红书发布COO柯南与经济学者薛兆丰的对谈视频。对谈中柯南首次对外定义&#xff0c;小红书电商是“生活方式电商”。 柯南表示&#xff0c;生活方式电商是让用户在小红书买到的&#xff0c;不仅是好产品&#xff0c;也是一种向往的生活。 随着生活方式的多元…

【初阶数据结构】9.二叉树(4)

文章目录 5.二叉树算法题5.1 单值二叉树5.2 相同的树5.3 另一棵树的子树5.4 二叉树遍历5.5 二叉树的构建及遍历 6.二叉树选择题 5.二叉树算法题 5.1 单值二叉树 点击链接做题 代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

PID 控制实验 - 整定实验

Arduino PID Arduino-PID-LibraryArduino-PID-AutoTune-Library PID控制实验 – 制作测试台 PID Control Experiment – Making the Testing Rig PID (Proportional, Integral, Derivative) control is a classic control algorithm that I have used for a few projects,…

Java面试还看传统八股文?快来看看这个场景题合集吧【附PDF】

以下就是这份面试场景文档↓ 这里有什么&#xff1f; ↓↓ 1.针对 2024 年面试行情的变化设计的面试场景题以及回答思路 2. 如何快速通过面试的详细攻略 3. 简历优化技巧 1.知己知彼才能百战百胜&#xff0c;如何做好面试前的准备工作 场景题答案以及更多场景题八股文一线大…

java学习--枚举

问题引入&#xff1a; 当需要解决一个季节类的问题&#xff0c;我们使用学到的类与对象&#xff0c;创建一个季节的类然后添加构造器在进行分装就可以实现&#xff0c;但问题也随之而来&#xff0c;这样不仅可以有正常的四季还可以添加其他不存在的四季以及可以更改四季的属性…

【Leetcode】十九、贪心算法:玩筹码 + 跳跃游戏

文章目录 1、贪心算法2、leetcode1217&#xff1a;玩筹码3、leetcode55&#xff1a;跳跃游戏 1、贪心算法 关于贪心算法中&#xff0c;“每一步都是最好的选择"的理解”。以零钱兑换为例&#xff0c;现在有1分、2分、5分的硬币&#xff0c;现在要凑出11分&#xff0c;且要…

masscan 端口扫描——(Golang 简单使用总结)

1. 前言 最近要做一个扫描 ip 端口的功能 扫描的工具有很多&#xff0c;但是如何做到短时间扫描大量的 ip 是个相对困难的事情。 市场上比较出名的工具有 masscan和nmap masscan 支持异步扫描&#xff0c;对多线程的利用很好&#xff0c;同时仅仅支持 syn 半开扫描&#xff…

采用先进的人工智能视觉分析技术,能够精确识别和分析,提供科学、精准的数据支持的明厨亮灶开源了。

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…

SEO与数据中心代理IP的结合能带来哪些便利?

本文将探讨将SEO与数据中心代理IP结合所带来的好处&#xff0c;以及如何利用这种组合来提升网站在搜索引擎中的排名和可见性。 1. 数据中心代理IP的作用和优势 数据中心代理IP指的是由数据中心提供的IP地址&#xff0c;用于隐藏真实服务器的位置和身份。与其他类型的代理IP相…

【Java基础系列】RBAC:介绍与原理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C++】:红黑树的应用 --- 封装map和set

点击跳转至文章&#xff1a;【C】&#xff1a;红黑树深度剖析 — 手撕红黑树&#xff01; 目录 前言一&#xff0c;红黑树的改造1. 红黑树的主体框架2. 对红黑树节点结构的改造3. 红黑树的迭代器3.1 迭代器类3.2 Begin() 和 End() 四&#xff0c;红黑树相关接口的改造4.1 Find…

Java OpenCV 图像处理41 图形图像 图片缩放

Java OpenCV 图像处理41 图形图像 图片缩放 1 图片缩放2 仿射变换3 透视变换 1 图片缩放 Java OpenCV 代码 OpenCV 提供的主要图像缩放函数&#xff0c;可以指定缩放比例或者目标尺寸。 Imgproc.resize(src, dst, new Size(width, height), fx, fy, interpolation);Imgproc.r…

科学又省力 宠物浮毛怎么去掉便捷高效?除毛秘籍养宠空气净化器

上次和朋友逛完街去她家&#xff0c;她家的猫哈基米一开门就飞奔过来&#xff0c;朋友直接抱起它狂亲。结果&#xff0c;猫毛和汗水粘得到处都是&#xff0c;手臂上、脸上都是&#xff0c;看得我这鼻炎星人直起鸡皮疙瘩。很多养宠物的朋友都说&#xff0c;天天给猫狗梳毛&#…

ProcessExplorer免费且功能强大的进程管理软件

ProcessExplorer是一款功能强大的进程管理软件&#xff0c;由Sysinternals开发&#xff0c;并被微软收购。它不仅可以管理和监控系统中的进程&#xff0c;还提供了许多实用的功能&#xff0c;如CPU和内存使用情况的曲线图表、DLL和句柄查看、进程冻结等。 安装ProcessExplorer…

微服务安全——OAuth2.1详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

Axious的请求与响应

Axious的请求与响应 1.什么是Axious Axious是一个开源的可以用在浏览器和Node.js的异步通信框架&#xff0c;它的主要作用就是实现AJAX异步通信&#xff0c;其功能特点如下&#xff1a; 从浏览器中创建XMLHttpRequests ~从node.js创建Http请求 支持PromiseAPI 拦截请求和…

电信应用的振荡器基础知识

数字通信的最基本组成部分是同步。同步有很多方面。在数字传输中&#xff0c;同步是通过管理跨节点的平均传输和接收速率来管理无错误的传输和接收。在蜂窝通信中&#xff0c;同步使用户设备在移动中以及从一个小区移动到另一个小区时能够可靠地工作。在 5G 等先进网络中&#…

为什么w 和 b成同比例变化对超平面没有影响

文章目录 解释可视化证明数乘角度进行解释可视化代码领取 解释 在机器学习中&#xff0c;特别是支持向量机&#xff08;SVM&#xff09;和线性回归等模型中&#xff0c;参数 w w w和 b b b分别代表权重向量和偏置项。当说 w w w和 b b b成规模变化对超平面没有影响时&#xff…