TinyShell后门通信模型剖析

TinyShell后门通信模型剖析

通过对TinyShell后门的外联通信函数进行剖析,梳理其通信过程如下:

  • 调用gettimeofday函数及getpid函数获取当前时间tv及进程pid,将tv和pid作为SHA1算法的输入,生成得到20字节的IV1数据
  • 调用gettimeofday函数及pid++获取tv及pid,将tv和pid作为SHA1算法的输入,生成得到20字节的IV2数据
  • 使用socket套接字发送40字节的IV1+IV2数据
  • 提取内置的key字符串信息(tsh.h文件中的secret数据)
  • 初始化发送数据及接收数据的session key信息
    • 将key字符串信息及IV1数据作SHA1运算,取16字节作为发送数据时AES算法的AES key
    • 将key字符串信息及IV2数据作SHA1运算,取16字节作为接收数据时AES算法的AES key
    • 取IV1数据的前16字节作为第一次发送数据时的AES iv
    • 取IV2数据的前16字节作为第一次接收数据时的AES iv
  • 控制端与被控端相互发送内置的challenge数据(\x58\x90\xAE\x86\xF1\xB9\x1C\xF6\x29\x83\x95\x71\x1D\xDE\x58\x0D),用于校验通信是否建立成功
  • 发送数据时,每16字节进行一次AES运算,前16字节的加密结果将作为第二段数据加密的IV值
  • 通信数据结构
    • 2字节数据:后续实际载荷长度
    • 实际载荷数据

实际通信数据包截图如下:

实际通信数据包案例剖析:

#************第一个通信数据包   tsh -> tshd
b1180d0d0b5c3cd49366af469c313586e29bd96111bae610609d82c733f8b10767e4b0627570ce5fb1180d0d0b5c3cd49366af469c313586e29bd961    #IV1
11bae610609d82c733f8b10767e4b0627570ce5f    #IV2b1180d0d0b5c3cd49366af469c313586    #初始send_aes_iv
11bae610609d82c733f8b10767e4b062    #初始recv_aes_iv#************计算send_aes_key
#74696E797368656C6C对应内置的key字符串信息tinyshell
74696E797368656C6C + b1180d0d0b5c3cd49366af469c313586e29bd961a13e91013d7f4a3ef3a149467af680262c45b141    #SHA1运算结果a13e91013d7f4a3ef3a149467af68026    #send_aes_key#************计算recv_aes_key
74696E797368656C6C + 11bae610609d82c733f8b10767e4b0627570ce5f0813d1deba152c1d2c6dc774293c18ff86f3239b    #SHA1运算结果0813d1deba152c1d2c6dc774293c18ff    #recv_aes_key#************第二个通信数据包   tsh -> tshd
4ff6ac2d77894dbe5355e773c0a6216c8b6fba90ac890c125424c9f3bce4c021cbd0eefd4ea658a45ecfcd49a4efa95177da55e800105890ae86f1b91cf6298395711dde580d    #AES解密数据
0010    #载荷长度
5890ae86f1b91cf6298395711dde580d    #内置的challenge校验数据#************第三个通信数据包   tshd -> tsh
16516b60fd4b37c540ec7ad3902830c8332393f5a22187147c7cc72e60943c0e36b8a4851cdae3b5058b56af7eed56533743930c00105890ae86f1b91cf6298395711dde580d    #AES解密数据
0010    #载荷长度
5890ae86f1b91cf6298395711dde580d    #内置的challenge校验数据

模拟构建通信解密程序

为了更便利的对TinyShell后门的通信数据进行解密,笔者尝试编写了一个解密程序,可对TinyShell后门通信数据进行批量解密,解密效果如下:

 自动化脚本输入文件格式如下:(备注:直接从wireshark导出”C Arrays“数据即可)

代码实现

代码结构截图如下

 

  • main.go
  • package mainimport ("awesomeProject5/common""encoding/hex""fmt""io/ioutil""strings"
    )func main() {key := "tinyshell"// 读取文件的所有内容content, err := ioutil.ReadFile("C:\\Users\\admin\\Desktop\\1.txt")if err != nil {fmt.Println("Error reading file:", err)return}data := string(content)data = strings.ReplaceAll(data, "\n0x", "0x")datas := strings.Split(data, "\n")lable := strings.Split(datas[0], "_")[0]//fmt.Println(lable)firstdata := strings.ReplaceAll(strings.Split(strings.Split(datas[0], " };")[0], "*/0x")[1], ", 0x", "")firstdata_hex, _ := hex.DecodeString(firstdata)if len(firstdata_hex) == 40 {send_aes_key := []byte{}recv_aes_key := []byte{}send_iv := []byte{}recv_iv := []byte{}send_aes_iv := []byte{}recv_aes_iv := []byte{}send_iv = append(send_iv, firstdata_hex[:20]...)recv_iv = append(recv_iv, firstdata_hex[20:]...)send_aes_iv = append(send_aes_iv, send_iv[:16]...)recv_aes_iv = append(recv_aes_iv, recv_iv[:16]...)send_aes_key = append(send_aes_key, common.CalculateSHA1(append([]byte(key), send_iv...))[:16]...)recv_aes_key = append(recv_aes_key, common.CalculateSHA1(append([]byte(key), recv_iv...))[:16]...)fmt.Println("send_aes_key:", hex.EncodeToString(send_aes_key))fmt.Println("recv_aes_key:", hex.EncodeToString(recv_aes_key))fmt.Println("send_aes_iv:", hex.EncodeToString(send_aes_iv))fmt.Println("recv_aes_iv:", hex.EncodeToString(recv_aes_iv))decryptedText := []byte{}for _, str := range datas[1:] {if str == "" {break}buf := strings.ReplaceAll(strings.Split(strings.Split(str, " };")[0], "*/0x")[1], ", 0x", "")hex_buf, _ := hex.DecodeString(buf)if strings.HasPrefix(str, lable) {fmt.Println("************send************")fmt.Println("Raw Data:", hex.EncodeToString(hex_buf))common.Decrypt_msg(hex_buf, send_aes_key, &send_aes_iv)} else if strings.HasPrefix(str, "char peer") {fmt.Println("************recv************")fmt.Println("Raw Data:", hex.EncodeToString(hex_buf))common.Decrypt_msg(hex_buf, recv_aes_key, &recv_aes_iv)fmt.Println(hex.EncodeToString(decryptedText))fmt.Println(string(decryptedText))}}}
    }
    
  • common.go
    package commonimport ("crypto/aes""crypto/cipher""crypto/sha1""encoding/hex""fmt"
    )func Decrypt_msg(ciphertext []byte, aeskey []byte, aes_iv *[]byte) {total_len := 0blk_len := 0for {//前两字节为buffer长度tmp := []byte{}tmp = append(tmp, ciphertext[total_len:total_len+16]...)output, _ := DecryptAES(ciphertext[total_len:total_len+16], aeskey, *aes_iv)*aes_iv = tmpplaintext_len := (int(output[0]) << 8) + int(output[1])if (plaintext_len+2)%16 > 0 {blk_len = ((plaintext_len+2)/16+1)*16 + 20total_len = total_len + blk_len} else {blk_len = ((plaintext_len+2)/16)*16 + 20total_len = total_len + blk_len}if blk_len > 0x24 {aa := decrypt_pel_msg(ciphertext[total_len-blk_len+16:total_len-20], aeskey, aes_iv)output = append(output, aa...)buffer := []byte{}buffer = append(buffer, output[2:plaintext_len+2]...)fmt.Println("hex:", hex.EncodeToString(buffer))fmt.Println("string:", string(buffer))} else {buffer := []byte{}buffer = append(buffer, output[2:plaintext_len+2]...)fmt.Println("hex:", hex.EncodeToString(buffer))fmt.Println("string:", string(buffer))}if len(ciphertext) == total_len {return}}
    }func decrypt_pel_msg(ciphertext []byte, aeskey []byte, aes_iv *[]byte) (plaintext []byte) {if len(ciphertext)%16 == 0 {blocks := len(ciphertext) / 16buffer := []byte{}for i := 0; i < blocks; i++ {tmp := []byte{}tmp = append(tmp, ciphertext[16*i:16*(i+1)]...)output, _ := DecryptAES(ciphertext[16*i:16*(i+1)], aeskey, *aes_iv)*aes_iv = tmpbuffer = append(buffer, output...)}plaintext = append(plaintext, buffer...)}return
    }func DecryptAES(ciphertext, key, iv []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}if len(ciphertext) < aes.BlockSize {return nil, fmt.Errorf("ciphertext too short")}if len(ciphertext)%aes.BlockSize != 0 {return nil, fmt.Errorf("ciphertext is not a multiple of the block size")}mode := cipher.NewCBCDecrypter(block, iv)mode.CryptBlocks(ciphertext, ciphertext)return ciphertext, nil
    }func CalculateSHA1(input []byte) []byte {hasher := sha1.New()hasher.Write(input)hashBytes := hasher.Sum(nil)return hashBytes
    }

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

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

相关文章

OpenHarmony实战开发-使用通用事件、焦点事件

基本概念 焦点 指向当前应用界面上唯一的一个可交互元素&#xff0c;当用户使用键盘、电视遥控器、车机摇杆/旋钮等非指向性输入设备与应用程序进行间接交互时&#xff0c;基于焦点的导航和交互是重要的输入手段。 默认焦点 应用打开或切换页面后&#xff0c;若当前页上存在…

工业异常检测

工业异常检测在业界和学界都一直是热门&#xff0c;近期其更是迎来了全新突破&#xff1a;与大模型相结合&#xff01;让异常检测变得更快更准更简单&#xff01; 比如模型AnomalyGPT&#xff0c;它克服了以往的局限&#xff0c;能够让大模型充分理解工业场景图像&#xff0c;判…

SpringMVC基础篇(四)

文章目录 1.视图1.基本介绍1.视图介绍2.为什么需要自定义视图 2.自定义视图实例1.思路分析2.代码实例1.view.jsp2.接口3.配置自定义视图解析器springDispatcherServlet-servlet.xml4.自定义视图MyView.java5.view_result.jsp6.结果展示 3.自定义视图执行流程4.自定义视图执行流…

比较美观即将跳转html源码

源码介绍 比较美观即将跳转html源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码截图 比较美观的一个跳转界面&#xff0c;修改方法如上&…

Vitis HLS 学习笔记--AXI4 主接口

目录 1. 简介 2. 认识MAXI 3. MAXI突发操作 3.1 全局/本地存储器 3.2 MAXI优势与特点 3.3 查看MAXI报告 3.3.1 HW Interfaces 3.3.2 M_AXI Burst Information 3.4 MAXI 资源消耗 4. 理解 Volatile 4.1 标准C/C中的 volatile 4.2 HLS 中的 volatile 5. 总结 1. 简介…

idea中使用GlassFish服务器启动项目

idea中使用GlassFish服务器进行测试 1.项目背景 当前在研究openMDM项目, 不过该项目不是springboot项目, 并且是使用GlassFish进行war部署的, 但是需要在idea中进行项目的二次开发,故需要进行idea启动项目并且进行开发和调试 2.GlassFish是什么 GlassFish是一个web服务器, …

ROS学习笔记(14)拉普拉斯变换和PID

0.前提 近些时间在对睿抗的ROS仿真赛进行小组安排&#xff0c;对小组成员进行了一些安排&#xff0c;也要求他们以本次比赛写下自己的比赛经历博客&#xff0c;他们的培训由我来安排和负责&#xff0c;因此我得加吧油&#xff0c;起码保证我的进度得快过他们&#xff0c;才能安…

图像处理技术与应用(三)

图像处理技术与应用入门 图像信息 切片 from skimage import io # 使用 io.imread() 函数来读取图像 img io.imread(cc.jpg) ] roi img[100:5000, 500:1780] # 显示ROI区域 io.imshow(roi) io.show() # 显示图像 红色文字段定义感兴趣的区域&#xff08;ROI&#xff09…

ArcGIS基础:便捷分享图层包和地图包

1、分享图层包&#xff1a; 首先&#xff0c;选中要分享的数据&#xff0c;右键创建图层包&#xff0c;修改保存路径。 找到项目描述那一栏&#xff0c;将摘要、标签、描述都填写分享图层包的相关内容。 一切设置好之后&#xff0c;点击右上角的【分析】按钮。 点击分析之后…

【PyTorch与深度学习】2、PyTorch张量的运算API(上)

课程地址 最近做实验发现自己还是基础框架上掌握得不好&#xff0c;于是开始重学一遍PyTorch框架&#xff0c;这个是课程笔记&#xff0c;这个课还是讲的简略&#xff0c;我半小时的课听了一个半小时。 1. 张量 1.1 张量操作 &#xff08;1&#xff09;chunk&#xff1a;将一…

蓝桥杯ctf2024 部分wp

数据分析 1. packet 密码破解 1. cc 逆向分析 1. 欢乐时光 XXTEA #include<stdio.h> #include<stdint.h> #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2)(y>>3^z<<4))^((sum^y)(key[(p&3)^e]^z))) void btea(unsigned int* v…

Linux软件包管理器——yum

文章目录 1.什么是软件包1.1安装与删除命令1.2注意事项1.3查看软件包1.3.1注意事项&#xff1a; 2.关于rzsz3.有趣的Linux下的指令 -sl 1.什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一…

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品&#xff0c;完全没想到热度很高&#xff0c;很多读者对这份数据都有比较浓厚的兴趣&#xff0c;在这里首先感谢各位读者的大力支持与鼓励&#xff0c;给了我持续更新…

单路双电源三态控制的电平转换总线收发器AiP74LVC1T45

AiP74LVC1T45框图 AiP74LVC1T45引脚定义 AiP74LVC1T45丝印 概述 AiP74LVCH1T45是一个双电源带三态控制的总线收发器&#xff0c;具有3状态输出&#xff0c;可实现双向电平转换。它们具有两个1位输入输出端口(A和B)&#xff0c;一个方向控制输入(DIR)和双电源引脚(VCC(A)和VCC(…

C语言 | Leetcode C语言题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; #define max(a, b) (((a) > (b)) ? (a) : (b))bool canJump(int* nums, int numsSize){int cover 0;int i;// 只可能获取cover范围中的步数&#xff0c;所以i<coverfor(i 0; i < cover; i) {// 更新cover为从i出发能到达的最大…

idea No versioned directories to update were found

idea如何配置svn以及svn安装时需要注意什么 下载地址&#xff1a;https://112-28-188-82.pd1.123pan.cn:30443/download-cdn.123pan.cn/batch-download/123-820/3ec9445a/1626635-0/3ec9445a25ba365a23fc433ce0c16f34?v5&t1714358478&s171435847804276f7d9249382ba512…

Linux:浏览器访问网站的基本流程(优先级从先到后)

浏览器访问网站的基本流程&#xff08;优先级从先到后&#xff09; 首先查找浏览器是否存在该网站的访问缓存 其次查找本机的域名解析服务器 windows&#xff1a;C:\Windows\System32\drivers\etc\hostsLinux&#xff1a;/etc/hosts 使用外部的域名解析服务器解析&#xff…

LMDeploy 量化部署 LLM-VLM 实践 学习笔记

视频链接 https://www.bilibili.com/video/BV1tr421x75B/?vd_sourcea1ce254b4a97f9f687a83e661793cb2c 什么是模型部署 部署指的是已经开发好的大模型投入使用&#xff0c;要把模型部署到服务器或者移动端里&#xff0c;如何在有限的资源里加载大模型&#xff1f; 比如你好不…

网络安全 SQLmap-tamper的使用

目录 使用SQLmap Tamper脚本 1. 选择合适的Tamper脚本 2. 在命令行中使用Tamper脚本 3. 组合使用Tamper脚本 4. 注意和考虑 黑客零基础入门学习路线&规划 网络安全学习路线&学习资源 SQLmap是一款强大的自动化SQL注入和数据库取证工具。它用于检测和利用SQL注入漏…

计算机网络之传输层TCP\UDP协议

UDP协议 用户数据报协议UDP概述 UDP只在IP数据报服务之上增加了很少功能&#xff0c;即复用分用和差错检测功能 UDP的主要特点&#xff1a; UDP是无连接的&#xff0c;减少开销和发送数据之前的时延 UDP使用最大努力交付&#xff0c;即不保证可靠交付&#xff0c;可靠性由U…