我们不能简单地通过端口号来识别端口上运行的应用,因此可以通过服务扫描来进行识别,从而有针对性地找到它的利用代码或者发现它的漏洞以及利用方法。本篇除了讲解如何识别端口所对应的服务,还会讲解如何识别目标操作系统。不同的操作系统自带的服务上面也会存在一些漏洞,因此我们可以利用漏洞的弱点直接取得目标系统的管理权,或者取得它的用户权限,然后在用户权限的基础之上进行本地提权,拿到它的管理员权限,进行后续渗透测试的攻击。
如何识别应用以及操作系统的版本?
- Banner捕获
- 服务识别
- 操作系统识别
- SNMP分析(通过系统内部信息来进行信息的探测和搜索,所以准确性也会比较高)
- 防火墙识别(识别边界防火墙的类型以及过滤机制,从而绕过和躲避它)
一、服务扫描——Banner(准确性不高)
- 获取软件开发商、软件名称、服务类型、版本号(可能直接发现已知的漏洞和弱点)
- 只有建立完整的连接后才能获取目标系统的Banner信息,才能更准确地识别端口上运行的应用。
- Banner并不是特别准确,它需要结合另类的服务识别方法——特征行为和响应字段,不同的操作系统对于同一请求的响应结果是不同的,因此不同的响应可用于识别低层操作系统。
- 通过连接服务器的端口,使其返回banner信息,结果可能查不到,也可能是管理员伪造的。
1、nc
nc -nv 192.168.24.129 80
root@kali:~# nc -nv 192.168.247.129 80
(UNKNOWN) [192.168.247.129] 80 (http) open
get
HTTP/1.1 400 Bad Request
Date: Wed, 24 Apr 2019 14:48:54 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
2、socket —— 用于连接网络服务
root@kali:~# python
Python 2.7.14+ (default, Mar 13 2018, 15:23:44)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> banner=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> banner.connect(("192.168.247.129",80)) //创建连接
>>> banner.recv(1024) //接收数据
''
>>> banner.close() //关闭连接
>>> exit()
某些应用软件,它的Banner信息是不允许被抓取的,recv函数无返回将被挂起,因此需要对程序进行处理。针对该问题,下面的脚本进行了一些处理:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#该脚本用于实现Banner信息的扫描,如果Banner信息不能获取,则pass
import socket
import select #通过一个select()系统调用来监视多个文件描述符的数组
import sys
if len( sys.argv ) !=4:
print "Usage - ./banner_grab.py [Target.IP] [First Port] [Last Port]"
print "Example - ./banner_grab.py 1.1.1.1 1 100"
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) #建立TCP连接
bangrab.connect((ip,port))
ready=select.select([bangrab],[],[],1) #连接间隔时间1秒
if ready[0]: #ready[0]表示recv函数没有被挂起
print "TCP Port " + str(port) + "." +bangrab.recv(2048)
bangrab.close() #每发现一个端口,就要关闭TCP连接,避免建立太多的TCP连接,从而造成网络性能以及系统性能的下降
except:
pass
root@kali:~# chmod +x banner.py
root@kali:~# ./banner.py 192.168.247.129 1 200 //目标主机加入了域
TCP Port 25.220 WIN-N7TAB1239LM.st13.com Winmail Mail Server ESMTP ready
TCP Port 110.+OK WIN-N7TAB1239LM.st13.com Winmail Mail Server POP3 ready
TCP Port 143.* OK IMAP4 ready! WIN-N7TAB1239LM.st13.com Winmail Mail Server MagicWinmail Extend IMAP 102
3、dimitry
- dimitry -p 192.168.247.129 //-p TCP端口的扫描
- dimitry -pb 192.168.247.129 //-b 从扫描到的端口中获取Banner信息
root@kali:~# dmitry -pb 192.168.247.129
Deepmagic Information Gathe