# smtp-blackhole # # waits for TCP Connections and simulates a SMTP-Server # # pending MultThreading param ( $listenport = 25 ) Set-PSDebug -Strict Start-Transcript ".\smtp-plackhole.$(get-date -Format yyyMMdd-HHMMss).log" Write-Host "SMTP Blackhole started" Write-Host "Generate Listener for Port $($listenport)" $endpoint = new-object System.Net.IPEndPoint([system.net.ipaddress]::any, $listenport) $listener = new-object System.Net.Sockets.TcpListener $endpoint try { $listener.start() # warte auf eingehende Verbindungen } catch { Write-Host "Error during warting listener -Quit" Exit } Write-Host "Wait for connection on Port $($listenport)" $conn = $listener.AcceptTcpClient() # Blockiert das Skript bis eine Verbindung ankommt $sourceip = $conn.Client.RemoteEndPoint.Address.IPAddressToString Write-Host "Neue Verbindung von: $($sourceip)" $stream = $conn.GetStream() # Binde Datenstrom [system.io.streamreader]$streamreader = New-Object System.IO.StreamReader($stream,[system.text.encoding]::ASCII) [system.io.streamwriter]$streamwriter = New-Object System.IO.StreamWriter($stream,[system.text.encoding]::ASCII) $streamwriter.AutoFlush=$true $message = "220 Welcome at SMTPBlackHole" [string]$state = "waitforhelo" [string]$fullmessage="" while ($state -ne "closeconnection") { if ($null -ne $message){ Write-Host "S:$($message)" -ForegroundColor Yellow $streamwriter.WriteLine($message) } Write-Host "Wait for Data from remote host State:$($state)" try { $line = $streamreader.readline() } catch { Write-Host "Error during waiting for connection. Close" $line = $null $state = "closeconnection" } if ($null -eq $line) { Write-Host " Skip empty Line" } else { Write-Host "R:$($line)" -ForegroundColor Green $line = $line.ToLower() if ($state -eq "receivingmail"){ Write-Host "Data:$($line)" -ForegroundColor Magenta if ($line -eq ".") { $state = "waitformailfrom" $message = "250 Mail accepted" $fullmessage } else { $message = $null $fullmessage= $fullmessage + "`r`n" +$line # wait for more lines and final . } } elseif ($line.StartsWith("quit")) { $message = "221 Service closing transmission channel" $state = "closeconnection" } else { switch ($state) { "waitforhelo" { if ($line.StartsWith("helo ")) { $state = "waitformailfrom" $message = "250 2.0.0 Welcome $($line.substring(5)) [$($sourceip)]" } elseif ($line.StartsWith("ehlo ")) { $state = "waitformailfrom" $message = "250-Welcome $($line.substring(5)) [$($sourceip)]" $message += "`r`n250-DSN" $message += "`r`n250-ENHANCEDSTATUSCODES" $message += "`r`n250-8BITMIME" $message += "`r`n250-SIZE" $message += "`r`n250 XOORG" } elseif ($line.StartsWith("rset")) { $state = "waitformailfrom" $message = "250 2.0.0 Reset accepted" } else { $message = "502 5.0.0 Command not implemented. Start with HELO or EHLO first" } } "waitformailfrom" { if ($line.StartsWith("mail from:")) { $state = "waitforrcptto" $message = "250 2.0.0 Hello Sender $($line.substring(10)). continue with RCPT TO" } elseif ($line.StartsWith("rset")) { $state = "waitformailfrom" $message = "250 2.0.0 Reset accepted" } else { $message = "500 5.0.0 start with MAIL FROM first" } } "waitforrcptto" { if ($line.StartsWith("rcpt to:")) { $state = "waitfordata" $message = "250 2.0.0 Message for $($line.substring(10)) OK. continue with RCPT TO or DATA" } elseif ($line.StartsWith("rset")) { $state = "waitformailfrom" $message = "250 2.0.0 Reset accepted" } else { $message = "500 5.0.0 start with RCPT TO first" } } "waitfordata" { if ($line.StartsWith("data")) { $state = "receivingmail" #$state="closeconnection" $message = "354 Start mail input; end transmission with ." $fullmessage="" } else { $message = "200 continue with RCPT TO or DATA" } } default { $message = "550 State $($state) not handled. Check code" } } } } } Write-Host "->$($message)" try { Write-Host "Close StreamReader, Writer, Connection and Listener" $streamwriter.WriteLine($message) $streamwriter.Close() $streamreader.Close() $conn.Close() } catch { Write-Host "Connection was already closed by the remote host" } Write-Host "Close Listener Listener" $listener.stop() Stop-Transcript Write-Host "SMTPBlackhole: End"