Python已經(jīng)成為漏洞開發(fā)領(lǐng)域的行業(yè)標(biāo)準(zhǔn),讀者會發(fā)現(xiàn)大多數(shù)概念驗證工具都是用Python語言編寫的(除了用Ruby寫的安全漏洞檢測工具)。Python允許開發(fā)者編寫腳本處理遠(yuǎn)程服務(wù),處理二進(jìn)制文件,與C語言庫(或者Java的Jython/。Net的IronPython)以快速且簡單的方式進(jìn)行交互。它“內(nèi)置電池”原則的巨大標(biāo)準(zhǔn)庫,為開發(fā)省去對其它框架或者語言的依賴。我想跟讀者們分享個人
的python編程經(jīng)歷,這些也許會對你未來的工作有所幫助,讓這個世界變得更加安全一些(注:大多數(shù)例子基于Python3.0以上版本編寫的,有些可以兼容python所有分支)。
環(huán)境配置
對于你要編寫的大多數(shù)工程或者腳本,建議讀者們最好將所有的依賴放在同一個位置(除了有些在特殊工程中才用到的依賴)。為了滿足上述要求,需要用到一個叫virtualenv的工具(Python3.3已經(jīng)包括該工具),這個工具有一個簡潔的功能,就是在不打亂全局環(huán)境的基礎(chǔ)上,為你的Python工程生成獨(dú)立的環(huán)境,生成新環(huán)境的方法如下:
$ virtualenv <新環(huán)境的路徑>
或者在Python3.3以上的環(huán)境中:
$ python3 -mvenv <新環(huán)境的路徑>
使用這個環(huán)境之前,你要先激活它:
$ source <新環(huán)境的路徑>/bin/activate
禁止該環(huán)境的方式也很簡單:
$ deactivate
安裝依賴包
很多時候讀者們會發(fā)現(xiàn),借助大型python社區(qū)中的python庫編寫的個人工具,可以幫助我們很快得到結(jié)果。你可以通過個人軟件管理包或者可用的python軟件包管理器安裝這些庫,其中最權(quán)威的就是pip工具了。有了pip,你可以全局安裝這些依賴包(#pip install
有一個基本的python包叫iPython,通常在我不是100%肯定該如何解決當(dāng)前任務(wù),想嘗試做些實(shí)驗時,我會安裝這個依賴包。IPython是常用的python命令行,它是基于Python編寫的,有以下幾個特點(diǎn):
動態(tài)對象內(nèi)省
通過Tab完成本地命名空間
持續(xù)的歷史記錄
會話日志
路徑補(bǔ)全
JIT調(diào)試器
自動縮進(jìn)
和平常一樣,通過pip安裝也很簡單:$ pip install ipython
如果你想創(chuàng)建教程或者其它文本文件,ipython中的筆記本特性(現(xiàn)在由jupyter提供)允許用戶通過個人瀏覽器和IPython命令行交互,包括markdown、 mathjax、matplotlib等工具支持。
(通過安裝jupyter(pip install jupyter)可以使用它們,開啟筆記本服務(wù)通過(jupyter notebook))。
如果讀者們需要與包括JSON/XML的HTTP服務(wù)交互,我建議特別好用的requests依賴庫。該python庫可以處理與網(wǎng)頁交互面對的各類操作,如編碼、解碼、參數(shù)、標(biāo)記、重定向等。例如,請求和解析一個JSON資源的代碼如下:
大多數(shù)HTML解析和交互工作都可以交給BeautifulSoup庫,該python庫可以在任何現(xiàn)在瀏覽器上處理HTML輸入,包括修復(fù)受損代碼。
我們大多數(shù)目標(biāo)都有可能在網(wǎng)絡(luò)上獲取,安裝好的標(biāo)準(zhǔn)庫中已經(jīng)包含了通用的、有用的python庫,這里我對其進(jìn)行簡短的介紹。socket模塊是基于BSD socket API的瘦包裝器,它在所有的通用操作系統(tǒng)都可用。所以如果你已經(jīng)有C語言socket編程經(jīng)驗,你可以將你的代碼輕易地翻譯成python代碼。有很多特別方便的函數(shù),如create_connection函數(shù)可以創(chuàng)建TCP socket,建立本機(jī)和給定主機(jī)或者端口的連接。另一個包裝器是sendall方法,有些數(shù)據(jù)只有當(dāng)所有給定數(shù)據(jù)都被發(fā)出,或者有錯誤發(fā)生才能在線路中傳輸,而sendall方法可以嘗試重傳這些數(shù)據(jù)。
增加TSL加密鏈路也非常簡單:
上述功能也可以在已經(jīng)使用的連接中實(shí)現(xiàn):
如何你不需要這些低級服務(wù)交互,還有些模塊可以提供高層服務(wù)交互:
smtplib
ftplib
poplib
imaplib
httplib (Python 3以上版本的http客戶端)
nntplib
telnetlib (應(yīng)用于服務(wù)開發(fā)和之后的需要交互命令行會話)
xmlrpclib (Python 3以上版本的xmlrpc客戶端)
二進(jìn)制操作或編碼
當(dāng)開發(fā)與服務(wù)或者文件交互的腳本時,你經(jīng)常會發(fā)現(xiàn)需要將數(shù)據(jù)轉(zhuǎn)換為不同格式或者編碼。在Python2.x版本中,通常使用encode或者decode方法將字符串在不同格式之間轉(zhuǎn)換。
很可惜,這種捷徑在Python3.x版本中被取消了,encode和decode方法當(dāng)前只可以實(shí)現(xiàn)字符編碼,如utf-8, cp1250, iso8859, big5等。
作為替代,你現(xiàn)在只能使用bytes類型的兩種方法實(shí)現(xiàn)十六進(jìn)制編碼:
對于Base64編碼,你需要使用另外的模塊(在Python2.x版本中也有):
URLs編碼或者解析可以用urllib.parse模塊實(shí)現(xiàn)(Python2.x版本中是urllib)
Python普通數(shù)據(jù)類型(如int,float,str)與二進(jìn)制之間的一般轉(zhuǎn)換,可以在stuct模塊中實(shí)現(xiàn):
Python3.2也可以使用int類型直接獲取其二進(jìn)制表示:
ctypes 模塊還有一個特別棒的特征,如果你將cpython作為解譯器(通常大家都是這樣),就可以使用ctypes.Structure結(jié)構(gòu)化描述C語言,獲取它們的二進(jìn)制表示,就好像從C應(yīng)用程序中轉(zhuǎn)儲的一樣。
ctypes 模塊通常是Python程序集和C語言庫之間的橋梁,不需要編寫任何Python包裝器。有了ctypes模塊,你可以使用任何C語言庫和其輸出函數(shù):
上文中提到Structure 類型主要用于C語言庫的交互,在函數(shù)調(diào)用過程中傳遞或者獲取結(jié)構(gòu)。
漏洞開發(fā)工具
很多CTF團(tuán)體提供他們自己的的CTF解決方案框架,我發(fā)現(xiàn)來自Gallopsled 的pwntools框架特別有用,尤其是開發(fā)遠(yuǎn)程elf二進(jìn)制時,它包含很多方便的函數(shù),例如位移計算(通過cyclic模式)、格式化字符串開發(fā)(普通數(shù)據(jù)饋送以及產(chǎn)生的格式化字符串)、跳轉(zhuǎn)組合(基于ropgadget解析elf二進(jìn)制以及提供生成簡單跳轉(zhuǎn)組合調(diào)用的包裝器)和不同傳輸通道的全部API(稱作管道)。這些可以讓讀者們開發(fā)gdb編譯后端,同時簡單地改變一行代碼就可以傳輸?shù)侥繕?biāo)服務(wù)。
-
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137264 -
編程
+關(guān)注
關(guān)注
88文章
3634瀏覽量
93866 -
python
+關(guān)注
關(guān)注
56文章
4801瀏覽量
84885
原文標(biāo)題:黑客們會用到哪些Python技術(shù)?
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論