攻击金融恶意软件僵尸网络面板 - SpyEye漏洞分析

本文深入分析了SpyEye僵尸网络控制面板的安全漏洞,包括明文传输、弱密码策略、SQL注入、XSS等多类漏洞,并探讨了法律与伦理问题。

Jump ESP, jump!: 攻击金融恶意软件僵尸网络面板 - SpyEye

这是“攻击金融恶意软件僵尸网络面板”系列的第二篇博客文章。在研究了Zeus之后,我的注意力转向了另一个老旧(且已消亡)的僵尸网络SpyEye。从IT安全的角度来看,SpyEye与Zeus共享许多漏洞。

以下报告基于SpyEye 1.3.45版本,该版本已老旧,如果我们幸运的话,整个SpyEye分支很快就会消亡。

查找SpyEye C&C服务器面板的Google搜索技巧

  • 如果img目录被索引,很容易搜索,例如:inurl:b-ftpbackconnect.png
  • 如果install目录被索引,同样容易,搜索例如:inurl:spylogo.png
  • 此外,如果你找到一个登录屏幕,检查css文件(style.css),如果你看到#frm_viewlogs#frm_stat#frm_botsmon_country#frm_botstat#frm_gtaskloader等类似内容,你可以确定你找到了它
  • 否则,最好不要通过Google搜索,而是获取一个SpyEye样本并进行分析

控制面板登录界面如下,并不复杂:

最棒的部分是你不需要猜测管理员的用户名 ;)

这是一个典型的控制面板外观:

Hack the Planet! :)

发现的乏味漏洞(警告,几乎是从Zeus博客文章复制而来)

  • 明文HTTP登录 - 你可以通过MiTM嗅探登录密码,或窃取会话cookie
  • 无密码策略 - 管理员可以设置非常弱的密码
  • 无防暴力破解 - 你可以尝试猜测管理员的密码。没有默认用户名,因为没有用户名处理!
  • 启用密码自动完成 - 乏味
  • 会话cookie缺少HttpOnly标志 - 与XSS结合时很有趣
  • 无CSRF保护 - 例如,你可以上传新的exe、bin文件,开启/关闭插件 :-( 乏味。此外,文件扩展名检查可以被绕过,但文件存储在数据库中,所以这次没有PHP shell。如果你检查以下代码,你可以看到即使检查了文件扩展名和类型,并显示错误,但上传过程继续。即使错误会停止上传过程,通过设置无效的$uptype也可以欺骗检查。干得好…
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if ($_FILES['file']['tmp_name'] && ($_FILES['file']['size'] > 0)) {
    $outstr = "<br>";
    set_time_limit(0);
    $filename = str_replace(" ","_",$_FILES['file']['name']);
    $ext = substr($filename, strrpos($filename, '.')+1);
    if( $ext==='bin' && $uptype!=='config' ) $outstr .= "<font class='error'>Bad CONFIG extension!</font><br>";
    if( $ext==='exe' && $uptype!=='body' && $uptype!=='exe' ) $outstr .= "<font class='error'>Bad extension!</font><br>"; 
    switch( $uptype ) {
        case 'body': $ext = 'b'; break;
        case 'config': $ext = 'c'; break;
        case 'exe': $ext = 'e'; break;
        default: $ext = 'e';
    }
    $_SESSION['file_ext'] = $ext;
    if( isset($_POST['bots']) && trim($_POST['bots']) !== '') {
        $bots = explode(' ', trim($_POST['bots']));
        //writelog("debug.log", trim($_POST['bots'])); 
        $filename .= "_".(LastFileId()+1);
    }
    if( FileExist($filename) ) $filename .= LastFileId();
    $tmpName  = $_FILES['file']['tmp_name'];
    $fileSize = $_FILES['file']['size'];
    $fileType = $_FILES['file']['type'];
    ## reading all file for calculating hash
    $fp = fopen($tmpName, 'r');
  • 明文密码存储 - MySQL密码以明文形式存储在php文件中。此外,表单面板的登录密码也以明文形式存储。
  • MD5密码 - MySQL中存储的密码是MD5密码。没有PBKDF2、bcrypt、scrypt、盐等。只是MD5。只需查看登录检查的纯粹简单性,干得好!
1
$query = "SELECT * FROM users_t WHERE uPswd='".md5($pswd)."'";
  • ClickJacking - 非常乏味的内容

SQL注入

SpyEye有丰富的SQL注入历史。详情参见这里这里这里视频这里视频这里

需要重点强调的是,大多数易受攻击的函数可以在没有任何身份验证的情况下访问,因为这些PHP文件在文件开头缺少用户身份验证。

但如果C&C服务器所有者通过此漏洞被攻击,向开发者抱怨并不是一个好主意,因为在仔细阅读安装指南后,可以看到:

“用于在收集器数据库中搜索信息的是PHP接口作为formgrabber管理面板。管理面板不打算在服务器上找到。这是一个客户端应用程序。”

并且有很多理由不将formgrabber管理面板安装在任何可互联网访问的服务器上。但这一事实导致了另一个可能的漏洞。该控制面板的用户被允许远程登录到MySQL数据库,并且安装指南提供了非常好的密码以供重用。我的意思是它看起来非常安全,没有理由不使用它。

1
CREATE USER 'frmcpviewer' IDENTIFIED BY 'SgFGSADGFJSDGKFy2763272qffffHDSJ';

下次你找到一个SpyEye面板,并且可以连接到MySQL数据库时,尝试这个密码是值得的。

不幸的是,该用户的默认权限不足以写入文件(select into outfile):

1
Access denied for user 'frmcpviewer' (using password: YES)

我还对这个SQL注入漏洞进行了一个小实验。我设置了一个真实的SpyEye僵尸网络面板,创建了恶意软件安装二进制文件(droppers),并将droppers发送给AV公司。随着越来越多的沙箱连接到我的服务器,有人开始利用我服务器上的SQL注入漏洞!

1
63.217.168.90 - - [16/Jun/2014:04:43:00 -0500] "GET /form/frm_boa-grabber_sub.php?bot_guid=&lm=3&dt=%20where%201=2%20union%20select%20@a:=1%20from%20rep1%20where%20@a%20is%20null%20union%20select%20@a:=%20@a%20%2b1%20union%20select%20concat(id,char(1,3,3,7),bot_guid,char(1,3,3,7),process_name,char(1,3,3,7),hooked_func,char(1,3,3,7),url,char(1,3,3,7),func_data)%20from%20rep2_20140610%20where%20@a=3%23 HTTP/1.1" 200 508 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"

尽管查询没有向攻击者返回任何有意义的数据(仅从沙箱收集的数据),但这引发了一些法律问题。

  • 哪个公司/组织有权攻击我的服务器?
    • 警察(有搜查令)
    • 军方(如果我们处于战争状态)
    • 间谍机构(总是/从不,选择你喜欢的答案)
    • CERT组织?

但是,AV公司或安全研究公司是否有法律权利攻击我的服务器?我不这么认为……最有问题的是当他们(未经授权)黑客服务器,并以“情报服务”的名义出售被盗信息。这是什么,狂野的西部?

SQLi明显针对被盗登录凭据的内容。如果这不是AV公司,而是攻击者,他们是如何获得SpyEye dropper的?如果是AV公司,他们为什么要窃取被盗凭据?他们会免费通知互联网银行所有者有关被盗凭据吗?或者他们会为此收费?

不要误会,我不想保护罪犯,但这显然是法律上的灰色地带。从道德的角度来看,我同意黑客攻击罪犯的服务器。正如你所看到的,整篇文章都是关于披露这些僵尸网络面板中的漏洞。但从法律的角度来看,这有些棘手……我真的感兴趣其他人的意见,所以热烈欢迎评论。

顺便说一下,我感兴趣的是“攻击者”如何找到SpyEye表单目录?简单,他们通过暴力破解,使用一个约43,000个条目的单词列表。

(无用的)跨站脚本

尽管SpyEye面板的部分容易受到XSS攻击,但你不太可能在服务器上找到这些组件,因为这些代码是安装过程的一部分,并且如果找到有效安装,安装程序将无法运行。在这种情况下,你还需要DB密码来触发漏洞……

会话处理

这是一个有趣的部分。注销按钮仅在服务器端使会话无效,而不是在客户端。但如果你考虑到登录过程从不重新生成会话cookie(也称为会话固定),你可以看到无论管理员登录应用程序多少次,会话cookie保持不变(直到管理员关闭浏览器)。所以如果你找到一个过去有效但当前无效的会话cookie,有可能这个cookie将来会有效……

二进制服务器

SpyEye服务器的某些部分涉及在服务器上运行一个二进制服务器组件,以收集表单数据。对这个组件(称为sec)进行漏洞模糊测试会很有趣。

日志文件泄露

如果SQLi部分中提到的表单面板安装在服务器上,值得访问<form_dir>/logs/error.log文件,你可能会看到webroot文件夹的路径、管理员的IP地址等。

阅读代码

有时阅读代码,你可以找到一些代码片段,这些片段很难用清醒的头脑理解:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$content = fread($fp, filesize($tmpName));
if ( $uptype === 'config' )
    $md5 = GetCRC32($content);
else $md5 = md5($content);
....
<script>
if (navigator.userAgent.indexOf("Mozilla/4.0") != -1) {
        alert("Your browser is not support yet. Please, use another (FireFox, Opera, Safari)");
        document.getElementById("div_main").innerHTML = "<font class=\'error\'>ChAnGE YOuR BRoWsEr! Dont use BUGGED Microsoft products!</font>";
}
</script>

解密SpyEye通信

事实证明,恶意软件与C&C服务器之间的通信并不非常复杂(Zeus在这方面做得更好,因为RC4密钥流是从僵尸网络密码生成的)。

1
2
3
4
5
6
7
8
function DeCode($content){
    $res = '';
    for($i = 0; $i < strlen($content); $i++) {
        $num = ord($content[$i]);
        if( $num != 219) $res .= chr($num^219);
    }
    return $res;
}

固定的XOR密钥,再次,干得好……

这意味着很容易创建一个脚本,可以与SpyEye服务器通信。例如,这可以用于向SpyEye数据库填充垃圾数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import binascii
import requests
import httplib, urllib

def xor_str(a, b):
    i = 0
    xorred = ''
    for i in range(len(a)):
        xorred += chr(ord(a[i])^b)
    return xorred

b64_data= "vK6yv+bt9er17O3r6vqPnoiPjZb2i5j6muvo6+rjmJ/9rb6p5urr6O/j/bK+5uP16/Xs7evq9ers7urv/bSo5u316vXs7evq/a6v5pq/trK1/bi4qbjm453j6uPv7Or9tr/u5um+uuvpve3p7eq/4+vsveLi7Lnqvrjr6ujs7rjt7rns/au3vOa5sre3srW8s7q2tr6p4Lm3tLiw4LmuvKm+q7Spr+C4uPu8qbq5ub6p4Li4vKm6ubm+qeC4qb6/sq+8qbq54LiuqK+0tri0tbW+uK+0qeC/v7So4L+1qLqrsuC+trqyt7ypurm5vqngvb24vqmvvKm6ubm+qeC9/aivuq/mtLW3srW+"
payload = xor_str (binascii.a2b_base64(b64_data), 219)
print ("the decrypted payload is: " + payload)
params = (binascii.b2a_base64(xor_str(payload,219)))
payload = {'data': params}
r = requests.post("http://spyeye.localhost/spyeye/_cg/gate.php", data=payload)

故事的寓意?

罪犯生产的代码与世界其他地区一样糟糕,多亏了这一点,一些恶意软件操作者被抓住并现在关在监狱里。而法律总是落后于现实。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计