PowerShell小技巧之獲取TCP響應(yīng)(類Telnet)
通常情況下,為了檢測指定的TCP端口是否存活,我們都是通過telnet指定的端口看是否有響應(yīng)來確定,然而默認情況下win8以后的系統(tǒng)默認是不安裝telnet的。設(shè)想一下如果你黑進了一個服務(wù)器,上面沒裝telnet,但是為了進一步滲透進內(nèi)網(wǎng),需要探測內(nèi)部服務(wù)器特定端口是否打開,同時你還不愿意安裝telnet,擔心引起管理員注意。那么好吧,在這個情況下你需要我的這個腳本。由于它是原生態(tài)的PowerShell語句完成,木有telnet你也照樣能檢測TCP端口的情況了。
下面首先上代碼,后面進行講解:
=====文件名:Get-TCPResponse.ps1=====
Function Get-TCPResponse {
<# Author:fuhj(powershell#live.cn ,http://fuhaijun.com)
.SYNOPSIS
Tests TCP port of remote or local system and returns a response header
if applicable
.DESCRIPTION
Tests TCP port of remote or local system and returns a response header
if applicable
If server has no default response, then Response property will be NULL
.PARAMETER Computername
Local or remote system to test connection
.PARAMETER Port
TCP Port to connect to
.PARAMETER TCPTimeout
Time until connection should abort
.EXAMPLE
Get-TCPResponse -Computername pop.126.com -Port 110
Computername : pop.126.com
Port : 110
IsOpen : True
Response : +OK Welcome to coremail Mail Pop3 Server (126coms[75c606d72bf436dfbce6.....])
Description
-----------
Checks port 110 of an mail server and displays header response.
#>
[OutputType('Net.TCPResponse')]
[cmdletbinding()]
Param (
[parameter(ValueFromPipeline,ValueFromPipelineByPropertyName)]
[Alias('__Server','IPAddress','IP','domain')]
[string[]]$Computername = $env:Computername,
[int[]]$Port = 25,
[int]$TCPTimeout = 1000
)
Process {
ForEach ($Computer in $Computername) {
ForEach ($_port in $Port) {
$stringBuilder = New-Object Text.StringBuilder
$tcpClient = New-Object System.Net.Sockets.TCPClient
$connect = $tcpClient.BeginConnect($Computer,$_port,$null,$null)
$wait = $connect.AsyncWaitHandle.WaitOne($TCPtimeout,$false)
If (-NOT $wait) {
$object = [pscustomobject] @{
Computername = $Computer
Port = $_Port
IsOpen = $False
Response = $Null
}
} Else {
While ($True) {
#Let buffer
Start-Sleep -Milliseconds 1000
Write-Verbose "Bytes available: $($tcpClient.Available)"
If ([int64]$tcpClient.Available -gt 0) {
$stream = $TcpClient.GetStream()
$bindResponseBuffer = New-Object Byte[] -ArgumentList $tcpClient.Available
[Int]$response = $stream.Read($bindResponseBuffer, 0, $bindResponseBuffer.count)
$Null = $stringBuilder.Append(($bindResponseBuffer | ForEach {[char][int]$_}) -join '')
} Else {
Break
}
}
$object = [pscustomobject] @{
Computername = $Computer
Port = $_Port
IsOpen = $True
Response = $stringBuilder.Tostring()
}
}
$object.pstypenames.insert(0,'Net.TCPResponse')
Write-Output $object
If ($Stream) {
$stream.Close()
$stream.Dispose()
}
$tcpClient.Close()
$tcpClient.Dispose()
}
}
}
}
首先創(chuàng)建一個System.Net.Sockets.TCPClient對象,去連接指定的域名和端口,瞬間斷開的那是服務(wù)器沒開那個端口,直接被拒絕了,如果沒拒絕,那就等著服務(wù)器端給你響應(yīng),然后讀取字節(jié)流拼接起來進行解析。
最后需要強調(diào)的是需要對打開的流和TCP連接進行關(guān)閉,以便釋放資源
調(diào)用方法如下:
Get-TCPResponse -Computername pop.126.com -Port 110

再對比一下telnet的結(jié)果

結(jié)果是一樣的,以后沒有telnet也難不住大家了,have fun!^_^
相關(guān)文章
PowerShell 未經(jīng)數(shù)字簽名 系統(tǒng)將不執(zhí)行該腳本
這篇文章主要介紹了PowerShell 未經(jīng)數(shù)字簽名 系統(tǒng)將不執(zhí)行該腳本的相關(guān)資料2017-10-10
Powershell小技巧之使用Get-ChildItem得到指定擴展名文件
本文主要描述了使用Get-ChildItem得到指定擴展名文件的方法以及示例,并介紹了Get-ChildItem混合使用參數(shù)的問題,有需要的朋友可以參考下2014-09-09
Powershell實現(xiàn)導(dǎo)入安裝證書功能腳本分享
這篇文章主要介紹了Powershell實現(xiàn)導(dǎo)入安裝證書功能腳本分享,本文用編程方法實現(xiàn)把pfx證書文件導(dǎo)入到指定的庫中,需要的朋友可以參考下2014-11-11
基于PowerShell在Ubuntu系統(tǒng)的使用詳解
下面小編就為大家分享一篇基于PowerShell在Ubuntu系統(tǒng)的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
PowerShell中使用.NET將程序集加入全局程序集緩存
這篇文章主要介紹了PowerShell中使用.NET將程序集加入全局程序集緩存,本文介紹了兩種方法實現(xiàn)把程序集加入全局程序集緩存,著重講解了使用.Net的類庫解決這個需求,需要的朋友可以參考下2015-06-06
PowerShell入門教程之高效使用PowerShell交互式運行環(huán)境的幾個小技巧
這篇文章主要介紹了PowerShell入門教程之高效使用PowerShell交互式運行環(huán)境的幾個小技巧,本文也可以說是使用PowerShell的一些好習(xí)慣,需要的朋友可以參考下2014-10-10
Powershell展開對象數(shù)據(jù)結(jié)構(gòu)并以JSON格式輸出
這篇文章主要介紹了Powershell展開對象數(shù)據(jù)結(jié)構(gòu)并以JSON格式輸出,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-03-03

