Python 的網路測試應用範例程式

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]

 

Leave a Reply

Your email address will not be published. Required fields are marked *