黑基网 首页 学院 网络安全 查看内容

谈谈端口探测的经验与原理

2017-9-4 16:49| 投稿: lofor |来自: 互联网

摘要: 端口探测在渗透测试的信息收集以及威胁情报领域都有着很重要的应用,本文章将从几个方面来介绍端口探测相关的知识。0×00 有关端口的基础知识0.基本概念端口并不是一个真是存在的实体,是完全抽象的,只是计算机网络 ...

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

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. 识别服务

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

常见的系统端口

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

常见的Web server的端口

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

常见的各类数据库的端口

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

一般来说,对应的服务都会开在对应的端口上,以便访问(比如浏览器在不指定端口时会访问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,那么很大概率上可以直接的拿

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论


新出炉

返回顶部