• 如何在Vim编辑器中剪切、复制和粘贴

    剪切、复制和粘贴文本是文本编辑中最基本的任务之一,我们都知道 Vim 有不同的处理方式。 这意味着,在你掌握它之前,你会害怕它,一旦你掌握了它,它就只是一个兔子洞。 虽然我将详细介绍剪切、复制和粘贴,但这里是本教程的基本摘要,以帮助你开始使用: 按键 描述 yiw 复制当前单词。 yy 复制整行。 diw 剪切当前单词。 dd 剪掉整行。 p 粘贴文本。 别担心,Vim 为你提供的选项比我上面提到的要多得多。 在本教程中,我将引导你完成以下内容: 如何在 Vim 中复制文本 如何在 Vim 中剪切文本 如何在 Vim 中粘贴文本 如何使用可视模式在 Vim 中剪切和复制文本 那么让我们从第一个开始。 如何在 Vim 编辑器中复制文本 虽然我们使用术语“复制”,但 Vim 有一个不同的术语,称为 “扽出yank”,因此从现在开始,我将使用“扽出”而不是“复制”。 正如我之前提到的,你可以使用多种方法在 Vim 中扽出文本,以下是一些有用的方法: 命令 描述 nyy或nY 扽出(复制)当前行和接下来的 n-1行。例如,3yy复制当前行及其下面的两行。 yaw 扽出(复制)光标所在的当前单词。 yy或Y 扽出(复制)整个当前行。 y$ 扽出(复制)从光标到行尾的文本。 y^或y0 扽出(复制)从光标到行首的文本。 要在 Vim 中扽出,请执行以下 3 个简单步骤: 按 Esc键切换到正常模式 移动到要复制的行或单词 按上表中的相关命令,你的文本将被复制 想学习交互式复制行的方式吗? 跳到本教程的最后一部分。 如何在 Vim 编辑器中剪切文本 在 Vim 中,你没有任何删除文本的选项。取而代之的是剪切文本,因此删除和剪切文本与 Vim 中的操作类似。 要在 Vim 中剪切文本,请按 d命令。但你永远不会在没有任何选项的情况下使用d命令。你总是会添加一些东西来做更多操作。 因此,你可以使用以下一些实用方法使用 d命令剪切文本: 命令 描述 dd 剪切整个当前行。 d$ 将文本从光标剪切到行尾。 d^或d0 将文本从光标剪切到行首。 ndd或dN 剪切当前行和接下来的 n-1行。例如,3dd剪切当前行及其下面的两行。 daw 剪切光标所在的当前单词。 假设我想从文件中剪切前 4 行,然后我需要使用 4dd,我是这样做的: 如何在 Vim 编辑器中粘贴文本 在 Vim 中复制或剪切文本后,只需按 p键即可粘贴它。 你可以多次按 p键多次粘贴文本,也可以使用np,其中n是要粘贴文本的次数。 例如,在这里,我粘贴了之前复制了三遍的行: 就是这么简单! 如何通过选择文本来剪切和复制文本 如果你使用过 GUI 文本编辑器,那么你肯定习惯于通过选择文本来复制和剪切文本。 让我们从如何通过在 Vim 中选择文本来复制开始。 通过选择文本复制 要在可视模式下复制文本,请执行以下 3 个简单步骤: 移动到要开始选择的地方 按 Ctrl + v启用可视模式 使用箭头键进行选择 按 y键复制所选文本 例如,在这里,我使用可视模式复制了 4 行: 如果你注意到,当我按下 y键,它就会显示有多少行被扽出(复制)。就我而言,有 4 行被复制。 在 Vim 中选择文本来剪切文本 要在 Vim 中以可视模式剪切文本,你所要做的就是遵循 4 个简单步骤: 移动到要剪切的位置 按 Ctrl + v切换到可视模式 使用箭头键选择要剪切的行 按 d键剪切选定的行 假设我想剪掉 4 行,那么我会这样做: 挺容易。是吧? ...

    2023-11-07 186
  • 主从延时的原因及解决方案

    主从延迟情况 我们先看看,哪些情况会导致主从延时: 从库机器性能:从库机器比主库的机器性能差,只需选择主从库一样规格的机器就好。 从库压力大:可以搞了一主多从的架构,还可以把 binlog 接入到 Hadoop 这类系统,让它们提供查询的能力。 从库过多:要避免复制的从节点数量过多,从库数据一般以3-5个为宜。 大事务:如果一个事务执行就要 10 分钟,那么主库执行完后,给到从库执行,最后这个事务可能就会导致从库延迟 10 分钟啦。日常开发中,不要一次性 delete 太多 SQL,需要分批进行,另外大表的 DDL 语句,也会导致大事务。 网络延迟:优化网络,比如带宽 20M 升级到 100M。 MySQL 版本低:低版本的 MySQL 只支持单线程复制,如果主库并发高,来不及传送到从库,就会导致延迟,可以换用更高版本的 MySQL,支持多线程复制。 主从延时解决方案 面试时,有些同学能回答出使用缓存、查询主库、提升机器配置等,仅仅这些么? 最容易想到的方法,缩短主从同步时间: 提升从库机器配置,可以和主库一样,甚至更好; 避免大事务; 搞多个从库,即一主多从,分担从库查询压力; 优化网络宽带; 选择高版本 MySQL,支持主库 binlog 多线程复制。 也可以从业务场景考虑: 使用缓存:我们在同步写数据库的同时,也把数据写到缓存,查询数据时,会先查询缓存,不过这种情况会带来 MySQL 和 Redis 数据一致性问题。 查询主库:直接查询主库,这种情况会给主库太大压力,核心场景可以使用,比如订单支付。 如果能把上面基本回答出来,就已经非常厉害了,还有么? 其实还可以在 MySQL 架构上来考虑。 主库对数据安全性较高,设置配置如下: sync_binlog = 1 innodb_flush_log_at_trx_commit = 1 而 slave 不需要这么高的数据安全,完全可以将 sync_binlog 设置为 0,或者关闭 binlog,innodb_flushlog 也可以设置为 0,来提高 sql 的执行效率。 架构方案:使用多台 slave 来分摊读请求,再从这些 slave 中取一台专用的服务器,只作为备份用,不进行其他任何操作,比如设置 sync_binlog 为0,或者关闭 binglog 等,提升从库查询性能。 ...

    2023-11-03 169
  • ZK的watch机制实现原理

    newZooKeeper(StringconnectString,intsessionTimeout,Watcherwatcher)这个Watcher将作为整个ZooKeeper会话期间的上下文,一直被保存在客户端ZKWatchManager的defaultWatcher 也可以动态添加watcher:getData(),exists,getChildren。 分布式环境下的观察者模式:通过客服端和服务端分别创建有观察者的信息列表。 客户端调用相应接口时,首先将对应的Watch事件放到本地的ZKWatchManager中进行管理。 服务端在接收到客户端的请求后根据请求类型判断是否含有Watch事件,并将对应事件放到WatchManager中进行管理。 在事件触发的时候服务端通过节点的路径信息查询相应的Watch事件通知给客户端,客户端在接收到通知后,首先查询本地的ZKWatchManager获得对应的Watch信息处理回调操作。 这种设计不但实现了一个分布式环境下的观察者模式,而且通过将客户端和服务端各自处理Watch事件所需要的额外信息分别保存在两端,减少彼此通信的内容,大大提升了服务的处理性能 客户端实现过程 标记该会话是一个带有Watch事件的请求 通过DataWatchRegistration类来保存watcher事件和节点的对应关系 客户端向服务器发送请求,将请求封装成一个Packet对象,并添加到一个等待发送队列outgoingQueue中调用负责处理队列outgoingQueue的SendThread线程类中的readResponse方法接收服务端的回调,并在最后执行finishPacket()方法将Watch注册到ZKWatchManager,sendThread通过发送path路径和watcher为true,到server注册watch事件 ZKWatchManager保存了Map<String,Set> dataWatchers、Map<String,Set> existsWatchers、Map<String,Set> childrenWatchers三个集合,客户端会在dataWatchers中会添加一个key为path路径的本地事件 服务端实现过程 解析收到的请求是否带有Watch注册事件,通过FinalRequestProcessor类中的processRequest函数实现的。当getDataRequest.getWatch()值为True时,表明该请求需要进行Watch监控注册。 将对应的Watch事件存储到WatchManager,通过zks.getZKDatabase().getData函数实现, WatchManger该类中有HashMap<String,HashSet> watchTable,key为path,Watcher是一个客户端网络连接封装,当节点变化时会通知对应的连接(连接通过心跳保持) 服务端触发过程 调用WatchManager中的方法触发数据变更事件 封装了一个具有会话状态、事件类型、数据节点3种属性的WatchedEvent对象。之后查询该节点注册的Watch事件,如果为空说明该节点没有注册过Watch事件。如果存在Watch事件则添加到定义的Wathcers集合中,并在WatchManager管理中删除。最后,通过调用process方法向客户端发送通知 客户端回调过程 使用SendThread.readResponse()方法来统一处理服务端的相应 将收到的字节流反序列化转换成WatcherEvent对象。调用eventThread.queueEvent()方法将接收到的事件交给EventThread线程进行处理 从ZKWatchManager中查询注册过的客户端Watch信息。查询到后,会将其从ZKWatchManager的管理中删除。因此客户端的Watcher机制是一次性的,触发后就会被删除 将查询到的Watcher存储到waitingEvents队列中,调用EventThread类中的run方法循环取出在waitingEvents队列中等待的Watcher事件进行处理 ...

    2023-11-02 134
  • 开放文档格式ODT文件格式解析

    开放文档格式(ODF)基于开放标准,你可以使用其它工具检查它们,甚至从中提取数据。你只需要知道从哪里开始。 过去,文字处理文件是封闭的专有格式。在一些较旧的文字处理软件中,文档文件本质上是该软件的内存转储。虽然这样可以让加载文件更快,但也使文档文件格式变得不透明。 2005 年左右,结构化信息标准促进组织Organization for the Advancement of Structured Information Standards(OASIS)为所有类型的办公文档定义了一种开放格式,即办公应用程序开放文档格式Open Document Format for Office Applications(ODF)。 由于 ODF 是基于 OpenOffice.org的 XML 文件规范的开放式标准,因此你也可以将其简称为 “开放文档格式”。 ODF 包括几种文件类型,包括用于 开放文档文本OpenDocument Text 文档的 ODT。 ODT 文件中有很多值得探索的内容,它的本质是一个 Zip 文件。 ODT 文件结构 跟所有 ODF 文件一样,ODT 文件实际上是一个 XML 文档和其它文件的 Zip 压缩包。 使用 Zip 可以占用更少的磁盘空间,同时也意味着可以用标准 Zip 工具来检查它。 我有一篇关于 IT 领导力的文章,名为“Nibbled to death by ducks”,我将其保存为 ODT 文件。 由于 ODF 文件是一个 zip 容器,你可以用 unzip命令来检查它: $ unzip -l 'Nibbled to death by ducks.odt' Archive: Nibbled to death by ducks.odt Length Date Time Name 39 07-15-2022 22:18 mimetype 12713 07-15-2022 22:18 Thumbnails/thumbnail.png 915001 07-15-2022 22:18 Pictures/10000201000004500000026DBF6636B0B9352031.png 10879 07-15-2022 22:18 content.xml 20048 07-15-2022 22:18 styles.xml 9576 07-15-2022 22:18 settings.xml 757 07-15-2022 22:18 meta.xml 260 07-15-2022 22:18 manifest.rdf 0 07-15-2022 22:18 Configurations2/accelerator/ 0 07-15-2022 22:18 Configurations2/toolpanel/ 0 07-15-2022 22:18 Configurations2/statusbar/ 0 07-15-2022 22:18 Configurations2/progressbar/ 0 07-15-2022 22:18 Configurations2/toolbar/ 0 07-15-2022 22:18 Configurations2/popupmenu/ 0 07-15-2022 22:18 Configurations2/floater/ 0 07-15-2022 22:18 Configurations2/menubar/ 1192 07-15-2022 22:18 META-INF/manifest.xml 970465 17 files 我想强调 Zip 文件结构的以下几个元素: mimetype文件用于定义 ODF 文档。处理 ODT 文件的程序,如文字处理程序,可以使用该文件来验证文档的 MIME 类型。对于 ODT 文件,它应该总是:application/vnd.oasis.opendocument.text META-INF目录中有一个manifest.xml文件。它包含查找 ODT 文件其它组件的所有信息。任何读取 ODT 文件的程序都从这个文件开始定位其它内容。例如,我的 ODT 文档的manifest.xml文件包含这一行,它定义了在哪里可以找到主要内容: content.xml文件包含文档的实际内容。 我的文档中只有一张截图,它位于 Pictures目录中。 从 ODT 中提取文件 由于 ODT 文档是一个具有特定结构的 Zip 文件,因此可以从中提取文件。 你可以先解压缩整个 ODT 文件,例如使用 unzip命令: $ unzip -q 'Nibbled to death by ducks.odt' -d Nibbled 一位同事最近向我要了一份我在文章中提到的图片。通过查看 META-INF/manifest.xml文件,我找到了嵌入图像的确切位置。用grep命令可以找到描述图像的行: $ cd Nibbled $ grep image META-INF/manifest.xml $ ls -F Configurations2/ manifest.rdf meta.xml Pictures/ styles.xml content.xml META-INF/ mimetype settings.xml Thumbnails/ 就是这张图片: 开放文档格式 ODF 是一种开放的文件格式,它可以描述文字处理文件(ODT)、电子表格文件(ODS)、演示文稿(ODP)和其它文件类型。 由于 ODF 格式基于开放标准,因此可以使用其他工具检查它们,甚至从中提取数据。 你只需要知道从哪里开始。所有 ODF 文件都以 META-INF/manifest.xml为“引导”文件,通过它你能找到其余的所有内容。 ...

    2023-11-02 226
  • 如何在Ubuntu服务器22.04上设置静态IP地址

    在这篇文章中,我们将介绍如何在 Ubuntu 服务器 22.04 上设置静态 IP 地址。 强烈建议在 Linux 服务器上使用静态 IP,因为它会在重启后保持不变。静态 IP 对邮件服务器、Web 服务器和文件服务器等服务器起着重要作用。 准备条件 最小安装的 Ubuntu 服务器 22.04 具有 sudo 管理员权限的普通用户 在 Ubuntu 服务器 22.04 中,网络由 netplan 程序控制,因此我们将使用 netplan 在 Ubuntu 服务器上配置静态 IP 地址。 注意:我们不能使用 nmcli 程序,因为它不是 Ubuntu 服务器上默认安装的一部分。 在Ubuntu服务器22.04上设置静态IP地址 登录到你的 Ubuntu 服务器 22.04,查找 netplan 配置文件。它位于 /etc/netplan 目录下。 $ cd /etc/netplan/ $ ls -l total 4 -rw-r--r-- 1 root root 116 Oct 12 04:03 00-installer-config.yaml $ 运行以下 cat 命令以查看 00-installer-config.yaml 的内容。 注意:配置文件的名称可能因你的设置而异。由于它是一个 yaml 文件,因此请确保在编辑时保持缩进和语法。 $ cat 00-installer-config.yaml 输出: 根据上面的输出,它说我们有 ens33 接口,它正在从 DHCP 服务器获取 IP。查看接口名称的另一种方法是通过 ip 命令。 现在,要配置静态 IP 代替 DHCP,使用 vi 或 nano 编辑器编辑 netplan 配置文件并添加以下内容。 $ sudo vi 00-installer-config.yaml # This is the network config written by 'subiquity' network: renderer: networkd ethernets: ens33: addresses: - 192.168.1.247/24 nameservers: addresses: [4.2.2.2, 8.8.8.8] routes: - to: default via: 192.168.1.1 version: 2 保存并关闭文件。 在上面的文件中,我们使用了以下内容, ens33 为接口名称 用于设置静态 IP 的地址 nameservers 用于指定 DNS 服务器的 IP 用于指定默认网关的路由 注意:根据你的环境更改 IP 详细信息和接口名称。 要是上述修改生效,请使用以下 netplan 命令应用这些更改: $ sudo netplan apply 运行以下 IP 命令查看接口上的 IP 地址: $ ip addr show ens33 要查看默认路由,请运行: $ ip route show 上述命令的输出。 ip-addr-route-command-output-u buntu-server 完美,以上命令的输出确认静态 IP 和路由配置成功。 这就是这篇文章的全部内容。请在下面的评论部分发表你的问题和反馈。 ...

    2023-10-28 246
  • 号称植入了2000万设备的欺诈后门拓展分析

    事件概述 近日,奇安信威胁情报中心注意到外国安全厂商humansecurity在外网揭露了一个名为BADBOX的事件,其报告称观察到至少74000 部基于 Android 的手机、平板电脑、和全球联网电视盒有遭遇BADBOX 感染的迹象;而来自趋势科技的说法是该后门据信被植入了2000万数量级别的设备。实际上,humansecurity在其分析报告中已经对该事件进行了比较详细的技术分析,各位如果有兴趣可以自行查看。本篇文章中,我们主要想基于奇安信自身情报视野做一些关联扩展分析,希望能从我们的视角出发提供更多的补充信息给到业界。 分析细节 基于奇安信威胁情报中心的历史流量记录,可以看到humansecurity提供的几个C2地址在国内的感染量并不算少,以cbphe.com为例,可以看到cbphe.com22年到23年5月份基本上是每日访问情况比较平稳,从23年开始逐步增长,到了23年5月之后,感染量突然暴增,并一直持续到现在。 另外,我们发现域名flyermobi.com下有多个关联的样本,首先选一个样本进行定性分析,这里随机挑选了一个e6027f962eaaf7dede8a271166409fe6。 样本信息: MD5:e6027f962eaaf7dede8a271166409fe6 包名:com.gavv.tissm 样本会解密原包中/a/b.data 文件,释放jar,通过dexclassloader的方式加载 原包文件: 移动设备中释放的jar和dex 然后动态加载jar文件: 样本会将释放的jar的版本号(v)、设备型号(tp)、Android系统版本(bdr)、软件版本(rv)、包名(pk)等数据上传到解密出来的url中,对比返回版本信息,如果版本有更新则下载新的jar,从而实现版本更新。url如下: hxxp://adc[.]flyermobi[.]com/update/update.conf?bdr=xx&rv=x&v=xxx&pk=xxx&tp=Generic+Android-x86_64 解密字符串的部分: 解密算法: public class De {public static void main(String[] args) {System.out.println(dec("d62kyun6d", "C4FF3D0FF6730B4AE7BFA387C88862560050076610A3517E03BA599535DEAA943134CA7E20F8138A7D0331"));}public static String dec(String key,String msg){String v7_3 = "";byte[] v7_2;int v0 = 0;if (msg.length()>=2){String v7_1 = msg.toLowerCase();int v2 = v7_1.length() / 2;byte[] v3 = new byte[v2];while(v0 < v2) {int v4 = v0 * 2;v3[v0] = (byte)Integer.parseInt(v7_1.substring(v4, v4 + 2), 16);++v0;}v7_2 = v3;byte[] v6 = a(v7_2, key);try {v7_3 = new String(v6, "UTF-8");} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}}return v7_3;}public static byte[] a(byte[] arg4, String arg5) {try {SecretKeySpec v5 = Sekey(arg5);Cipher v0 = Cipher.getInstance("AES/CFB/NoPadding");v0.init(2, v5, new IvParameterSpec(new byte[v0.getBlockSize()]));return v0.doFinal(arg4);}catch(Exception v4) {v4.printStackTrace();return null;}}private static SecretKeySpec Sekey(String arg2) {byte[] v2_1;if(arg2 == null) {arg2 = "";}StringBuilder v0 = new StringBuilder(0x20);while(true) {v0.append(arg2);if(v0.length() >= 0x20) {break;}arg2 = "0";}if(v0.length() > 0x20) {v0.setLength(0x20);}try {v2_1 = v0.toString().getBytes("UTF-8");}catch(UnsupportedEncodingException v2) {v2.printStackTrace();v2_1 = null;}return new SecretKeySpec(v2_1, "AES");}} 返回结果中包含下载地址,md5,版本号等内容: 释放的jar中,利用webview实现后台刷广告牟利的功能。广告地址通过访问url获取,利用MotionEvent实现自动点击广告。 访问url:http://adc.flyermobi.com/config/config.conf、http://adc.flyermobi.com/config/config.conf.default来获取广告相关url 利用webview请求广告: 通过MotionEvent实现广告点击: 分析到这里,可以确认这个样本行为与humansecurity提到的基本一致,该恶意程序是一个内置的后门,通过后门实际远程下载其他代码模块并加载的功能;目前看到的主要功能模块是用于后台点击广告来牟利。 接下来尝试对相关C2地址进行关联分析,首先将公开披露的这几个域名(cbphe.com 、cbpheback.com、ycxrl.com、dcylog.com、flyermobi.com;)输入到奇安信威胁情报中心的【威胁图谱分析】模块中,威胁图谱会自动将这几个域名的历史解析记录、whois、关联样本等等多种关联关系展示在画布上。 其中,我们注意到flyermobi.com这个域名有一个解析的IP 128.199.193.15,这个IP上还关联到了其他的域名,其中有一个apkcar.com的域名也解析到128.199.193.15这个IP上,并且其子域名ymex.apkcar.com、ymlog.apkcar.com的域名结构与前面的rnznd.ycxrl.com、z3rv.ycxrl.com(ycxrl.com的子域名)结构相似。 进一步下钻关联数据,可以看到ymsdk.apkcar.com曾经cname到adbsdk.flyermobi.com,并且扩展出来更多的子域名、URL和样本,如下图: 选择其中一个样本进行分析(MD5:f33401aaf64a2dd3ed14e6f441ac83ab),可以看到代码与前面分析的样本代码十分相似: 到这里,我们基本可以确定apkcar.com,是本次事件同一个团伙的域名,而这个域名在其他安全厂商的报告中都没有提到。我们通过奇安信威胁图谱关联的方式扩展出了一个之前没有被发现的新C2. 总结 经过上述分析,可以确认本次事件确有其事,攻击者通过在机顶盒内置后门的方式,利用后门远程下载并加载其他恶意代码模块;最后通过后台隐蔽点击广告来进行牟利。 IOC DOMAIN cbphe.com cbpheback.com ycxrl.com dcylog.com flyermobi.com apkcar.com URL hxxp://128[.]199.97.77/logs/log.active hxxp://adc[.]flyermobi.com/update/update.conf hxxp://ymsdk[.]apkcar.com/adbu MD5 e6027f962eaaf7dede8a271166409fe6 f33401aaf64a2dd3ed14e6f441ac83ab 参考链接 [1].https://humansecurity.com/hubfs/HUMAN_Report_BADBOX-and-PEACHPIT.pdf [2].https://arstechnica.com/security/2023/10/thousands-of-android-devices-come-with-unkillable-backdoor-preinstalled/ ...

    2023-10-28 190
  • Linux Rsync命令的使用方法以及应用场景

    Rsync Rsync(Remote Sync)是一个用于文件同步和备份的开源工具。 它可以在本地系统之间或本地系统与远程系统之间同步文件和目录。 1.安装 在大多数常见的Linux发行版中,都没有默认安装rsync。 sudo apt-get install rsync sudo yum install rsync 2.使用场景 一些常见的使用场景包括: 文件备份:rsync可以用于定期备份文件和目录,只传输修改过的文件,节省带宽和存储空间。 文件同步:rsync可以用于将文件从一个位置同步到另一个位置,确保两个位置的文件保持一致。 远程备份:rsync可以通过SSH协议在本地和远程系统之间进行文件备份和同步。 文件发布:rsync可以用于将文件和目录发布到远程服务器,例如网站发布、软件发布等。 Rsync使用方法 rsync命令 是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。 rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 1.本地文件 将源目录同步到目标目录 $ rsync -r source destination 上面命令中,-r 表示递归,即包含子目录。注意,-r是必须的,否则 rsync 运行不会成功。 source 目录表示源目录,destination 表示目标目录。 多个文件或目录同步 $ rsync -r source1 source2 destination 上面命令中,source1、source2 都会被同步到 destination 目录。 -a 参数可以替代 -r,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)。 由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以 -a 比 -r 更有用。 下面的用法才是常见的写法。 $ rsync -a source destination 目标目录 destination 如果不存在,rsync 会自动创建。 执行上面的命令后,源目录 source 被完整地复制到了目标目录 destination 下面,即形成了 destination/source 的目录结构。 如果只想同步源目录 source 里面的内容到目标目录 destination ,则需要在源目录后面加上斜杠。 $ rsync -a source/ destination 上面命令执行后,source 目录里面的内容,就都被复制到了 destination 目录里面,并不会在 destination 下面创建一个 source 子目录。 ...

    2023-10-25 208
  • Linux ping命令参数用法详解

    ping命令 ping命令用于测试网络连接的可达性和延迟。它通过向目标主机发送ICMP回显请求(ping请求),并等待目标主机返回ICMP回显应答(ping应答)来判断网络连接的情况。 使用ping命令的基本语法如下: ping [选项] 目标主机 选项包括: usage: ping [-AaDdfnoQqRrv] [-c count] [-G sweepmaxsize] [-g sweepminsize] [-h sweepincrsize] [-i wait] [-l preload] [-M mask | time] [-m ttl] [-p pattern] [-S src_addr] [-s packetsize] [-t timeout][-W waittime] [-z tos] host ping [-AaDdfLnoQqRrv] [-c count] [-I iface] [-i wait] [-l preload] [-M mask | time] [-m ttl] [-p pattern] [-S src_addr] [-s packetsize] [-T ttl] [-t timeout] [-W waittime] [-z tos] mcast-group Apple specific options (to be specified before mcast-group or host like all options) -b boundif # bind the socket to the interface -k traffic_class # set traffic class socket option -K net_service_type # set traffic class socket options --apple-connect # call connect(2) in the socket --apple-time # display current time 例如,要ping一个目标主机(如www.example.com)并发送5个ping请求,可以使用以下命令: ping -c 5 www.example.com ping命令会显示每个ping请求的结果,包括目标主机的IP地址、ping请求的数据包大小、ping请求的时间、以及从目标主机返回的ping应答信息。 请注意,ping命令在不同操作系统中的具体实现可能会有所不同,因此一些选项可能会有所差异。 ping -t 的使用 ping -t 是一个Windows系统下的命令,用于连续向指定的目标IP地址发送ICMP Echo请求,以测试网络连接的稳定性和延迟。其中,-t 参数表示持续发送请求,直到手动停止。 ping -a 的使用 ping -a命令用于通过IP地址来获取对应的主机名。它会向指定的IP地址发送网络探测包,并等待目标主机的响应。当目标主机响应时,ping -a命令会返回该主机的主机名。 使用示例: ping -a 192.168.0.1 这个命令会向IP地址为192.168.0.1的主机发送网络探测包,并返回该主机的主机名。 ping -n 的使用 ping -n 是一个用于网络诊断的命令,它用于测试与目标主机之间的网络连接。在Windows系统中,ping -n命令用于指定要发送的ping请求的次数。 使用示例: ping -n 5 www.example.com 上述命令将发送5个ping请求到www.example.com,并显示每个请求的结果。 ping -l size 的使用 ping -l size 是用于指定ICMP数据包的大小的参数。其中,size表示要发送的数据包的大小,单位为字节。 通过使用ping -l size命令,可以测试网络的连通性和延迟。它会向目标主机发送ICMP数据包,并等待目标主机返回响应。通过观察响应时间和丢包情况,可以评估网络的质量和性能。 例如,要发送大小为64字节的数据包,可以使用以下命令: ping -l 64 注意,实际发送的数据包大小可能会比指定的大小稍大,因为还需要包含一些额外的头部信息。 ping -r count 的使用 ping -r count 是一个用于网络诊断的命令,其中 count 是指定要发送的 ICMP Echo 请求的次数。 使用 ping -r count 命令可以向指定的目标主机发送 ICMP Echo 请求,并显示每个请求的往返时间(RTT)以及路由路径上的每个中间路由器的 IP 地址。 以下是 ping -r count 命令的使用示例: ping -r 5 www.example.com 这个命令将向 www.example.com 发送 5 个 ICMP Echo 请求,并显示每个请求的 RTT 以及路由路径上的中间路由器的 IP 地址。 请注意,ping -r count 命令在不同的操作系统上可能会有一些差异,具体的用法和参数可能会有所不同。在使用该命令时,建议查阅相关操作系统的文档或使用 ping -r --help 命令获取更多详细信息。 批量 ping 网段 要批量ping一个网段,可以使用以下命令: for /L %i in (1,1,255) do ping -n 1 192.168.0.%i 这个命令会依次ping指定网段中的每个IP地址,从1到255。你可以将命令中的192.168.0替换为你要ping的网段。 注意,这个命令是在Windows系统下使用的,如果你使用的是其他操作系统,请使用相应的命令。 ...

    2023-10-25 228
  • Windows文件夹加密和增量加密方法

    本文使用两种方式给文件夹进行加密。 虚拟文件保险柜 本节使用 Windows 自带工具 VHD 建立虚拟文件柜,并用 BitLocker 加密。 Win+S 打开搜索,输入 hard disk,选中 Create and format hard disk partitions,进入 Disk Managenment。 选择一个硬盘卷,依次点击 Action > Create VHD,按照要求选择或输入 VHD 生成位置,大小和属性等。 等待生成后可以在 Disk Managenment 界面看到新建的 VHD,右键该 VHD > Initialize Disk,选择 MBR 或 GPT。 初始化完成后,再次右键 Unallocated 的空间,选择 New Simple Volume 新增简单卷,按照要求新建即可。 该 VHD 可以 Eject 或 Mount,近似于移动硬盘。 以上是 VHD 的创建流程,接下来是 BitLocker 加密的设置。 将新建的 VHD 双击后挂载 (Mount)。 Win+S 打开搜索,输入 bitlocker,进入 Manage BitLocker 界面。 找到该 VHD,点击 Turn on BitLocker,按照要求设置密码等配置即可。 ❝该方法的好处是不需要依赖于第三方软件,可以在各个 Windows 系统电脑中直接使用。个人感觉适用于存储长期不做更改的加密文件。❞ 不需要该文件柜时,直接删除即可。 Cryptomator 增量加密 上述方法的缺点是如果我们需要将该文件在云盘同步,则每次都需要将所有的空间全部覆写一边。这样做非常麻烦。 Cryptomator 是一款开源免费的增量加密软件,能够解决上述的问题。 Cryptomator 的安装和操作非常简单,按照流程执行即可,在此不做赘述。 另外,Cryptomator 还可以搭配 Cyberduck 一起使用。后者可以用来直接访问云盘的内容。 ...

    2023-10-23 171
  • MySQL: Binlog复制如何安全地跳过错误事务

    MySQL是一个功能强大的开源关系数据库管理系统,它提供了二进制日志(Binlog)复制功能,帮助数据库管理员在主从架构中同步数据。 然而,在实际运营过程中,可能会遇到由于某些错误事务而导致复制过程中断的情况。 在确认是单独的错误事务导致问题后,我们可以在从服务器(Slave)上采取措施来跳过该错误事务,然后继续复制过程。 首先,我们需要停止从服务器上的复制过程,以确保不会有新的数据被复制过来。 可以通过执行以下命令来停止复制: STOP REPLICA; 接下来,我们需要设置全局变量sql_slave_skip_counter,以指定要跳过的错误事务数量。 通常情况下,如果只有一个错误事务,我们可以将该变量设置为1: SET GLOBAL sql_slave_skip_counter = 1; 然后,我们可以重新启动复制过程,以继续复制后续的事务: START REPLICA; 为了验证我们的操作是否成功,可以通过以下命令检查复制的状态和sql_slave_skip_counter的值: SHOW REPLICA STATUS\G show variables like 'sql_slave_skip_counter'; 一旦复制应用启动,GLOBAL sql_slave_skip_counter变量会被重置为0。这意味着,如果在将来再次遇到需要跳过的错误事务,我们需要再次设置这个变量。 虽然我们可以将sql_slave_skip_counter设置为一个非常大的值,以确保启动后所有错误都会被忽略,但这并不是一个推荐的做法。这样做可能会忽略掉所有的错误事务,包括那些可能会影响数据完整性或系统稳定性的重要错误,甚至会错过正常的事务导致数据丢失。 因此,通常建议仅在清楚知道错误事务的性质和影响时,才使用sql_slave_skip_counter来跳过错误事务。 总结来说,通过理解和应用sql_slave_skip_counter变量,我们可以在遇到错误事务时,有选择地跳过它们,以保持复制过程的连续性。 但同时,我们也应该注意不要滥用这个功能,以避免产生不可预见的问题。 在处理复制错误时,应该先尝试找出并解决错误的根本原因,而不是简单地跳过错误事务。 通过这样的实践,我们可以确保我们的MySQL复制环境更加健壮和可靠。 ...

    2023-10-22 185
  • 攻防演练 | 如何使用 Docker 搭建代理池+隧道代理

    前言 作为一种常见的服务器防御网络攻击或探测手段,封 IP 可以有效地保护服务器免受恶意攻击。在进行安全测试时,安全人员需要使用代理来隐藏真实 IP 地址,并依靠代理池获取可用的代理地址。同时,为了更方便地在某些工具中使用代理,可以借助隧道代理直接将请求转发给不同的代理服务器,从而避免 IP 被封锁。 本文介绍了一种利用 Docker 搭建代理池和隧道代理的方法,并通过对 httpbin.org 的访问和红队工具 dirsearch 的使用进行了测试。这种方法能够快速搭建一个免费、高效、稳定且易于管理的代理环境,在进行网络渗透测试等任务时非常有帮助。 下图为搭建过程的流程图: Docker 的准备 我这里都是使用的 Docker 搭建。 Docker 可能用到的命令如下: # 查看当前运行的 docker 容器 ID 和运行状况 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c09ae6b9c554 tunnel_proxy:0.02 "/usr/local/openrest…" 2 hours ago Up 2 hours tunnel_proxy 17bc67d0f892 germey/proxypool:master "supervisord -c supe…" 2 hours ago Up 2 hours 0.0.0.0:5555->5555/tcp, :::5555->5555/tcp proxypool b659295a7927 redis:alpine "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp redis4proxypool [root@localhost ~]# docker exec -it 17 /bin/sh/app # lsDockerfile README.md docker-compose.yml kubernetes release.sh run.py supervisord.logLICENSE build.yaml examples proxypool requirements.txt supervisord.conf exit 退出   命令:docker exec -it <id> /bin/bash在指定 id 的 Docker 容器中执行指令,id 通过docker ps命令来获取。如果执行的是 shell 程序比如 /bin/bash 或者 /bin/sh 就能进入到容器的 shell 里,可以执行一些 linux 指令,id 可以使用前几位可以区分不同容器的字符就行,我这里用的前两位。 如果在接下来的配置中有问题,可以使用这种方式进入容器里查看日志,或者按照我的配置将日志文件映射到本地。 启动 Docker 用的程序是 docker-compose。如果你输入 docker-compose 提示找不到这个程序,有可能是没有安装或者是 /bin 目录下没有。 使用docker info命令查看 docker-compose 程序的位置 [root@localhost ~]# docker infoClient: Docker Engine - Community Version: 24.0.2 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.10.5 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.18.1 Path: /usr/libexec/docker/cli-plugins/docker-compose 检查一下 docker-compose 有无执行权限,如果没有,就要sudo chmod +x /usr/local/bin/docker-compose赋予执行权限 [root@localhost proxy_pool]# cd /usr/libexec/docker/cli-plugins/[root@localhost cli-plugins]# ll总用量 108356-rwxr-xr-x 1 root root 56327368 5月 26 05:56 docker-buildx-rwxr-xr-x 1 root root 54627904 5月 20 02:09 docker-compose 如果无法直接运行 docker-compose,可能需要创建软链接 [root@localhost cli-plugins]# ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose[root@localhost work]# docker-compose --versionDocker Compose version v2.18.1 代理池 ProxyPool 我这里用的是开源的代理池,自动从免费代理网站上爬取 http 代理。Python3WebSpider/ProxyPool 这个项目有四个模块:获取IP模块,存储模块,检测模块,接口模块。它包含两个 Docker 容器:redis4proxypool 和 proxypool,对于容器的设置都在 ProxyPool 根目录的 docker-compose.yml 文件里。对于容器的配置留到下部分再详细描述,先跑起来再说。 首先 gitclone git clone https://github.com/Python3WebSpider/ProxyPool.gitcd ProxyPool 然后启动 docker 环境 docker-compose up 这时候如果防火前的 5555 端口是开放的,访问 http://<当前 ip>:5555/random 即可随机获取一个可用代理,不需要做任何的修改。效果图如下: random 接口返回的是随机的高分 IP,也就是已验证能访问测试 URL 的 IP。高分,指的是在 redis 数据库中,获取 IP 模块获取的每一条 IP 的分数,如果检测模块用 IP 访问测试链接,能成功访问则设置这个分数为 100,单次测试访问失败则将分数减 1。 ProxyPool 的配置 在 ProxyPool 目录下使用命令docker-compose down可以关闭 docker。接下来,我们修改 ProxyPool 的配置。它包含两个容器,一个是 redis4proxypool,也就是 redis 数据库的部分,下文用 redis 来代替,另一个容器是 proxypool,也就是负责代理池逻辑的部分。 redis 为了查看或者 redis 里的这些数据,首先要设置 docker-compose.yml,设置 6374 的端口映射 version: "3"services: redis4proxypool: image: redis:alpine container_name: redis4proxypool # 把容器内部的 6379 端口映射到宿主机(host)的 6374 端口,这样就可以通过宿主机的 6374 端口来访问容器内部的 Redis 数据库 ports: - "6374:6379" proxypool: image: "germey/proxypool:master" container_name: proxypool ports: - "5555:5555" restart: always # volumes: # - proxypool/crawlers/private:/app/proxypool/crawlers/private environment: PROXYPOOL_REDIS_HOST: redis4proxypool 开启容器之后,要查看 redis 用到的命令如下: [root@localhost ProxyPool]# redis-cli -h 127.0.0.1 -p 6374   keys * 获取 redis 中所有的 key 127.0.0.1:6374> keys * "proxies:universal" type <key> 获取 key 的类型 127.0.0.1:6374> type proxies:universalzset 因为是 zset 有序类型,所以用 zrange 获取所有数据,后面两个参数是开始位置和结束位置 127.0.0.1:6374> zrange proxies:universal 0 -1...18156) "72.44.101.173:8080"18157) "95.56.254.139:3128" 获取分数为 100 的,用 zrangebyscore,后面两个参数是最小值和最大值 127.0.0.1:6374> zrangebyscore proxies:universal 99 100 "103.189.96.98:8085" "186.121.235.66:8080" "200.4.217.203:999" "103.74.121.88:3128" "117.251.103.186:8080"... exit 退出 proxypool 针对 proxypool 也有不少设置可以自定义,在使用 Docker 的情况下,在 docker-compose.yml 文件中,设置 environment 参数即可。 这里修改了 volumes 参数,把容器里的指定文件夹映射到宿主机的指定位置。proxypool 在容器里工作的根目录是 /app,所以这里是把 /app/proxypool/logs 文件夹映射到主机的 ProxyPool/logs/proxypool 目录下。 设置了以下环境变量: CYCLE_TESTER, Tester 运行周期,即间隔多久运行一次测试,默认 20 秒,这里修改为 5 秒。 PROXYPOOL_REDIS_PORT,容器内部的 6379 连接 redis4proxypool。 TEST_URL, 测试 URL,默认百度,指定要爬取的 URL。 REDIS_KEY,redis 储存代理使用字典的名称,其中 PROXYPOOL_REDIS_KEY 会覆盖 REDIS_KEY 的值。 LOG_DIR: "proxypool/logs" ,这个参数不知道为啥设置了并没有什么用,尝试了 n 遍,本来按照源码,没有上面这个参数也应该写到 logs 相对目录下,但是程序并没有写入,所以保存日志文件只能用下面这种相对路径的写法。 LOG_RUNTIME_FILE,运行日志文件名称。 LOG_ERROR_FILE,错误日志文件名称。 加了 depends_on 参数,意思是先启动 redis4proxypool 在启动 proxypool,这样确保在启动 proxypool 之前先启动了 redis4proxypool,以避免可能的连接问题。 version: "3"services:redis4proxypool:image: redis:alpinecontainer_name: redis4proxypoolports: "6374:6379"proxypool:image: "germey/proxypool:master"container_name: proxypoolports: "5555:5555"restart: always volumes: ./logs/proxypool:/app/proxypool/logsvolumes: - proxypool/crawlers/private:/app/proxypool/crawlers/private environment:CYCLE_TESTER: 5PROXYPOOL_REDIS_HOST: redis4proxypoolPROXYPOOL_REDIS_PORT: 6379TEST_URL: https://httpbin.org/ipREDIS_KEY: proxies:httpbinLOG_RUNTIME_FILE: "./proxypool/logs/proxypool_runtime.log"LOG_ERROR_FILE: "./proxypool/logs/proxypool_error.log"depends_on: redis4proxypool 隧道代理 我们使用一些扫描或者爆破工具的时候,大部分情况下,配置选项中只能选择一条代理,被封 IP 的可能性仍然很大,有没有什么方法能在请求的时候自动切换代理服务器呢?这就是隧道代理。 隧道代理服务器,能将接收到的请求随机或者按规则转发给不同的代理,这样,相当于在工具中只需要设置代理为隧道代理服务器,自动切换 IP 的任务交给隧道代理。 我这里使用的 OpenResty 搭建的隧道代理,也是用的 Docker,并把配置整合到了 docker-compose.yml 文件中。 参考链接:openresty实现隧道代理 ...

    2023-10-21 316
  • Linux如何设置定时任务

    定时任务crond Linux 可以定时执行指定的任务或程序,是一种常用工具。主要采用 crontab 命令: crontab -e # 编辑 crontab 任务 crontab -l # 查询 crontab 任务 crontab -r # 删除当前用户所有的 crontab 任务 在 crond 编辑中,可以采用如下方式编辑定时任务: * * * * * [command] 上述命令中: 第一个星号为分钟,取值为 0-59 这 60 个整数。 第二个星号为小时,取值为 0-23 这 24 个整数。 第三个星号为当月天数,取值为 1-31 这 31 个整数。 第四个星号为月份,取值为 1-12 这 12 个整数。 第五个星号为星期,取值为 0-6 这七个整数(0 为周日)。 以下是两个例子: # 每天 01 点 05 分自动关机 05 01 * * * /sbin/shutdown -h now # 每周日的 01 点 05 分自动重启 05 01 * * 0 /sbin/shutdown -r now 除使用星号代表所有值外,crontab 中还有以下符号: 逗号 , 可用于不连续时间。 横杠 - 用于表示时间范围。 斜杠 / 用于除以某个数,表示隔多久执行一次。 以下是几个示例: * * * 12 * # 每年的 12 月每一天的每一分钟都执行一次 58 5 9 * * # 每个月的 9 号 5 点 58 分执行一次 0 1,8,15,23 * * * # 每天的 1, 8, 15, 23 点整各执行一次 0 1-14 * * * # 每天 1 点到 14 点一小时执行一次 */15 * * * * # 每隔 15 分钟执行一次 单次定时计划at 与 crontab 的循环定时任务不同,at 命令用于制定一次性的定时任务。 如果系统没有 at 指令,则需要安装 sudo apt update && sudo apt install at 然后启动调度 atd 的守护进程: sudo systemctl enable --now atd 在使用 at 命令时,切记要确保 atd 在后台已经启动,可采用以下命令查询: ps -ef | grep atd ❝atd 会在每隔 60s 查询一次当前是否存在任务,若存在则执行一次,然后自动删除任务信息。❞ at 命令的使用规则如下: at [options] [runtime] 其中指定时间的方式比较复杂,甚至还有很多模糊的时间指代方式。我个人认为常用的指定时间应是这几种格式: # 指定当天具体的时间 at 16:00 # 指定某一天的具体时间 at 16:00 2023-09-21 # 指定多长时间后执行, 单位为 minutes, hours, days, weeks at now + 50 minutes at 16:00 2023-09-21 + 100 days 输入上述命令后,会进入 at 命令模式,在此输入需要执行的命令后回车,再用 Ctrl+D 完成输入并退出。例如: $ at now + 10 minutes warning: commands will be executed using /bin/sh at> ls > /home/ubuntu/mount0/test.log at> <EOT> job 5 at Thu Sep 21 17:46:00 2023 此时可以用 atq 命令来查询目前还未执行的任务。 atq # 输出以下内容 5 Thu Sep 21 17:46:00 2023 a bunian 在上述输出中,5 代表任务编号,该编号每执行一次 at 就会增加一个。a 是队列字母。 如果想要放弃还未执行的任务,则需执行以下命令即可。 atrm [任务编号] </div> ...

    2023-10-19 163
  • Linux查看日历命令cal详解

    使用 cal 命令可以输出当前月的日历: cal # 输出以下内容: September 2023 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 如果要输出指定年或月的日历,则采用以下方式: # 输出 2022 年日历 cal 2022 # 输出 2020 年 4 月日历 cal 4 2020 </div> ...

    2023-10-19 163
  • Linux查询时间修改系统时间命令详解

    在Linux中,可用date命令查询时间: date # Thu 21 Sep 2023 03:34:29 PM CST date -R # Thu, 21 Sep 2023 15:42:50 +0800 在输出中,CST 代表 China Standard Time,使用 -R 参数可以查询所在时区,即本次输出的东八区。 如果要查特定单位的时间,即采用以下格式查询: # 输出当前年份 date +%Y # 输出当前月份 date +%m # 输出当前是该月的第几天 date +%d # 输出年月日时分秒, 时刻采用大写为 24 小时制 date "+%Y-%m-%d %H:%M:%S" 修改系统当前时间,可以采用以下命令: # 采用手动方式修改时间 date -s 'Apr 01 2023 13:52:59 UTC' ❝如果使用了网络时间协议 (NTP) 或其他服务来自动同步时间,上述修改时间的方式可能会无效。不过我觉得还是使用同步时间更佳。❞ 如果系统的时间不正确,我们可以令其自动同步: # 查看所有可用的时区 timedatectl list-timezones # 将时区更改为东八区 timedatectl set-timezone Asia/Shanghai # 启动启用网络时间协议(NTP),以便自动同步系统时间 timedatectl set-ntp true # 关闭网络时间协议(NTP) timedatectl set-ntp false </div> ...

    2023-10-19 197
  • Linux如何扩容lvm磁盘容量

    LVM(逻辑卷管理器)可以将多个物理磁盘或分区组合成一个存储池,然后从这个存储池中划分出新的逻辑卷。 这些逻辑卷可以被看作是新的逻辑分区,它们可以像物理分区一样被格式化和挂载。因此我们可以动态地添加更多的磁盘来增加文件系统空间。 在安装 Ubuntu server 系统时,默认将 LVM 挂载在根目录下。 可以执行以下操作为 LVM 进行扩容。 使用 vgdisplay 查询空间信息,如得到以下结果: ... VG Size <126.50 GiB PE Size 4.00 MiB Total PE 32383 Alloc PE / Size 16192 / 63.25 GiB Free PE / Size 16191 / <63.25 GiB ... 磁盘扩容。 # 增加 100G lvextend -L +100G /dev/mapper/ubuntu--vg-ubuntu--lv # 减小 100G lvreduce -L -100G /dev/mapper/ubuntu--vg-ubuntu--lv # 按百分比扩大到最大 lvresize -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv 执行扩容。 resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv 使用 vgdisplay 再次查看效果。 ...

    2023-10-19 193
  • Linux用户和组管理的常用命令

    用 root 用户登录,首先创建一个 bunian 用户。 useradd -m bunian -m 用于创建用户主目录,默认是不创建的。此外用 -d 参数可以自定义主目录(感觉很少用)。 创建 bunian 用户的密码,该命令也可以用于修改密码。回车后可输入密码。 passwd bunian 在 Linux 中,当创建了一个用户,系统会自动为其新建一个与用户名相同的主用户组名。可用下列命令查询 bunian 用户所属组(包括主组和辅助组): groups bunian # bunian : bunian 本次将 bunian 用户改到自己所需要的用户组中。 # 新增以下组 usermod -aG adm,cdrom,sudo,dip,plugdev,lxd bunian 查询 bunian 用户和主用户组的信息。 id bunian # uid=1001(bunian) gid=1001(bunian) groups=1001(bunian),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),117(lxd) ❝uid 和 gid 是由 Linux 系统分配给每个用户和主用户组的数字,从而允许系统识别用户和用户组。 默认情况下系统会自动为新的用户按照数字顺序从 1000 开始分配 uid 和 gid。前 1000 个账户号码通常被保留给系统账户、服务和其他特殊账户。uid 和 gid 分别存储在 /etc/passwd 和 /etc/groups 目录中。❞ 上述查到的各个组的定义如下: adm # 此组的成员可以查看许多日志文件 cdrom # 此组的成员可以访问 CD-ROM 驱动器和其他光驱 sudo # 此组的成员可以使用 sudo 命令来执行需要 root 权限的命令 dip # 此组的成员可以使用 ppp 和 dip 命令来拨号和使用PPP连接 plugdev # 此组的成员可以通过 pmount 挂载和卸载可移动设备 lxd # 此组的成员可以管理 LXD 容器 此时可以切换到 bunian 用户。 su bunian 切换到 bunian 用户后发现终端只显示 $ 符号。这是因为没有设置登录 shell,导致命令默认使用 /bin/sh。使用以下命令进行修改: usermod -s /bin/bash bunian 以上 wang 用户配置完毕。但在使用 sudo 命令时,需要输入 bunian 用户的密码,相对比较麻烦。可编辑 /etc/sudoers 文件进行修改: sudo vim /etc/sudoers # 找到下列行: # Allow members of group sudo to execute any command %sudo ALL=(ALL) :ALL # 修改为: # Allow members of group sudo to execute any command %sudo ALL=(ALL) NOPASSWD:ALL 再次使用 sudo 命令无需输入密码。 如果在上述第 3 步中,没有为 bunian 用户分配为 sudo 用户组,也可以单独为 bunian 用户设置使用 sudo 命令的权限,即通过编辑 /etc/sudoers 文件进行修改: ❝ 注意由于没有为 bunian 用户分配为 sudo 用户组,因此下列命令需要在 root 用户下执行。❞ # 需要在 root 用户下执行 !!! # 新增 /etc/sudoers.d/bunian 文件并编辑 vim /etc/sudoers.d/bunian # 在文件中添加以下内容: wang ALL=(ALL) NOPASSWD:ALL 进入 authorized_keys 目录,将自己的公钥复制到目录中。以后使用私钥登录即可。 mkdir -p ~/.ssh && vim ~/.ssh/authorized_keys 在有密钥登录的前提下,可顺便将密码登录关闭。 # 修改配置文件 sudo vim /etc/ssh/sshd_config # 将以下内容进行修改 PermitRootLogin no # 关闭 root 用户直接登录 PasswordAuthentication no # 关闭密码登录 修改上述配置后重新加载 ssh: sudo systemctl reload sshd 如果要删除 bunian 用户,则在 root 用户下执行以下命令: # 删除用户 bunian, 但保留了其主目录 userdel bunian # 删除 bunian 同时删除了主目录 userdel -r bunian </div> ...

    2023-10-19 179
  • 记一次地市hw:从供应商到目标站再到百万信息泄露

    起因:某市hw、给了某医院的资产,根据前期进行的信息收集就开始打,奈何目标单位资产太少,唯有一个IP资产稍微多一点点,登录框就两个,屡次尝试弱口令、未授权等均失败。 事件型-通用性-反编译jar-Naocs-后台-供应商到目标站-批量检测-内网 1.事件型-通用型 尝试互联网获取更多目标资产的信息。fofa搜索IP发现这样一个系统,是通用型的系统(根据指纹和ico自动识别的)、大概100+单位,包括县级、市级等均用此系统。 由于之前有过类似的从供应商一路打到目标站的经历,这次猜测应该也可以 查看网站底部的备案号,发现并不是目标单位的,而是供应商的,于是开始针对供应商进行信息收集 定位到了某家公司,天眼查显示八个备案域名: 直接上enscan收集备案信息,随后根据收集到的所有备案域名,查找真实IP以及端口等 根据获取到的域名,用fofa直接反查IP、子域等等,经过筛选之后,共有八个真实IP 随后就是找端口、找指纹什么的,我喜欢用fofa,现在fofa支持批量搜索100个IP资产的功能,根据系统的ICO识别指纹很快 2.反编译jar 很快根据fofa的ico摸到了nexus系统:一个maven仓库管理器 弱口令:admin/admin、admin/admin123等均失败 弱口令尝试无果后,根据之前的反编译jar的思路,直接点击browse查看maven公开仓库 找项目仓库,发现了不少的jar包 直接下载jar包反编译查看敏感信息,包括spring鉴权口令以及redis口令均可查看 大概几十个jar包,挨个尝试敏感信息获取,将获取到的敏感信息存一个密码本中,留着撞库爆破用很快收集到了mysql用户名口令、oracle用户名口令、Redis信息、nacos口令信息、部分服务的ak/sk接口(比如人脸识别api、语言api等等),但大多都处于内网,一时无法利用。 3.Nacos 继续查看端口结果,发现其中一个IP,开放的端口很大,直到50000以上。其中一个端口48848瞬间引起了我的注意,因为nacos默认端口8848嘛,随后点开提示404(要的就是404),反手在路径处输入nacos,直接跳转到nacos登陆界面 尝试默认口令:nacos/nacos、test/123456、nacos/123456均失败,未授权添加用户以及获取用户名口令均失败、尝试jwt绕过登录等等也都失败…… 用刚刚反编译jar获取到的口令进行尝试,在尝试了几个之后,成功跳转到后台 随即: 有配置就有东西,直接翻找配置文件,找敏感信息、同样发现了redis、MySQL等连接信息、还有短信云服务的ak/sk、这些AK/SK大多都是可接入存储桶什么的、但是没东西,也没有云主机…… 4.通用型口令进后台 从nacos系统获取到的敏感信息继续添加到密码本中,继续找别的端口,发现了某端口下开放着和目标站点一模一样的系统界面,利用收集到的口令(密码本)尝试进行登陆供应商的系统: 尝试了几个之后。。成功以收集到的强口令登陆该系统 在某档案管理处发现4w+个人信息(身份证、手机、姓名、地址、病历等等) 在系统用户中找到3K+个人信息 翻找系统用户列表还发现系统用户还存在一个manager用户、但是默认管理员admin账户未找到,怀疑是系统开发商留下的默认用户admin,密码稍微有点复杂,大小写字母+数字+特殊符号组合。尝试利用该口令登陆该IP资产下的其它相同系统,均登录成功分别为1w+、14w+、5w+、24w+等众多敏感信息,均为不同的医院 根据每个系统的特点以及信息数量可以得到,系统存在开发商管理员用户名:admin和manager,且口令为开发商初始默认口令 5.从供应商到目标站 根据前期收集到的信息,直接以初始口令登录此次hw目标站点成功打入后台,先是1K+信息 在系统管理-用户管理中同样发现存在manager用户直接以默认口令尝试登陆 获取5K+敏感信息,查看接口可获取到未脱敏信息 6.afrog批量POC 前期fofa找出来的结果,大概100+系统用afrog编写批量爆破poc尝试登陆,result=1就是登录成功;afrog、就是快、准、狠 粗略估计一下,大概100w左右的数据,永远永远的好起来了…… 7.redis-供应商内网 根据前期获取到的redis口令,登陆redis成功,并且为root权限,尝试写入公钥getshell老样子,先用xshell生成公钥,将此公钥复制到liqun工具箱中,直接进行写入即可 在连接的时候踩坑了,因为目标主机开放的ssh端口过多,其中一个端口44622写入失败,换一个端口44722写入成功了。 接下来就是内网常规操作了…… ...

    2023-10-16 194
  • 如何在Arch Linux上安装和使用Yay

    Yay 是最流行的 AUR 助手之一,用于处理 Arch 用户资源库中的软件包。学习在 Arch Linux 中安装它。 你可以在 Arch 用户仓库Arch User Repository(AUR)中找到社区成员打包的大量软件。 由于它来自第三方,纯粹主义者建议从 AUR 手动下载并构建每个所需的包。 但这是一项乏味的任务,这就是为什么会有 AUR 助手来避免麻烦。 Yay 是最受欢迎的 AUR 帮助程序之一,在本教程中,我将分享如何在 Arch Linux 上安装 Yay。我还将分享一些有关使用 Yay 管理 AUR 包的技巧。 ? Yay 可在 Manjaro 的仓库中找到。因此,Manjaro 用户只需使用 pacman -S yay即可安装 在 Arch Linux 上安装 Yay 在继续安装 Yay 之前,你需要一些构建它所需的软件包。 让我把它分成几个步骤。 步骤 1:安装必备包 首先刷新包缓存并更新系统是一个好主意: sudo pacman -Syu 安装所需的 base-devel(包含makepkg等工具)和git(克隆 yay 的 Git 仓库所需的)。 sudo pacman -S --needed base-devel git 使用 --needed标志,它不会重新安装已经安装的软件包。 它看起来是这样的: 现在你已经有了所需的软件包,是时候在你的系统上安装 Yay。 步骤 2:克隆 Yay Git 仓库并切换到它 使用 git 命令“克隆” Yay 仓库。你可以在系统中的任何位置执行此操作,无论是主目录还是其他目录。 git clone https://aur.archlinux.org/yay.git 完成后,切换到克隆的目录: cd yay 终于可以安装 Yay 了。 步骤 3:安装 Yay 事实上,你是在构建它。你将在此处看到 PKGBUILD文件。使用以下命令从此处构建包: makepkg -si 按照屏幕上的说明进行操作。当系统要求你确认时,按 Y。 该过程完成后,通过检查其版本来验证 Yay 是否已成功安装。 yay --version 现在你已经成功安装了它,你可以删除克隆的 Yay Git 仓库。不再需要它了。 使用 Yay 进行包管理 Yay 遵循与 pacman类似(但不相同)的命令结构。所以你用 Yay 管理 AUR 包应该不难。 搜索软件包: yay search_term 安装软件包: yay -S package_name 删除软件包: yay -R package_name 要删除包及其依赖项: yay -Rns package_name 仅升级 AUR 包: yay -Sua Yay 还能够升级非 AUR 软件包。上面的 a标志将其限制为 AUR。 将 Yay 升级到新版本 现在,你可能想知道如何将 Yay 升级到可用的新版本。 答案是你不需要做任何特别的事情。当你运行以下命令时,Yay 可以自行更新: yay -Sua 从 Arch 系统中删除 Yay 如果你不喜欢 Yay 或不再需要它,你可以使用 pacman命令像删除任何其他软件包一样删除它: sudo pacman -Rs yay 总结 这是对 Yay AUR 助手的快速介绍。你可以访问其 GitHub 仓库以了解有关其工作的更多详细信息。 Arch 用户仓库(AUR)是为什么有些人喜欢使用 Arch Linux的原因之一。 虽然纯粹的 Arch 用户一般都会嘲笑 AUR,特别是 AUR 助手,但它们仍然因其提供的易用性而受到欢迎。 ...

    2023-10-15 192
  • Linux安装redis详细教程

    1、yum install安装redis源码安装所需工具 yum -y install gcc automake autoconf libtool make vim wget 2、下载并解压redis安装包 # 目录切换 cd /usr/local # 下载redis源码 wget http://download.redis.io/releases/redis-7.0.10.tar.gz # 解压redis源码 tar -zvxf redis-7.0.10.tar.gz 3、进入解压包并执行编译 # 进入解压包 cd redis-7.0.10 # 执行编译 make 4、执行安装并指定安装目录 make install PREFIX=/usr/local/redis 5、启动服务 前台启动 /usr/local/redis/bin/redis-server 后台启动 # 把redis解压包配置文件拷贝一份到安装目录下 cp /usr/local/redis-7.0.10/redis.conf /usr/local/redis/bin/ 修改 redis.conf 文件,把 daemonize no 改为 daemonize yes /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf 6、设置开机启动 添加开机启动服务 vim /etc/systemd/system/redis.service 复制粘贴以下内容: [Unit] Description=redis-server After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf PrivateTmp=true [Install] WantedBy=multi-user.target 设置开机启动 # 重新加载配置 systemctl daemon-reload # 重启redis服务 systemctl restart redis.service # 设置开机就启动redis服务 systemctl enable redis.service # redis-cli客户端设置软连接 ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis 7、redis服务操作命令 # 启动redis服务 systemctl start redis.service # 停止redis服务 systemctl stop redis.service # 重新启动服务 systemctl restart redis.service # 查看服务当前状态 systemctl status redis.service # 设置开机自启动 systemctl enable redis.service # 停止开机自启动 systemctl disable redis.service </div> ...

    2023-10-14 163
  • Windows安装MySQL数据库步骤

    浏览器输入网址:https://www.mysql.com/downloads下载MySQL软件包 根据图片安装MySQL软件 勾选同意,点击Next 选择只安装服务,然后点击Next 点击Execute 选择服务后点击Next 如图所示设置,点击Next 设置登录密码后,点击Next MySQL57是服务名称,可以根据爱好设置,点击Next 默认,点击Next 默认,点击Execute 点击finish,表示软件安装完成 找到软件目录下的bin目录 开始->计算机->属性->高级系统设置->环境变量 ,把mysql的bin目录加入到path 开始->cmd->输入登录账户和密码,看到如图界面,表示MySQL服务安装完成 注意:不同MySQL版本安装略有不同,但是总体大同小异,大家一起开始MySQL数据库的学习之旅吧! ...

    2023-10-14 172

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注