Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
직렬화된 DNS 요청
java.net.URL
클래스는 Serializable
을 구현하므로 이 클래스는 직렬화될 수 있다.
이 클래스는 흥미로운 동작을 가지고 있습니다. 문서에서는 "두 호스트가 동일한 IP 주소로 해석될 수 있다면 호스트 이름이 동일하게 간주됩니다"라고 설명하고 있습니다.
그러면 URL 객체가 equals
또는 hashCode
함수 중 어떤 것을 호출하더라도 IP 주소를 가져오기 위해 DNS 요청이 전송됩니다.
URL 객체에서 hashCode
함수를 호출하는 것은 매우 쉽습니다. 이 객체를 역직렬화될 HashMap
안에 삽입하면 됩니다. 이것은 HashMap
의 readObject
함수의 끝에서 이 코드가 실행되기 때문입니다:
그것은 HashMap
내의 모든 값과 함께 putVal
를 실행할 것입니다. 그러나 더 중요한 것은 모든 값과 함께 hash
를 호출하는 것입니다. 이것이 hash
함수의 코드입니다:
당신이 관찰할 수 있듯이 **HashMap
**을 역직렬화할 때 hash
함수는 각 객체와 함께 실행됩니다. hash
실행 중에는 객체의 .hashCode()
가 실행됩니다. 따라서 **HashMap
**을 역직렬화하면 URL 객체가 .hashCode()
를 실행할 것입니다.
이제 URLObject.hashCode()
코드를 살펴보겠습니다:
위에서 볼 수 있듯이 URLObject
가 .hashCode()
를 실행하면 hashCode(this)
가 호출됩니다. 계속 진행하면 이 함수의 코드를 볼 수 있습니다:
getHostAddress
가 도메인에 대해 실행되어 DNS 쿼리를 시작합니다.
따라서 이 클래스는 악용될 수 있어 DNS 쿼리를 시작하여 직렬화가 가능하다는 것을 보여주는 데 사용하거나 정보를 유출할 수 있습니다 (명령 실행의 출력을 하위 도메인으로 추가할 수 있습니다).
URLDNS 페이로드 코드 예시
여기서 URDNS 페이로드 코드를 찾을 수 있습니다. 그러나 코드를 이해하기 쉽게 만들기 위해 ysoserial의 것을 기반으로 한 PoC를 만들었습니다:
추가 정보
원래 아이디어에서 commons collections 페이로드가 DNS 쿼리를 수행하도록 변경되었으며, 이는 제안된 방법보다 신뢰성이 낮았지만 다음 게시물입니다: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
Burp Suite App Store (Extender)에서 GadgetProbe를 다운로드할 수 있습니다.
GadgetProbe는 서버의 Java 클래스에 일부 Java 클래스가 존재하는지 확인하여 해당 서버가 알려진 취약점에 취약한지 알 수 있습니다.
작동 방식
GadgetProbe는 이전 섹션의 DNS 페이로드를 사용하지만 DNS 쿼리를 실행하기 전에 임의의 클래스를 역직렬화하려고 합니다. 임의의 클래스가 존재하는 경우 DNS 쿼리가 전송되고 GadgetProbe는 이 클래스가 존재한다는 것을 알립니다. DNS 요청이 전송되지 않으면, 이는 임의의 클래스가 성공적으로 역직렬화되지 않았다는 것을 의미하므로 해당 클래스가 존재하지 않거나 직렬화/악용할 수 없는 것입니다.
깃허브 내부에는 GadgetProbe에 테스트할 Java 클래스 목록이 있습니다.
추가 정보
Java Deserialization Scanner
이 스캐너는 Burp App Store (Extender)에서 다운로드할 수 있습니다. 확장 프로그램에는 수동 및 능동적인 기능이 있습니다.
수동
기본적으로 Java 직렬화 마법 바이트를 찾기 위해 보낸 모든 요청 및 응답을 수동으로 확인하고 발견된 경우 취약성 경고를 표시합니다:
능동적
수동 테스트
요청을 선택하고 마우스 오른쪽 단추를 클릭하여 Send request to DS - Manual Testing
를 선택할 수 있습니다.
그런 다음 Deserialization Scanner Tab --> _Manual testing tab_에서 삽입 지점을 선택할 수 있습니다. 그리고 테스트를 실행할 수 있습니다 (사용된 인코딩에 따라 적절한 공격을 선택하십시오).
이것이 "수동 테스트"라고 불리지만, 꽤 자동화되어 있습니다. 웹 서버에 있는 라이브러리를 확인하고 취약한 라이브러리를 강조하기 위해 Java Sleeps, CPU 소비를 통한 sleeps, 또는 이전에 언급된 DNS를 사용하여 어떤 ysoserial 페이로드에 취약한지 자동으로 확인합니다.
악용
취약한 라이브러리를 식별하면 요청을 _Exploiting Tab_로 보낼 수 있습니다. 이 탭에서 다시 삽입 지점을 선택하고, 페이로드를 생성하려는 취약한 라이브러리와 명령을 작성한 다음 적절한 공격 버튼을 누르기만 하면 됩니다.
Java Deserialization DNS Exfil 정보
페이로드가 다음과 같은 것을 실행하도록 만드세요:
더 많은 정보
Last updated