把蚁剑的 Labs 结个尾,后面再继续学一下蚁剑的其他东西
AntSword-Labs 还有一个 LoadBalance-JSP 的文件夹,看了下介绍的 .md,是关于负载均衡的
一、负载均衡(Load Balance)
关于负载均衡的文章网上有很多,🐧云的文档里也有介绍,简单理解就是实现了负载(流量)分发(分摊)到不同的服务单元上处理,既可以提高服务的性能,也能避免出现单点故障带来的问题(各官方云服务器提供商都会有负载均衡的文档,因为自己的是腾讯云,一些内容就参考了🐧的)
实现负载均衡的方式有很多种,比如 DNS/F5/LVS/HAproxy/Nginx
,关于 Nginx,官方文档里有介绍
策略主要有:轮询(round-robin)、最少连接(least-connected)、ip_hash、权重(weight)
轮询就是按照请求到达时间的先后顺序分配到不同的 server,如果有 server 挂掉了,自动剔除
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
最少连接就是不让处于繁忙状态的服务器处理过多的请求,而是将新的请求分配给其他不那么繁忙的服务器(解释了等于没解释😅),适合请求处理时间长短不一造成服务器过载的情况
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
ip_hash 是为了确保来自同一客户端的请求始终指向同一服务器,适合解决同一用户访问同一程序 session 不共享的问题
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
weight 就是给服务器赋一定的权重,权重越高,分配的也就相对越多,适合后端服务器的硬件配置差别比较大的情况
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
如何知道后端的服务器是否处于正常运行状态,可以通过健康检查(Health checks)实现,具体方式也可参考腾讯云
二、Webshell 管理
参考文章:
上面是负载均衡的基本内容介绍,回到 webshell 上面来
假定业务中存在RCE漏洞,上传了 WebShell 之后, 因为负载均衡的存在, 导致后续上传的工具、执行命令等操作出现不连续的情况
演示环境中, LBSNode1 和 LBSNode2 均存在位置相同的 Shell: ant.jsp
upstream lbspool {
server lbsnode1:8080;
server lbsnode2:8080;
}
server {
listen 80 default_server;
server_name _;
charset utf-8;
root /usr/share/nginx/html;
index index.jsp index.html index.htm;
location / {
proxy_pass http://lbspool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
┌─────────────┐
│ │
┌──────► LBSNode 1 │
┌─────────┐ │ │ │
│ │ │ └─────────────┘
│ Nginx ├────────┤
│ │ │ ┌─────────────┐
└─────────┘ │ │ │
└──────► LBSNode 2 │
│ │
└─────────────┘
在上面的轮询状态下 ip 一直都是跳的
所以上传文件的时候,在分片传输的机制下想要传上去的文件会被分成几部分散落在服务器上,即使是小文件也一样,传上去也不一定能访问到,因为不能保证后面几台机子的相同位置上都有,而且采用什么负载均衡方式也不知道,渗透测试总不能碰运气吧
然后 Medicean 师傅提出了在Web 层做一次 HTTP 流量转发的解决方法,把所有的流量通过代理脚本 /antproxy.jsp 请求重组之后传递到一台 Node 上面,实现命令执行
脚本在藏青师傅的文章下有