在 Kali Linux 上使用 virtualenv 執行 Python 2 撰寫的 exploit 程式

by iok
發佈日期: 更新日期: 2.8K 人次瀏覽
kali-python2

前言

Python 軟體基金會(Python Software Foundation) 已於 2020 年 1 月 1 日停止發展與支援 Python 2 版本,目前主流的 Linux Distribution 的 預設 Python 程式版本都已移轉至 Python 3 版本,也包含 Kali Linux。

由於 Kali Linux 為了向前相容,預設的 /usr/bin/python 程式仍指向 Python 2 版本,但 Python 的模組管理程式 /usr/bin/pip,卻不是 Python 2 的版本,而是Python 3 的版本。

結論就是,Kali Linux 目前內建的 pip 程式,已經無法安裝 Python 2 模組了。

而且 Python 2 版本的pip 套件 python-pip,也無法再安裝取得 。

而 Exploit-DB 網站仍有早期以 Python 2 撰寫的exploit 攻擊程式,若無法安裝 Python 2 的模組,會導致無法執行這些攻擊程式。

精選圖片來源:The Python Logo

解決辦法

安裝 Python3 的 virtualenv 套件。利用 virtualenv 指令,建立一個 Python 2 的虛擬執行環境,來執行這些早期的 exploit 程式。

虛擬環境包含 Python 2 程式、Python 2 版本的 pip 程式、模組安裝資料夾…等。

步驟如下:

step 1

安裝 virtualenv 套件

$ sudo apt install virtualenv

step 2

確認 Python 版本

$ /usr/bin/python --version 
Python 2.7.18

使用 Kali Linux 內建的 python 2 程式(/usr/bin/python),並確認其版本為 Python 2.7.18 。接下來使用的 Python 2 版本都會是 2.7.18,如果你有安裝其他 2.x 版本的 Python的需求,可使用 pyenv 程式。

step 3

建立 Python 2.7.18 的虛擬執行環境

$ virtualenv -p /usr/bin/python venv
created virtual environment CPython2.7.18.final.0-64 in 136ms
creator CPython2Posix(dest=/home/kali/venv, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/kali/.local/share/virtualenv)
added seed packages: pip==20.3.4, setuptools==44.1.1, wheel==0.37.0
activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

-p 參數是指虛擬環境的 Python 程式的引用路徑,範例是 /usr/bin/python ,也就是 Python 2.7.18 版本。venv 是虛擬執行環境的資料夾名稱,資料夾名稱可自由命名,例如改為 foo。

virtualenv 程式會將虛擬執行環境需要的素材,放置在這個資料夾中。

step 4

進入 Python 2.7.18 版本程式虛擬執行環境

┌──(kali㉿kali)-[~]
└─$ source venv/bin/activate  

┌──(venv)─(kali㉿kali)-[~]
└─$ 

執行 source 指令就是讓目前的終端機,能進行 Python 2.7.18 的虛擬執行環境,之後在這個環境下安裝 Python 2 模組,都不會影響作業系統 的 Python 3 設定。

source 指令執行成功後,會在終端機的 PS1 字串前面多一個 (venv)的提示。之後,所有的執行指令都會在這個虛擬環境執行。

step 5

安裝 impacket 模組來測試

此處使用的 pip 程式,是虛擬環境下 Python 2.7.18 版本的 pip,因此執行時會印出 Python 2.7 已不支援的提示訊息。此外,安裝時,也會一併安裝 impacket 其他相依性模組。

(venv) $ pip install impacket
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.                                                                                                                                                                
Collecting impacket
  Downloading impacket-0.9.24.tar.gz (7.1 MB)
     |████████████████████████████████| 7.1 MB 3.9 MB/s 
Collecting pyasn1>=0.2.3
  Downloading pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
     |████████████████████████████████| 77 kB 1.4 MB/s 
Collecting pycryptodomex
  Downloading pycryptodomex-3.11.0-cp27-cp27mu-manylinux2010_x86_64.whl (1.9 MB)
     |████████████████████████████████| 1.9 MB 1.9 MB/s 
Collecting pyOpenSSL>=0.16.2
  Downloading pyOpenSSL-21.0.0-py2.py3-none-any.whl (55 kB)
     |████████████████████████████████| 55 kB 1.5 MB/s 
Collecting six
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting ldap3!=2.5.0,!=2.5.2,!=2.6,>=2.5
  Downloading ldap3-2.9.1-py2.py3-none-any.whl (432 kB)
     |████████████████████████████████| 432 kB 1.7 MB/s 
Collecting ldapdomaindump>=0.9.0
  Downloading ldapdomaindump-0.9.3-py2-none-any.whl (18 kB)
Collecting flask>=1.0
  Downloading Flask-1.1.4-py2.py3-none-any.whl (94 kB)
     |████████████████████████████████| 94 kB 1.4 MB/s 
Collecting future
  Downloading future-0.18.2.tar.gz (829 kB)
     |████████████████████████████████| 829 kB 4.3 MB/s 
Collecting chardet
  Downloading chardet-4.0.0-py2.py3-none-any.whl (178 kB)
     |████████████████████████████████| 178 kB 2.8 MB/s 
Collecting cryptography>=3.3
  Downloading cryptography-3.3.2-cp27-cp27mu-manylinux2010_x86_64.whl (2.6 MB)
     |████████████████████████████████| 2.6 MB 1.9 MB/s 
Collecting dnspython
  Downloading dnspython-1.16.0-py2.py3-none-any.whl (188 kB)
     |████████████████████████████████| 188 kB 5.7 MB/s 
Collecting itsdangerous<2.0,>=0.24
  Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting click<8.0,>=5.1
  Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
     |████████████████████████████████| 82 kB 423 kB/s 
Collecting Jinja2<3.0,>=2.10.1
  Downloading Jinja2-2.11.3-py2.py3-none-any.whl (125 kB)
     |████████████████████████████████| 125 kB 2.8 MB/s 
Collecting Werkzeug<2.0,>=0.15
  Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
     |████████████████████████████████| 298 kB 2.6 MB/s 
Collecting cffi>=1.12
  Downloading cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl (393 kB)
     |████████████████████████████████| 393 kB 669 kB/s 
Collecting ipaddress; python_version < "3"
  Downloading ipaddress-1.0.23-py2.py3-none-any.whl (18 kB)
Collecting enum34; python_version < "3"
  Downloading enum34-1.1.10-py2-none-any.whl (11 kB)
Collecting MarkupSafe>=0.23
  Downloading MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl (24 kB)
Collecting pycparser
  Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)
     |████████████████████████████████| 118 kB 435 kB/s 
Building wheels for collected packages: impacket, future
  Building wheel for impacket (setup.py) ... done
  Created wheel for impacket: filename=impacket-0.9.24-py2-none-any.whl size=1450131 sha256=c3507dac2198a7c5f26bb9736004a0b74e3b7d7066f8f663cc141f2fed268082
  Stored in directory: /home/kali/.cache/pip/wheels/fb/19/59/b5402a38e6d5c76e284ae31ed8ef0ab8088b8d37d6d09a419d
  Building wheel for future (setup.py) ... done
  Created wheel for future: filename=future-0.18.2-py2-none-any.whl size=502567 sha256=1077d3c74ece316e9b0a0fed8aa419b33eb7dd894de9e3bad546987574aa2b78
  Stored in directory: /home/kali/.cache/pip/wheels/5f/11/0c/aad680baf5ef4fbcbab992c9f03e1130357e0c173a4fdabfff
Successfully built impacket future
Installing collected packages: pyasn1, pycryptodomex, pycparser, cffi, ipaddress, six, enum34, cryptography, pyOpenSSL, ldap3, future, dnspython, ldapdomaindump, itsdangerous, click, MarkupSafe, Jinja2, Werkzeug, flask, chardet, impacket
Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 cffi-1.15.0 chardet-4.0.0 click-7.1.2 cryptography-3.3.2 dnspython-1.16.0 enum34-1.1.10 flask-1.1.4 future-0.18.2 impacket-0.9.24 ipaddress-1.0.23 itsdangerous-1.1.0 ldap3-2.9.1 ldapdomaindump-0.9.3 pyOpenSSL-21.0.0 pyasn1-0.4.8 pycparser-2.21 pycryptodomex-3.11.0 six-1.16.0

step 6

從 searchsploit 下載 ms08-067 的 exploit code

先搜尋列出 ms08-067 的所有 exploit 。

(ven) $ searchsploit ms08-067
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                                                      |  Path
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Microsoft Windows - 'NetAPI32.dll' Code Execution (Python) (MS08-067)                                                              | windows/remote/40279.py
Microsoft Windows Server - Code Execution (MS08-067)                                                                                                | windows/remote/7104.c
Microsoft Windows Server - Code Execution (PoC) (MS08-067)                                                                                    | windows/dos/6824.txt
Microsoft Windows Server - Service Relative Path Stack Corruption (MS08-067) (Metasploit)                       | windows/remote/16362.rb
Microsoft Windows Server - Universal Code Execution (MS08-067)                                                                            | windows/remote/6841.txt
Microsoft Windows Server 2000/2003 - Code Execution (MS08-067)                                                                          | windows/remote/7132.py
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Paper Title                                                                                                                                        |  Path
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
How Conficker makes use of MS08-067                                                                                                                 | docs/english/12934-how-conficker
---------------------------------------------------------------------------------------------------------------------------------------------------- ----------

下載 40279.py。

(venv) $ searchsploit -p windows/remote/40279.py
  Exploit: Microsoft Windows - 'NetAPI32.dll' Code Execution (Python) (MS08-067)
      URL: https://www.exploit-db.com/exploits/40279
     Path: /usr/share/exploitdb/exploits/windows/remote/40279.py
File Type: Python script, ASCII text executable, with very long lines

複製 40279.py 到 imp 資料夾。

(venv) $ mkdir imp
(venv) $ cd imp
(venv) $ cp /usr/share/exploitdb/exploits/windows/remote/40279.py .

step 7

執行 ms08-067 exploit code (40279.py)

可成功執行,表示 Python 2.7 虛擬環境設定 OK。

(venv) $ python 40279.py     
#######################################################################
#   MS08-067 Exploit
#   This is a modified verion of Debasis Mohanty's code (https://www.exploit-db.com/exploits/7132/).
#   The return addresses and the ROP parts are ported from metasploit module exploit/windows/smb/ms08_067_netapi
#######################################################################


Usage: 40279.py <target ip>

Example: MS08_067.py 192.168.1.1 1 for Windows XP SP0/SP1 Universal

Example: MS08_067.py 192.168.1.1 2 for Windows 2000 Universal

結論

隨著 Python 2.7 版本停止支援,各大 Linux 作業系統都轉移到 Python 3 環境,Kali Linux 亦已無法使用 pip 內建指令,安裝 Python 2 的模組。

幸好有 virtualenv 能建置虛擬執行環境,讓 Python 2 撰寫的 exploit code 還能順利運作,解決相容性的問題。

希望這篇教學能幫助到你,有任何問題,請在下方留言給我,也請幫我分享這篇文章給你的朋友。

若對 Kali Linux 的中文桌面環境設定有興趣,可以參考我另外一篇文章:打造 Kali Linux 2021 中文桌面環境(字型、中文輸入法)

參考資料

相關文章

留言