Python 語言簡潔易學,功能強大,使其成為駭客工具開發的理想選擇。本文從 Python 模組安裝開始,逐步介紹變數、資料型別、註解和函式等基礎語法,並搭配例項說明如何撰寫簡單的 Python 指令碼。接著,文章探討物件導向程式設計(OOP)的概念,以及如何使用 socket 模組建立 TCP 客戶端連線,並示範如何編寫一個簡單的橫幅擷取工具,用於取得目標主機的 SSH 服務版本資訊。這為讀者提供了 Python 網路程式設計的入門指引,並展示了其在資安領域的應用潛力。更進一步的學習可以參考 Python 官方檔案和 PyCharm 等開發工具。
Python 入門:從基礎到實用的駭客工具
玄貓將帶領大家探討 Python 語言的基礎概念、基本語法以及如何利用它來撰寫實用的駭客工具。首先,玄貓將介紹如何安裝必要的模組,接著進入Python的基本概念和語法。最後,我們將撰寫一些對駭客來說非常實用的指令碼,展示Python強大的功能。
安裝模組
在開始之前,瞭解如何安裝Python模組非常重要。假設我們需要安裝一個名為python_nmap的模組,這個模組可以讓我們在Python指令碼中使用Nmap網路掃描工具。以下是安裝步驟:
pip install python-nmap
安裝完成後,這個模組就可以在你的Python指令碼中使用。這只是其中一個例子,許多其他模組也可以透過相同的方式安裝。
開始Python指令碼撰寫
就像其他程式語言一樣,我們可以使用任何文字編輯器來撰寫Python指令碼。為了簡化操作,建議使用簡單的文字編輯器如Leafpad。同時,也值得注意到有許多整合開發環境(IDE)可以用來撰寫Python程式碼,例如Kali內建的PyCrust或JetBrains的PyCharm。
PyCharm是一個非常強大且功能豐富的IDE,適合學習和開發Python程式碼。它有專業版和社群版兩種選擇,社群版是免費的。如果你想繼續深入學習Python,PyCharm會是一個非常好的工具。
Python 語法與格式
Python 對於程式碼格式有嚴格的要求,這與其他程式語言不同。Python使用縮排來決定程式碼塊的範圍,這意味著如果你在某一段程式碼中使用了雙縮排,整段程式碼都必須保持一致。這種格式要求在其他的程式語言中是可選的,但對於Python來說是必須遵守的規則。
變數
變數是程式設計中最基本的資料型別之一。變數名稱與特定值相關聯,當你在程式中使用這個名稱時,它會呼叫相關聯的值。變數名稱指向記憶體位置中的資料,這些資料可以是整數、浮點數、字串、布林值、列表或字典等。
簡單的 Python 指令碼
為了讓大家熟悉基本概念,我們來撰寫一個簡單的指令碼。以下是這個指令碼的內容:
#!/usr/bin/python3
name = "OccupyTheWeb"
print("Greetings to " + name + " from HackersArise. The Best Place to Learn Hacking!")
此指令碼首先告訴系統使用Python解譯器來執行這個程式。接著定義了一個名為name的變數並賦予它一個值OccupyTheWeb。最後一行使用print()函式將文字輸出到螢幕上。
給予執行許可權
在執行此指令碼之前,我們需要給予執行許可權。使用chmod命令來完成這項操作:
chmod 755 hackers-arise_greetings.py
執行指令碼
接著我們可以執行此指令碼:
./hackers-arise_greetings.py
預期輸出:
Greetings to OccupyTheWeb from HackersArise. The Best Place to Learn Hacking!
不同型別的變數
在Python中,每種變數型別都被視為類別的一種範本,用來建立物件。以下是一些不同型別變數的範例:
#!/usr/bin/python3
HackersAriseStringVariable = "HackersArise Is the Best Place to Learn Hacking"
HackersAriseIntegerVariable = 12
HackersAriseFloatingPointVariable = 3.1415
HackersAriseList = [1, 2, 3, 4, 5, 6]
推薦閱讀
希望大家能夠從這些基礎知識出發,逐步掌握Python並應用於實際工作中。
基礎 Python 程式設計:變數、註解與函式
Python 是一種強大且易學的程式語言,特別適合初學者。本文將探討 Python 中的變數、註解及函式,並提供具體的實務案例來幫助讀者更好地理解這些概念。
變數與資料型態
在 Python 中,變數是用來儲存資料的容器。我們可以使用不同的資料型態來儲存各種不同型別的資料。以下是幾個常見的資料型態:
- 字串(String):用來儲存文字資料。
- 整數(Integer):用來儲存不帶小數點的數字。
- 浮點數(Floating Point):用來儲存帶小數點的數字。
- 列表(List):用來儲存一組有序的資料。
- 字典(Dictionary):用來儲存鍵值對(key-value pairs)的資料。
以下是一個簡單的範例,展示如何在 Python 中建立並使用這些變數:
HackersAriseStringVariable = "HackersArise Is the Best Place to Learn Hacking"
HackersAriseIntegerVariable = 12
HackersAriseFloatingPointVariable = 3.1415
HackersAriseList = [1, 2, 3, 4, 5]
HackersAriseDictionary = {'name': 'OccupyTheWeb', 'value': 27}
內容解密:
在這段程式碼中,我們建立了五個變數,分別用來儲存字串、整數、浮點數、列表和字典。這些變數可以用來進行各種運算和操作。
字典的使用
字典是一種非常有用的資料型態,因為它可以透過鍵值對來儲存資料。每個鍵值對由一個鍵和一個值組成,鍵是唯一的,用來識別值。以下是一個簡單的範例:
fruit_color = {'apple': 'red', 'grape': 'green', 'orange': 'orange'}
# 請注意,這裡有一個錯誤,橘子應該使用單引號或雙引號
假設我們想要取得葡萄的顏色,可以使用以下方式:
print(fruit_color['grape'])
如果我們想要更改蘋果的顏色,可以使用以下方式:
fruit_color['apple'] = 'green'
指令碼建立與執行
將以上程式碼儲存為 secondpythonscript.py,並給予執行許可權:
kali > chmod 755 secondpythonscript.py
執行指令碼後,我們會看到輸出結果:
kali > ./secondpythonscript.py
HackersArise Is the Best Place to Learn Hacking
12
3.1415
註解
註解是程式碼中用來說明程式碼功能和邏輯的文字。Python 使用 # 符號來標記單行註解,使用三個雙引號 """ 或三個單引號 ''' 來標記多行註解。以下是一個包含註解的範例:
#!/usr/bin/python3
"""
這是我的第一個 Python 指令碼,包含了註解。
註解可以幫助我們和其他程式設計師理解程式碼的功能。
"""
name = "OccupyTheWeb"
print("Greetings to " + name + " from HackersArise. The Best Place to Learn Hacking!")
函式
函式是一段可重複使用的程式碼塊,它們可以執行特定的任務。Python 提供了許多內建函式,例如 print()、exit()、float()、int() 等。我們也可以自行建立函式來完成特定任務。
以下是一些常見內建函式的介紹:
exit():離開程式。float():將引數轉換為浮點數。help():顯示指定物件的幫助資訊。int():將引數轉換為整數。len():傳回列表或字典中的元素數量。max():傳回引數中的最大值。open():以指定模式開啟檔案。range():傳回兩個值之間的整數列表。sorted():對列表中的元素進行排序。type():傳回引數的型別。
測試列表中的元素
Python 的列表是可迭代的,我們可以透過索引來存取列表中的元素。索引從 0 開始計算。以下是如何存取列表中的第四個元素:
HackersAriseList = [1, 2, 3, 4, 5]
print(HackersAriseList[3])
此圖示展示瞭如何存取列表中的元素:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python 駭客工具開發:基礎語法與網路應用實踐
package "Python 應用架構" {
package "應用層" {
component [主程式] as main
component [模組/套件] as modules
component [設定檔] as config
}
package "框架層" {
component [Web 框架] as web
component [ORM] as orm
component [非同步處理] as async
}
package "資料層" {
database [資料庫] as db
component [快取] as cache
component [檔案系統] as fs
}
}
main --> modules : 匯入模組
main --> config : 載入設定
modules --> web : HTTP 處理
web --> orm : 資料操作
orm --> db : 持久化
web --> cache : 快取查詢
web --> async : 背景任務
async --> fs : 檔案處理
note right of web
Flask / FastAPI / Django
end note
@enduml內容解密:
在此圖示中,HackersAriseList 是一個包含五個元素的列表。我們透過索引 [3] 您取得第四個元素。
使用 Python 進行網路溝通與資安技術
Python 的模組與 OOP 基本概念
在進一步探討 Python 之前,讓我們花一些時間來談談物件導向程式設計(OOP)的基本概念。Python,像大多數現代程式語言(例如 C++、Java 和 Ruby)一樣,遵循 OOP 模型。
模組
模組是將程式碼區段儲存到單獨的檔案中,以便在程式中多次使用而不必重新輸入。如果想要使用模組或任何來自模組的程式碼,需要先匯入它。這是 Python 如此強大的關鍵特性之一。例如,如果我們想要使用之前安裝的 nmap 模組,可以在指令碼中新增以下一行:
import nmap
稍後我們會使用兩個非常有用的模組:socket 和 ftplib。
物件導向程式設計(OOP)
OOP 的核心概念是建立類別似於現實世界事物的物件。例如,汽車是一個具有屬性(如輪胎、顏色、大小和引擎型別)和方法(如加速和鎖門)的物件。從自然語言的角度來看,物件是名詞,屬性是形容詞,方法通常是動詞。
物件是某個類別的一員,而類別基本上是建立具有分享初始變數、屬性和方法的物件的範本。例如,假設我們有一個名為 cars 的類別;我們的汽車(BMW)將是 cars 類別中的一員。該類別還包括其他物件/汽車,如 Mercedes 和 Audi。
類別也可能有子類別。我們的汽車類別有一個 BMW 子類別,該子類別的物件可能是 320i 模型。
每個物件都有屬性(製造商、型號、年份和顏色)和方法(啟動、駕駛和停車)。
在 OOP 語言中,物件會繼承它們所屬類別的特徵,所以 BMW 320i 會從 cars 類別繼承啟動、駕駛和停車方法。
這些 OOP 概念對於理解 Python 和其他 OOP 語言的運作至關重要。
用 Python 建立 TCP 客戶端
接下來,讓我們利用之前學到的知識來編寫一些與網路連線相關的破解指令碼。
應用 socket 模組
我們將使用 socket 模組來建立 TCP 連線。Python 自帶一個包含各種任務所需模組的函式庫。在此情況下,我們需要 socket 模組來建立 TCP 連線。讓我們看看它如何運作。
以下是一個名為 HackersAriseSSHBannerGrab.py 的指令碼範例:
#!/usr/bin/python3
import socket
s = socket.socket()
s.connect(("192.168.1.101", 22))
answer = s.recv(1024)
print(answer)
s.close()
內容解密:
這段程式碼展示瞭如何使用 Python 的 socket 模組來進行網路連線並擷取應用程式的橫幅資訊。橫幅是應用程式在有人或其他東西連線時展示的資訊。駭客利用橫幅擷取技術來取得關於正在執行的應用程式或服務的重要資訊。
#!/usr/bin/python3
這行程式碼指定了指令碼應該使用哪個 Python 接襏器來執行此指令碼。#!/usr/bin/python3 指的是系統中的 Python 3 接襏器位置。
import socket
這行程式碼匯入了 socket 模組,使我們可以使用其功能和工具來進行網路通訊。
s = socket.socket()
這行程式碼建立了一個新變數 s,並將其與 socket 模組中的 socket 類別相關聯。這樣我們就不必每次都參考完整的 socket.socket() 語法了;我們只需要使用變數名稱 s。
s.connect(("192.168.1.101", 22))
這行程式碼使用 socket 模組中的 connect() 函式來建立到特定 IP 和埠的網路連線。方法是針對特定物件的函式。語法為 object.method()(例如,socket.connect)。在此例子中,我們連線到 IP 地址 192.168.1.101 和埠 22,它通常是 SSH 的預設埠。
answer = s.recv(1024)
這行程式碼使用 recv() 函式從 socket 中讀取 1024 個位元組資料並將其儲存在變數 answer 中;這些位元組資料包含橫幅資訊。
print(answer)
這行程式碼列印預出變數 answer 的內容到螢幕上,使我們能夠看到透過那個 socket 傳遞過來的資料。
s.close()
最後一行程式碼關閉了連線。
請將此指令碼儲存為 HackersAriseSSHBannerGrab.py,然後使用 chmod 命令更改其許可權以便執行它。
執行指令碼
現在讓我們執行此指令碼來連線另一個 Linux 機器(例如 Ubuntu 或另一個 Kali 機器)上的埠 22。如果 SSH 在該埠上執行,我們應該能夠將橫幅讀入 answer 裡並列印到螢幕上:
kali >./HackersAriseSSHBannerGrab.py
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.5
這樣就完成了一次成功的橫幅擷取過程!