购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 Kioptrix Level 4:rbash逃逸

在之前的三个例子中,无论寻找渗透测试入手点的手段有多么繁复,一旦获得一个可以利用的脆弱性,便可以一路畅通地完成渗透流程,即目标主机不会在这个过程中进行任何阻挠或者拦截操作。但是在实际的渗透测试中,大多数情况下都会或多或少地遭到目标主机防护机制的拦截和干扰。这些防护机制可能是禁止执行特定命令或者禁用特定端口,也可能是各类HIDS、反病毒等商业工具。在本节的实践中,将首次接触目标主机层面的功能限制,下面会通过较为简单的逃逸措施获取目标系统主机的root权限。

2.4.1 目标主机信息收集

首先依然使用nmap对目标主机进行初步探测,本例中目标主机的IP为192.168.192.132,执行如下命令:

得到的扫描结果如下:

根据扫描结果可知,比较容易存在脆弱性的开放服务为139、445端口的Samba以及80端口的http,首先对80端口进行测试。访问http://192.168.192.132,结果如图2-68所示。

图2-68 访问http://192.168.192.132的结果

可以看到,这是设计较为粗糙的登录界面,根据之前的实践经验,此类界面在登录操作中疑似会存在SQL注入漏洞。随意输入用户名和密码,开启浏览器代理使用Burpsuite抓包,将获得如图2-69所示的登录请求数据包。

图2-69 Burpsuite抓包的结果

2.4.2 漏洞线索:表单数据与SQL注入

将上一节获得的数据包内容保存至文件,命名为sqlmap,然后使用sqlmap对该数据包进行SQL注入检测,具体命令如下:

检测结果如图2-70所示,sqlmap检测出mypassword参数存在SQL注入漏洞。

在检测过程中有概率获得302重定向提醒,由于目前使用的测试流量是基于用户登录操作请求的报文格式,因此返回302状态码就意味着sqlmap集成的某个SQL注入漏洞测试语句在测试过程中无意成功登录了系统。提示302重定向时,为了不影响上述结果的输出,输入“n”即可继续进行测试,并获得图2-70所示的结果。

图2-70 使用sqlmap检测的结果

2.4.3 利用SQL注入漏洞枚举数据库信息

可以在上述SQL注入漏洞的基础上进行数据库枚举,命令如下:

从枚举结果可知,当前用户对两个数据库拥有访问权限,这两个数据库分别是members和mysql,如图2-71所示。

图2-71 对两个数据库拥有访问权限

其中mysql是与数据库系统自身信息相关的数据库,members则可能是80端口的Web应用系统所使用的数据库。优先枚举members数据库下的数据表,命令如下:

数据表枚举结果如图2-72所示,可以看到,数据库中只有一个members数据表。

图2-72 只有一个members数据表

继续枚举members数据表下的数据列,命令如下:

枚举结果如图2-73所示,该数据表下共有三个数据列,分别是id、password以及username。

图2-73 数据表下有三个数据列

根据数据列的名称可知,username和password可能存储的是用户名和密码信息,因此导出这两列数据列,命令如下:

导出结果如图2-74所示,这里获得了两个账号凭证,分别如下。

图2-74 导出数据列的结果

用户名:john, 密码:MyNameIsJohn

用户名:robert 密码:ADGAdsafdfwt4gadfga==

2.4.4 登录凭证的利用与二次探索

使用上一节获得的两个账号分别登录Web应用系统,均会获得如图2-75所示的界面。虽然登录成功,但无可操作选项。

图2-7 5 登录We b应用系统后的界面

由于上述账号登录后都没有可操作选项,因此进一步尝试使用账号登录ssh,命令如下:

如图2-76所示,登录成功,获得了一个受限shell,即rbash,两个账号登录后权限完全相同。

图2-76 登录ssh后的界面

2.4.5 rbash逃逸技术

上一节中提到,rbash是一种功能受限的bash shell,也就是说,相比于正常的bash shell,它可以执行的命令被人为限制了。在rbash中输入“?”,会获得当前shell允许执行的所有命令列表,本例中rbash仅被允许执行cd、clear、echo、exit、help、ll、lpath、ls共8项命令。

之前也提到,如果设置rbash中限定的命令种类时存在疏忽,可能可以利用某些在rbash中被允许执行的命令获得一个不受限的bash shell,该操作被称为rbash逃逸。本例中echo命令就是一个代表,只需输入如下命令即可利用echo获得一个bash shell。

上述命令利用echo命令调用了os.system()函数,并在rbash中运行了bash shell,如图2-77所示,新的bash shell不再限制命令的执行,因此可以直接执行whoami等原本不被允许的命令。

图2-77 rbash逃逸后的界面

小贴士: 在rbash中,如果遇到了如下常见的命令被允许执行,就可以直接凭借对应的构造命令成功地实现rbash逃逸。换言之,如果想设置一个相对安全的rbash环境,以下命令不应该轻易被允许使用。

❑针对ftp、more、less、man、vi、vim,可在输入点输入!/bin/sh或!/bin/bash命令实现逃逸。

❑awk可以使用awk 'BEGIN{system("/bin/sh")}'或awk 'BEGIN{system("/bin/bash")}'。

❑find命令可以通过输入find/-name SomeName-exec/bin/sh\;和find/-name SomeName-exec/bin/bash\;实现逃逸。

❑Python可以使用python-c 'import os;os.system("/bin/sh")'命令实现逃逸。

❑php可以使用php-a then exec("sh-i");命令实现逃逸。

❑Perl可以使用perl-e 'exec"/bin/sh";'命令实现逃逸。

❑lua可以使用os.execute('/bin/sh')命令实现逃逸。

❑ruby可以使用exec"/bin/sh"命令实现逃逸。

这里只罗列了常见的部分,若想获得更多信息,建议进一步学习如下资料。

《Linux Restricted Shell Bypass》:https://www.exploit-db.com/docs/english/44592-linux-restricted-shell-bypass-guide.pdf。

2.4.6 目标主机本地脆弱性枚举

成功实现rbash逃逸后,就可以上传LinEnum进行进一步的探测了。此时,会遇到第二个问题,如果使用的是python -m SimpleHTTPServer 80命令,那么目标主机系统中的wget命令将无法连接成功。这是因为该主机设置了策略,禁止连接远程主机的80端口,这时会出现如图2-78所示的连接等待界面。

图2-78 目标主机无法连接到Kali 80端口

而如果在Kali系统中换一个端口开启SimpleHTTPServer,则可以成功绕过上述连接限制。本例中使用如下命令将SimpleHTTPServer改在8882端口开放。

之后在目标主机系统上使用wget命令访问Kali系统的8882端口下载文件,就不会再受连接限制影响了,如图2-79所示。

图2-79 更改Kali系统主机的http下载端口后上传LinEnum

赋予LinEnum执行权限并运行,检测信息如图2-80所示。

图2-80 通过LinEnum检测目标主机系统信息

2.4.7 本地脆弱性1:操作系统内核漏洞

根据系统信息可知,目标主机系统与Kioptrix Level 3中的系统版本相同,因此也可以使用脏牛进行内核提权。但是该目标主机系统没有安装gcc编译器,因此需要在Kali系统中编译好32位系统版本的脏牛exploit并传输给目标主机。目前Kali系统为64位,因此需要在原有编译选项的基础上追加“-m32”这个选项,以便在64位的系统下编译32位的系统程序,若编译报错,可执行如下命令安装相关依赖环境。

但是如同前面多次强调的,渗透的过程中需要遵守最低代价原则,因此可以再仔细看一下LinEnum,确认是否检测到了其他可利用的点。

2.4.8 本地脆弱性2:无密码的MySQL数据库root账号

如图2-81所示,LinEnum提示目标主机的MySQL数据库root账号没有设置密码,因此可以直接登录MySQL服务。

图2-81 LinEnum检测软件信息的结果

同时进一步查看进程信息,还可以发现目前的MySQL进程是以root权限执行的,如图2-82所示。

图2-82 LinEnum检测进程信息的结果

这意味着我们可以通过无密码的MySQL系统root账号登录由系统root用户启动的MySQL服务,从而以系统root用户权限执行一些MySQL数据库指令。

首先登录MySQL,命令如下:

由于密码为空,因此直接输入回车键即可登录,如图2-83所示。

图2-83 登录MySQL服务

2.4.9 MySQL UDF提权实战

由于MySQL服务是以系统root用户权限运行的,且我们现在拥有MySQL数据库的root用户权限,可以无限制地执行MySQL指令,因此就可以借助MySQL的UDF功能来执行系统命令。

UDF(User Defined Function,用户自定义函数)是MySQL的一个拓展接口。用户可以通过UDF在MySQL中调用一些其原来不具备的功能。直接利用UDF提权需要具备两个条件。

❑MySQL的版本在5以上。根据上述LinEnum枚举的信息可知,符合此条件;

❑存在lib_mysqludf_sys。该文件可以调用sys_exec执行任意命令,如果不存在,则需要手工添加。

首先确认是否已存在lib_mysqludf_sys,使用如下命令查看。

结果如图2-84所示,很幸运,该MySQL系统已存在lib_mysqludf_sys,可以直接调用sys_exec。

图2-84 MySQL系统存在lib_mysqludf_sys

拥有了使用MySQL函数执行系统命令的权利,且执行命令没有范围限制,这就意味着我们可以有很多种提权方法,本例中简单分享如下三种。

1)利用root权限构建一个SUID程序。

2)利用root身份执行命令,创建一个反弹shell。

3)利用root权限将当前用户加到管理员用户组。

使用方法1可以将目标主机常用于SUID提权的本地程序设置为SUID,例如find,示例命令如下,结果如图2-85所示。

图2-85 MySQL调用sys_exec函数设置find为SUID

之后输入quit命令退出MySQL系统,使用find命令查找任意一个文件,并追加-exec命令参数,示例命令如下,结果如图2-86所示。

可见,find命令的确在以root身份执行,因此可以直接利用find命令运行一个root权限的shell,示例命令如下,结果如图2-87所示。

图2-86 以find命令作为SUID查找文件

图2-87 以find命令作为SUID运行root权限的shell

至此成功获得了root权限。

方法2是利用root身份执行命令,创建一个反弹shell。例如,使用nc创建反弹shell,使用whereis nc命令找到目标主机系统本地nc程序的位置等,如图2-88所示。从图中可知,nc程序位于/bin/nc.traditional下。

使用MySQL执行如下命令:

同时在Kali系统中提前使用nc监听1234端口,结果获得了一个拥有root用户权限的反弹shell,如图2-89所示。

图2-88 whereis nc命令的执行结果

图2-89 拥有root权限的反弹shell

方法3是利用root权限将当前用户加到管理员用户组,在MySQL系统中输入如下命令:

执行结果如图2-90所示,我们成功地将robert用户加入admin用户组了。

图2-90 MySQL调用sys_exec函数将robert用户加入admin用户组

之后退出MySQL,输入如下命令刷新当前robert用户账号的环境变量,在这一步需要输入一次当前用户的密码。

执行结果如图2-91所示,这里成功获得了root权限。

图2-91 sudo su-命令的执行结果 p2/+iMPZwbT10OQLUb4pGHKdlRi3iFNi1owIXPFA1f/4xGOOAepha4jNELa4Md74

点击中间区域
呼出菜单
上一章
目录
下一章
×