Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Opening up a port with powershell

On Machine A I am running a port scanner. On Machine B I would like to open and close ports in an organized fashion. I am hoping to do all of this via powershell.

I found THIS script to run on Machine B however when scanning the same port from Machine A it still says that it is closed.

Do any of you know how I can successfully open a port on Machine B

like image 515
mhopkins321 Avatar asked Oct 29 '12 20:10

mhopkins321


People also ask

How do I open a port in PowerShell?

Tutorial Firewall - Open a TCP port using Powershell As an Administrator, start an elevated Powershell command-line. Create a firewall rule to open a TCP port using Powershell. Verify the created firewall rule. In our example, we created a firewall rule to allow the input on the TCP port 80 using Powershell.

How do I open a port in Command Prompt?

Answer: Open the Run command and type cmd to open the command prompt. Type: “netstat –na” and hit enter. Find port 445 under the Local Address and check the State. If it says Listening, your port is open.


2 Answers

Avoid COM if possible. You can use TcpListener to open a port:

$Listener = [System.Net.Sockets.TcpListener]9999;
$Listener.Start();
#wait, try connect from another PC etc.
$Listener.Stop();

If you happen to miss a Stop command during debugging - just close and re-open the application from where you opened the socket - hanging port should be cleared. In my case it was PowerGUI script editor.

Then use TcpClient to check it.

(new-object Net.Sockets.TcpClient).Connect($host, $port)

If you cannot connect, means the firewall is blocking it.

EDIT: To print a message when connection is received, you should be able to use this code (based on this article from MSDN):

#put this code in between Start and Stop calls.
while($true) 
{
    $client = $Listener.AcceptTcpClient();
    Write-Host "Connected!";
    $client.Close();
}
like image 116
Neolisk Avatar answered Sep 28 '22 03:09

Neolisk


I needed something that would not only acknowledge that the port was open, but respond as well. So,here's my super-basic not-quite-telnet server.

Clear-Host; $VerbosePreference="Continue"; $Port=23
$EndPoint=[System.Net.IPEndPoint]::new([System.Net.IPAddress]::Parse("<ip address>"),$Port)
$Listener=[System.Net.Sockets.TcpListener]::new($EndPoint)

$KeepListening=$true
while ($KeepListening) {
  $Listener.Start()
  while (!$Listener.Pending) { Start-Sleep -Milliseconds 100 }

  $Client=$Listener.AcceptTcpClient()
  Write-Output "Incoming connection logged from $($Client.Client.RemoteEndPoint.Address):$($Client.Client.RemoteEndPoint.Port)"

  $Stream=$Client.GetStream()
  $Timer=10; $Ticks=0; $Continue=$true
  $Response=[System.Text.Encoding]::UTF8.GetBytes("I see you.  I will die in $($Timer.ToString()) seconds.`r`nHit <space> to add another 10 seconds.`r`nType q to quit now.`r`nType x to terminate listener.`r`n`r`n")
  $Stream.Write($Response,0,$Response.Length)

  $StartTimer=(Get-Date).Ticks
  while (($Timer -gt 0)  -and $Continue) {
    if ($Stream.DataAvailable) {
      $Buffer=$Stream.ReadByte()
      Write-Output "Received Data: $($Buffer.ToString())"
      if ($Buffer -eq 113) {
        $Continue=$false
        $Response=[System.Text.Encoding]::UTF8.GetBytes("`r`nI am terminating this session.  Bye!`r`n")
      }
      elseif ($Buffer -eq 32) {
        $Timer+=10
        $Response=[System.Text.Encoding]::UTF8.GetBytes("`r`nAdding another 10 seconds.`r`nI will die in $($Timer.ToString()) seconds.`r`n")
      }
      elseif ($Buffer -eq 120) {
        $Continue=$false
        $KeepListening=$false
        $Response=[System.Text.Encoding]::UTF8.GetBytes("`r`nI am terminating the listener.  :-(`r`n")
      }
      else { $Response=[System.Text.Encoding]::UTF8.GetBytes("`r`nI see you.  I will die in $($Timer.ToString()) seconds.`r`nHit <space> to add another 10 seconds.`r`nType q to quit this session.`r`nType x to terminate listener.`r`n`r`n") }

      $Stream.Write($Response,0,$Response.Length)
    }
    $EndTimer=(Get-Date).Ticks
    $Ticks=$EndTimer-$StartTimer
    if ($Ticks -gt 10000000) { $Timer--; $StartTimer=(Get-Date).Ticks }
  }

  $Client.Close()
}
$Listener.Stop()
like image 39
Slogmeister Extraordinaire Avatar answered Sep 28 '22 05:09

Slogmeister Extraordinaire