在我们渗透测试的过程中,当拿到普通用户的shell后,可能会因为各种各样的权限限制,导致无法进行更多的操作,这个时候我们就要想办法进行提权。
收集环境信息
一旦我们拿到了受限制的shell,第一步是尽可能多地收集有关我们当前shell环境的信息。收集的信息将让我们了解我们所处的受限制的shell类型,以及所提供的功能和我们可以使用的技术。我们可以做以下的测试:
然后,自己在本地搭建环境,进行各种测试,根据报错信息,确认是哪种类型的shell...
常见的shell类型报错如下:
rbash
rksh
rzsh
lshell
一些受限制的shell在错误消息中会显示其名称,有些则没有。
常用的突破技术
我们从基础开始、我们可以使用一些非常简单的技术逃避受限制的shell来执行命令或访问我们不能或者不应该访问的系统区域、、、这些技术大多依赖简单的命令转义字符,重定向运算符甚至linux系统shell变量污染、、、我们来分析一下:
1.Console编辑(vim)
Vim有一个功能,允许我们在其中运行脚本和命令、如果vim可用,可以用一下的命令来进行测试:
:!/bin/ls -l b*
Vim会离开编辑器并显示“ls -l b*”执行命令的结果,显示所有目前目录下以字母“b”开头的文件...
我们可以使用这个技术执行任何其他命令甚至是另一个可用的shell,比如bash,以突破我们目前的限制,就比如:
:set shell=/bin/sh:shell
或者
:!/bin/sh
另一个好例子是ed。它是一个旧的默认Unix控制台编辑器。通常ed是提供给用户,它功能非常简单,但它仍然有内部的第三方命令执行功能,非常类似于vim。一旦进入,ed我们可以通过执行另一个来逃避正常的shell,!’/bin/sh’如下所示:
另一个编辑器的例子是ne,它是一个非常小巧的被用来设计成替代vi的东西。使用ne,可以突破的例子如下:这是一个lshell、我们没有权限回到“/”上面的任何其他目录。。。。
那么就轮到我们的ne上场了,ne编辑器有一个非常骚的功能,允许我们保存或加载配置首选项。我们可以用这个功能来读取文件系统中的内容。按一下ESC一旦可以打开主配置菜单、转到最后一个菜单,“Prefs”选项“Load Prefs”:
点击后,它就会显示文件系统的内容,让我们可以从中选择我们的首选项文件。但是在这里,请注意,我们现在可以进入到上一级文件系统中的目录,甚至到达“/”或任何其他目录,获取和读取它里面的内容:
我们甚至可以打开/etc目录文件/etc/passwd来枚举用户:
2.Pager命令
Linux 的Pager类型命令是一些简单实用的命令、它们允许我们以分页的方式查看特定命令或文本文件的输出,最着名的是“more”和“less”、它还具有执行脚本的功能。。。是不是很骚。。。举个栗子:我们less一个文件,然后输入 !'ls'或者 !'sh',这里它就会成功的显示本目录下所有的文件
这种技术,适用于more和less
3.man命令
命令“man”用于显示Linux命令的手册页,也具有突破功能功能。只需使用man命令显示任何命令手册,如下所示:$ man ls当ls出现命令手册时,我们可以使用more和less相同的技术、原因是 “man”使用“less”或“more”作为默认的man打开命令
4.pinfo命令
这个命令比较偏,只适用于一些个别的shell类型中,作用和man一样,这里使用 lshell 来演示一些受限制下的 lshell 如何使用 pinfo 提权。。。。我们尝试一些命令如“nc”,“/bin/bash”或“ls /etc”,都无法被执行,lshell限对这些命令有限制,然后我们来尝试用pinfo提权:
用pinfo打开ls手册user@kali:~$ pinfo ls当ls手册页面打开后,在里面打“!”(感叹号)。请注意,这里就会打开了一个命令执行功能,现在执行一些简单的命令试试吧,就比如之前的“ls /etc”,可以看到成功执行:
这里我们就成功绕过了lshell执行受限命令的限制。。。
5.find命令
find是一个非常着名的命令,用于在Linux文件系统中查找文件。它有许多功能,其中“-exec”选项是一个让我们可以执行shell命令。关于这个命令,我在博客中有提过,这里就不详细说了,放两个例子:
/usr/bin/find examples.desktop -exec whoami ;
/usr/bin/find examples.desktop -exec /bin/sh ;
可以直接进入root权限的shell中。。。
6.nmap命令
nmap是一个非常著名的扫描端口的命令,它有一个选项叫做“--interactive”,该“--interactive”选项在2009年5月之前的版本中用于打开交互式控制台,可以运行其他命令。但是有点忧伤的是,这个功能在版本r17131中已停用,不过如果我们再有点旧版的Linux中可以尝试一下,当可以使用这个选项时,可以输入“!sh”,看看能不能打开一个shell
user@kali:~$ nmap --interactivenmap> !sh$
7.export
如果这个命令可以,就可以直接添加环境变量,获取到更多可以执行的命令,比如:
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
利用编程语言的技巧
1.awk命令
awk是一种为文本处理而设计的解释型编程语言。它是大多数类Unix操作系统的标准功能,我们通常可以在shell中找到它们。它有很多的类似功能如print(),sprintf()以及其他。其中最有意思的是system()、system()函数允许我们/bin/sh$ awk 'BEGIN {system("/bin/sh")}'即使 lshell 不允许 /bin/sh 直接运行另一个shell(),我们也可以通过使用awk为我们打开shell来突破它的限制:
2.Python
Python是世界上最好的语言、哈哈哈。它有很多的功能,我们可以用它来执行的shell命令,比如system(),pty()等等,来看个栗子:
我们执行函数print()来回显字符串“testing”,因此我们就可以执行任何其他命令(如ls甚至是shell)。对于第一个示例,我们导入OS模块,负责操作系统交互,最后使用system()函数运行本来不让运行的命令cp,这里只是随便证明一下:
可以看到,我们成功运行了cp命令,因此运行shell应该也可以吧,来试试:
可以看到,我们成功得到了shell。同样的例子可使用多种不同的方式,主要看掌握的基础知识是不是强大,再来个例子,如spawn()的pty模块:
多说一句,你掌握的知识,决定你可以使用的功能。。。
如果我们想要shell可以远程使用,我们可以使用反弹shell让python打开我们的攻击者机器的socket,如下所示:
检查已经在端口5000上侦听的攻击者的电脑看看反弹过来了没:
3.Ruby
Ruby中可以让我们使用irb(Interactive Ruby Shell)直接调用shell或任何其他命令:
可以反弹一个shell
4.Perl
我们使用perl with system()method来执行禁止本来没法执行的命令cp,也可以调用/bin/sh,如下:
完成同样骚操作的另一种方法是使用exec()方法,如下所示:
反弹个shell
5.php
PHP语言有很多选项可以在shell中执行命令,其中包括已经很有名的system()和exec()。您可以在php控制台内以交互方式进行,也可以直接在命令行中进行,就像之前在ruby,python和perl中做的那样。。。
以下是交互式使用PHP的示例:还是一样,试试cp命令
再使用exec()函数来尝试执行交互式shell:
也不一定非得要交互模式来获取shell、我们可以用简单的php在命令行上执行脚本并让我们的靶机向我们反弹shell,如下所示:
是不是很棒。。。
当然,提权的方式还有很多很多 ,后续会陆续发出,如果大家还有什么更骚的操作,欢迎私信。。。