python滲透測試入門——基礎的網路程式設計工具

2022-10-24 18:01:19

《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使用者端給伺服器端傳送幾個測試包。

首先開啟伺服器端:

 

 在使用者端傳送測試包,即可看到:

 

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