| Autor |
Beitrag |
oOXTCOo
      
Beiträge: 141
Windows XP Prof. 3
Delphi 7
|
Verfasst: Mi 27.01.10 05:42
hallo!
ich lese mich schon die ganze nacht durch sämtliche treads und tutorials (auch die von narses) finde aber nichts zu meinem problem.
ich habe einen server laufen mit einer smartcard die mit einem kartenleser am usb port des server verbunden ist. diese smartcard berechnet schlüssel zur authorisierung. mein server programm stellt den klienten diese schlüssel berechnung der smartcard zur verfügung als würden die klienten selbst eine smartcard besitzen.
das problem ist, das immer nur ein klient eine berechnung machen kann. die berechnung wird mit 4 mal schlüssel austausch gemacht. also der klient sendet einen schlüssel zum server der server berechnet aus diesem einen neuen schlüssel und sendet den neuen schlüssel wieder zum client, worauf der client wiederum einen neuen schlüssel berechnet der zum server gesendet wird worauf der server wieder einen schlüssel berechnet der wieder zu client gesendet wird. der prozess dauert nicht länger als 3 sekunden, dann kommt der nächste klient drann.
ich habe das so gelöst, das der server immer nur den [1] array anspricht.
somit sind alle anderen auf warteposition und wenn der client fertig ist
und die verbindung zum server trennt, wird im disconnect ereignis ein command and den neuen 1 klienten der auf die array position [1] "gerutscht" ist angeschrieben, so das der weis
er kommt drann und wird somit aufgefordert seinen schlüssel zu senden.
das hat alles wunderbar funktioniert, bis gestern vormittag ein hacker mit einem tool einfach immer 10 verbindungen aufbaut, wenn ich den server disconnecte und wieder connecte werden sofort wieder 10 neuen verbindungen aufgebaut und der server ist somit auf dauer blockiert.
ich habe daraufhin die ip gesperrt, doch der hacker schein ein modem reset zu verwenden das bei nicht erfolgreichem verbinden ausgeführt wird damit er eine neue ip zugewiesen bekommt und wieder verbinden kann...
ich habe mittlerweile 15 ip´s gesperrt und jetzt den komplette ip bereich, doch damit schliesse ich auch "normale" klienten aus.
ich bekomme es einfach nicht hin, das ich etweder die ip filtere und gar nicht connecten lasse oder sie vom server immer wieder kicke, da dass scheinbar nur von klineten seite geht. da ich immer das [1] array verwendet habe um immer nur einen dran zu nehmen, funktioniert auch nichts anderes mehr.
hat jemand eine idee wie ich das lösen kann? gibt es wirklich keine möglichkeit clients vom server auszuschliessen (von server seitens) da ja der hacker sein eigenes tool verwendet, kann ich seinem programm ja kein command senden das es die verbindung trennen lässt?
ich habe es dann mit deiner userlist versucht, aber es will alles nicht klappen.
ich habe mir dann überlegt das ich (aus meiner user datenbank die auch auf dem server liegt) das jeweilige passwort auslese und username auslese einen sha-1 hash daraus mache und auf in der client seite auch aus dem usernamen und dem passwort einen sha-1 hash mache, die dann zum server gesendet wird und der server mit dem zugesendeten und dem eingenem hash vergleich, wenn der okay ist soll der user sich einloggen können. was aber alles aufgrund des programm aufbaues nicht ohne grosse änderungen möglich ist.
hat jemand ein gutes einfaches beispiel mit einer userlist in einer listbox so das ich die listbox mit der client ip sehen kann (sollte einer die verbindung abbrechen soll der user entfernt werden) und der server bedient immer den gerade aktuellen client. sollte der nicht innerhalb von 2-3 sekunden reagieren wird er einfach übersprungen... wie mache ich das? was passier wenn immer wieder verbindungen nachgeladen werden, mein programm würde dann immer wieder den hacker übersprigen, aber die normalen clients wären dann totzdem blockiert...
an dem problem häng ich schon die ganze nach und habe nicht wirklich einen plan wie ich das problem einfach und schnell aus der welt schaffen könnte.
ich hoffe jemand hier hat ein paar gute tipps.
mfg.
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Mi 27.01.10 07:23
Filter doch einfach die Verbindungen indem du ihre IP Adressen kontrollierst, wenn einer sich versucht einzuloggen, obwohl er schon eingeloggt ist, wird er gekickt und gebannt, in einer temporären Bannlist, das wird ihm dann auf dauer zu blöde.
|
|
Astat
      
Beiträge: 75
Erhaltene Danke: 1
Windows 2000
D6, D7, D2007, Lazarus
|
Verfasst: Mi 27.01.10 11:11
Hallo oOXTCOo, das hört sich nach einem schweren design Problem an.
Wie sieht die klassische Architektur eines solchen Client Server Systems aus.
1.Der Server aktzeptiert zuallererst mal alle Verbindungen, und speichert vor einem Socket Accept
alle ClientSockets in einem Ringbuffer, der danach von mehreren Workerthreads abgearbeitet werden kann.
Hier kann dann vor dem Accepten in einem Workerthread, schon eine Filterung stattfinden
(IP-Ranges, Doppelte Connections) usw.
2.Die Daten werden weiterverarbeitet, bzw. aufbereitet. Dazu gibt es ein Protokoll (zB. Länge der Daten, ID, SEC-ID)
Header kann dann etwa so aussehen 4Byte + 1Bbyte + 4Byte.
Wenn nun der Header und oder die Daten nicht korrekt sind, wird der betreffende Client sofort disconnected.
Dadurch ist es egal wieviele Clients gleichzeitig zugreifen, da nicht authorisierte sofort disconnected werden.
Zeig mal den Server Source, vielleicht kann man da schnell was drehen.
lg. Astat
|
|
oOXTCOo 
      
Beiträge: 141
Windows XP Prof. 3
Delphi 7
|
Verfasst: Fr 29.01.10 08:03
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
hallo!
danke für die tipps, aber das habe ich versucht.
das problem ist, das ich von der server seite den klienten nicht disconnecten kann weil die ja eine eigene software laufen habe.
wenn es meine klient software ist, dann sende ich einfach [$DISCONNECT$] an den klienten und er disconnected sofort...
oder gibt es irgend eine möglichkeit wie ich andere verbindungen kicken kann?
also müsste ich das mit einer userliste machen, wenn einer verbindent und verbunden bleibt dann einfach überspringen?
das kann aber auch nicht die lösung sein, wiviele socket verbindungen sind denn maximal möglich?
werden die nich auch nach einer gewissen zahl ausgeschöpft sein?
ich habe das jetzt vorrübergehend so gelöst das der client 1 sekunde zeit hat sich zu authorisieren, wenn das nicht passiert disconnected der server sich selbst und connected gleich wieder, damit ist der client auch disconnected, dabei werden aber alle andere auch disconnected.
ich habe jetzt sämtliche ip ranges gesperrt und sollte einer doch schaffen sich zu verbinden dann wird er gleich wieder disconnected weil er sich nicht authorisieren kann...
als source beispielt hatte ich teile von narses chat tutorial verwendet.
jetzt läuft der server zwar wieder, aber dennoch werden einige klienten disconencted wenn einer sich nicht authorisieren kann... zum glück ist die zeitspanne so kurz das dass maximal mit einem klienten passieren kann, ist also meine notlösung bis ich was besseres habe...
ich denke ich werde das besser über eine messanger protokoll laufen lassen, das sollte recht sicher sein.
ein paar konten anmelden und über diesen dann verbinden.
grüße
und vielen dank für die hilfe
|
|
Astat
      
Beiträge: 75
Erhaltene Danke: 1
Windows 2000
D6, D7, D2007, Lazarus
|
Verfasst: Fr 29.01.10 12:39
oOXTCOo hat folgendes geschrieben : |
oder gibt es irgend eine möglichkeit wie ich andere verbindungen kicken kann?
|
Ja, mit
Delphi-Quelltext
vom Server oder vom Client, egal.
lg. Astat
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Fr 29.01.10 12:40
Du kannst, egal ob der Client ne eigenen Software hat oder nicht, Disconnecten..
Wenn der Server sagt, so mein Freund ist nicht mehr, dann ist eh vorbei ..
Socket.Disconnect; Oder sowas in der Art.
//Edit
Zu langsam..
|
|
oOXTCOo 
      
Beiträge: 141
Windows XP Prof. 3
Delphi 7
|
Verfasst: So 31.01.10 21:23
Niko S. hat folgendes geschrieben : | Du kannst, egal ob der Client ne eigenen Software hat oder nicht, Disconnecten..
Wenn der Server sagt, so mein Freund ist nicht mehr, dann ist eh vorbei ..
Socket.Disconnect; Oder sowas in der Art.
//Edit
Zu langsam.. |
danke an alle..
wird das nur den client disconnecten oder den server selbst? (ich werde das dann sofort testen).
jetzt ist es nehmlich so, da der hacker das tool in einem forum gepostet hat, damit alle es asuführen...
natürlich will es jeder sehen, aber sobald es ausgeführt wird, wird die attacke gestartet...
ich bin mit dem blocken nicht mehr nachgekommen, jetzt muss ich abschalten...
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: So 31.01.10 21:32
Wie wäre es mit einer Strafanzeige?!?
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 31.01.10 22:03
Sorry: Schlechtes Software-Design ist keine Ausrede dafür, jemanden zu verklagen  Denn sonst müsste man Windows verbieten, weil es Tools enthält, mit denen man schlecht programmierte Anwendungen zum Absturz bringen könnte
Zu deinem Problem: Müssen die N Key-Berechnungen eines Clients hinter einander erfolgen, oder kann man Anfragen mehrerer Clients mischen?
Sollte letzteres gehen, so würde ich das Design dringend dahingehend überarbeiten, dass exakt dies auch gemacht wird. Damit kann ein Client keinen anderen Client mehr blockieren.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
oOXTCOo 
      
Beiträge: 141
Windows XP Prof. 3
Delphi 7
|
Verfasst: So 31.01.10 22:23
BenBE hat folgendes geschrieben : | Sorry: Schlechtes Software-Design ist keine Ausrede dafür, jemanden zu verklagen Denn sonst müsste man Windows verbieten, weil es Tools enthält, mit denen man schlecht programmierte Anwendungen zum Absturz bringen könnte
Zu deinem Problem: Müssen die N Key-Berechnungen eines Clients hinter einander erfolgen, oder kann man Anfragen mehrerer Clients mischen?
Sollte letzteres gehen, so würde ich das Design dringend dahingehend überarbeiten, dass exakt dies auch gemacht wird. Damit kann ein Client keinen anderen Client mehr blockieren. |
ich kann immer nur einen bedienen, weil immer nur einer auf die smarcard zugreifen kann. das funktioniert mit session keys, darum muss die session auch komplett abgeschlossen oder abgebrochen werden bevor der nächste drann kommt...
ich habe:
das disconnecten so versucht:
Delphi-Quelltext 1: 2: 3: 4:
| ServerSocket1.Socket.Close; application.ProcessMessages; sleep(100); ServerSocket1.Open; |
wenn ichs nach dem code oben mache, diconneted er ALLE und ich muss dann wieder connected, aber dann ist er ja schon wieder mit 10 sockets drauf.
und so:
Delphi-Quelltext 1:
| ServerSocket1.Socket.Disconnect(aktual_socket); |
doch beides lässt dann keinen mehr verbinden...
wie kann ich die am besten nach ip filtern? denn wenn ich ip filtern kann, dann kann ich auch einen authorierungs schlüssel übergeben und nur mit diesem kommt der client weiter, sonst wird seine ip gesperrt. ich habe da ein tool (ip blocker), so in der art müsste es gehen...
ich könnte ja meine server software so lassen wie sie ist, und so ein programm "daziwschen" erstellen...
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 31.01.10 22:33
Hmmm, wenn du wirklich auf der SmartCard immer nur eine Session gleichzeitig laufen lassen kannst, solltest du versuchen, vor dem Zugriff auf diese eine Authentifizierung der Clients zu schalten; z.B. durch ein Challenge-Response-Verfahren, mit dem sich jeder Client authentifiziert. Und erst nach dieser Authentifizierung (innerhalb eines Timeouts), wird dem Client (für einen gewissen Zeitraum (zweites Timeout) Zugriff auf die SmartCard gegeben. Warteschlangen-Reihenfolge ist dann basierend auf der Reihenfolge der erfolgreichen Authentifizierungen. Beide Timeouts können i.d.R. recht kurz gewählt sein (<10 Sekunden). Die Wartezeit in der Warteschlange ist dabei dann unerheblich - wobei jeder Client in der Warteschlange die Klappe zu halten hat (Protokollvereinbarung) bis er vom Server das OK bekommt.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 31.01.10 22:55
Hi,
Die Variante der Client (User) brauch nichts zu machen, ist ja ne richtige Einladung für B...F... attacken.
Deine Software sollte eine Eingabe des Clienten verlangen, wie es üblich ist.
Danach ist ein weiteres Connecten nicht möglich so lange er drin ist.
Selbst bei Iprange würde er damit ne neue Eingabe machen müssen und sich hinten in der Schlange anstellen bis er dran ist. Wenn ich Deine Software so verstanden habe.
Was ist der Grund dafür des der client nichts machen muss!
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
oOXTCOo 
      
Beiträge: 141
Windows XP Prof. 3
Delphi 7
|
Verfasst: So 31.01.10 23:01
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
das mit der warteschlage ist genau das was ich brauche...
aber wie soll ich das machen?
der client connected on dann hat er ja schon einen socket zugewiesen... wie es aussieht kann ich den nicht disconnecten ohne alle anderen mit abzuschiessen...
das problem ist, das ja irgendwann alle sockets voll sein werden?
irgendwie habe ich keine plan wie ich das machen kann...
ich würde am liebsten den source hier mal posten, aber wer weis ob er dann nicht von den leuten gelesen wird...
ich erkäre mal ungefähr wie ich das gemacht habe: - client connected und bekommt einen socket.
- client muss innerhalb 1 sekunden mit dem gewünschten string antworten sonst -> disconnect wobei derzeit alle anderen auch gekickt werden).
- wenn der client nun den string senden, dann fordert mein server den ersten key zur berechnung an.
- der client sendet diese key, und der server brechnet diesen und sendet diese zurück. das passiert zwei mal, dann wird der client normalerweise disconnected mit einem command das ich in der client software habe.
wenn sich also dazwischen schon wieder welche eingereiht haben, warten die clients bis sie einen gewissen string zugesendet bekommen und starten dann mit der berechnung...
ich spreche also immer nur den ersten socket 1 an, dadruch das die clients ja normalerweise immer disconnected werden, hat das super funktioniert.
nun jetzt sind aber die hacker immer connected und auch wenn ich sie kicke gleich wieder connected...
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 31.01.10 23:15
oOXTCOo | Zitat: | | der client connected on dann hat er ja schon einen socket zugewiesen... |
| Zitat: | 1.) client connected und bekommt einen socket.
2.) client muss innerhalb 1 sekunden mit dem gewünschten string antworten sonst -> disconnect wobei derzeit alle anderen auch gekickt werden).
|
edit: habe erst beim 2.mal lesen gesehen!
zu 1 ohne schlüssel(password) lol
alles was danach ist nicht mehr wichtig er hatt ja schon ne verbindung von Dir
Weil Du freiwillig durch Dein Schlüssel es zulässt.
dadurch brauch er weiter nichts zu machen als zu warten bis er drauf ist, dann schickt er die nächste Abfrage und Du schickst ohne kontrolle den Schlüssel raus! Peng, schon ist Dein Server dicht!
sagt das nicht alles!!
Da du Daten zu ihm schickst, und die Daten durch das Protokoll zurück bekommst, kannst Du auch die daten von seiner Netzkarte abfragen.
Ist nicht einfach aber machbar, den die ist einmalig!
Da der client hier nicht via internet connected sehe ich das richtig!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Zuletzt bearbeitet von ALF am So 31.01.10 23:34, insgesamt 2-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 31.01.10 23:18
Das mit dem Challenge Response in meinem Post hatte schon seine Wichtigkeit. Wenn du einen Festen String verlangst, lässt sich das binnen weniger Sekunden mit nem Netzwerk-Sniffer aushebeln
Und bzgl. derWarteschlange: Du fügst nach erfolgter Authentifizierung jeden Client einfach in eine Queue ein, die unabhängig von deinem Server-Socket ist und bedienst die Clients aus dieser heraus. Unauthentifizierte Clients tauchen in dieser "Service Queue" gar nicht auf und stören daher auch nicht.
Ferner solltest du beachten, dass es einmal die ServerSocket-Komponente gibt - diese Stellt den Listening-Socket zur Verfügung, zu dem Connected wird; und auf der anderen Seite jede Client bei seinem Connect ein ClientSocket bekommt - dieser wird dir im Connect-Ereignis mitgeteilt. Wenn du auf diesem ClientSocket arbeitest, sollte das Disconnect normal gehen. (Achtung: Sender ist der TServerSocket IIRC).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
oOXTCOo 
      
Beiträge: 141
Windows XP Prof. 3
Delphi 7
|
Verfasst: So 31.01.10 23:40
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
danke, ich habe vor den usernamen und das passwort zu einem hash (sha1 oder sowas) zu berechnen. und dier wird dann vom clienten abgefragt... sollte der mitgeschnitten und kopiert werden weis ich das es ein user von mir ist und sperre diesen account.
jetzt muss ich mir ansehen wie du das meinst mit den sockets...
ich dachte es gibt nur die sockets und mehr nicht...
ich schau mir das gleich mal an.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 31.01.10 23:51
oOXTCOo | Zitat: | ich habe vor den usernamen und das passwort zu einem hash (sha1 oder sowas) zu berechnen
und dier wird dann vom clienten abgefragt... |
erst abfragen, wenn ok, dann den socket zulassen!!
nicht andersherum!
wie:
BenBE | Zitat: | | Wenn du auf diesem ClientSocket arbeitest, sollte das Disconnect normal gehen. |
schon geschrieben, kannst Du client auch einzehln kicken! Sperren natürlich nicht!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
oOXTCOo 
      
Beiträge: 141
Windows XP Prof. 3
Delphi 7
|
Verfasst: Mo 01.02.10 00:06
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
dann ists klar warum immer alle disconnected werden...
ich schliesse also fälschlicherweise den komplette socket anstatt den client sockets ?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 01.02.10 00:17
Wenn Du Nutzername + Passwort hast:
1. Client sendet 32 Bytes Zufallsdaten + Hash von Nutzernamen
2. Server antwortet mit 64 Bytes Zufallsdaten
3. Client Hasht (32 Bytes Zufallsdaten vom Server + Nutzername + Zufallsdaten vom Client + Passwort + 32 Bytes Zufallsdaten vom Server)
Bei fehlerhaftem Login schließt der Server die Verbindung, bei erfolgreichem Login ruht die Verbindung.
Anmerkung bzgl. diesem Protokoll:
- Der Client muss mehr Daten senden. Damit wird die Bandbreite des Servers geschont und Multiplikatoreffekte (wie bei DNS möglich) vermieden
- Weder Nutzerneame noch Passwort gehen im Klartext über's Netz. Beide können aber Problemlos vom Server nachgeschlagen werden. Selbst wenn der Nutzername eine Kollission erzeugt, so wird spätestens durch den zweiten Schritt diese Kollission aufgelöst.
- Das Ruhenlassen der Verbindung im Erfolgsfalle gibt dem Angreifer keine Zusätzliche Information über die Last des Servers.
- Die Zufallsdaten dienen als Salt für die Hashes, um Replay-Angriffe abzufangen
- Da der Server in der Konstellation die vertrauenswürdigere Stelle ist, fließen die dort generierten Daten mit höherer Wichtung ein
Und bzgl. einzelnen Client disconnecten: Das geht auf jeden Fall ...
oOXTCOo hat folgendes geschrieben : | dann ists klar warum immer alle disconnected werden...
ich schliesse also fälschlicherweise den komplette socket anstatt den client sockets ? |
Ja. 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 01.02.10 00:18
genau!!!!
und Du hast ne Falsche Reienfolge verwendet!!!
du hast das Socket schon zugelassen und wolltest dann erst abfragen!
Wenn Du also 10 sockets zulässt, sind bei attack abfragen immer alle 10 sockest belegt,
bevor Du irgenwelche Schlüssel oder Pws abgefragt hast!
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
|