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 "." 前面加|| 或。意思为当有正确的时候会显示出来。没有正确的时候,会用或||输出一个点. 这个点的输出可以让我们很直观的分辨程序是否在执行或卡死了。