Ich habe das Script das ich hier mit euch ausgearbeitet habe etwas verändert & fehler freier geschrieben.
@alpines meinte mal zu mir es sei wichtig eine art Formatierung über das script zu legen, damit es leichter zu lesen ist & ordentlicher erscheint.
Ich habe versucht mir einen Kopf darüber zu machen wie ich den Code in absätze einteile. Soetwas habe ich vorher noch nie getan & hätte deshalb gerne ein paar tipps von euch.
Beschreibung: Eine klassische Remote CMD die die versendeten daten verschlüsselt. Beim ersten verbinden vom Clienten zum Server wird ein Password abgefragt. Erkennt der Server das passwort als richtig wird ein Session key erstellt der an den Clienten zurück gesendet wird. Dieser key wird jetzt beim senden & empfangen immer mit versendet. Damit wollte ich vermeiden das sich irgendjemand so schnell in den Server einloggen kann & den computer hackt.
Server:
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <crypt.au3>
AutoItSetOption("TrayAutoPause", 0)
AutoItSetOption("TrayIconDebug", 1)
Local $hWnd = WinGetHandle("[Class:ConsoleWindowClass]")
WinSetTrans($hWnd, "", 200)
Local $ip = "0.0.0.0"
Local $port = 5051
Local $iSocket = 0
Local $trenner = "=ENDING"
Local $setpass = "informatik"
TCPStartup()
OnAutoItExitRegister("OnAutoItExit")
_Crypt_Startup()
Local $iAlgorithm = $CALG_RC4
Local $g_hKey = _Crypt_DeriveKey("3thaN0l-A|kOh0l", $iAlgorithm)
Local $iPID = Run(@ComSpec & ' /K ', "C:\", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD + $STDIN_CHILD)
ConsoleWrite("This is a computer Remote CMD for computer remote operations" & @CRLF & "Do not Close this Windows, you can Minimize or look at it" & @CRLF & @CRLF)
$esta = 0
$Ursprung = ""
$cmdWindowOut_Buffer = ""
sleep(100)
$cmdWindowOut = StdoutRead($iPID)
$cmdWindowErr = StderrRead($iPID)
$cmdWindowOut_Buffer = $cmdWindowOut_Buffer & $cmdWindowOut & $cmdWindowErr
$Ursprung = StringSplit ($cmdWindowOut, @CRLF, 1)
$Ursprung = $Ursprung[$Ursprung[0]]
$cmdWindowOut_Buffer = ""
ConsoleWrite("Waiting for Connection Establishment... ")
While 1
$cmdWindowOut_Buffer = ""
Local $iListenSocket = TCPListen($ip, $port, 999)
Do
$iSocket = TCPAccept($iListenSocket)
If @error Then
Exit
EndIf
Until $iSocket <> -1
if $esta = 0 Then
ConsoleWrite("Established." & @CRLF & "Waiting for Password.. ")
Do
$pass = TCPRecv($iSocket, 2048)
Until $pass <> ""
$dpass = BinaryToString(_Crypt_DecryptData(BinaryToString($pass), $g_hKey, $CALG_USERKEY))
if $dpass = $setpass Then
$setsession = BinaryToString(StringToBinary(Random(1000,2000, 1))) ;<=sieht blöd aus, aber ohne das bekam ich tatsächlich probleme
ConsoleWrite("Correct Password. Sessionkey is: " & $setsession & @CRLF & @CRLF)
if ProcessExists("cmd.exe") Then
$yesno = "1"
Else
$yesno = "0"
EndIf
$testsendandreceive = "If you can see this the the Encryption Mechanism works." & @CRLF & "Admin: " & IsAdmin() & "|CMD is running: " & $yesno
$testdecrypt = BinaryToString(_Crypt_DecryptData(BinaryToString($testsendandreceive), $g_hKey, $CALG_USERKEY))
TCPSend($iSocket, $testdecrypt & $setsession & "1")
Else
ConsoleWrite("Wrong Password" & @CRLF)
TCPSend($iSocket, BinaryToString(StringToBinary(Random(1000,2000,1))) & "0")
sleep(2000)
Exit
EndIf
$esta = 1
EndIf
Local $sReceived = ''
Do
$sReceived = TCPRecv($iSocket, 2048,1)
Until StringInStr($sReceived,StringTrimLeft(StringToBinary($trenner),2)) <> 0
$sReceivedE = StringTrimRight($sReceived,StringLen(StringTrimLeft(StringToBinary($trenner),2)))
$sessioncheck = StringRight($sReceivedE, 4)
if $sessioncheck <> $setsession Then
ConsoleWrite(@CRLF & "Someone try's to hack this CMD" & @CRLF & "CMD is now closing" & @CRLF);<=Keine Antwort über TCPSend, damit der vermeintliche angreifer darüber keine informationen bekommt
sleep(2000)
Exit
EndIf
$sReceivedE = StringTrimRight($sReceivedE, 4)
ConsoleWrite("Decrypt.. " & $sReceivedE & @CRLF)
$sDecryptedData = _Crypt_DecryptData(BinaryToString($sReceivedE), $g_hKey, $CALG_USERKEY) ;<=Befehl wird entschlüsselt
$sDecryptedData = BinaryToString($sDecryptedData)
if $sDecryptedData = "restart" Then
ShellExecute(@ScriptFullPath)
Exit
EndIf
if $sDecryptedData = "exit" then
ConsoleWrite("Bye Bye" & @CRLF)
$sDecryptedData = "echo exit"
EndIf
ConsoleWrite("Server receive: " & $sDecryptedData & @CRLF)
StdinWrite($iPID, $sDecryptedData & @CRLF)
while 1
$cmdWindowOut = StdoutRead($iPID)
$cmdWindowErr = StderrRead($iPID)
$cmdWindowOut_Buffer = $cmdWindowOut_Buffer & $cmdWindowOut & $cmdWindowErr
If @Error then Exit
$aktuell = StringSplit ($cmdWindowOut, @CRLF, 1)
$aktuell = $aktuell[$aktuell[0]]
if $aktuell <> $Ursprung Then
if StringRight ($aktuell, 1) = ">" or StringRight ($aktuell, 2) = "\>" Then
$Ursprung = $aktuell
ExitLoop
EndIf
Else
ExitLoop
EndIf
WEnd
If $cmdWindowOut_Buffer = "" Then
$cmdWindowOut_Buffer = "No Answer"
EndIf
ConsoleWrite("Encrypt.." & @CRLF)
$sEncryptedData = _Crypt_EncryptData($cmdWindowOut_Buffer, $g_hKey, $CALG_USERKEY) ;<=Verschlüssel die Antwort
sleep(400)
ConsoleWrite("Server send: " & $cmdWindowOut_Buffer & @CRLF)
TCPSend($iSocket, $sEncryptedData & $setsession & StringTrimLeft(StringToBinary($trenner),2)) ;<=Sende Antwort
;~ FileWrite(FileOpen(@ScriptDir & "\ZS.txt",16+1),$sEncryptedData & StringTrimLeft(StringToBinary($trenner),2) & @CRLF & @CRLF)
TCPCloseSocket($iSocket)
TCPCloseSocket($iListenSocket)
if $sDecryptedData = "echo exit" then
ConsoleWrite("Bye Bye" & @CRLF)
Sleep(1000)
Exit
EndIf
ConsoleWrite("Waiting for the next Order" & @CRLF)
WEnd
Func OnAutoItExit()
_Crypt_DestroyKey($g_hKey)
_Crypt_Shutdown()
TCPShutdown() ; Close the TCP service.
EndFunc ;==>OnAutoItExit
Alles anzeigen
Client:
Spoiler anzeigen
#Region
#AutoIt3Wrapper_Change2CUI=y
#EndRegion
#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <crypt.au3>
Local $hWnd = WinGetHandle("[Class:ConsoleWindowClass]")
if @error then Exit
Local $aPos = WinGetPos($hWnd)
WinMove($hWnd, "", 0, 0, $aPos[2], 1000)
WinSetOnTop($hWnd, "",1)
Local $sIPAddress = InputBox("Ip Adress Set","Input IP","127.0.0.1")
if @error Then Exit
Local $iPort = 5051
Local $trenner = "=ENDING" ;<=Damit enden die gesendeten daten. damit weiß sowohl der server, als auch der client, wann keine daten mehr kommen
Local $ester = 0
TCPStartup()
OnAutoItExitRegister("OnAutoItExit")
_Crypt_Startup()
Local $iAlgorithm = $CALG_RC4 ;<=Verschlüsselungs methode ist RC4
Local $g_hKey = _Crypt_DeriveKey("3thaN0l-A|kOh0l", $iAlgorithm) ;<=Hier wird das passwort gesetzt mit dem die daten verschlüsselst und ent.. werden
While 1
Sleep(100)
Local $iSocket = TCPConnect($sIPAddress, $iPort);<=Verbinde zum server
If Not @error Then
if $ester = 0 Then
ConsoleWrite("Connection Established. Password?" & @CRLF)
$pass = InputBox("Password", "Password?", "informatik")
$epass = _Crypt_EncryptData(StringToBinary($pass), $g_hKey, $CALG_USERKEY)
TCPSend($iSocket, $epass)
Do
$recvsession = TCPRecv($iSocket, 2048)
Until $recvsession <> ""
if StringRight($recvsession,1) = "1" Then
;~ if StringLen(BinaryToString($recvsession)) = 4 Then
$sessionkey = StringRight(StringTrimRight($recvsession,1),4)
$recvsession2 = StringTrimRight($recvsession,5)
$recvsession2 = BinaryToString(_Crypt_DecryptData(BinaryToString($recvsession2), $g_hKey, $CALG_USERKEY))
ConsoleWrite("Server Responds: " & $recvsession2 & "|Sessionkey is: " & $sessionkey & @CRLF)
Elseif StringRight($recvsession,1) = "0" Then
ConsoleWrite("Server Responds: " & $recvsession & @CRLF & "Programm will now Exit" & @CRLF)
sleep(2000)
Exit
EndIf
$ester = 1
EndIf
$cmdinput = InputBox("Kommandoeingabe","","dir") ;<=Gib mirn befehl
If $cmdinput = "" Then
$cmdinput = "exit" ;<=Damit der Server auch herunterfährt & sich nicht aufhängt
EndIf
ConsoleWrite("Encrypt.. " & $cmdinput & @CRLF)
$sEncryptedData = _Crypt_EncryptData(StringToBinary($cmdinput), $g_hKey, $CALG_USERKEY) ;<=RC4 verschlüsselung des Befehls
ConsoleWrite("Client send: " & $cmdinput & @CRLF & "Waiting for Response.. This could take some time(tree)" & @CRLF) ;<=Anzeigen des zusendenen befehls
TCPSend($iSocket, $sEncryptedData & $sessionkey & StringTrimLeft(StringToBinary($trenner),2)) ;<=$trenner wird binär & das 0x vorne wird entfernt
If @error Then Exit
if $cmdinput = "restart" Then
Sleep(1000)
ShellExecute(@ScriptFullPath) ;<================noch zu überarbeiten
Exit
EndIf
Local $sReceived = '' ;<=Macht den Buffer leer
Do
$sReceived &= TCPRecv($iSocket, 2048,1) ;<=Empfange pakete binär - Beachte '&=' ohne das kommt bei größeren antworten nur das letzte paket an
Until StringInStr($sReceived,StringTrimLeft(StringToBinary($trenner),2)) <> 0 ;<=Sobald $sReceived den substring $trenner in binär ohne 0x findet wird die schleife beendet
$sReceived = "0x" & StringReplace($sReceived,"0x","");<=nach 2048 zeichen kam gerne wiederhohlt ein 0x, deshalb ließen sich ergebnisse wie tree nicht entschlüsseln, das wird hier gecounterd
;~ FileWrite(FileOpen(@ScriptDir & "\ZC.txt",16+1),$sReceived & @CRLF & @CRLF) ;<====================================müll
$sReceivedE = StringTrimRight($sReceived,StringLen(StringTrimLeft(StringToBinary($trenner),2)));<=hier wird der binäre $trenner entfernt damit die eigentliche antwort entschlüsselt werden kann
$sessioncheck = StringRight($sReceivedE, 4)
if $sessioncheck <> $sessionkey Then
ConsoleWrite(@CRLF & "Something went badly wrong" & @CRLF & "CMD is now closing" & @CRLF)
sleep(2000)
Exit
EndIf
$sReceivedE = StringTrimRight($sReceivedE, 4)
ConsoleWrite("Decrypt.. " & @CRLF)
sleep(200)
$sDecryptedData = _Crypt_DecryptData(BinaryToString($sReceivedE), $g_hKey, $CALG_USERKEY) ;<=Entschlüssele die Antwort
$sDecryptedData = BinaryToString($sDecryptedData) ;<=ist ja jetzt lesbar, also kann es auch zu einem string formatiert werden
ConsoleWrite("Client receive: " & $sDecryptedData & @CRLF) ;<=Anzeigen der Antwort
FileWrite(FileOpen(@ScriptDir & "\1.txt",16+1),$sDecryptedData & @CRLF & @CRLF) ;<=Logging
Else
MsgBox(0,"","No Connection Establishment")
Exit
EndIf
TCPCloseSocket($iSocket)
WEnd
Func OnAutoItExit()
_Crypt_DestroyKey($g_hKey)
_Crypt_Shutdown()
TCPShutdown() ; Close the TCP service.
EndFunc ;==>OnAutoItExit
Alles anzeigen