【技术分享】手把手教你使用PowerShell内置的端口扫描器

引言


想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用。有的时候仅仅是想看一下某个端口是否开放。在这些情况下,PowerShell确实能够大放异彩。接下来我们聊聊如何使用PowerShell实现基本的端口扫描功能。

本文中用到的PowerShell命令


PowerShell端口扫描器:针对单个IP的多个端口的扫描

1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.100",$_)) "Port $_ is open!"} 2>$null

Test-Netconnection 针对某IP段中单个端口的扫描

foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

针对某IP段 & 多个端口的扫描器

1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}

PowerShell测试出口过滤器

1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("allports.exposed",$_)) "Port $_ is open!" } 2>$null

为了仅用一行PowerShell命令实现一个端口扫描器,我们需要组合3个不同的组件:创建一系列对象、循环遍历每个对象、将每个对象的信息输出到屏幕。在PowerShell中,我们可以利用好其面向对象的特性来帮助我们实现此过程。

PowerShell端口扫描器


1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.100",$_)) "Port $_ is open!"} 2>$null

命令分解

1)1..1024 - 创建值为从1到1024的一系列变量

2)| - 管道运算符,将上述对象传递给循环体

3)% - 在PowerShell中,%是foreach对象的别名,用来开始一个循环。循环体为接下来使用大括号{}括起来的内容

4)echo - 将输出打印至屏幕

5)new-object Net.Sockets.TcpClient - 新建一个.Net TcpClient类的实例,它允许我们和TCP端口之间建立socket连接

6).Connect("10.0.0.100",$_)) - 调用TcpClient类的Connect函数,参数为10.0.0.100和端口$_。其中$_这个变量表示当前对象,即本轮循环中的数字(1..1024)

7)"Port $_ is open!") - 当程序发现一个开放的端口时,屏幕打印『Port # is open!』

8)2>$null - 告诉PowerShell遇到任何错误都不显示

上述示例中扫描的端口是1-1024,但是可以很容易改成如(22..53)、(8000..9000)等端口范围。

在PowerShell中另外一种可用的方法是使用Test-NetConnection命令。该命令使用方法差不多,还能够输出更多有用的信息。

Test-NetConnection 针对某IP段中单个端口的扫描


foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

Test-NetConnection的最大的不足是:该命令是在4.0版本的PowerShell中才引入的。

命令分解

1)foreach ($ip in 1..20) {} - 循环遍历数字1到20

2)Test-NetConnection - Test-Connection是一个用来测试不同种类的网络连接的工具

3)-Port 80 - 检查80端口是否可用

4)-InformationLevel "Detailed" - 提供详细的输出信息

5)192.168.1.$ip - 针对列表中的IP地址,依次尝试向80端口发起连接。在本例中,变量$ip从1循环至20

当然,构建一个可以遍历多个系统的多个端口的扫描器也是可行的。

针对某IP段 & 多个端口的扫描器


1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}

这一版本的扫描器会对10.0.0.1-20IP段的1-1024端口进行扫描。注意,这可能需要花费较长时间才能完成扫描。一种更有效的方法是手动指定目标端口,比如接下来介绍的:

针对某IP段 & 多个端口的扫描器v2


1..20 | % { $a = $_; write-host "------"; write-host "10.0.0.$a"; 22,53,80,445 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}

额外奖励 - 测试出口过滤


许多安全的网络环境会开启出口流量过滤控制,以限制对某些服务的出口协议的访问。这对于提升HTTP/HTTPS/DNS通道的安全性是有好处的,原因之一就在于此。然而,当需要识别出可替代的出站访问时,我们可以在内网中使用PowerShell来评估网络防火墙上的出口过滤器。

PowerShell测试出口过滤器

1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("allports.exposed",$_)) "Port $_ is open" } 2>$null

有关PowerShell出口测试的更多信息,请参考Beau Bullock在*Black Hills Information Security中发表的文章:http://www.blackhillsinfosec.com/?p=4811

结论


PowerShell是一个强大的工具,一旦在Windows环境启用了PowerShell,则几乎可以用PS完成任何事情。大家如果有其他相关的PowerShell独门绝技,欢迎留言评论。

本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://pen-testing.sans.org/blog/2017/03/08/pen-test-poster-white-board-powershell-built-in-port-scanner

【技术分享】手把手教你使用PowerShell内置的端口扫描器的更多相关文章

  1. Spring Boot修改内置Tomcat端口号 (zhuan)

    http://blog.csdn.net/argel_lj/article/details/49851625 ********************************************* ...

  2. (一)Spring Boot修改内置Tomcat端口号--解决tomcat端口被占用的问题

    Spring Boot 内置Tomcat默认端口号为8080,在开发多个应用调试时很不方便,本文介绍了修改 Spring Boot内置Tomcat端口号的方法. 一.EmbeddedServletCo ...

  3. UI设计技术分享:教你几个设计技巧让老板对你的设计赞不绝口

    我们做任何设计都离不开大小与重复的运用,这样能使我们的设计更加理性和科学,经得起推敲,那么我们一起来探讨下如何在产品设计中运用这一方法. 为什么大的物体更吸引眼球    ▲如上图所示,a球会比右边b球 ...

  4. 谢宝友: 手把手教你给Linux内核发patch

    本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 谢宝友 来源: 微信公众号 linux阅码场 (id: linuxdev) 本文简介       本文一步一 ...

  5. 表格技术七十二变|手把手教你用Canvas电子表格做电子签名

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 日常生活工作学习中,大家对电子表格必定不陌生.从工作数据汇总分析到出门收据各种电子发票,这些都是由电子表格制 ...

  6. 手把手教你在Linux中快速检测端口的 3 个小技巧

    一个执着于技术的公众号 前言 无论是要解决网络连接问题还是配置防火墙,第一件事是要检查系统实际打开了哪些端口. 本文介绍了几种快速查找 Linux 系统上哪些端口向外部开放的方法. 什么是开放端口 监 ...

  7. UWA 技术分享连载 转载

    技术分享连载1 Q1:Texture占用内存总是双倍,这个是我们自己的问题,还是Unity引擎的机制? Q2:我现在发现两个因素直接影响Overhead,一个是Shader的复杂度,一个是空Updat ...

  8. -_-#微信内置JavaScript API WeixinJSBridge

    微信相关的 js 操作:分享.网络.菜单 微信内置JsAPI之WeixinJSBridge微信WeixinJSBridge API续

  9. 【转】这些隐藏在苹果iPhone当中的内置代码你是否知道?

    原文地址:http://www.ithome.com/html/iphone/200569.htm 每一部手机都有一些内置的隐藏代码,我们称之为“指令”,这些代码加在一起就叫做“指令集”.当然这些代码 ...

随机推荐

  1. css3 变换 transform(2D)

    一.transform变换 可做拉伸.压缩.旋转.偏移的效果.需加各个浏览器前缀. 二.transform-origin 为transform属性值的基点,默认值为元素的中心位置,即以元素左上角为坐标 ...

  2. synchronized优化

    重量级锁 synchronized关键字 前文解释了synchronized的实现和运用,了解monitor的作用,但是由于monitor监视器锁的操作是基于操作系统的底层Mutex Lock实现的, ...

  3. 操作系统,银行家算法模拟实现(Windows 环境 C++)

    计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...

  4. showcase,开发中必须引起重视的小环节

    有人说,测试者来自火星,开发者来自金星.这是因为软件测试员和软件开发者就好比一对冤家,里面的缘由说不清也道不明.开发代表着创造,而测试则代表着摧毁,因为测试的目的就是以各种方式不断地从开发出的产品中发 ...

  5. yum 源问题

    YUM源搭建 1.yum源是yum安装的获取源地,yum  = 红帽包管理 echo /dve/sr0 /media ios9660 defaults 0 0 >> /etc/fstab ...

  6. Linux 下实时查看日志

    Linux 下实时查看日志 cat /var/log/*.log 如果日志在更新,如何实时查看 tail -f /var/log/messages 还可以使用 watch -d -n 1 cat /v ...

  7. 在 overlay 中运行容器 - 每天5分钟玩转 Docker 容器技术(51)

    上一节我们创建了 overlay 网络 ov_net1,今天将运行一个 busybox 容器并连接到 ov_net1: 查看容器的网络配置: bbox1 有两个网络接口 eth0 和 eth1.eth ...

  8. 设计模式(二) 策略模式Strategy

    策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度3m/s,有人100m/s,把他们的具体行走和对象本身 ...

  9. 带着SMART原则重新出发

    很久以来,对分布式系统都比较感兴趣,但工作中却接触不到,“虽不能至,心向往之”,于是打算自己学.分布式系统领域概念很多,错综复杂,一些理论也比较难以理解,要想学习的话还是得下一番功夫.于是在来两个月前 ...

  10. ReactiveSwift源码解析(十) Lifetime代码实现

    为了之后博客的进行,本篇博客我们就来聊一下ReactiveSwift框架中的Lifetime类的具体实现.从Lifetime这个名字中我们就这道,就是生命周期.在ReactiveSwift中使用Lif ...