主机发现端口扫描原理及工具选择(无nmap环境情况)

1.主机发现

Nmap中的-sn命令实际上封装的是系统的ping命令,无论winodws和linux 都是由ping命令

所以 先给一个ping

ping -c 1 -W 1 192.168.88.$
  • -c:count 数量 后面跟数字
  • -W:超时事件,在给定时间内扫描,不能超过指定时间。超过时间扫描结束,根据速度和准确性的权衡,后面跟1
  • $:因为是主机发现,所以第四位为变量,要靠bash脚本完成
for i in {1..254};do ping -c 1 -W 1 192.168.88.$i;done

首先要有一个for循环,声明一个i的变量,变量的范围在花括号:1-254,因为0和255两个ip地址有特殊用途,所以只可能是1-254. 然后加一个分号;  在最后面指定i的变量 最后加一个done。do和最后的done均为bash语法。

现在逻辑通了但不能执行,因为执行后会有254组结果。阅读性会很差,所以要将有用的信息筛选出来。

方法:

比如我们现在的ip为192.168.88.155

那么我们就可以缩小变量到155附近的范围

for i in {152..158};do ping -c 1 -W 1 192.168.88.$i;done

 这样我们接受到的回显既有开放的主机又有未开放的主机,就可以看到二者的回显,得到开放及未开放的特征。

我们能确定的是:192.168.88.155这台机器是一定开放的,而155的回显与其他回显不同的是多了一个from,那么我们就可以将from当做开放机器的特征码进行筛选。

for i in {1..254};do ping -c 1 -W 1 192.168.88.$i | grep from;done

2.端口扫描

2.1 旧版nc

nc.traditional -vv -z 192.168.88.158 1-65535
  • nc.traditional:旧版nc
  • -vv:让信息详细显示
  • -z:零数据传输

理论来说这一行代码已经可以实现端口扫描

但执行出的回显是65535条,所以我们需要过滤

我们需要知道开放端口状态及未开放端口的状态特征码

nc.traditional -vv -z 192.168.88.158 80-110

回显结果发现,未开放的端口都存在refused

nc.traditional -vv -z 192.168.88.158 1-65535 | grep -v refused
  • -v:反选。不选择输出字段refused

但这个命令的回显仍然是65535条,过滤是无效的。

实际上这条命令过滤只对结果产生回显过滤,而虽然是显示出来了这些过滤信息,但这些错误信息类型是分开的。  所以要将错误输出重新输入给标准输出:2>&1,这样所有信息都是一个类型,只有这样才会接受grep的过滤。

nc.traditional -vv -z 192.168.88.158 1-65535 2>&1 | grep -v refused 
  • nc.traditional:旧版nc
  • -vv:让信息详细显示
  • -z:零数据传输
  • -v:反选。不选择输出字段refused
  • 2>&1:将错误输出重新输入给标准输出,让所有输出类型都为标准输出,这样才会接受grep的过滤

2.2 伪设备

在linux系统中所有的设备都是映射成文件,所以我们用文件也可以模拟设备。

很多时候更友好的环境为bash环境,因为从早期的kali主流的shell环境都是bas,最近才改的zsh。

虽然现在的环境变量为zsh

但很多语句和习惯都是bash 的写法来写的,二者差别并不是很大,更多的是他们的生态,因为zsh的生态会更好,所以kali改成了zsh,但很多经典的语句和方法都还保留这bash的写法,在bash会更稳定,否则的话也很难说是bash 的语法还是zsh的语法,也与扫描目标的互动,应用有关。

for i in {1..65535}; do (echo < /dev/tcp/192.168.88.158/$i) ; done
  • for循环,指定端口范围1-65535
  • /dev/tcp  这就是我们所说的伪设备
  • 加括号的目的是里面的语句是整体执行的,后面还会放更复杂的语句

这个语句结束后,理论上已经可以实现端口扫描的效果,但因为我们指定了65535个端口号,回显的结果也会是65535,所以我们在输出输入做一些处理。

for i in {1..65535}; do (echo < /dev/tcp/192.168.88.158/$i) &>/dev/null && printf "\n[+] The Open Port is: %d\n" "$i"; done
  •  &>/dev/null   and没有指明1或2,那就是1和2都包括 都定向到/dev/null 扔掉。意思就是无论正确的结果还是错误的结果都扔掉。
  • &&  两个and逻辑符。意思为,前面的执行正确才执行后面的,否则都不执行。
  • printf  c语言的字符串,打印出后面的字符串。配合&&意思为,前面执行正确才能打印出后续的字符串。前面找到了开放的端口,后面才能执行printf输出字符串The Open Port is: %d "$i":

但这样写的命令要考虑一件事情,因为命令本身需要去过65535个请求,所以卡在某处我们并不能分辨是程序卡顿还是端口扫不到,所以需要再完善一下

for i in {1..65535}; do (echo < /dev/tcp/192.168.88.158/$i) &>/dev/null && printf "\n[+] The Open Port is: %d\n" "$i" || printf "." ; done
  • printf "."  前面加|| 或。意思为当有正确的时候会显示出来。没有正确的时候,会用或||输出一个点.  这个点的输出可以让我们很直观的分辨程序是否在执行或卡死了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值