《Python黑帽子——駭客與滲透測試程式設計之道學習》這本書是我在學習安全的過程中發現的在我看來十分優秀的一本書,業內也擁有很高的評價,所以在這裡將自己的學習內容分享出來。
1.基礎的網路程式設計工具。
實驗環境:vscode+kali虛擬機器器
(1)TCP使用者端
from ctypes.wintypes import tagRECT from http import client from pydoc import cli import socket from urllib import response target_host = "www.baidu.com" target_port = 80 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect((target_host,target_port)) client.send(b"GET / HTTP/1.1\r\nHost:baidu.com\r\n\r\n") response =client.recv(4096) print(response.decode()) client.close()
首先建立一個帶有AF_INET和SOCK_STREAM引數的socket物件。AF_INET參數列示我們將使用標準的IPv4地址或主機名,SOCK_STREAM表示這是一個TCP使用者端。然後,我們將該使用者端連線到伺服器,並行送一些bytes型別的資料。最後一步,接收返回的資料並將其列印到螢幕上,再關閉socket。以下是執行結果。
(2) UDP使用者端
from http import client import socket target_host = "127.0.0.1" target_port = 80 client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) client.sendto(b"AAABBBCCC",(target_host,target_port)) data, addr = client.recvfrom(4096) print(data.decode()) client.close()
UDP使用者端和TCP使用者端相差不大,並且作用也相去不遠,在建立socket物件時,需要將socket型別改成SOCK_DGRAM,之後呼叫sendto()函數即可。UDP是一個無連線協定,所以不需要connect()函數建立連線。recvfrom()函數不僅返回接收到的資料,還會返回詳細的資料來源資訊(主機名和埠號)。。
(3)TCP伺服器端(多執行緒)
from http import client, server import socket import threading from urllib import request IP = '0.0.0.0' PORT = 9998 def main(): server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind((IP,PORT)) server.listen(5) print(f'[*] Listening on {IP}:{PORT}') while True: client, address = server.accept() print(f'[*] Accepted connection from {address[0]}:{address[1]}') client_handler = threading.Thread(target=handle_client, args=(client,)) client_handler.start() def handle_client(client_socket): with client_socket as sock: request = sock.recv(1024) print(f'[*] Received: {request.decode("utf-8")}') sock.send(b'ACK') if __name__ == '__main__': main()
我們先指定伺服器應該監聽哪個IP地址和埠。接著,讓伺服器開始監聽,並把最大連線數設為5。下一步,讓伺服器進入主迴圈中,並在該回圈中等待外來連線。當一個使用者端成功建立連線的時候,將接收到的使用者端socket物件儲存到client變數中,將遠端連線的詳細資訊儲存到address變數中。然後,建立一個新的執行緒,讓它指向handle_client函數,並傳入client變數。建立好後,我們啟動這個執行緒來處理剛才收到的連線,與此同時伺服器端的主迴圈也已經準備好處理下一個外來連線。而handle_client函數會呼叫recv()接收資料,並給使用者端傳送一段簡單的回覆。那麼我們用前面寫好的TCP使用者端給伺服器端傳送幾個測試包。
首先開啟伺服器端:
在使用者端傳送測試包,即可看到:
這次的分享先到這裡,下一次將擴充這次這幾個實驗的功能。