Thread IO::Socket; "Zwitter"
(5 answers)
Opened by KCobain at 2011-11-07 19:42
Wenn erst mal eine Verbindung hergestellt ist, dann können beide Seiten miteinander kommunizieren. Die Kommunikation ist nicht einseitig. Einen Server und Client gibt es, weil sich beide "Gesprächspartner" ja irgendwie finden müssen. Der Server bietet eine Feste IP und Port und der Client fordert eine Verbindung an. Das Paar "Client-IP+Port <> Server-IP+Port" ist absolut einzigartig und gibt auf der ganzen Welt zu diesem Zeitpunkt nur einmal. Mit dieser Kennung verschickte Nachrichten finden immer den Empfänger. In beide Richtungen.
Noch eine Bemerkung. Ohne einen fork des Servers kann immer nur eine Verbindung zur selben Zeit aufgebaut werden. Es geht auch anders mit threads oder POE. mit fork würde es ungefähr so ablaufen: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 #!/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 <<EOH; exit => ende help => dieser text echo:<TXT> => echo von <TXT> exec:<CMD> => programm starten <CMD> ist der Programmname mit Optionen write:<EOC> => perlcode in den puffer schreiben <EOC> markiert das Ende des Code clr => perlcodepuffer leeren run => perlcode im puffer ausführen cmd:<CODE> => perlcode direkt ausführen <CODE> 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(); } Ich gebe zu ich hatte Spaß die Funktionalität zu erweitern. :-) Last edited: 2011-11-08 00:38:18 +0100 (CET) |