【应急响应事件】记一次矿机木马事件

news2024/11/25 15:40:19

事情起因,是因为实验室有一台服务器的占用率从开机启动就是100%,很怀疑就是中了某种矿机木马,拿去挖矿了,然后经过师兄的不懈努力,终于找到了木马文件,给他命名为virus_sample
然后我就拿着样本去逆了

木马分析

搜索一下main函数看下代码结构,看到一个诡异函数sub_400F7E

在这里插入图片描述

我们跟进一下,然后在这个函数里面看到诡异的fwrite,应该是在写一个错误信息

在这里插入图片描述

直接google搜索一下这串字符串

在这里插入图片描述

进去代码发现代码结构与IDA看到的基本上一致,那就可以大致确定了这就是shc加密了

在这里插入图片描述

在这里插入图片描述

找到了相关的博客

Obfuscated, Encrypted, Converted to C source:https://gist.github.com/NullArray/f39b026b9e0d19f1e17390a244d679ec

于是确定了这是一个shc加密shell脚本生成的二进制文件

shc加密shell脚本:文章链接

从资料看出来shc加密以后会生成三个文件

  • .sh源文件
  • .sh.x 加密后的二进制文件
  • .sh.x.c 脚本对应的c源码

我们自己尝试写一个来加密一下看一下。

在这里插入图片描述

此时生成的二进制文件只能通过 ./xxxx命令来执行

在这里插入图片描述

demo.sh.x.c分析

chkenv()

然后我们跟进到chkenv函数中

在这里插入图片描述

我们发现它首先会获取我们的pid,然后会让pid经过RC4以及一系列加密,最后保存到buff中。

这也就能解释我们在服务器中看到的隐藏进程为什么是一串十六进制数字(d4c46f88.service)

然后会让string等于buff的环境变量的值,这里肯定是没有的(因为经过加密后的进程名是一串十六进制数字,系统里面肯定没有这个环境变量),所以也就到了下面的if语句

在这里插入图片描述

通过sprintf函数,将"=mask argc"字符串写入了buff[l],又因为l是buff的长度,所以这里相当于直接在数组后面续写了进程的pid与参数个数

int putenv(char *string); 用于设置环境变量的值

  • string:一个以 “变量名=值” 格式表示的字符串,用于设置环境变量的名称和值。

char *strdup(const char *str); 用于创建一个字符串的副本。

  • str:要复制的字符串。

然后用了putenv函数给新产生进程名的字符串副本创建了对应的环境变量,这也就是为什么要用sprintf函数给这个字符串赋值为=xxx

此时当脚本再次执行的时候,因为string我们前面已经设置过变量了,所以此时string也就有了值,此时sscanf就会从string里面按照格式读取数据,然后如果获取的个数为2,且获取到的m和我们刚才获取的pid一致,就会调用rmarg函数来从环境变量数组中删除第一个数组。

下图为/proc/2030/environ 环境变量数组的内容

在这里插入图片描述

gets_process_name()

接下来又看到了它是如何获取我们的进程脚本的,直接通过proc/pid/cmdline就可以找到进程对应的脚本

在这里插入图片描述

用fread函数一个字符一个字符读取,读取的大小为procfile数组的大小,然后判断如果字符串最后一个字符是换行符的话就把其替换为字符串终止符。相当于将字符串截断到了换行符这里

下图是pid为2030的一个进程的命令行参数字符串

在这里插入图片描述

/usr/bin/dbus-daemon:这是可执行文件的路径。

--config-file=/usr/share/defaults/at-spi2/accessibility.conf:这是一个命令行选项,指定了配置文件的路径。参数值为 /usr/share/defaults/at-spi2/accessibility.conf

--nofork:这是一个命令行选项,表示进程在后台运行而不创建子进程。

--print-address:这是一个命令行选项,表示进程在启动时打印出其地址信息。

/proc/pid/cmdline 文件中,命令行参数字符串是以 null 字符(‘\0’)分隔的,而不是以换行符分隔的。

然而,有一种特殊情况可能导致在命令行参数字符串的末尾找到换行符。这种情况是当命令行参数中的某个参数值本身包含了换行符时。

#!/bin/bash
echo "Hello world!"

所以如果命令行的参数为上面的代码话,就会触发截断。

untraceable()

这个函数是用来使子进程来难以被跟踪和调试的

在这里插入图片描述

难以追踪和调试体现在

  1. 当前如果是子进程的话,就要获取其父进程的pid,然后将该进程的内存的路径写入proc变量

  2. 然后打开了/proc/pid/mem 打开 /proc 文件并进行读写操作可以干扰调试器的正常功能

  3. 然后立即关闭标准输入(fd=0的时候),也就是close(0),关闭标准输入会导致调试器无法通过标准输入与子进程进行交互,从而减少了调试的可能性。

  4. mine为子进程此时是否为不能跟踪状态,mine为真即表示不可跟踪的状态,然后调用kill函数(SIGCONT信号)来恢复子进程,如果mine为假,即表示子进程无法进入不可跟踪的状态,它会发送 SIGKILL 信号给父进程,从而强制终止父进程的执行。这样,调试器将无法继续跟踪父进程的执行。

xsh()

在这里插入图片描述

它首先会让me变量获取到自身的文件名,如果没有获得到就用getenv函数来获取环境变量。总之代码会首先获得到脚本的路径名。

而在Unix系统中,环境变量 _ 存储了当前程序的可执行文件的路径。通过调用 getenv("_"),可以获取该路径的字符串。

在这里插入图片描述

直接跳到隐藏这里,前面都是一些加密的代码

malloc会给scrpt分配一块4096+40字节大小的空间

代码会将scrpt指向的内存块的前4096个字节(hide_z的值)都设置为空格的ASCII值

memcpy将text中40字节的内容,复制到scrpt的第4097个字节,相当于此时scrpt的前4096个字节都是空格,只有后面的40个字节才是真正的数据

在这里插入图片描述

如果此时ret为假,则会将xecc格式化字符串以及me变量(自己脚本的路径)传入scrpt中

在这里插入图片描述

然后经过一系列的对varg参数赋值,最后调用了execvp函数执行了shll,并且varg作为参数。

远程debugger

现在在自己的机器上执行一下这个文件,用远程debugger一下。

就光执行了一下,就已经看到了删除了我很多的日志了。

在这里插入图片描述

先找到main函数,找到标志性字符串,分别给没有识别出来的函数重新命名一下

在这里插入图片描述

在这里插入图片描述

sub_401412函数是main函数

在这里插入图片描述

在这里插入图片描述

在ret处打断点,修改值

在这里插入图片描述

在这里插入图片描述

然后在这里打断点来获取shellcode

在这里插入图片描述

可以看到已经获取到了shellcode

在这里插入图片描述

用个脚本来获取一下

base = 0x000000000602B83
end = 0x00000000006074F0

ans=[]

for i in range(base,end):
    tmp = idc.get_wide_byte(i)
    ans.append(tmp)
    if(tmp == 0):
        print(bytes(ans))
        ans=[]

在这里插入图片描述

存到文件里面,文件名 shell.sh.tmp

shlll = b'xxx'

with open("shell.sh.tmp", "w") as f:
    print(shlll.decode(),file=f)

大致看了一下包含了删除日志、下载矿机、设置iptables等功能

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

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

相关文章

Centos7在线安装mysql5.7

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 安装Mysql yum源1、卸载旧环境2、下载mysql yum源3、上传到自己服务器1)、上传源2)、安装yum源3)、查看yum源是否安装成功 安装M…

【Java核心技术】第3章 Java的基本程序设计结构

1 数据类型 Java一共有8种数据类型: 4种整型 类型存储需求int4字节short2字节long8字节byte1字节 2种浮点型 类型存储需求float4字节double8字节 1种字符型 1种布尔型 2 变量声明 2.1 局部类型推断 如果可以从变量的初始值推断变量类型,只需要使用…

Linux网络基础2(下)

传输层 再谈端口号端口号的划分netstatpidof UDP协议 UDP的特点UDP缓冲区UDP使用注意事项UDP报头的理解基于UDP的应用层协议 TCP协议 4位首部长度16位窗口大小确认应答机制32位序号和32位确认序号6个标记位超时重传机制连接管理机制流量控制快重传机制再谈序号延迟应答面相字节…

Day16_学点儿JavaEE_实践_基于IDEA2023的简易JavaWeb项目、Tomcat输出乱码解决

0 JavaWeb项目目录 └──JavaWeb├──resources│ └──db.properties├──src│ └──com.sdust.web│ ├──servlet│ │ └──StudentServlet│ ├──pojo│ │ └──Student│ └──util│ └──JDBCUtil├──web│ ├──st…

电商技术揭秘十三:云计算在电商中的应用场景

相关系列文章 电商技术揭秘一:电商架构设计与核心技术 电商技术揭秘二:电商平台推荐系统的实现与优化 电商技术揭秘三:电商平台的支付与结算系统 电商技术揭秘四:电商平台的物流管理系统 电商技术揭秘五:电商平台…

百科引流攻略|小马识途分享百科营销的五个技巧

纵观整个互联网领域,国内几大巨头百度、抖音、腾讯都布局了自身的百科平台,百科营销也始终作为网络营销一个重要分支而存在。很多人都知道百科营销是品牌背书的一把王牌,但很少有人提及百科营销的引流作用。 有人可能会说,百科词条…

[数据结构]—二叉树基本概念

1.树概念及结构 1.树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&#xff…

老房改造系列--如何用一套流程接入所有业务线

ToB业务没有太多高并发的挑战,但同一套流程往往可能需要承载各种差异化的复杂业务需求,所以如何让系统具备良好的扩展性成为ToB业务系统最大的挑战。本文将详细讲述如何用一套流程接入所有业务线? 老系统改造不是一蹴而就的,从20…

【自用笔记】【大数据】

1 mapreduce (1)Map任务的数量:由输入数据的大小决定的,如文件数量和大小、HDFS块大小以及FileInputFormat的设置等。每个MapSlot可以运行一个Map任务 (2)Reduce任务的数量(分区数)&…

想走?可以!先买票--迭代器模式

1.1 乘车买票,不管你是谁! 售票员检查谁没有买票,把车厢里的人都遍历一遍。 1.2 迭代器模式 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示…

[CSS]布局

盒子就是把网站分割成一小块一小块的吧,然后方便移动或者管理 背景 属性名描述background-color设置元素的背景颜色。background-image设置元素的背景图片。背景图片与背景颜色同时设置时,则图片覆盖颜色。写法如下:background-image: url(&…

【洛谷 P4017】最大食物链计数 题解(深度优先搜索+动态规划+邻接表+记忆化搜索+剪枝)

最大食物链计数 题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。 题目描述 给你一个…

【Java核心技术】第4章 对象与类

1 面向对象 2 自定义类 形式: class ClassName { field // 字段 constructor // 构造器(构造函数) method // 方法 } 如: class Employee {private String name;private double salary;private LocalDate hireDay;public Emp…

【拓展技术】——AutoDL服务器训练Pycharm使用注意点Pycharm配置AutoDL

一、AutoDL服务器模型训练 AutoDL是一个为研究人员、开发者和企业提供的平台,它致力于提供一个高效、可靠和易用的环境,以支持复杂的计算任务和AI模型的部署: 高效的并行计算资源:AutoDL拥有强大的计算集群和高性能的计算节点&a…

MySOL之旅--------MySQL数据库基础( 2 )

本篇碎碎念:尽自己最大的努力,直到筋疲力尽为止,加油 今日份励志文案: 别人都在前进,我为什么要停下 目录 补上一条博客缺失的内容 常用数据类型 数值类型: 字符串类型: 日期/时间类型: 二进制类型: 其他类型: …

工业4G路由器SR500护航清远市智慧环卫项目

一、项目背景 随着智慧城市建设的不断推进,清远市政府高度重视城市环卫管理的智能化升级。由于清远地处山区,环卫作业路线长、工作环境复杂,有效监控和调度成为亟待解决的难题。 经过严格筛选,清远市最终选定了星创易联科技的SR500双网口4G工业路由器,与环卫车载智能终端配合使…

BM25和语言模型的改进研究

原文链接: BM25和语言模型的改进研究 摘要: 近期关于搜索引擎排名函数的研究报告指出,BM25和带Dirichlet平滑的语言模型有所改进。本研究通过在INEX 2009维基百科语料库上训练,然后在INEX 2010和9个TREC语料库上测试&#xff0…

ffmpeg命令与批处理编程

(一) CMD脚本查找所有文件 powershell与cmd转换 powershell与cmd虽然同为windows命令,但许多命令并不通用。 CMD换行符 a 在CMD下,可以用^作为换行符,类似于Linux下的\。举例如下: start pemu.exe ^ -net nic,vlan1,macaddr…

低功耗接地故障中断器D4145,无需任何电位计符合 U.L.943 标准,直接连接至SCR

概述: D4145 是交流电源插座接地故障中断器的低功率控制器。 在发生有 害或致命冲击前,这些器件检测是否有危险的接地情况,比如设备( 与 AC 线路反相连接) 与水以及与裸露电线接触。内含一个 26V 齐纳并联稳压 器、 一个运算放大器和一个…

实体抽取全解析:技术与实战

目录 一、前言二、实体抽取技术概览基于规则的实体抽取基于统计的实体抽取基于深度学习的实体抽取 三、实体抽取的发展历程早期的实体抽取方法基于规则和词典的方法基于特征的机器学习方法 深度学习时代的实体抽取从传统模型到神经网络序列标注模型的兴起预训练语言模型的革命 …