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

事情起因,是因为实验室有一台服务器的占用率从开机启动就是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)关系的数学定义: 在笛卡儿积中取出有实际意义的元组来构造关系。 关系也是…

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

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

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[…

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

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

从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;赢得了众多客户的信赖和好评。 一、专业团队&#…

UDP网络程序

上一章中&#xff0c;我们介绍了socket&#xff0c;以及TCP/UDP协议。这一章带大家实现几个UDP协议的网络服务。我们需要一个 服务端和一个客户端。 1.服务端实现 1.1socket函数 #include <sys/types.h> #include <sys/socket.h>int socket(int domain, in…

Linux——十个槽位,RWX

Linux——RWX 十个槽位 - 表示文件 d 表示文件夹 l 表示软链接 r权&#xff0c;针对文件可以查看文件内容 针对文件夹&#xff0c;可以查看文件夹内容&#xff0c;如ls命令 w权&#xff0c;针对表示可以修改此文件 针对文件夹&#xff0c;可以在文件夹内&#…

Qt案例 通过调用Setupapi.h库实现对设备管理器中设备默认驱动的备份

参考腾讯电脑管家-软件市场中的驱动备份专家写的一个驱动备份软件案例&#xff0c;学习Setupapi.h库中的函数使用.通过Setupapi.h库读取设备管理器中安装的设备获取安装的驱动列表&#xff0c;通过bit7z库备份驱动目录下的所有文件. 目录导读 实现效果相关内容示例获取SP_DRVIN…

Scikit-learn 快速入门篇

Sklearn 简介 scikit-learn (sklearn) 是 Python 中用于机器学习的最流行的库之一。它提供了一系列有效的算法和工具&#xff0c;涵盖各种机器学习任务&#xff0c;包括&#xff1a; 分类回归聚类降维模型选择数据预处理 Sklearn 六大模块 分类&#xff1a;预测离散类别 算…

分布式强化学习

标题 易混淆概念联邦学习与强化学习1&#xff09;联邦学习应用于强化学习2&#xff09;强化学习应用于联邦学习 时空图卷积网络&#xff08;ST-GCN&#xff09;基本概念结合训练 易混淆概念 DistributionalRL是分布RL&#xff0c;不是分布式RL。分布RL是把Q值从一个期望构建成…

2024-4-10 群讨论:JFR 热点方法采样实现原理

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信拉你 什么是 JFR 热点方法采样&#xff0c;效果是什么样子&#xff1f; 其实对应的就是 jdk.ExecutionSample 和 jdk.NativeMethodSample 事件 这两个事件是用来采样的&#xff0c…

睿尔曼复合机器人之底盘操作流程

以操作流程为例&#xff0c;介绍底盘的操作流程。 开机&#xff1a;长按电源按钮&#xff0c;蜂鸣器短响两声&#xff0c;当第三声变长鸣后松开&#xff0c;等待机器开机。 使用&#xff1a; 建立通讯&#xff1a;主要采用无线WiFi与底盘进行通讯连接 无线连接方式&#xff…

副业天花板流量卡推广,小白也可轻松操作

在如今的互联网时代&#xff0c;手机已经不仅仅是一款工具&#xff0c;更像是我们生活中的一部分&#xff0c;那么手机卡也是必需品&#xff0c;但存在的问题就是:很多手机卡的月租很贵&#xff0c;流量也不够用。所以大家都在寻找一个月租低&#xff0c;流量多的卡&#xff0c…