Wie funktioniert Netcat

Hi!
Ich wüsste gerne mehr darüber wie genau netcat oder allgemein ein Programm das eine Shell einrichtet funktioniert.
Ich kann leider c++ nicht gut genug um mir den Source anzugucken.
Also was ich mir denk ist, dass der Verkehr auf einem Port angenommen und an ein Programm weitergeleitet wird. In diesem Fall cmd.
Andersherum wird die Ausgabe zurück gesendet.
Und wie genau funktioniert es das Ergebnis abzufangen?

Ok also eigentlich weiss ich selbst nich so ganz.. ;(
Ich würde nur gerne mehr darüber wissen also wenn ihr irgendwelche Quellen oder Wissen habt das ihr teilen wollt wäre ich sehr dankbar :)
 
netcat verbindet sich einfach mit dem port. die shell kommt vom telnetserver. mann kann ja auch mit netcat nen port öffnen (mit -l glaub ich).
probiers mal. öffne nen port mit netcat und verbinde dich dann wieder mit netcat. was du beim client eingibst, sollte beim server ankommen.
=> es macht also im prinzip nicht viel, außer verbindung herstellen.
 
Aber es ist doch auch möglich die Verbindung an eine Anwendung zu leiten und das Ergebnis zurückzuschicken oder!?
Wie funktioniert das?
Oder klappt es nur bei Dosanwendungen wie cmd
 
Code:
nc -l -p1000 -d -e cmd.exe -L
-l öffnet das port.
-p das lokale port.
-e anwendung.
-L bei abbruch der verbindung wieder neu starten.

soviel ich weis kann man mit -c anwendungen ausführen, bzw. halt unter linux shell commands. steht aber alles in der hilfe: nc -h
edit2: mit -e lassen sich alle anwendungen ausführen. das problem dabei wären vielleicht progis mit oberfläche? versuchs doch einfach und verbinde dich mit "telnet 127.0.0.1 1000"

lg
 
Das hatte ich schon gefunden.
Ich wollte vorallem die programmiertechnische Seite verstehn. Ich kann mir nicht wirklich vorstellen wir das gemacht wird.
 
naja. mit netcat -l wird halt ein socket geöffnet, in listenmodus geschaltet und wartet dann verbindungen ab. je nachdem wird dann eingehender traffic nach stdout und eventuelle ausgaben einer anwendung (z.b. cmd) über pipes dann versendet.

als client wird einfach ein connect() gemacht, wobei eingehende pakete nach stdout geschrieben werden und eingaben von stdin werden an den peer gesendet.
 
Code:
#define _WIN32_WINNT 0x500


#include <stdio.h>
#include <winsock2.h>
#include <iostream>
#include <cstdio>
#include <windows.h>
using namespace std;

int main(void)
{
  SOCKET s,s1;
  WSADATA wsa;
  SOCKADDR_IN addr;
  STARTUPINFO sinfo;
  PROCESS_INFORMATION pi;
  long rc;
    
  WSAStartup(MAKEWORD(2,2),&wsa);
 	
  memset(&addr,0,sizeof(addr));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(1415);
  addr.sin_addr.s_addr=ADDR_ANY;

  s1=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0);

  rc=bind(s1,(SOCKADDR*)&addr,sizeof(addr));
while(1)
 {
  rc=listen(s1,10);
  s=accept(s1,NULL,NULL);

  ZeroMemory(&sinfo,sizeof(sinfo));
  ZeroMemory(&pi,sizeof(pi));
  sinfo.hStdInput = (HANDLE)s;
  sinfo.hStdOutput = (HANDLE)s;
  sinfo.hStdError = (HANDLE)s;     
  sinfo.cb = sizeof (STARTUPINFO);
  sinfo.dwFlags = sinfo.dwFlags | STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
  sinfo.wShowWindow = SW_HIDE;

  CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,&sinfo,&pi);

  WaitForSingleObject(pi.hProcess,INFINITE);
 }
  closesocket(s);
  closesocket(s1);
  return 0;
}

Hier ist der Source eines "TelnetServers" ;)
 
Mh ok danke!
Also wird praktisch nur eine Verbindung aufgebaut und als Prozess cmd geöffnet!?
Und wie wird das dann an den Prozess übergeben?
Ich kenn nur von Visual Basic sendkeys aber so wird es wohl auf gar keinen Fall funktionieren :)
 
Du erstellst ein socket. Das hat ja auch nen Eingabe- und Ausgabepuffer. In dem STARTUPINFO struct kannst du Festlegen, welches Handle du für Eingabe (STDIN) und Ausgabe(STDOUT,STDERR) verwenden willst.
Wenn du jetzt mit WSASocket ein Socket erstellst, kannst du dies hier einfach als E/A-Handle angeben (Achtung. Ein mit socket() erstelltes Handle funktioniert nicht).
Das heißt, anstatt die Ausgabe am bildschirm anzuzeigen wird die Ausgabe von CMD einfach an den gerade Verbundenen Netzwerkpartner (peer) gesendet, der es dann auf seinem Bildschirm anzeigt. Genauso gehts dann mit den Eingaben, die werden vom peer eingegeben und über Netzwerk dann empfangen und "ausgeführt".
 

Also ich habe nur mal kurz einen Blick auf eins von den Tutorials geworfen und mir ist sowas hier aufgefallen:
Code:
char hostname[512];
printf("Enter Hostname: ");
gets(hostname);
Wenn der Rest des Codes ähnlich aussieht, dann sollte man die Seite am besten ganz schnell wieder vergessen.
 
Original von Lesco

Also ich habe nur mal kurz einen Blick auf eins von den Tutorials geworfen und mir ist sowas hier aufgefallen:
Code:
char hostname[512];
printf("Enter Hostname: ");
gets(hostname);
Wenn der Rest des Codes ähnlich aussieht, dann sollte man die Seite am besten ganz schnell wieder vergessen.

Der Code dient zu lernzwecken und soll übersichtlich sein, nicht sicher.
Und die Tutorials sind die besten über sockets die's im Netz gibt.
 
Original von v01d

Der Code dient zu lernzwecken und soll übersichtlich sein, nicht sicher.
Und die Tutorials sind die besten über sockets die's im Netz gibt.

Gerade Code der zu Lernzwecken dient sollte sicher sein, da viele Leute den Code lesen und sonst die Fehler übernehmen. Es wäre außerdem genauso einfach und lesbar gewesen fgets() zu verwenden. Solchen Code wie ich zitiert habe sollte man einfach nicht verwenden, egal ob zu Lernzwecken oder nicht.
 
Zurück
Oben