在这篇文章中,我们将介绍一些在基于Linux的设备上通过利用Python库和脚本提升权限的方法。
1.介绍
一般来说,当攻击者处于有python文件的环境中,可以用来提升其访问权限的方式比较有限。本文将介绍利用写权限、sudo权限和编辑Path变量,这三种提权方式。
为了方便演示,我们先创建一个导入一些库的示例脚本。在实际情况中,这可能是个一般的python脚本或是一个开发人员正在进行的项目。在CTF比赛中,可能很容易找到一个包含与此相类似的脚本。我们创建的示例脚本中,首先导入webbrowser模块,然后使用open函数来运行设备上的默认web浏览器,来打开http://www.1218.com.cn/网页(此处以任子行官网举例),如图1-1。
图1-1可以看到运行脚本程序会打开任子行官网
方法一:
这个漏洞利用是基于我们导入的模块文件要具有写权限。当被导入的模块文件具有允许任何用户编辑的权限时,它就可能成为一个漏洞。在我们创建的python示例脚本中,调用了webbrowser.py模块文件。为了更好地了解这种提权方式,我们将首先在ubuntu环境中创建脆弱性漏洞环境,然后使用另一个机器来攻击利用这个漏洞。
漏洞创建
正如前文所讲,在这种方法中,漏洞是基于模块文件的权限。为了构造这个漏洞,我们首先需要找到模块文件。我们可以用locate命令来找到它,当然也可以利用find之类的命令进行查找。我们可以看到它位于/usr/lib/python3.8/里面,然后我们可以看到,模块文件的默认权限是:所有者有读、写、执行的权限,组有执行和读的权限,其他用户只有执行的权限。这意味着除非用户是root权限,否则任何人不能编辑该文件。为了构造这个漏洞,我们需要用chmod命令改变一下权限,使每个用户都可以读取、写入和执行。这从下图1-2中可以看到。
图1-2可以看到所有用户对文件具有读,写,执行权限。
要想让Linux机器变得易受攻击,下一步要做的就是提供一个运行python脚本的方法。最简单的方法是写入sudoers文件中,这样攻击者(可以访问用户lele)就可以执行我们创建的python脚本(hack.py)。如图1-3。
图1-3
以上就是一个完整使机器容易受到Python库劫持的攻击的过程,其余没有提到的配置都为Linux的默认配置。
漏洞利用
该漏洞利用的前提是我们在目标机上已经获得初始立足点。然后我们可以利用这种方法在获得初始立足点后提升权限。为了模仿这种情况,我们先以用户lele的身份连接到目标机。作为一个需要提升权限的攻击者,我们运行sudo -l命令,看看哪些脚本或二进制文件是以提升的权限运行的。可以看到,我们能使用python3.8来运行hack.py。作为一个攻击者,我们使用cat命令查看脚本内容,看到它导入一个名为webbrowser的模块。我们使用locate命令找到该模块的位置,发现它位于/usr/lib/python3.8中。然后我们还可以发现lele用户拥有该模块的写权限。如图1-4,图1-5所示。
图1-4可以看到哪些脚本拥有root权限
图1-5可以看到目标脚本所处位置
我们用vim编辑器打开该模块文件,然后在被hack.py文件调用的函数里面加入了反弹shell的python脚本。在前面我们可以看到,它使用一个open函数在浏览器中打开了一个网页。因此,我们将反弹shell的代码添加到该模块文件中,如下图1-6所示。
vim /usr/lib/python3.8/webbrowser.py
图1-6将反弹shell的代码写入图中位置
编辑完模块文件后,我们保存并关闭编辑器。打开ctf机器的另一台终端,我们在shellcode脚本中指定的端口上打开一个Netcat监听器,然后以lele用户回到终端,用sudo执行hack.py脚本,如图1-7所示。
图1-7
当脚本运行时,我们就可以看到一个会话连接到了我们的Netcat监听器。通过whoami命令和id命令可以看到我们已经成功地将Linux权限从lele用户提升到了root权限用户。
方法二:
这个漏洞是基于Python库路径的优先级顺序,它适用于我们脚本正在导入的模块文件。当一个模块在脚本中被导入时,Python会以特定的优先顺序在默认目录中寻找特定的模块文件。在我们创建的python脚本中,我们有webbrowser.py模块文件被调用。因为如果在与原始脚本相同的目录下存在一个Python模块文件,它将获得优先于默认路径的地位。为了更好地了解背后发生了什么,以及怎么样导致权限升级的,我们先在ubuntu环境中创建漏洞,然后使用另一个机器Linux来利用这个漏洞。
漏洞构建
正如前面所讨论的,在这种方法中,漏洞是基于模块文件执行的优先顺序。为了构造这个漏洞,首先,我们需要把方法一加入的反弹shell的代码注释掉或者直接删掉(如图2-1),避免产生干扰,然后恢复我们先前赋予文件的权限(如图2-2)。这样,这台机器就不会在多个方面出现漏洞。
图2-1 注释掉先前加的反弹shell代码
图2-2恢复webbrowser.py的权限
接下来,我们回到我们先前创建的python脚本。我们可以看到,它位于lele用户的home目录下,它仍然包含相同的代码,需要导入 webbrowser模块,如图2-3所示。
图2-3
sudoers文件中与方法一中的编写一致,使其包含脚本hack.py的正确路径,如图2-4所示。
图2-4
以上是一个完整的使机器容易受到Python库劫持的攻击过程。其余没有提到的配置都为Linux的默认配置。
漏洞利用
同样,该漏洞利用的前提是我们在目标机上已经获得初始立足点。然后我们可以利用这种方法在获得初始立足点后提升权限。为了模仿这种情况,我们以用户lele的身份连接到目标机器。作为一个需要提升权限的攻击者,我们运行sudo -l命令,看看我们可以用哪些脚本或二进制文件是以提升的权限运行的。我们看到,我们可以使用python3.8来运行hack.py。作为一个攻击者,我们使用cat命令查看该脚本,看到它导入了一个名为webbrowser的模块,如图2-5。
图2-5
由于 hack.py 位于 lele 用户的主目录内,而我们有 lele 用户的访问权限,我们可以在主目录内创建一个文件。在这种情况下,需要注意的是我们不能编辑 hack.py 文件。在这种情况下,我们将创建一个webbrowser.py文件。然后在创建的webbrowser.py文件中添加反弹shell的代码。如图2-6:
图2-6 反弹shell代码
接下来,我们需要运行一个Netcat侦听器端口,我们提到在反向shellcode。然后我们将继续使用sudo执行hakc.py脚本,如图2-7:
图2-7
当脚本运行时,我们看到一个会话连接到Netcat侦听器。会话的id命令证明在目标机器上已经是root权限。我们已经成功地把lele用户提升特权为root用户,如图2-8:
图2-8提权为root权限
方法三:
这个漏洞是通过Python PATH环境变量进行搜索的Python库来利用的。这个变量有一个目录列表,在这个列表中,Python会搜索导入模块的不同目录。如果攻击者能够改变或修改该变量,那么他们就可以利用它来提升目标机器的权限。为了更好地了解是怎么样导致权限升级的,我们和前面一样先在ubuntu环境中创建漏洞,然后使用另一台Linux来攻击利用这个漏洞。
漏洞构建
正如前面所讨论的,这个方法的漏洞利用是基于python环境path变量的。为了构造这个漏洞,首先,和前面一样,我们需要恢复Linux环境到最初的配置。然后,在tmp目录内创建hack.py脚本,我们可以验证该脚本的内容与之前一样,如图3-1,图3-2所示。
图3-1运行该脚本会打开任子行官网
图3-2 可以看到脚本内容
接下来,我们需要在sudoers文件中做一些修改。首先,我们把文件的位置改为/tmp目录,然后在文件中加入SETENV标记,如图3-3所示。这意味着lele用户可以使用具有sudo权限的SETENV命令,而无需输入root密码。SETENV是个可以改变Python PATH环境变量的值,并将任何位置纳入我们在前面的方法中学到的执行顺序的命令。
图3-3给我们的文件加上SETENV标记配置环境变量
以上就是使机器容易受到Python库劫持的完整过程。其余没有提到的配置都被设置为Linux的默认配置。
漏洞利用
同样,该漏洞利用的前提是我们在目标机上已经获得初始立足点。然后我们可以利用这种方法在获得初始立足点后提升权限。为了模仿这种情况,我们以用户lele的身份连接到目标机器。作为一个需要提升权限的攻击者,我们运行sudo -l命令,看看我们可以用哪些脚本或二进制文件是以提升的权限运行的。我们看到,我们可以用root权限使用SETENV,这意味着我们可以用它来改变导入模块的优先顺序。由于hack.py位于/tmp目录内,我们进入其中并检查hack.py脚本,如图3-4所示。
图3-4 可以看到已经以root权限进行设置环境变量
由于它需要导入webbrowser模块,我们首先将创建一个名为webbrowser.py的恶意模块文件,然后利用改变环境变量Python PATH的能力导入我们的恶意模块文件,恶意模块文件中包含反弹shell的代码。如图3-5接着在脚本中提到的同一端口上启动一个Netcat监听器,并继续将/tmp目录添加到Python路径中,然后执行hack.py文件以提升我们的访问权限。
图3-5恶意模块文件里包含反弹shell的代码
当脚本运行时,我们可以看到一个会话连接到了我们的Netcat监听器。whoami和id命令表明了我们已经成功地将权限从lele用户提升到了root权限用户,如图3-6:
图3-6已经从普通访问权限提权为root权限
在这篇文章中,我们通过人为的为Python库的环境设置三个真实的场景,然后介绍了一些错误的配置可能导致攻击者将其访问权限提升到root权限级别的方法。