1. 程式人生 > >探祕黑客用到的Python技術,領略不一樣的“風景勝地”!

探祕黑客用到的Python技術,領略不一樣的“風景勝地”!

對於黑客,大多數的人覺得他們很神祕,很酷,以致於盲目的崇拜。可是卻不知道黑客所用的技術是哪些,本期我們一起去看一下他們用的一些Python技術吧!

探祕黑客用到的Python技術,領略不一樣的“風景勝地”!

 

Python已經達到了漏洞開發領域的行業標準,你會發現大多數概念驗證工具都是用Python編寫的(除了用Ruby編寫的metasploit框架)。Python允許編寫處理遠端服務的指令碼,擺弄二進位制資料並以快速簡便的方式與C庫(或者在IronPython中使用Jython / .Net的Java)進行互動。帶有“包含電池”原理的巨大標準庫消除了其他框架/語言中已知的一些依賴性。我想與你分享一些個人的python編碼經驗,也許這可以為你未來的工作提供一些有用的提示,讓世界變得更安全一些

探祕黑客用到的Python技術,領略不一樣的“風景勝地”!

 

設定您的環境

對於您將要編寫的大多數專案/指令碼,將所有依賴項放在一個位置(並且只有特定專案需要的依賴項)非常有用。為了滿足這些要求,存在一個名為virtualenv的工具/庫 (從版本3.3開始,它已經包含在Python中)。該工具具有為python專案生成隔離環境的簡潔功能,而不會使您的全域性環境混亂。新環境的產生就像一樣簡單

$ virtualenv <path to new environment>

或者在Python> = 3.3中:

$ python3 -mvenv <path to new environment>

要使用此環境,您必須啟用它:

$ source <path to new environment>/bin/activate

停用/離開環境也很容易:

$ deactivate

安裝依賴項

大多數情況下,您會從龐大的python社群中找到一些庫,這可以幫助您使用工具獲得快速結果。您可以使用您的發行包管理器或使用其中一個可用的pythone包管理器來安裝它們。也許最強大的是pip。使用pip,您可以安裝依賴項global(# pip install <package>),每個使用者($ pip install --user <package>)或虛擬環境((venv) $ pip install <package>)。您可以使用您的發行包管理器手動或使用Python 3.4 onwards($ python3 -mensurepip)提供的庫來安裝pip 。

當我不是100%確定如何解決當前任務並想要嘗試一點時,我通常安裝的必備軟體包之一是IPython。IPython是一個令人印象深刻的Python shell,用Python程式設計。舉幾個功能:

  • 動態物件內省。
  • 通過在提示符下鍵入TAB,在本地名稱空間中完成。
  • 持久命令歷史記錄。
  • 會話記錄。
  • 路徑完成。
  • JIT偵錯程式。
  • 自動縮排。

通過pip安裝很容易: $ pip install ipython

如果您想建立教程或其他文件檔案,ipython(現在由jupyter提供)的筆記本功能允許您通過瀏覽器與IPython shell進行互動,包括markdown,mathjax和內聯matplotlib支援。

(通過安裝jupyter(pip install jupyter)使用它們並啟動筆記本伺服器(jupyter notebook))。

如果您想與HTTP服務(包括JSON / XML-API)進行互動,我建議使用非常棒的請求庫。此庫處理在與網站互動期間您將面臨的大多數編碼/解碼/引數/ cookie /重定向內容。例如,請求和解析JSON資源是通過以下方式完成的:

r = requests.get('https://api.github.com/user', auth=('user', 'pass'))

r.json()

{u'private_gists': 419, u'total_private_repos': 77, ...}

使用BeautifulSoup庫可以在大多數情況下完成HTML解析和互動。該庫能夠同樣處理現有瀏覽器的HTML輸入,包括嘗試修復損壞的程式碼。

與網路互動

您的大部分目標都可以通過網路訪問,因此我將簡要介紹標準Python安裝中已包含的常用/有用Python庫。

對於較低的網路級互動,庫為您提供套接字和ssl模組。套接字模組是所有常見作業系統上可用的BSD套接字API的薄包裝器。因此,如果您已經具有C語言中的套接字程式設計經驗,則可以輕鬆地將程式碼轉換為Python。存在一些令人信服的功能,例如create_connection建立TCP套接字的功能,解析主機名並連線到給定的主機/埠。另一個包裝器是該sendall方法,該方法嘗試重新傳輸在傳送所有給定資料或發生錯誤之前無法通過線路傳輸的資料。


from __future__ import unicode_literals
import socket

s = socket.create_connection(('www.ernw.de', 80))
s.sendall(b'GET / HTTP/1.1 Host: www.ernw.de ')
print(s.recv(1024))

在連線中新增TLS隧道也非常簡單:


from __future__ import unicode_literals
import socket
import ssl
s = socket.create_connection(('www.ernw.de', 443))
s = ssl.wrap_socket(s)
s.sendall(b'GET / HTTP/1.1 Host: www.ernw.de ')
print(s.recv(1024))

在已使用的連線期間甚至可以這樣做:


from __future__ import unicode_literals
import socket
import ssl
s = socket.create_connection(('smtp.example.com', 25))
s.sendall(b'HELO smtp.example.com STARTTLS ')
print(s.recv(1024))
s = ssl.wrap_socket(s)
s.sendall(b'MAIL FROM:<[email protected]> ')
print(s.recv(1024))

如果您不需要與服務進行如此低級別的互動,則可以使用多個模組在更高級別進行互動:

  • 的smtplib
  • FTPLIB
  • poplib模組
  • imaplib
  • httplib(Python 3.x中的http.client)
  • nntplib
  • telnetlib(如果您必須利用服務並希望之後進行互動式shell會話,則非常有用)
  • xmlrpclib(Python 3.x中的xmlrpc.client)

二進位制處理/編碼

在開發必須與服務或檔案互動的指令碼時,您經常會發現自己需要在不同格式/編碼之間轉換資料。在Python 2.x中,這大部分時間都像執行一樣簡單,encode或者decode在字串上以不同格式轉換它:

"Hello World".encode("hex")
"AAA=".decode("base64")

遺憾的是,這個快捷方式在Python 3.x中被刪除了,encode而且decode方法現在只能在utf-8,cp1250,iso8859,big5等字元編碼之間進行轉換。

相反,你現在必須在位元組型別上使用兩種方法來進行十六進位制編碼:


bytes.fromhex('414141')
b'AAA'.hex() # starting with Python 3.5

對於Base64編碼,您將不得不使用其他模組(在Python 2.x btw中也存在):


import base64
base64.b64encode(b'Hello World')
import codecs
codecs.encode(b'Hello World', 'base64')
import binascii
binascii.b2a_base64(b'Hello World')

可以使用urllib.parse模組(或Python 2.x中的urllib)完成編碼/解析URL :


from urllib.parse import quote_plus, unquote_plus
quote_plus('Hello World+1=1337') # Hello+World%2B1%3D1337
unquote_plus('Hello+World') # Hello World

Python的簡單型別之間的常規轉換(int,float,str)和二進位制可以與結構模組來完成:


import struct
struct.pack('<I', 1337) # convert the integer 1337 into its little endian, 32 bit representation
struct.unpack('<I', b'\x10\x00\x00\x00')[0] # returns tuple of results -> get only the first result
struct.unpack('<I4s', b'\x10\x00\x00\x00Test') # returns (16, b'Test')

從Python 3.2開始,您也可以int直接使用該型別來獲取其二進位制表示:


a = 1337
a.to_bytes(4, 'little') # 32 bit little endian
a.to_bytes(2, 'big') # 16 bit big endian
int.from_bytes(b'\x10\x00', 'little') # 16

另一個很棒的功能是ctypes模組中的結構。如果您使用cpython作為直譯器(大部分時間都是這樣),您可以使用該ctypes.Structure型別來描述C類結構並獲取它們的二進位制表示,就像它們是從C應用程式轉儲一樣:


from ctypes import *
import io
class TestStructure(Structure):
_fields_ = (('foo', c_int), ('bar', c_char))
t = Test()
t.foo = 1337
t.bar = b'A'
b = io.BytesIO()
b.write(t)
b.seek(0)
print(b.getvalue()) # \x39\x05\x00\x00\x41
t2 = Test()
b = io.BytesIO(b'\x10\x00\x00\x00\x42')
b.readinto(t2)

print(t2.foo) # 16
print(t2.bar) # B

該ctypes模組通常用作Python程式和C庫之間的線索,沒有編寫Python包裝器。使用該ctypes模組,您可以訪問任何C庫及其匯出的函式:


from ctypes import *
libc = ctypes.CDLL('libc.so.6')
libc.printf(b'Hello World ')

Structure上面提到的型別用於與在函式呼叫期間傳遞/期望結構的C庫互動。

探祕黑客用到的Python技術,領略不一樣的“風景勝地”!

 

剝削助手

許多CTF團隊為開發和CTF解決提供了自己的框架。我發現Gallopsled的pwntools框架非常有用,特別是在利用遠端elf二進位制檔案方面。它包含用於偏移計算的函式(通過迴圈模式),格式字串利用(要寫入的資料中的簡單饋送以及為其生成格式字串的偏移量),rop連結(使用ropgadget解析elf二進位制檔案並提供包裝器)這導致一個簡單的rop鏈呼叫)和一個用於不同傳輸通道(稱為管)的整個API。這使您可以開發漏洞,例如使用gdb後端,只需更改一行即可將漏洞利用程式傳輸到目標服務:


from pwn import *
r = gdb.debug('./level3')
#r = remote(IP, PORT) # simply uncomment to interact with a remote service
r.recvuntil(': ')
r.sendline(EXPLOIT)
r.interactive() # start interactive session

原版英文文章地址:https://insinuator.net/2015/09/python-for-hackers/

以上就是本文的內容,小編也選取了幾個例子。喜歡本文的小夥伴或者覺得本文對你有幫助可以點播關注或轉發,如果你有好的意見或建議歡迎在下面留言或評論。選取的例子的連結就在後面。

附例:1、https://www.ernw.de/download/python-for-hackers/Pitfalls%202.html

2、https://www.ernw.de/download/python-for-hackers/Pitfalls%203.html

3、https://www.ernw.de/download/python-for-hackers/Network.html

本文來自網路,如有侵權,請聯絡小編刪除!