问题来了,为什么发现开放端口后还要进行服务扫描呢?
因为往往这些开放端口上运行的应用并不是我们想象中的应用,换句话说22端口上可能并不是跑着SSH服务,也有可能跑的是HTTP服务。基于此考虑,我们需要进行服务扫描,进一步识别开放端口上运行的应用!
下图表示服务扫描的目的:
服务扫描的方法具体有以下几种:基于kali 2018
一、banner捕获
ps:需要建立完整连接;banner信息可能被管理员篡改;有些应用不允许抓取banner信息;
1、工具使用--nc
2、工具使用--socket
ps:scapy缺乏对应用层数据包的支持,主要基于三层四层包的劫持嗅探,无法对一个应用(端口)建立完整连接;以下使用socket演示。
3、脚本使用--socket
#!/usr/bin/python import socket import select import sys if len(sys.argv) !=4: print "Usage: ./banner_grap.py [target ip] [first port] [last port]" print "Example : ./banner_grap.py 1.1.1.5 1 100" print "Example will grap banner for TCP ports through 100 on 1.1.1.5" sys.exit() ip = sys.argv[1] start = int(sys.argv[2]) end = int(sys.argv[3]) for port in range(start,end): try: bangrab = socket.socket(socket.AF_INET,socket.SOCK_STREAM) bangrab.connect((ip,port)) ready = select.select([bangrab],[],[],1) if ready[0]: print "TCP Port " + str(port) + "-" + bangrab.recv(4096) bangrab.close() except: pass
4、工具使用--dmitry
dmitry -pb 192.168.43.32
ps:-p:执行TCP端口扫描;-b:从扫描端口获取banner信息
5、工具使用--nmap
nmap -sT 192.168.43.32 -p 22 --script=banner.nse
6、工具使用--amap
ps:-B:基于banner信息探测端口上的服务
amap -B 192.168.43.32 21
amap -B 192.168.43.32 1-100
二、SNMP分析--渗透测试人员获取设备信息的金矿
ps:监控网络交换机,服务器,firewall等等系统内部信息;
ps:服务端端口161;客户端端口162;
ps:经常被网络管理员错误配置;
ps:SNMP的身份验证信息:community;默认值为public(只读权限),如未修改public字符串,则任何人都可以通过SNMP客户端或扫描工具利用public这个community去连接目标设备,获取详细配置信息;如果值为private(可写权限),则可以通过SNMP对目标服务器的配置信息进行修改;还有一些非标准的community特征字符,如admin、manager;可以构造一个community特征字段字典扫描;
ps:国际化标准组织制定了一个通用的SNMP管理信息库(MIB库);MIB库里存储查询指令的编号;客户端基于编号查询服务端信息,如CPU占用信息,内存,网络进程信息;不同设备厂商开发了MIB库,需要在客户端导入专有MIB库(思科的),发送特有编号给服务器查到厂家专有设备的信息;
ps:编号如1.3.6.1.4.1.77.1.2.25
环境配置:
ps:添加Windows组件-->管理和监视工具
ps:打开并配置SNMP服务
ps:陷井项讲解:配置好SNMP服务后,本机就作为一个SNMP服务端;客户端机器对服务端提起查询请求,默认情况下服务端不会把机器上的性能参数变化向外发;配置了陷阱的SNMP服务端会主动把自己监控的性能参数发往陷阱目标(通常是监控服务器),基于这些信息如果性能超标的话,陷阱主机可以发出告警;
1、工具使用--onesixtyone
ps:探测出硬件架构(基于三四层发现的nmap扫描一般不能发现);如果无结果可能目标服务端改变了community;
onesixtyone -c dict.txt -i hosts -o my.log -w 100
ps:community字典爆破;-i:主机列表
ps:宁玛派扫描134主机的SNMP端口开放否;
ps:然而目标主机161端口是开启的;说明nmap UDP扫描结果出错,并不可靠
2、工具使用--snmpwalk
ps:每个MIB库的ID号可以通过在客户端导入相应厂商的MIB库进行查询
ps:指定UID号针对性查询
3、工具使用--snmpcheck
snmap-check 192.168.43.208 -c public
ps:易读性更好
三、服务识别
1、工具使用--nmap:指纹特征信息匹配识别
nmap -sV 192.168.43.32 -P1-100
PS:较banner信息识别更全面、详细、可信度更高、可识别隐藏服务(18000上跑的http服务)
2、工具使用--amap
amap 192.168.43.32 1-100
ps:不如nmap精确
ps:-q:不报告closed的端口,不打印未识别的端口;-b:以ascii格式输出
四、操作系统识别
ps:TTL起始值可被篡改
1、工具使用--python脚本:ttl_os.py
#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * import sys if len(sys.argv) !=2: print "Usage: ./ttl_os.py [IP address]" print "Example : ./ttl_os.py 1.1.1.5 " print "Example will perform ttl analysis to attempt to determine the system is Windows or linux/unix" sys.exit() ip = sys.argv[1] ans = sr1(IP(dst=str(ip))/ICMP(),timeout=1,verbose=0) if ans == None: print "NO respose was returned" elif int(ans[IP].ttl)<=64: print "Host is Linux/Unix" else: print "Host is Windows"
2、工具使用--nmap
nmap -o 192.168.43.32
ps:CPE:国际化标准组织给每种OS,软件,硬件做了一个CPE编号;通过编号识别进行判断。
3、工具使用--xprobe2
ps:通过多种协议对目标系统进行扫描,根据回包判断指纹信息 ,然后得出结论;无nmap精确
xprobe2 192.168.43.32
ps:一大串外星文,体验极为不佳;
4、工具使用--p0f:基于分析数据包信息判断操作系统信息
ps:基于发包本机信息
ps:基于回包判断远方主机信息
五、SMB扫描
SMB扫描
1、工具使用--nmap
ps:-v:表示详细显示;139(老版本),445(新版本);Windows系统默认开放,Linux系统也可能开放
ps:nmap -v 192.168.43.208 -p139,445 --open 筛选出open的机器
ps:nmap提供更准确的发现smb端口的脚本
nmap 192.168.43.208 -p139,445 --script=smb-os-discovery.nse
ps:也可以:nmap 192.168.43.32,208,137 -p139,445 --script=smb-os-discovery.nse
ps:判断smb是否有漏洞(已打补丁吗)
nmap -v -p139,445 --script=smb-check-vulns --script-argvs=unsafe=1 192.168.43.208 -Pn
ps:-Pn: Treat all hosts as online -- skip host discovery
ps:-script-argvs=unsafe=1会对系统造成破环,改为safe=1较稳但不如unsafe准确
ps:kali2018已经没有smb-check-vulns.nse脚本
2、工具使用--nbtscan
nbtscan -r 192.168.43.0/24
ps:-r:使用本地端口137做扫描(兼容性最好);可以跨网段扫描
3、工具使用--enum4linux
ps:尝试建立空连接,failed
ps:不支持网段扫描,但是扫描结果较详细;包括账号,共享,os
五、SMTP扫描--发现目标系统的邮箱账号;25端口
1、工具使用--nmap
nmap smtp.163.com -p25 --script=smtp-enum-users.nse --script-args=smtp-enum-users.methods={VRFY}
nmap smtp.163.com -p25 --script=smtp-open-relay.nse
ps:一旦开放邮件中继(open-relay),黑客可以使用你的邮件服务器给受害者发送钓鱼邮件
2、脚本--smtp.py
#!/usr/bin/python import socket import sys if len(sys.argv)!=2: print "Usage: smtp.py <username>" sys.exit(0) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect = s.connect(('smtp.163.com',25)) banner = s.recv(1024) print banner + '------' s.send('HELO '+ sys.argv[1] + '\r\n') result=s.recv(1024) print result s.close()
ps:边界防火墙内部机器向外发起连接,fw会开启临时一个高位端口,用以向外发起请求;源目的地址过滤,只允许某些IP对某端口发起访问
ps:利用以上方法判断防火墙的过滤规则;
1、脚本--fw_detect.py
#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * import sys if len(sys.argv) !=3: print "Usage: ./fw_detect.py [target ip] [target port]" print "Example : ./fw_detect.py 1.1.1.5 445" print "Example will determine if fitering exists on port 445 of 1.1.1.5" sys.exit() ip = sys.argv[1] port = int(sys.argv[2]) ACK_response = sr1(IP(dst=ip)/TCP(dport=port,flags='A'),timeout=1,verbose=0) SYN_response = sr1(IP(dst=ip)/TCP(dport=port,flags='S'),timeout=1,verbose=0) if (ACK_response == None) and (SYN_response == None): print "Port is either unstatefully filtered or host is down" elif ((ACK_response == None) or (SYN_response == None)) and not ((ACK_response == None) and (SYN_response == None)): print "Stateful filtering in place" elif int (SYN_response[TCP].flags) == 18: print "Port is unfiltered and open" elif int(SYN_response[TCP].flags) == 20: print "Port is unfiltered and closed" else: print "Unable to determine if the port is filtered"
2、工具使用--nmap
nmap -p22 192.168.43.32
nmap -p22 192.168.43.32 -sA
ps:nmap默认使用SYN扫描,-sA:ACK扫描
七、负载均衡识别
广域网负载均衡:
通过DNS轮询实现负载均衡,同一个域名会被解析为多个A记录,多个ip;
基于智能DNS,访问同一个域名在不同地点访问解析到的ip地址不同,保证响应速度;
基于解析速度、链路状态,先把访问请求发给性能最好的服务器;
服务器负载均衡:
基于Nginx、Apache等应用层负载均衡;
基于网络层设备的负载均衡;
ps:还有组件负载均衡等;探测负载均衡的目的:发现目标域名下的各个服务器,不同服务器安全防护和配置不一样,有些ip可能存在发现漏洞;
工具使用--lbd
ps:DNS负载均衡:一个域名被解析为两个ip;HTTP负载均衡:基于nginx;
ps:负载均衡设备通过过滤转发用户请求到后端服务器,进而保护隐藏真实服务器;
八、waf识别
ps:基于规则的waf总能被绕过;基于机器学习的方式几乎能防掉所有的sql注入攻击;
1、工具使用--wafw00f
ps:能够检测的waf产品
ps:通常微软使用的server是IIS,结果返回AkamaiGHost,说明微软使用了AkamaiGHost,waf产品;
2、工具使用--nmap脚本
nmap www.baidu.com --script=http-waf-detect.nse
ps:基于发送<script>alert(document.cookie)</script>请求被过滤判断存在waf