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客戶端給服務端發送幾個測試包。

首先開啟服務端:

 

 在客戶端發送測試包,即可看到:

 

 這次的分享先到這裡,下一次將擴充這次這幾個實驗的功能。