python滲透測試入門——基礎的網路編程工具
- 2022 年 10 月 24 日
- 筆記
- Python滲透測試學習筆記
《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客戶端給服務端發送幾個測試包。
首先開啟服務端:
在客戶端發送測試包,即可看到:
這次的分享先到這裡,下一次將擴充這次這幾個實驗的功能。