LokiBot家族静态分析过程分享

admin 2023年12月1日14:58:28评论9 views字数 5396阅读17分59秒阅读模式

LokiBot家族静态分析过程分享
免责声明
由于传播、利用本公众号听风安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号听风安全及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

公众号现在只对常读和星标的公众号才展示大图推送,

建议大家把听风安全设为星标,否则可能就看不到啦!

----------------------------------------------------------------------

LokiBot是一款著名的间谍木马,其通过垃圾邮件传播,窃取用户敏感数据,包括浏览器、电子邮箱、ftp、sftp密码及凭证。

LokiBot家族静态分析过程分享

静态分析程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。

动态分析:动态分析方法则需要运行计算机病毒。常用的分析工具有RegShot、Process Monitor、OllyDbg等。


本文通过静态分析技术,选取LokiBot家族样本进行分析,从而支撑防护规则建立。


1

样本选取

md5:b746f7a8313da0ee4bff88f56de64fe4062d485b1ee83c39ef5c86fbafe0b98d


LokiBot家族静态分析过程分享

ATT&CK技术使用情况:

LokiBot家族静态分析过程分享


2

查看静态特征

使用die判断基础文件信息:

LokiBot家族静态分析过程分享

通过标记出来的信息可以判断出文件的类型以及文件为.net文件。

.net文件逆向可以使用dnspy这个软件来查看源代码,但是在分析中发现这是壳,需要先进行脱壳以后才能进行进一步分析。

3

脱壳

通过对文件的基本分析发现该文件使用了壳保护。所以进行分析的话要先进行脱壳。

脱壳可以结合沙箱来进行脱壳,首先使用微步进行查看:          LokiBot家族静态分析过程分享

可以知道该样本使用了WriteProcessMemory函数

BOOL WriteProcessMemory(  [in]  HANDLE  hProcess,  [in]  LPVOID  lpBaseAddress,    目标地址  [in]  LPCVOID lpBuffer,     ;预备写入的地址    [in]  SIZE_T  nSize,        ;写入数据大小    [out] SIZE_T  *lpNumberOfBytesWritten);

作用:将数据写入指定进程中的内存区域。

通过查找确定了可疑函数,对该函数下硬件断点:

    LokiBot家族静态分析过程分享LokiBot家族静态分析过程分享


下完断点后点击运行到断点:

LokiBot家族静态分析过程分享

查看stdcall窗口,其中的由上到下对应的参数都是WriteProcessMemory的参数。主要关注的是2,3,4这三个参数,通过这三个参数可以判断出我们需要dump文件的起始地址以及文件大小。

以下是多次运行到改断点参数的值:

040AF0F8 40002887668 138000289B410 42000289F61C 2000289F828 2000

通过这些参数我们可以知道该文件的大小是1A000,通过savedata这个参数可以对文件进行dump.

savedata 1234,0x040AF0F8,0x1A000

savedata命令格式:文件名,起始地址,文件大小

LokiBot家族静态分析过程分享


将dump出的文件载入IDA中发现可以看到函数,说明成功了。

4

恢复函数名

该样本将函数名进行隐藏,只有当需要调用该函数时才会接收索引值以及API函数名称的的hash值作为参数进而将函数名恢复。

LokiBot家族静态分析过程分享


sub_40317B函数中存在一段这样的汇编代码,这是通过PEB获取kernel32.dll地址汇编代码的一部分,通过这块可以判断出

LokiBot家族静态分析过程分享

下面时parse_export_tbl的函数,两部份结合起来就是通过peb来获取函数名的过程。

LokiBot家族静态分析过程分享


这块就时hash解码的过程

LokiBot家族静态分析过程分享


通过上述分析我们知道了sub_4030A5函数的主要作用就是通过索引值以及函数名的hash值来查找函数的,我们想要获取相关函数名可以通过对这个命名函数的返回值下断点进而来跟踪,同时他会直接通过call eax来调用函数,而不是将函数名恢复后调用原函数,所以通过运行程序后dump程序无发恢复函数名。

LokiBot家族静态分析过程分享

这是一个恢复的函数,

LokiBot家族静态分析过程分享

LokiBot家族静态分析过程分享

通过上述的对比可以知道是直接通过调用函数来实现功能的,而不是将函数恢复或者存储到某个地方以后再运行的,属于调用哪个函数便恢复哪个函数,进而防止一次性恢复后全部dump出来。


通过上述分析我们确定了恢复函数名与调用的地方,但是我们知道该样本的函数名是用一次恢复一次需要多次动调,这样比较麻烦,对于这种恢复函数名我们有四种方案。

1.一个一个动调恢复(费人)

2.收集到所有的函数名hash值,然后自己分析解密函数,自己编写脚本恢复(大佬你们谁写了发我。。)。

3.在xdb64中编写脚本,直接输出函数名和调用地址。

https://blog.csdn.net/yan_star/article/details/113621948这个文章写了怎么编写python脚本,感兴趣可以去看看。

4.通过下条件断点,使得直接输出函数名和调用函数地址。

关键节点有两个1.4030c0中存储的是函数名称

LokiBot家族静态分析过程分享

从这个截图中可以看到三个信息,1.下条件断点的地址 2.条件断点的内容 3.函数名。通过这我们可以获得函数名


2.在403260处下条件断点,根据堆栈中的返回值我们可以知道哪个函数调用了该函数名恢复函数,进而方便我们后续恢复函数名。


LokiBot家族静态分析过程分享


这是几个输出列子,其中Loadllibrary是重复出现的,可以直接全文替换。

LokiBot家族静态分析过程分享


5

命令行参数检查

LokiBot家族静态分析过程分享

在执行操作前先判断命令行中是否存在“-u”如果存在则延迟10s执行。

6

网络初始化和互斥体创建

LokiBot家族静态分析过程分享

okibot 使用 Berkeley 兼容套接字进行通信,因此在使用其他网络功能之前先调用 WSAStartup()。
如果调用成功会根据机器的GUID创建互斥体。


LokiBot家族静态分析过程分享


LokiBot家族静态分析过程分享


互斥体用于保证机器上只有一个程序实列在运行。

7

窃取信息

在该函数中,首先构造两个数组,一个是全局变量充当标识符,还有一个包含实际窃取数据的列程。

LokiBot家族静态分析过程分享


查看第一个窃密函数,其中执行的操作是首先判断是否存在这个软件,然后根据不同的版本再进行对应的窃密操作。


LokiBot家族静态分析过程分享


包装函数会给每个窃密函数绑定一个全局变量标识符,这样在解析被盗数据时,C2 服务器将知道如何处理/存储它。


LokiBot家族静态分析过程分享


LokiBot家族静态分析过程分享

firefox browsericedragon browsersafari browserk-meleon browser seamonkey browserflock browserblackhawk browserlunascape browserbrowsers general dataopera browserqtweb internet browserqupzilla browserinternet exploreropera passwordscyberfox browserpale moon browserwaterfox browserpidgin passwordssuperputtyftpshellnotepadplusplusmyftpftpboxsherrod ftpftpnownexusfile ftpnetsarang xftpeasyftpsftpnetdriveableftpjasftpautomizeableftpcyberduckfullsyncftpinfolinasftpfilezillastaff ftpblazeftpfastream ftpgoftpestsoft alftpdeluxe ftpghisler wcx ftpftpgetterws ftpsite xml filesfull tilt pokerpokerstarsexpandrivesteedflash fxpinsoftware novaftpnetdriveghisler wcx ftpsmart ftpfar manager ftpbitvise bvsshclientvncmsecuresyncoveryfreshwebmaster freshftpbitkinexultrafxpftp nowsecurefxodin secure ftp expertnch software flingnch software classicftpkittyputtymozilla thunderbirdfoxmailpocomailincredimailgmail notifier prodesksoft checkmailwinftp clientwinscp32bitftpftp navigatorsoftwarenetz mailingoperamailpostboxmozilla fossamailmailbox ini filewinchips user accountoutlookymail2trojita imap clienttrulymailspn filesto dodeskliststickies images and rtfnotefly notesconceptworld notezillamicrosoft sticky noteskeepass databasesenpass db filesmy roboform1passwordmikrotik winbox


8

建立连接以及信息发送

LokiBot家族静态分析过程分享


该函数主要负责将获取的信息保存到缓存区,并且获取本机的一些信息然后一同打包发送。

LokiBot家族静态分析过程分享

先根据互斥体进行判断是否是同一个机器,接着获取操作系统版本信息。


LokiBot家族静态分析过程分享


LokiBot家族静态分析过程分享


LokiBot家族静态分析过程分享



获取一些与机器相关的信息:

LokiBot家族静态分析过程分享

复制数据到缓存区。

LokiBot家族静态分析过程分享


建立通信的函数。

9

抓包C2分析

前置环境搭建。

由于上线包建立connect需要返回值,所以修改kali的ip,将他当作一个c2服务器,进而进行连接请求时会返回一个值,可以获得上线包。

kali的设置:kali中直接修改ip地址,使得ip为目标c2的地址。

LokiBot家族静态分析过程分享

使用python3启动一个服务

LokiBot家族静态分析过程分享


在kali的设置中选择网络适配器,先添加一个LAN区段,然后将kali的LAN区段设置为该区段。


LokiBot家族静态分析过程分享


设置完成保存快照,以便后续恢复。


win7的设置:同理,将win7也设置为同一网段下的ip:

LokiBot家族静态分析过程分享


将win7的LAN段也设置为与kali相同的区段。

LokiBot家族静态分析过程分享


抓包获取上线包成功。

LokiBot家族静态分析过程分享

如果是域名的话修改windows的hosts文件

 C:WindowsSystem32driversetchosts

c2上线包详细分析

报文头的生成:

LokiBot家族静态分析过程分享


1.开始的两个值是[1,2],[3-4]定值,是直接传入的参数作为值输入

LokiBot家族静态分析过程分享


2.这部分的值前两个字节[1,2]代表的是是否是宽字节,宽字节则为1不是则为0,后面[3,6]个字节是表示的是后面字符串的长度,接着的[7,13]个字节表示是一个定值字符串:

LokiBot家族静态分析过程分享


3.这部分表示的值与第二部分的意义基本相同,[1,2]两个字节代表的是是否是宽字节,宽字节则为1不是则为0,后面4个字节[3,6]是表示的是后面字符串的长度,由于是宽字节则长度为本身字节长度的二倍,[7,20]这部分的值是用户的用户名。

LokiBot家族静态分析过程分享


4.这块的结构同上,表示主机名称

LokiBot家族静态分析过程分享


5.这块结构也同上代表的是域名

LokiBot家族静态分析过程分享

6.这两个字节表示的是屏幕的分辨率

LokiBot家族静态分析过程分享

7.这三个字符依次表示的是账户的权限,进程的权限以及系统的架构

LokiBot家族静态分析过程分享

8.这几个值是操作系统的版本号

LokiBot家族静态分析过程分享

9.这个k值是一个定值,他的前面是操作系统的版本号,他的值是k.r.o.t.i.k..W.i.n.b.o.x.的首字母,实际上完整字符是Mikrotik\winbox,由于存放操作系统版本号,所以将前4个字节覆盖了,定值

LokiBot家族静态分析过程分享

LokiBot家族静态分析过程分享

10.这几个值[1,2]由于是传入的定值参数,所以值为定值,紧跟着的[3,8]个字节直接填入0,最后四个字节[9,12]是获取的传入的a3的值,但由于该值赋值为0,所以最后四个字节也为0.

LokiBot家族静态分析过程分享

11.这段数据的结构与上述2,3,4,5结构一样,表示的是机器的GUID

LokiBot家族静态分析过程分享

12,这段数据[1,4]表示的是后面随机字符串的长度,[5,9]表示的是生成的字符串。

10

从凭证管理器窃取数据

该函数是LoKibot获取目标程序数据以后,尝试从 Windows Credential Manager 中窃取数据。

LokiBot家族静态分析过程分享

为了窃取凭证,Lokibot 将搜索以下目录中的所有文件。

LokiBot家族静态分析过程分享

下面是elevate_prives函数恢复函数名中的函数,可以知道

该函数的主要功能是提权。

LokiBot家族静态分析过程分享

find_file模块,根据传入的参数,先由CSIDL值标识的文件夹的路径或者扩展环境变量,接着根据路径查找文件。

LokiBot家族静态分析过程分享

LokiBot家族静态分析过程分享

最后将窃取的数据打包成一个新的报告数据包发向C2

11

持久化

为了持久化,Lokibot 将自身复制到%APPDATA%文件夹内的一个文件夹,创建一个新的运行密钥,并隐藏创建的目录和复制的可执行文件。

创建目录并复制原始可执行文件。

LokiBot家族静态分析过程分享

创建运行密钥并隐藏文件夹和可执行文件。

LokiBot家族静态分析过程分享

 参考链接 

https://jiuaidu.com/jianzhan/981416/(通过PEB获取函数值)

https://bbs.kanxue.com/thread-266678.htm

http://reversing.fun/posts/2021/06/08/lokibot.html

https://www.cnblogs.com/iBinary/p/16359195.html(X64Dbg 介绍->表达式)

原文始发于微信公众号(听风安全):LokiBot家族静态分析过程分享

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月1日14:58:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   LokiBot家族静态分析过程分享https://cn-sec.com/archives/2258925.html

发表评论

匿名网友 填写信息