设为首页 收藏本站
查看: 1218|回复: 0

powershell对指定IP进行端口扫描

[复制链接]

尚未签到

发表于 2018-9-3 07:38:24 | 显示全部楼层 |阅读模式
  powershell对指定IP进行端口扫描
  1..1024 | %{ echo ((new-object Net.Sockets.TcpClient).Connect("192.168.10.26",$_)) "$_ is open"} 2>$null
  语句中直接通过..列举了1到1024之间的数字,通过管道次传递给后面的操作符,使用New-Object创建System.Net.Sockets.TCPClient对象,调用该对象的Connect()方法连接指定IP的指定端口,而端口则是由管道传入的入组对象,也就是前面提到的1~1024及其之间的的数字,是由$_这个自动变量来代替,代表管道传入的当前的对象。对于开放TCP端口是会有相应的程序监听该端口的,等待程序连接,如果连接了一个未曾起监听的端口,TCPClient对象是会抛出以下的异常
  “Exception calling "Connect" with "2" argument(s): "由于目标机器积极拒绝,无法连接。 192.168.10.26:1"”
  对于抛出的异常通过2>$null的方式将错误信息重定向到$null的空设备,而不再当前屏幕输出,于此同时如果在对指定端口进行连接的过程中未曾抛出异常说明TCPClient对象可以正常连接到端口,则打印出该端口并提示该端口是打开的。
  通过PowerShell对.net对象的调用我们可以做很多的事情,基本上用WinForm和asp.net能做的事情大多可以通过PowerShell进行操作,与此同时我有了一个想法,通过PowerShell是否可以写出一些常用的用于安全和***测试的工作脚本,这些脚本可以组合成一个工具集,这不就能在手边没有相关***工具的情况下用 轻量级的脚本环境+编程 实现安全相关的功能检测呢?
  上面的脚本写的很简练了,但是有一个缺点,就是调用的TCPClient对象超时时间比较长,不管端口是否开发,都需要等到连接超时后才会扫描下一个端口,扫描一个区间的端口会耗费很多的时间,鉴于此我打算改造上面的脚本,为了便于函数的共享和重用,创建一个名为PSNet的工具集:
  Step 1:创建PowerShell的工作文件夹(D:\My Documents\WindowsPowerShell\Modules)并创建系统环境变量指向该目录,便于后续调用,如PSSpace
  Step 2.在上述步骤中提到的PSSpace路径中创建与目标module同名的目录用于存放脚本,即在%PSSpace%下创建PSNet
  Step 3.在PSNet目录下创建与module同名的.psm1文件PSNet.psm1
  Step 4.在PSNet目录下创建相关细分的子函数目录,便于不同类型操作进行分类,如创建TCPOp,用于创建TCP相关操作,并把Test-TCPPort.ps1放入其中
  Step 5.打开PSNet.psm1加入行:.$PSSpace/TCPOp/Test-TCPPort.ps1 以后如果要创建任何相关函数文件都可以添加一条记录到此文件,以便module初始化的时候可以初始化相关的函数,如果相关函数相互之间存在依赖关系,被依赖的文件初始化语句需要放在有依赖关系的文件语句之前
  Step 6. 在PSNet.psm1语句的最后面添加Export-ModuleMember -Function * 语句用于将从该文件中导入的函数都作为Module的成员发布,注意此语句每个模块只可使用一次否则将会报错。
  至此工具集的结构创建成功,目录树如下所示:
  +D:\MY DOCUMENTS\WINDOWSPOWERSHELL\MODULES
  └─PSNet
  │  PSNet.psm1
  │
  └─TCPOp
  Test-TCPPort.ps1
  如果我们要在PSNet下创建关于UDP相关的操作可以与TCPOp同级创建UDPOp子模块目录,依次类推,与网络相关的操作子模块均放在PSNet下,再预先创建一个PSSecurity模块用于后续创建于安全相关的模块。目录结构如下:
  +D:\MY DOCUMENTS\WINDOWSPOWERSHELL\MODULES
  ├─PSNet
  │  │  PSNet.psm1
  │  │
  │  ├─TCPOp
  │  │      Test-TCPPort.ps1
  │  │
  │  └─UDPOp
  └─PSSecurity
  对于Test-TCPPort.ps1子模块,写入以下代码用于实现对TCP端口是否监听进行测试:
Function Test-TCPPort  
{
  
param ( [ValidateNotNullOrEmpty()]
  
[string] $EndPoint = $(throw "Please specify an EndPoint (Host or IP Address)"),
  
[string] $Port = $(throw "Please specify a Port") )
  

  
try
  
{
  
$TimeOut = 1000#定义TCP端口超时时间
  
if ( $IP = [System.Net.Dns]::GetHostAddresses($EndPoint) )
  
{
  
$Address = [System.Net.IPAddress]::Parse($IP)
  
$Socket = New-Object System.Net.Sockets.TCPClient
  
$Connect = $Socket.BeginConnect($Address,$Port,$null,$null)
  
if ( $Connect.IsCompleted )
  
{
  
$Wait = $Connect.AsyncWaitHandle.WaitOne($TimeOut,$false)
  
if(!$Wait)
  
{
  
$Socket.Close()
  
return $false
  
}
  
else
  
{
  
$Socket.EndConnect($Connect)
  
$Socket.Close()
  
return $true
  
}
  
}
  
else
  
{
  
return $false
  
}
  
}
  
else
  
{
  
return $false
  
}
  
}
  
catch{}
  
}
对于此模块可以通过PowerShell命令行使用以下语句 :  Import-Module $env:PSSpace/PSNet
  Test-TCPPort 192.168.10.26 80
  进行调用,或者通过命令行或者批处理启动时指定
  start %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -noExit -Command "Import-Module '%PSSpace%\PSNet' "
  对于本文最初的那个例子,在有了导入这个模块后执行:
  1..1024 | %{$A=(Test-tcpport 192.168.10.26 $_)
  if($a) {
  echo $_
  }
  }
  在本文通过一段小脚本的方式引入了通过PowerShell实现简单安全***功能的想法,首先介绍了该小脚本是如何实现功能的,接下来对创建脚本工具集并导入的方法,随后又在该工具集中创建了Test-TCPPort函数,并介绍了调用方法,在后续的文章中将会陆续介绍相关脚本的开发,尽请期待。
  作者: 付海军
  出处:http://fuhj02.blog.51cto.com
  版权:本文版权归作者和51cto共有
  转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
  要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接且保证内容完整!否则必究法律责任!
  个人网站: http://txj.shell.tor.hu/



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-561785-1-1.html 上篇帖子: PowerShell检测AD域用户密码到期邮件提醒 下篇帖子: PowerShell学习笔记(四)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表