.net 역직렬화 새 항목--BinaryFormatter

BinaryFormatter 소개 BinaryFormatter는 System.Runtime.Serialization.Formatters.Binary 네임스페이스에 있으며 이진 형식으로 개체를 직렬화 및 역직렬화합니다. BinaryFormatter는 강력한 기능과 사용 편의성으로 인해 .NET 생태계 전반에 걸쳐 널리 사용됩니다. 그러나 강력한 기능을 통해 공격자는 대상 애플리케이션 내의 제어 흐름에 영향을 미칠 수도 있습니다. 공격이 성공하면 공격자가 대상 프로세스의 컨텍스트에서 코드를 실행할 수 있게 됩니다.

더 간단한 비유는 페이로드에서 BinaryFormatter.Deserialize를 호출하는 것이 해당 페이로드를 독립 실행형 실행 파일로 해석하고 실행하는 것과 동일하다고 가정하는 것입니다. 자세한 내용은 공식 웹사이트 소개: BinaryFormatter 및 관련 유형 사용 시 역직렬화 위험(https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/binaryformatter-security-guide
)을 참조하세요.

## 01 BinaryFormatter 직렬화 및 역직렬화

먼저 Person 클래스를 정의합니다.

1669882572_638862ccc7eea123e9993.png!작은?1669882574326

출력 초기화 및 직렬화 및 역직렬화

1669882588_638862dcf0f99127db04b.png!작은?1669882590284

BinaryFormatter 역직렬화 명령 실행은 유형 유형을 제어할 필요가 없고 들어오는 값만 제어할 수 있으면 됩니다. ysoserial의 소스 코드를 읽어보면 BinaryFormatter 역직렬화 공격 체인이 주로 두 개의 체인을 기반으로 한다는 것을 알 수 있습니다. , 하나는 TextFormattingRunProperties이고 다른 하나는 TypeConfuseDelegate이며, 대부분의 다른 공격 체인은 이 두 체인을 기반으로 캡슐화됩니다.

## 02 TextFormattingRunProperties

ysoserial이 TextFormattingRunProperties의 페이로드를 생성하는 방법을 살펴보겠습니다. 코드는 TextFormattingRunPropertiesGenerator.cs에 있습니다. 242행의 TextFormattingRunPropertiesGadget()에서 xaml_payload가 생성되고 TextFormattingRunPropertiesMarshal(xaml_payload)에 전달되어 최종 페이로드를 가져오는 것을 볼 수 있습니다.

1669882601_638862e9241755973f26f.png!작은?1669882602502

TextFormattingRunPropertiesMarshal(xaml_payload)에서 xaml_payload는 ForegroundBrush로 설정됩니다.

1669882613_638862f5666fddf65a3d6.png!작은?1669882614982

ForegroundBrush를 사용하는 이유는 무엇입니까? TextFormattingRunProperties를 살펴보겠습니다. 직렬화 함수에서는 this.GetObjectFromSerializationInfo(nameof
(ForegroundBrush), info)가 실행됩니다.

1669882624_6388630017ff2a5f2f870.png!작은?1669882625537

GetObjectFromSerializationInfo()를 따라가면 무엇이 보이나요? XamlReader.Parse()!지금까지 ObjectDataProvider의 xaml_payload를 연결했는데, 이 부분을 앞에서 소개했습니다.

1669882644_6388631435181c2f01a6f.png!작은?1669882645555

ForegroundBrush가 사용되는 이유는 ForegroundBrush가 부족하면 오류가 보고되므로 다른 매개변수는 사용되지 않습니다.

1669882664_638863284e4d55f8476f6.png!작은?1669882665647

지금까지 다음과 같은 공격 체인을 구성할 수 있습니다.

ISerialized 인터페이스 구현 –> GetObjectData가 직렬화될 때 ForegroundBrush 필드를 xaml 페이로드에 할당하고 TextFormattingRunProperties 클래스에 개체 유형 할당 –> 역직렬화 생성자 GetObjectFromSerializationInfo 트리거 –> 역직렬화 생성자가 XamlReader .Parse(payload) RCE를 트리거합니다
.

TextFormattingRunProperties
클래스는 Microsoft.VisualStudio.Text.Formatting 네임스페이스에 있습니다. 이는 Microsoft.VisualStudio.Text.UI.Wpf.dll 및 Microsoft.PowerShell.Editor.dll 어셈블리에서 구현됩니다.전자는 Visual Studio를 설치해야
하고 후자는 PowerShell과 함께 제공됩니다. 따라서 대상 환경에 VS가 설치되어 있지 않은 경우에도 이 클래스를 사용할 수 있습니다.

결국 deserialization이 성공적으로 실행되었음에도 불구하고 여전히 오류가 보고됩니다. 그렇다면 오류를 보고하는 이유는 무엇입니까? XamlReader.Parse()는
ResourceDictionary 형식의 인스턴스를 구문 분석하므로 이를 Media.Brush 형식의 변수에 할당하므로 오류가 보고됩니다.

1669882678_638863368cf5caf499a75.png!작은?1669882680048

## 03 요약

BinaryFormatter 역직렬화에는 많은 공격 체인이 있지만 대부분은 TextFormattingRunProperties 체인을 기반으로 캡슐화됩니다. TextFormattingRunProperties는 캡슐화된 XamlReader.Parse()이며
,
ObjectDataProvider의 Xaml 페이로드를 사용하여 코드 실행을 실현할 수 있습니다. 즉, BinaryFormatter를 사용하여 TextFormattingRunProperties로 캡슐화된 데이터를 역직렬화하면 결국 역직렬화를 위해 XamlReader에 속하게 됩니다.

참고

https://xz.aliyun.com/t/9593

https://zhuanlan.zhihu.com/p/333316520

https://zhuanlan.zhihu.com/p/333701103

http://www.hackdig.com/05/hack-356873.htm

https://mp.weixin.qq.com/s/2s457-XCm4XSCjK5NsMv6g#at

ck-356873.htm

https://mp.weixin.qq.com/s/2s457-XCm4XSCjK5NsMv6g#at

마침내

네트워크 보안에 한 번도 노출된 적이 없는 학생들을 위해 자세한 학습 및 성장 로드맵을 준비했습니다. 가장 과학적이고 체계적인 학습 경로라고 할 수 있으며, 누구나 이 일반적인 방향을 따르는 데 문제가 없습니다.

동시에 성장 경로에 해당하는 각 섹션에 대한 지원 비디오가 있습니다.


물론 지원 비디오 외에도 다양한 문서, 서적, 재료 및 도구가 정리되어 있으며 다음을 위한 카테고리로 분류되었습니다. 너.

제한된 공간으로 인해 정보의 일부만 표시됩니다. 도움이 필요한 친구는 [아래 카드를 클릭]하여 무료로 얻을 수 있습니다.

Supongo que te gusta

Origin blog.csdn.net/qq_53225741/article/details/131851143
Recomendado
Clasificación