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

事情起因,是因为实验室有一台服务器的占用率从开机启动就是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 = 0x00000000006074F0ans=[]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.mzph.cn/news/811255.shtml

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

相关文章

OSCP靶场--Peppo

OSCP靶场–Peppo 考点(ident枚举服务用户名ssh登陆rbash绕过 docker提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.158.60 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-10 09:32 EDT Nmap scan report…

使用 Docker 部署 Linux-Command 命令搜索工具

1)介绍 Linux-Command GitHub:https://github.com/jaywcjlove/linux-command Linux-Command 仓库搜集了 580 多个 Linux 命令,是一个非盈利性的仓库,生成了一个 Web 网站方便使用,目前网站没有任何广告,内…

T2.数据库原理

2.1 关系模型概述 1.域 域: 一组有相同数据类型的值得集合 2.笛卡尔积 笛卡尔积: 设任意的N个域D1,D2,…,Dn。 3、关系的定义和性质 (1)关系的数学定义: 在笛卡儿积中取出有实际意义的元组来构造关系。 关系也是…

设计模式学习笔记 - 设计模式与范式 -行为型:15.命令模式:如何利用命令模式实现一个游戏后端架构

概述 行为型设计模式只剩下3个模式了,它们分别是:命令模式、解释器模式、中介模式。这 3 个设计模式使用频率低、理解难度大,只在特定的应用场景下才会用到,所以这 3 个设计模式你只需要稍微了解即可。 本章学习其中的命令模式。…

C++11 数据结构1 线性表的概念,线性表的顺序存储,实现,测试

一 线性表的概念 线性结构是一种最简单且常用的数据结构。 线性结构的基本特点是节点之间满足线性关系。 本章讨论的动态数组、链表、栈、队列都属于线性结构。 他们的共同之处,是节点中有且只有一个开始节点和终端节点。按这种关系,可以把它们的所有…

双指针问题的常见剪枝

双指针问题的常见剪枝: 一.leecode第15题: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a b c 0 ?请找出所有和为 0 且 不重复 的三元组。 示例 1&…

力扣376 摆动序列 Java版本

文章目录 题目描述代码 题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, …

leetcode每日一题第四十六天

递归解法 class Solution { public:int search(vector<int>& nums, int target) {return midsearch(nums,target,0,nums.size()-1);}int midsearch(vector<int>& nums, int target, int low,int high){if(low < high){int mid (lowhigh) / 2;if(nums[…

深入了解Fcgiwrap:使CGI脚本与Nginx无缝集成

在Web开发的世界中&#xff0c;CGI&#xff08;Common Gateway Interface&#xff09;是一种早期的服务器端脚本技术&#xff0c;它允许客户端传输信息给应用程序&#xff0c;并获得应用程序返回的响应。随着时间的推移&#xff0c;更高效的解决方案如PHP、Python和Node.js等脚…

【实践篇】RabbitMQ实现队列延迟功能汇总

前言 记录下RabbitMQ实现延迟队列功能的所有实践内容。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 一、安装RabbitMQ 开启RabbitMQ的WEB管理功能。-CSDN博客 二、实现延迟队列的两种方式 RabbitMQ实现延迟队列的两种方式。-CSDN博客 三、实践文…

ChatGLM2-6B_ An Open Bilingual Chat LLM _ 开源双语对话语言模型

ChatGLM2-6B_ An Open Bilingual Chat LLM _ 开源双语对话语言模型 文章目录 ChatGLM2-6B_ An Open Bilingual Chat LLM _ 开源双语对话语言模型一、介绍二、使用方式1、环境安装2、代码调用3、从本地加载模型 4、API 部署 三、低成本部署1、模型量化2、CPU 部署3、Mac 部署4、…

在Windows 10中打开PowerShell的几种方法,总有一种适合你

PowerShell是一种比命令提示符更强大的命令行shell和脚本语言。自Windows10发布以来,它已成为默认选择,并且有许多方法可以打开它。 PowerShell和命令提示符之间的区别是什么 PowerShell的使用更复杂,但它比命令提示符强大得多。这就是为什么它成为超级用户和it专业人员的…

指针全套知识

一&#xff0c;指针基础 指针是C语言中的一种重要数据类型&#xff0c;主要用于存储内存地址。以下是一些关于指针的基本知识&#xff1a; 1. **指针的定义**&#xff1a;指针是一种特殊类型的变量&#xff0c;用于存储内存地址。指针变量的定义形式为 <数据类型> *<…

从0开始创建单链表

前言 这次我来为大家讲解链表&#xff0c;首先我们来理解一下什么是单链表&#xff0c;我们可以将单链表想象成火车 每一节车厢装着货物和连接下一个车厢的链子&#xff0c;单链表也是如此&#xff0c;它是将一个又一个的数据封装到节点上&#xff0c;节点里不仅包含着数据&…

防错设计及原理

目录 1、防错的作用 2、防错的原理 2.1断根原理 2.2保险原理 2.3自动原理 2.4相符原理 2.5顺序原理 2.6隔离原理 2.7层别原理 2.8复制原理 2.9警告原理 2.10缓和原理 防错法&#xff08;Poka-Yoke&#xff09;&#xff0c;又称愚巧法、防呆法&#xff0c;是一种在作…

C++ 类和对象(一)

目录 0.前言 1.面向过程&面向对象 1.1面向过程编程&#xff08;PP&#xff09; 1.2面向对象编程&#xff08;OOP&#xff09; 1.3从C到C 2.类的引入 2.1C语言中的结构体 2.2C中类的引入 2.3结构体与类的区别 2.4为什么引入类 3.类的定义 3.1声明与定义不分离 …

Blast生态借贷协议Pac Finance陷“清算”风波,兄弟项目ParaSpace曾上演内斗

Blast生态协议又出事了。4月11日晚间&#xff0c;有用户发现借贷协议Pac Finance上出现了大量ezETH清算&#xff0c;涉及金额达2400 万美元。官方回应称&#xff0c;系一位智能合约工程师的操作导致Pac Finance发行清算阈值在没有事先通知团队的情况下被意外更改。 目前社区内…

【MATLAB源码-第8期】基于matlab的DPSK的误码率仿真,差分编码使用汉明码(hanming)。

1、算法描述 差分相移键控常称为二相相对调相&#xff0c;记作2DPSK。它不是利用载波相位的绝对数值传送数字信息&#xff0c;而是用前后码元的相对载波相位值传送数字信息。所谓相对载波相位是指本码元初相与前一码元初相之差。差分相移键控信号的波形如概述图所示。 假设相对…

元宇宙漫谈|下一代社交平台是什么样子?

社交是人类历史上极为关键的社会活动&#xff0c;它必不可缺&#xff0c;方式也在不断变化。互联网和通信技术的盛行&#xff0c;带来的是以信息、电话、视频等交流模式的迭代。随即&#xff0c;社交媒体也开始蓬勃发展&#xff0c;成为主要承载大众注意力价值的载体&#xff0…

C++类引用的好处

简化代码&#xff1a;引用可以简化代码&#xff0c;使其更加易读和易懂。通过使用引用&#xff0c;可以避免在函数参数中复制大型对象&#xff0c;从而提高代码的效率和性能。 传递大型对象的效率高&#xff1a;使用引用作为函数参数传递大型对象时&#xff0c;不需要进行对象…