端口探测在渗透测试的信息收集以及威胁情报领域都有着很重要的应用,本文章将从几个方面来介绍端口探测相关的知识。

0×00 有关端口的基础知识

0.基本概念

端口并不是一个真是存在的实体,是完全抽象的,只是计算机网络中为了多个应用同时通信而创造出来的概念。它工作在OSI七层模型中的第四层网络层,属于TCP/UDP 协议中的内容。

TCP和UDP各有65536个端口(0-65535)作为一种网络资源,端口是由操作系统分配和管理的一般使用netstat来查看系统的端口使用状况。

 $  netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN     
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN     
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN     
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN     
tcp 0 0 10.254.123.52:22 91.197.232.107:54098 ESTABLISHED
tcp 0 364 10.254.123.52:22 210.13.242.2:33679 ESTABLISHED
tcp6 0 0 :::80 :::* LISTEN     
tcp6 0 0 :::61616 :::* LISTEN     
tcp6 0 0 :::22 :::* LISTEN     
tcp6 0 0 ::1:6010 :::* LISTEN     
tcp6 0 0 :::8161 :::* LISTEN 

通常来说,一个端口只能由一个进程绑定比如apache如果绑定了80端口,如果nginx再绑定时,操作系统就会拒绝nginx的请求。

 erro:listen tcp 0.0.0.0:80: bind: address already in use 

但是注意,由于端口是完全抽象的概念,仅仅是一种标识,因此不同协议的相同端口是不会发生任何冲突的也就是说,进程 A 绑定了TCP的80端口,进程 B 再去绑定UDP的80端口时,是没有任何问题的。

在0-65535这些端口中,0-1023这1024个端口是系统的保留端口,为一些关键服务预留的。如果想要绑定这些端口,必须具有系统的最高权限(ROOT),而其他的端口只需要用户权限即可。

0×00 端口扫描工具

0.nmap

最为大名鼎鼎的端口扫描工具,支持许多种探测,可以使用各种类型的包进行探测,支持SYN、Ping、Xmas等数十种扫描方式。

  • 操作系统
  • banner
  • 服务的类型
  • 服务的版本

1.zmap

2.masscan

这两种工具的特点就是速度极快,可以在很短时间内扫描大量主机。

3.nc

相对于其他几种自动化探测的工具,使用nc进行端口探测可以说是纯手动的方式了。

0×02 常见的用途

0. 识别服务

一般来说,每一个服务都有固定的一个默认端口最常见的,如:

常见的系统端口

端口 服务
21 ftp
22 ssh
23 telnet
25 smtp
80 http
110 pop3
135 rpc
139 netbios
445 smb

常见的Web server的端口

端口 server
80 apache/nginx
8080 tomcat
5000 flask
3000 nodejs
8000 django
3000 ruby on rails
8080 beego
8888 react

常见的各类数据库的端口

端口 服务
3306 mysql
1521 oracle
1433 SQL-server
5432 PostgreSQL
50000 DB2
5000 sybase
6379 Redis
27017 mongoDB
11211 memcached
60000 HBase

一般来说,对应的服务都会开在对应的端口上,以便访问(比如浏览器在不指定端口时会访问80端口,ssh不指定端口的时候会连接22端口)

但是,也有许多运维工程师和主机管理员为了避免安全问题,会把服务避开默认端口比如,把ssh开到80端口上,这就给探测服务带来了很大难度。

这个时候,就需要完成TCP连接,然后对于服务的内容进行试探,从返回的字符流中获取的服务的相关信息对于探测服务来说,可以使用nmap的 -sV选项:

$  nmap -sV localhost
Starting Nmap 6.47 ( http://nmap.org ) at 2017-08-25 20:11 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Other addresses for localhost (not scanned): 127.0.0.1 127.0.1.1 Not shown: 993 closed ports
PORT     STATE SERVICE VERSION 21/tcp open ftp     vsftpd 2.3.5 22/tcp open ssh     OpenSSH 6.0p1 Debian 4+deb7u4 (protocol 2.0) 80/tcp open http    Apache httpd 2.4.10 ((Debian)) 111/tcp open rpcbind 2-4 (RPC #100000) 3306/tcp open mysql   MySQL 5.5.52-0+deb8u1 8081/tcp open http    Apache httpd 2.4.10 ((Debian)) 8082/tcp open http    Apache httpd 2.4.10 ((Debian))
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel 

对于常见的服务,nmap甚至可以探测出服务版本但是,对于很多情况,必须辅以手动探测才能达到最好的效果,这个时候就需要使用nc来进行,举几个例子对于8001端口,nc连接上去,随便输入一个字符串,得到了以下结果:

$ nc -vv localhost 8001  
localhost [127.0.0.1] 8001 (?) open
asd
HTTP/1.1 400 Bad Request
Date: Fri, 25 Aug 2017 12:15:25 GMT
Server: Apache/2.4.23 (Debian)
Content-Length: 301
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> <hr> <address>Apache/2.4.23 (Debian) Server at 127.0.0.1 Port 8001</address> </body></html> 

由此我们知道了这是一个http服务,因为我们发送的字符串不是一个合法的HTTP请求,因此返回一个400 Bad requests,我们还得到了系统的版本是Debian,WebServer是Apache。

再举一个例子:

$ nc -vv localhost 3306 localhost [127.0.0.1] 3306 (mysql) open
L 5.7.15-1 ttsEs!eCl AlJmysql_native_passwordsdad
Got packets out of order sent 5, rcvd 111 

连接后直接返回了字符串mysql_native_passwordsda,可以判断这是一个mysql:

$ nc -vv localhost 22 localhost [127.0.0.1] 22 (ssh) open SSH-2.0-OpenSSH_7.3p1 Debian-3+b1
asd
Protocol mismatch.
 sent 4, rcvd 54 

也是同样,直接暴露出了SSH的服务。

根据端口信息判断一个IP属于何种类型

一个公网IP可能有很多种类型可能是基站,ISP出口网关,也可能是服务器,也可能是一些网络设备如摄像头、打印机、智能硬件等。总体来说,具有开放端口的一般都是服务器,而网关和基站一般不会有任何端口处于开放状态。但是也不排除有个别基站的防火墙会将一些特定的端口重定向到一些服务器上(一般是运营商的官网)。。

但是,如果开放 21(ftp) 22 (ssh) 25(telnet)则可以基本确定是服务器。

智能硬件的端口一般在3000-10000的范围内,一个不确定的端口。

打印机有几个很大概率的端口,比如515 等,有些打印机也有自己的一个web端的管理后台,通常放在80或者8080。

根据端口扫描的结果,我们可以粗略的判断一个ip背后是属于哪一种设备。

0×03 端口探测的原理

0.探测状态的原理

首先,我们要明白,端口的三种状态,分别是:

  1. OPEN
  2. CLOSED
  3. FILTERED

那么,这三种状态分别代表着什么呢?

1.OPEN

端口处于OPEN状态,代表着

  • 这个端口是开放的,可以被访问
  • 这个端口上面有进程(应用程序监听)

2.Filtered

  • 这个端口不会返回任何东西
  • 可能是被防火墙屏蔽了,也就是说,这个包被丢弃了

3.Closed

  • 这个端口是可以被访问的
  • 这个端口上没有程序监听,但是会返回包

以TCP-SYN 探测为例:

  1. OPEN 返回 SYN-ACK

  2. CLOSED 返回 RST

  3. FILTERED 啥都不反回

附注:

防火墙不一定会完全丢弃(DROP)包,也可根据用户的设置来进行其他操作以iptables为例:

iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply 

-j设置为REJECT就可以显示为CLOSED而设置为DROP的时候显示为FILTERED当然,还有其他的选项,比如REDIRECT之类的,有其他不同的操作。

1.探测操作系统版本和服务的原理

探测服务大多是根据banner和fingerprint来进行探测的。不同的操作系统以及不同版本的系统在TCP/IP协议上指纹参数的设定存在差异。Nmap通过收集这些参数进行比对得到系统的类型和版本信息,如果可以直接抓到banner,那么很大概率上可以直接的拿到服务类型和版本。但是如果没有,就要根据已知的指纹信息,来进行对应的推测。

如果遇到了在数据库中找不到的指纹,nmap会请求用户提交该指纹和对应的服务,添加到数据库中,来丰富整个的指纹数据库,对于nmap来说,很多小众的服务是依赖于用户提交的,如下图:

$ nmap -sV *****.io       
Starting Nmap 7.40 ( https://nmap.org ) at 2017-08-31 17:47 CST
Nmap scan report for *****.io (0.0.0.0)
Host is up (0.000070s latency).
Not shown: 988 closed ports
PORT     STATE SERVICE     VERSION 22/tcp open ssh         OpenSSH 7.3p1 Debian 3+b1 (protocol 2.0) 25/tcp open smtp        Sendmail 8.15.2/8.15.2/Debian-6 80/tcp open http        Apache httpd 2.4.23 ((Debian)) 139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP) 445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP) 587/tcp open smtp        Sendmail 8.15.2/8.15.2/Debian-6 631/tcp open ipp         CUPS 2.2 1080/tcp open socks5      (No authentication; connection failed) 3306/tcp open mysql       MySQL 5.7.15-1 1 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port5432-TCP:V=7.40%I=7%D=8/31%Time=59A7DB1D%P=x86_64-pc-linux-gnu%r(SM
SF:BProgNeg,8F,"E\0\0\0\x8eS\xe8\x87\xb4\xe5\x91\xbd\xe9\x94\x99\xe8\xaf\x
SF:af\0VFATAL\0C0A000\0M\xe4\xb8\x8d\xe6\x94\xaf\xe6\x8c\x81\xe7\x9a\x84\x
SF:e5\x89\x8d\xe7\xab\xaf\xe5\x8d\x8f\xe8\xae\xae\x2065363\.19778:\x20\xe6
SF:\x9c\x8d\xe5\x8a\xa1\xe7\xab\xaf\xe6\x94\xaf\xe6\x8c\x81\x201\.0\x20\xe
SF:5\x88\xb0\x203\.0\0Fpostmaster\.c\0L2008\0RProcessStartupPacket\0\0")%r
SF:(Kerberos,8F,"E\0\0\0\x8eS\xe8\x87\xb4\xe5\x91\xbd\xe9\x94\x99\xe8\xaf\
SF:xaf\0VFATAL\0C0A000\0M\xe4\xb8\x8d\xe6\x94\xaf\xe6\x8c\x81\xe7\x9a\x84\
SF:xe5\x89\x8d\xe7\xab\xaf\xe5\x8d\x8f\xe8\xae\xae\x2027265\.28208:\x20\xe
SF:6\x9c\x8d\xe5\x8a\xa1\xe7\xab\xaf\xe6\x94\xaf\xe6\x8c\x81\x201\.0\x20\x
SF:e5\x88\xb0\x203\.0\0Fpostmaster\.c\0L2008\0RProcessStartupPacket\0\0"); 

2.不同扫描方式的原理

1. TCP扫描

nmap target-host既上面说的TCP方式,发送SYN,等待回应,这种方法的优点就是准确性比较高但是需要完成整个的三次握手流程,而且对于filtered的端口需要进行在timeout之前的等待,所以严重的拖慢了速度。

2.半连接扫描

nmap -sS target-host这种方式与上面的TCP扫描类似,不同的是,如果收到了服务器发来的SYN-ACK ,则直接发送RST给服务器,中断连接,以加快扫描的速度。

3.FIN扫描

nmap -sF target-hostFIN扫描是一种非常快的扫描,因为直接给目标端口发送一个带FIN标志位的包,开放(有服务监听的)的端口见到FIN包会将其丢弃,而CLOSED状态的端口则会照常的发送一个RST包,告知这个端口没有监听服务。

但是,这种扫描有一个严重的缺点,那就是FILTERED状态的端口也会直接丢弃,因此不能够区分OPEN/FILTERD两种状态的端口,只能区分这两种与CLOSED之间的区别。

4.Xmas扫描

nmap -sX target-hostXmas扫描时,会将TCP中的所有标识位(ACK、FIN、RST、SYN、URG、PSH)都置为1,端口开放的时候,不会返回任何的信息,而当关闭的时候,将返回RST,这与FIN扫描十分类似,同样不能区分OPEN 和 FILTERED。

5.NULL扫描

nmap -sN target-host与Xmas扫描恰恰相反的是,NULL扫描将每一个表示为都置为0,但是Unix服务器反应与Xmas,FIN扫描一致,但是不太一样的是Windows主机的反应,Windows主机的所有端口都会返回一个RST,用这一点,可以区分开Unix与windows服务器。

6. FTP弹跳扫描

nmap -b target-hostRFC-959支持代理FTP连接。它允许一个用户连接一个FTP服务器然后请求文件发送给第三方服务器。大多数服务器已经停止支持它了。它可以允许FTP服务器来进行其它.Idlescan机器的端口扫描。只是简单的请求FTP服务器发送一个文件给每个目标主机的感兴趣的端口一个错误报文会描述端口是否开放。这是一个好办法来绕过防火墙因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。

7.zmap,masscan的快速扫描方式 : 无状态扫描

zmap和masscan都号称能在xx分钟内扫描完整个IPv4,那么为什么这么快呢?

那就是因为,他们在快速扫描的时候,使用的是无状态扫描的方法。我们知道,tcp连接是有状态的,需要对SYN-ACK包进行seq number 的校验这个等待连接的过程需要在缓冲区占用很大的资源,因此限制了扫描的速度。

但是,无状态扫描中,zmap记录了revicer ip、hash之后保存到send port 和seq number,然后再等待SYN-ACK中返回的相应信息直接进行校验,而不需要建立连接。

通俗的来说,传统的扫描方式是1对1的建立连接通信进行验证,而无状态的扫描就是批量的把请求撒出去,然后记录有回应的IP。

因此,效率上可以达到了成千上万倍的提高。但是同时,由于无状态的发包方式,如果遇到丢包的情况,不像有连接时候会进行重复查询,而是直接没有回应,因此准确率上不如SYN扫描那么准确,但是可以用重复扫描来弥补准确性上面的缺陷。

0×04 总结

端口探测有着多种多样的方式,手动探测和nmap适合对于单一或有限主机的扫描,而zmap,masscan适用于一整个C段或者整个内网的扫描。

而扫描的准确度越高,信息收集的越多,扫描的速度就成指数级递减,因此也就引出了两种攻击策略:

1.针对性攻击

在预设目标下,目的就是拿下这台主机,那么在做探测和扫描的时候,就可以无微不至对每一个细节进行探测。

2.广撒网攻击

这种攻击必定是要遗漏掉太多的东西的,但是通过批量的处理,可以增大我们拿下主机的效率,当然,这也决定了我们在做扫描的时候必须克制。比如说只对80、3306、445、3389等比较敏感的端口进行探测,而放弃其他几率比较小的端口,以增大概率。

我们可以根据实际的场景去选择自己需要的攻击和探测方式,但是确定无疑的是,我们在探测、扫描、信息收集上面做的更多,将会成倍的降低我们后面继续渗透的难度,甚至可能通过一些不起眼的地方一剑封喉。因此,这是每个渗透测试者必须熟练的基本技能。

* 本文作者:sarleon