端口扫描系统实践心得
端口扫描对任何一名网络安全从业者来说都不陌生,但作为一名小白,在甲方做扫描系统时踩了不少坑,在网络上找相关资料时没有发现太多相关的文章,于是想写下这篇文章和大家分享一下代码,顺便讨教一下主机存活判断和指纹识别的问题,欢迎大佬们批评和指正。
0×00 目的
对于外网,能够监控对外开放端口情况,并及时的发现向外暴露的高危端口,以便安全人员进行响应处理。对于内网,日常 的端口扫描以及指纹识别,不仅能够帮助梳理公司资产,并且能够帮助进行后续内网的漏洞扫描。
0×01 存活主机判断
开始做端口扫描时,所考虑的第一步便是存活主机判断。最初的设想便是使用nmap的-sP参数,对IP地址进行存活判断。
代码如下:
def ip_alive_check(ip_str):
cmd = "/usr/bin/nmap -sP "+ip_str output = os.popen(cmd).readlines() flag = False for line in list(output): if not line: continue if str(line).lower().find("1 host up") >= 0: flag = True break return flag
但随后便发现这个办法存在问题,引用Nmap官方文档如下:
-sP选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。
如果非特权用户执行,就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。
当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR), ,除非使用了--send-ip选项。
-sP选项可以和除-P0)之外的任何发现探测类型-P* 选项结合使用以达到更大的灵活性。
一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。
当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时, 推荐使用那些高级选项。
否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。
抓包如下:
局域网环境:
非root用户
nmap通过向目标IP的80端口和443端口分别发送SYN包来判断主机是否存活,由于目标主机的80和443端口均未开放,所以均返回RST包
nmap扫描结果:0 hosts up
root用户
nmap发送ARP请求