Socket、服务与协议识别
什么是Socket
socket包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
创建socket连接时可以指定使用的传输层协议,socket可以支持TCP或UDP协议。
什么是socket(AF_INET&SOCK_STREAM,SOCK_DGRAM)
参考🔗
简单理解socket(AF_INET&SOCK_STREAM,SOCK_DGRAM)
有两种类型的socket,基于文件的和面向网络的
AF_UNIX 基于文件的
AF_UNIX(又名AF_LOCAL,在POSIX1.g标准中指定),它代表地址家族(addressfamily):UNIX。其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocolfamily),并使用其缩写PF而非AF。类似地,AF_LOCAL(在2000~2001年标准化)将代替AF_UNIX
面向网络的AF_INET
因特网。另一个地址家族AF_INET6用于第6版因特网协议(IPv6)寻址。此外,还有其他的地址家族,这些要么是专业的、过时的、很少使用的,要么是仍未实现的。在所有的地址家族之中,目前AF_INET是使用得最广泛的
又来了两种socket。。面向连接的socket和面向无连接的socket
即TCP&UDP
TCP-SOCK_STREAM
UDP-SOCK_DGRAM
TCP连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(3)
sock.connect((ip,port)) //建立连接 也就是三次握手
sock.send(binascii.unhexlify(payload))
UDP连接
udp = socket(AF_INET, SOCK_DGRAM)
udp.sendto(data, ADDR)发送给服务端
data, ADDR = udpClientSock.recvfrom(BUFSIZE)接收服务端信息
服务及协议识别
参考连接-网络空间测绘技术之:协议识别(RDP篇)link
引用zwell大佬的话
举个例子,我们内部把协议分为ABC三类协议,A类协议属于你必须发一个正确的request包,服务器才会返回response,比如rdp协议;B类协议就是主动response,不需要你请求的,比如ssh协议;C类协议就是你需要你发request,但是哪怕格式不对也会返回错误信息的response,比如http协议。对于一个开放了非标准端口的A类协议,你如何确认是哪一个?你是准备几百个协议挨个遍历吗?如果考虑网络等待超时,一个端口的协议识别一次需要几分钟?
这个问题是个选择问题,可能未来会有一个算法来证明最有效的方案,但是现在还没有。我们的协议引擎已经能够自动化高效率的用少量包筛选出B类协议和C类协议,但是对于A类,会用最top的几个去做尝试,没法全遍历。
试了一下rsync识别 首先抓包,获取建立连接流量
$ rsync rsync://xxx.xx.x:873/
```python
payload="405253594e43443a2033312e300a"
#payload="0d0a"
print("Send: "+str(binascii.unhexlify(payload)))
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(3)
sock.connect((ip,873))
sock.send(binascii.unhexlify(payload))
data=sock.recv(1024)
print("Recvive:"+str(data))
print("Send: "+str(binascii.unhexlify("0d0a")))
sock.send(binascii.unhexlify("0d0a"))
data=sock.recv(1024)
print("Recvive:"+str(data))
实际上 rsync协议是不需要发送数据的,也就是上面分类中的B类协议,建立连接后会主动response
搜了一下nmap的识别方式,是不发送任何数据的,识别response如下
# rsync 2.5.5-0.1 with custom banner on Debian Woody
match rsync m|^@RSYNCD: (\d+)| i/protocol version $1/
# Synology Network Backup Service (rsync backup)
match rsync m|^@ERROR: protocol startup error\n|
Minds overflow