通过PowerShell发送TCP请求

很多时候我们需要通过Socket发送特定的TCP请求给服务器的特定端口来实现探测服务器的指定端口所开启的服务。很多语言都有相应的方法实现上述需求,当然,PowerShell也不例外,比如我们要发送一个简单的http请求到指定的web服务器:

GET / HTTP/1.1
Host:cn.bing.com

这里我们想请求微软必应的中文首页,如果需要通过PowerShell向cn.bing.com服务器发送get请求,就需要创建一个System.Net.Sockets.TcpClient对象,向指定的服务器和端口发送请求。

具体代码如下:

        =====文件名:Send-TcpRequest.ps1=====
















( 
        [] $remoteHost = , 
        [] $port = 80, 
        [] $UseSSL, 
        [] $inputObject, 
        [] $commandDelay = 100 
     ) 

[] $output =  



$currentInput = $inputObject 
( $currentInput) 
{ 
    $SCRIPT:currentInput = @($input) 
} 
$scriptedMode = [bool] $currentInput 

 Main 
{ 

    ( $scriptedMode) 
    { 
          
    } 

     {  ; exit } 
    $socket =  System.Net.Sockets.TcpClient($remoteHost, $port) 

    ( $scriptedMode) 
    { 
          
    } 

    $stream = $socket.GetStream() 

    ($UseSSL) 
    { 
        $sslStream =  System.Net.Security.SslStream $stream,$false 
        $sslStream.AuthenticateAsClient($remoteHost) 
        $stream = $sslStream 
    } 

    $writer =  System.IO.StreamWriter $stream 

    ($true) 
    { 

        $SCRIPT:output += GetOutput 



        ($scriptedMode) 
        { 
            ($line  $currentInput) 
            { 
                $writer.WriteLine($line) 
                $writer.Flush() 
                 -m $commandDelay 
                $SCRIPT:output += GetOutput 
            } 

             
        } 


         
        { 
            ($output)  
            { 
                ($line  $output.Split()) 
                { 
                     $line 
                } 
                $SCRIPT:output =  
            } 


            $command =  
            ($command  ([char] 4)) { ; } 


            $writer.WriteLine($command) 
            $writer.Flush() 
        } 
    } 


    $writer.Close() 
    $stream.Close() 


    ($scriptedMode) 
    { 
        $output 
    } 
} 


 GetOutput 
{ 

    $buffer =  System.Byte[] 1024 
    $encoding =  System.Text.AsciiEncoding 

    $outputBuffer =  
    $foundMore = $false 



     
    { 

         -m 1000 


        $foundmore = $false 
        $stream.ReadTimeout = 1000 

         
        { 
            try 
            { 
                $read = $stream.Read($buffer, 0, 1024) 

                ($read  0) 
                { 
                    $foundmore = $true 
                    $outputBuffer += ($encoding.GetString($buffer, 0, $read)) 
                } 
            } catch { $foundMore = $false; $read = 0 } 
        } ($read  0) 
    } ($foundmore) 

    $outputBuffer 
} 
. Main 

该脚本使用方法如下:

$http = @"
GET / HTTP/1.1
Host:cn.bing.com
`n`n
"@

$http | .\Send-TcpRequest cn.bing.com 80

执行效果如图所示:

image

需要说明的是,由于页面返回的内容太长了,这里至少是将返回的内容缓存在一个变量里,并只输出了变量的头10行。

有了这个脚本,我们就可以向指定的web服务器发送特定的请求,来实现模拟登陆和操作的功能了。

 

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

转载于:https://www.cnblogs.com/fuhj02/p/3349860.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值