很多时候我们需要通过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
执行效果如图所示:
需要说明的是,由于页面返回的内容太长了,这里至少是将返回的内容缓存在一个变量里,并只输出了变量的头10行。
有了这个脚本,我们就可以向指定的web服务器发送特定的请求,来实现模拟登陆和操作的功能了。
作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接且保证内容完整!否则必究法律责任!
个人网站: http://www.fuhaijun.com/