使用套接字库的Python中的HTTP服务器和版本

时间:2015-10-23 22:49:23

标签: python http

import socket

我想知道如何使用套接字库获取HTTP服务器的服务器响应头的Web服务器名称和版本:

服务器:Apache / 2.2.3(Red Hat)

1 个答案:

答案 0 :(得分:0)

您可能想要抓住服务器有趣端口上显示的banner。对于很多情况,您需要的是以下内容:

import sys
import socket

ip = sys.argv[1]
port = int(sys.argv[2])

s = socket.socket()

s.connect((ip, port))
print s.recv(1024)

既然你提到了Apache(httpd),我假设你会对HTTP的端口80和HTTPS的端口443感兴趣,但老实说httpd可以监听任何端口。由于这些是HTTP(S)(位于TCP之上的协议),因此在响应您之前需要提供请求,在这种情况下,您需要发送有效的HTTP请求。最低限度是GET / HTTP/1.0\r\n\r\n,所以在这种情况下你需要这样的东西:

import sys
import socket

ip = sys.argv[1]
port = int(sys.argv[2])

s = socket.socket()

s.connect((ip, port))
s.send("GET / HTTP/1.0\r\n\r\n")
print s.recv(1024)

请注意send之前的recv

您可以像这样运行该脚本:

$ python grab_banner.py <IP_ADDRESS> <PORT>
HTTP/1.1 200 OK
Date: Sat, 24 Oct 2015 03:12:31 GMT
Server: Apache/2.4.16 (Fedora)
Last-Modified: Sat, 24 Oct 2015 03:06:19 GMT
ETag: "17-522d1031eac3e"
Accept-Ranges: bytes
Content-Length: 23
Connection: close
Content-Type: text/html; charset=UTF-8

<h1>Hello, World!</h1>

所有这些都说如果不是只是Python和套接字编程的一个练习,你可能希望查看nmap,因为它可以很好地处理你似乎正在做的所有事情,它是快速且有很多选择(有些是非常先进的,但谷歌可以提供帮助)。

$ sudo yum install nmap
...
$ nmap -sV google.com

Starting Nmap 6.47 ( http://nmap.org ) at 2015-10-23 22:45 EDT
Nmap scan report for google.com (204.186.215.24)
Host is up (0.013s latency).
Other addresses for google.com (not scanned): 204.186.215.38 204.186.215.39 204.186.215.46 204.186.215.45 204.186.215.32 204.186.215.59 204.186.215.31 204.186.215.18 204.186.215.25 204.186.215.53 204.186.215.52
rDNS record for 204.186.215.24: cache.google.com
Not shown: 998 filtered ports
PORT    STATE SERVICE  VERSION
80/tcp  open  http     Google httpd 2.0 (GFE)
443/tcp open  ssl/http Google httpd 2.0 (GFE)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.02 seconds

注意-sV启用服务器和版本检查。另请注意,您可能不想多次使用谷歌,因为他们可能会非常好奇。