通过PowerShell获取TCP响应(类Telnet)

通常情况下,为了检测指定的TCP端口是否存活,我们都是通过telnet指定的端口看是否有响应来确定,然而默认情况下win8以后的系统默认是不安装telnet的。设想一下如果你黑进了一个服务器,上面没装telnet,但是为了进一步渗透进内网,需要探测内部服务器特定端口是否打开,同时你还不愿意安装telnet,担心引起管理员注意。那么好吧,在这个情况下你需要我的这个脚本。由于它是原生态的PowerShell语句完成,木有telnet你也照样能检测TCP端口的情况了。

下面首先上代码,后面进行讲解:

        =====文件名:Get-TCPResponse.ps1=====
 Get-TCPResponse {
<
    [OutputType('
    [cmdletbinding()]
     (
        [parameter(ValueFromPipeline,ValueFromPipelineByPropertyName)]
        [Alias('__Server','IPAddress','IP','domain')]
        [[]]$Computername = $env:Computername,
        [[]]$Port = 25,
        []$TCPTimeout = 1000
    )
     {
         ($Computer  $Computername) {
             ($_port  $Port) {
                $stringBuilder =  Text.StringBuilder
                $tcpClient =  System.Net.Sockets.TCPClient
                $connect = $tcpClient.BeginConnect($Computer,$_port,$null,$null) 
                $wait = $connect.AsyncWaitHandle.WaitOne($TCPtimeout,$false) 
                 ( $wait) {
                    $object = [pscustomobject] @{
                        Computername = $Computer
                        Port = $_Port
                        IsOpen = $False
                        Response = $Null
                    }
                }  {
                     ($True) {

                         -Milliseconds 1000
                         
                         ([int64]$tcpClient.Available  0) {
                            $stream = $TcpClient.GetStream()
                            $bindResponseBuffer =  Byte[] -ArgumentList $tcpClient.Available
                            []$response = $stream.Read($bindResponseBuffer, 0, $bindResponseBuffer.count)  
                            $Null = $stringBuilder.Append(($bindResponseBuffer |  {[char][]$_}) -join )
                        }  {
                            
                        }
                    } 
                    $object = [pscustomobject] @{
                        Computername = $Computer
                        Port = $_Port
                        IsOpen = $True
                        Response = $stringBuilder.Tostring()
                    }
                }
                $object.pstypenames.insert(0,'
                 $object
                 ($Stream) {
                    $stream.Close()
                    $stream.Dispose()
                }
                $tcpClient.Close()
                $tcpClient.Dispose()
            }
        }
    }
}
首先创建一个System.Net.Sockets.TCPClient对象,去连接指定的域名和端口,瞬间断开的那是服务器没开那个端口,直接被拒绝了,如果没拒绝,那就等着服务器端给你响应,然后读取字节流拼接起来进行解析。
最后需要强调的是需要对打开的流和TCP连接进行关闭,以便释放资源

调用方法如下:

Get-TCPResponse -Computername pop.126.com -Port 110

 

通过PowerShell获取TCP响应(类Telnet)_第1张图片

再对比一下telnet的结果

通过PowerShell获取TCP响应(类Telnet)_第2张图片

结果是一样的,以后没有telnet也难不住大家了,have fun!^_^

 
作者: 付海军
出处:http://blog.csdn.net/fuhj02
版权:本文版权归作者和csdn共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://www.fuhaijun.com/

你可能感兴趣的:(PowerShell,网络安全)