Python 的網路測試應用範例程式
這篇文章主要說明幾個 python 的網路測試個案,並且提供相關的可執行程式供參考。
執行網路測試或是資訊安全測試的時候,Python 提供許多相關的函數與模組,
當所使用的工具不夠彈性,希望可以進一步做一些客製化的時候,就可以使用 python.
Socket 模組
首先介紹 socket 模組,這是python內建的模組,Socket 為 IP Address + port number 的連線,
這個模組提供許多網路相關的功能,例如 :
[pastacode lang=”python” message=”Socket” highlight=”” provider=”manual”]
import socket
print (socket.gethostbyaddr("8.8.8.8"))
print (socket.gethostbyname("www.google.com"))
[/pastacode]
進一步延伸這個程式,就可以為整個特定網段搜尋相關的電腦名稱,看看是否有莫名的電腦在網路上。
Network Client/Server
接著我們要完成的小程式是類似netcat 這樣的工具程式。
有些情境會用到這樣的工具,我們希望有個client 端的工具,可以連線到遠端伺服器電腦特定 port,藉此測試該 port 是否可以連通,或是進一步傳送測試資料。
或是我們希望伺服器可以有個小工具模擬 特定 port listening,等待client 連線,並且把收到訊息列印出來。
因此,我們就會需要一個 client 的小工具連線程式。或是一個模擬 Server 的小工具程式。當然使用 netcat (http://nmap.org/ncat/) 也可以解決這樣的問題。
如果用 python 要怎樣完成呢?
Network Client工具程式
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
import socket
host = '127.0.0.1'
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = (host,5555)
mysock.connect(addr)
try:
msg =b"\nhi, This is connection from python network client \n"
mysock.sendall(msg)
except socket.errno as e:
print ("This is Socket Error!", e)
finally:
mysock.close()
[/pastacode]
Network Server工具程式
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
import socket
# listening on local port 5555
size = 512
host = '127.0.0.1'
port = 5555
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
sock.bind((host,port))
# max concurrent connection = 5
sock.listen(5)
c, addr = sock.accept()
# data received from client
data = c.recv(size)
print "Connected from client IP Address:" + str(addr)
print "Data Received from Connection:" + data
if data <> "": # write received message into file
f = open("Received.dat", 'w')
f.write(addr[0])
f.write("\n data received from the client:")
f.write(data)
f.close()
sock.close()
[/pastacode]
HTTP client
模擬 Browser 的 Http Request 動作,並且將網站回傳的資料印出。
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
import httplib
conn = httplib.HTTPSConnection("www.python.org")
conn.request("GET", "/")
r1 = conn.getresponse()
print r1.status, r1.reason
data1 = r1.read()
print data1
[/pastacode]
讀取HTTP Header
另外,讀取 http header 除了可以使用 HTTP HEAD之外,也可以利用下列程式。HTTP Header 往往額外透落該網站伺服器為 IIS or Apache。並且有相關的版本資訊。
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
import socket
import re
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("www.google.com", 80))
http_get = b"GET / HTTP/1.1\nHost: www.google.com\n\n"
data = ''
try:
sock.sendall(http_get)
data = sock.recvfrom(1024)
except socket.error:
print ("Socket error", socket.errno)
finally:
print("closing connection")
sock.close()
strdata = data[0].decode("utf-8")
headers = strdata.splitlines()
for s in headers:
print "Headers line = " + str(s)
if re.search('Server:', s):
print(s)
[/pastacode]