Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » ftpscript

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.01.2009, 17:30 Uhr
~hadywadydudeda
Gast


Hallo,

Ich wollte mir ein kleines ftp script proggen, welches in meinem firmen lan alle pcs testet bei denen man sich bei dem ftp service als anonymous anmelden kann.

realisiert habe ich das folgendermaßen:

main.cpp

Code:
#include <iostream>
#include <fstream>
#include <string.h>
#include <pthread.h>

#include "socket.h"


using namespace std;


int main (int argc, char* argv[])
{
    char buffer[5];
    char rip[1000];

    for (int i=1; i<40; i++)
    {
        strcpy (rip, argv[1]);
        sprintf(buffer, "%d", i);
        strcat (rip, buffer);

        pthread_t th[40];
        pthread_create(&th[i], NULL, client, (void*) &rip);
    }
}




socket.h

Zitat:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>


using namespace std;


void* client (void* index)
{
char buffer[5000];
char* k = (char*)index;
cout << k << endl;

int s;
struct sockaddr_in srv;

s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1)
{
perror("socket failed()");
}

srv.sin_addr.s_addr = inet_addr(k);
srv.sin_port = htons( (unsigned short int) 21);
srv.sin_family = AF_INET;

if (connect(s, (struct sockaddr*) &srv, sizeof(srv)) == -1)
{
perror("connect failed()");
}

recv (s, buffer, sizeof(buffer), 0);

send (s, "USER ftp\r\n", strlen("USER ftp\r\n"), 0);
recv (s, buffer, sizeof(buffer), 0);


send (s, "PASS ftp@localhost.com\r\n", strlen("PASS ftp@localhost.com\r\n"), 0);
recv (s, buffer, sizeof(buffer), 0);

if (strstr (buffer, "230") != 0)
cout << "Found ano login on host: " << k << endl;

else
cout << "\tHost: [" << k << "] does not support anonymous login" << endl << endl;
}



Das Ergebnis des Programm-Runs ist dann:

Zitat:

./main 127.0.0.
127.0.0.7127.0.0.7127.0.0.7
127.0.0.8
127.0.0.8
127.0.0.8
127.0.0.8


127.0.0.8
127.0.0.10
127.0.0.10
127.0.0.11
127.0.0.12
127.0.0.13
127.0.0.14
127.0.0.15
127.0.0.16
127.0.0.17
127.0.0.18
127.0.0.19
127.0.0.20
127.0.0.21
127.0.0.22
127.0.0.23
127.0.0.24
127.0.0.25
127.0.0.26
127.0.0.27
127.0.0.28
127.0.0.29
127.0.0.30
127.0.0.31
127.0.0.32
127.0.0.33
127.0.0.34
127.0.0.35
127.0.0.36
127.0.0.37
127.0.0.38
127.0.0.39


das problem
auf 127.0.0.1 läuft ein ftp server, der anonymes einloggen erlaubt => d.h. das programm soltle eig. eine meldung geben... tuts aber net

außerdem fängts iwie nicth bei .1 an zu scannen ?
Kann mir bitte jemand weiterhelfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.01.2009, 20:23 Uhr
0xdeadbeef
Gott
(Operator)


Das wird vermutlich an der race condition liegen. rip wird wohl in main überschrieben, bevor client zu

C++:
srv.sin_addr.s_addr = inet_addr(k);


kommt.

Ich halte C++ übrigens hier für eine suboptimale Sprachwahl - was spricht gegen ein Shellskript unter Benutzung eines FTP-Clients (oder netcat, wenn du unbedingt selbst FTP sprechen willst)?

Nachtrag: Oder auch nmap - das insbesondere dann, wenn es um das Aufspüren von Malware bzw. möglicher Backdoors, die diese eingerichtet hat, geht. Es kann sich in dem Fall durchaus lohnen, sich in die NSE einzuarbeiten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.01.2009 um 20:29 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.01.2009, 11:09 Uhr
~hadedadedudaj
Gast


Hat scho n einen Grund, warum ich C++ nehmen muss.

Könntest du mir bei meinem Problem ev. weiterhelfen?
Wie sollte ich es umbauen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.01.2009, 11:34 Uhr
~hadedadedudaj
Gast



Code:
int main (int argc, char* argv[])
{
    char buffer[5];
    char rip[1000];
    pthread_t th[40];

    

    for (int i=1; i<200; i++)
    {
        strcpy (rip, argv[1]);
        sprintf(buffer, "%d", i);
        strcat (rip, buffer);
        
        pthread_create (&th[i], NULL, client, (void*) &rip);
        pthread_join (th[i], NULL);
    }
}



Sollte das nicht funktionieren?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.01.2009, 13:53 Uhr
0xdeadbeef
Gott
(Operator)


Jetzt muss ich mich schon mal erkundigen, was es für einen Grund hat, dass du C++ benutzen musst. Nicht, dass du mir da irgendwelche warez-rootkits zusammenbasteln willst oder so.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.01.2009, 17:27 Uhr
~hadedadedudaj
Gast



Zitat von 0xdeadbeef:
Jetzt muss ich mich schon mal erkundigen, was es für einen Grund hat, dass du C++ benutzen musst. Nicht, dass du mir da irgendwelche warez-rootkits zusammenbasteln willst oder so.

Würd ich dann in einem öffentlichen Forum danach fragen?^^

Weil jedes meiner Programme, welches ich für die Systemadministration schreibe in C/C++ ist, dies sind persönliche Gründe:
- Übersichtlichkeit
- Geschlossene Sourcen
- Einfach weiter zu entwickeln

LG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.01.2009, 19:09 Uhr
0xdeadbeef
Gott
(Operator)


Och, so Scherzkekse kommen ab und zu mal vorbei. Das sind dann zwar in der Regel nicht die, die es auch tatsächlich hinbekommen könnten, und sie verraten sich ziemlich schnell, trotzdem habe ich aber kein Interesse daran, am Ende nach §202c StGB belangbar zu sein.

Mir ist durchaus bewusst, dass so ziemlich alle Crackertechniken auch in der Systemadministration legitime Anwendungen haben (kennen muss man sie als Sysad ja sowieso), aber dem Gesetzgeber und den meisten Richtern halt nicht. Je nach Lesart des Gesetzes (das etwas vage formuliert ist und zu dem es noch so gut wie keine konkrete Rechtssprechung gibt) habe ich aber die Verpflichtung, zumindest die Anstrengung zu unternehmen, sicherzustellen, dass ich keinem Cracker dabei helfe, in irgendwelche Systeme einzubrechen.

Aber zurück zum Thema.

Ich halte das gerade bei Systemadministrationswerkzeugen nicht für besonders gute Gründe, insbesondere ist es auf die Art weder übersichtlich noch einfach weiterzuentwickeln. Man muss sich zum Beispiel um race conditions Gedanken machen, wenn man 40 Threads den gleichen Buffer gibt.

Wie dem auch sei, in deinem Fall besteht das Problem darin, dass du den selben Buffer an 40 Threads weitergibst und nie darauf wartest, dass die ihn ausgewertet haben, bevor du ihn neu beschreibst.

Mutexen halte ich für Overkill. Entweder du gibst jedem Thread seinen eigenen Buffer, oder du übergibst den Threads die Rohdaten und lässt sie die Buffer selbst zusammenbauen.

Mit nem Shellskript liefe das ganze übrigens etwa auf

Code:
#!/bin/sh

RANGE_STUB=$1

try_host() {
  IP=$RANGE_STUB$1

  DATA='USER anonymous\nPASS foo\nquit'
  CODE=$(echo -e "$DATA" | nc $IP 21 | head -3 | tail -1 | cut -d \  -f 1)

  if [ "$CODE" == 230 ]; then
    echo "$IP erlaubt anonymes FTP"
  fi
}

for((i = 0; i < 40; ++i)) ; do
  try_host $i &
done


hinaus. (ungetestet)
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: