Thread IO::Socket; "Zwitter" (5 answers)
Opened by KCobain at 2011-11-07 19:42

topeg
 2011-11-08 00:33
#153992 #153992
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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:
more (23.5kb):
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)

View full thread IO::Socket; "Zwitter"