요약

크롬, 엣지등의 브라우저에 악성 확장 프로그램을 유저가 모르게, 그리고 프로그래매틱하게 설치하는 .NET 기반의 PoC 툴을 만들었다 - https://github.com/ChoiSG/SharpSilentChrome. 개념 및 데모 영상은 다음의 유투브 영상을 참고한다: https://youtu.be/EXTkgghGDvs?si=jPS5dtVi7yLxWWoT
해당 툴은 Credits 섹션에 있는 분들의 논문, 블로그 글, 파이썬 코드를 참고해 만들었다. 모든 크레딧은 논문의 저자들, Syntax-err0r, AsaurusRex에게 돌린다.
들어가며

상상해보자. 레드팀 침투 업무 중, 사내망 AD를 완전히 장악했다. 포레스트와 도메인을 모두 장악하고, DA, EA까지 따고 기분 좋게 담당자와 미팅을 하려는 순간 슬랙이 울린다: 저희 클라우드까지 장악할 수 있나요? 한번 침투해주세요
.
이런, 부랴부랴 LDAP과 사내 위키 서버를 뒤져 클라우드 관리자의 AD 조인된 PC를 알아냈다. EntraID와 PRT는 잠시 예외로 치고, AWS, GCP, GitHub 등, 다양한 클라우드 자원으로 피벗하기 위해서는 클라우드 관리자 직원의 PC로 피버팅한 뒤, 해당 유저의 브라우저를 장악해야한다.
브라우저 장악에는 악성 확장 프로그램 설치만큼 좋은게 없다. 하지만 브라우저 보안의 발전 때문에 프로그래매틱하게 확장 프로그램을 설치하기가 쉽지 않다. 그렇다고 포트포워딩과 RDP로 유저 세션에 무작정 들어가 임직원이 사용하던 세션을 튕겨내고 확장 프로그램을 설치할 수도 없는 노릇이다. 이를 어떻게 해결할 수 있을까?
배경

최근 들어 엔드포인트 보안이 강화됨에 따라 공격자들은 엔드포인트단에서의 악성 행위를 최소화하고 브라우저를 타겟팅하기 시작했다. Browser is the new LSASS 라는 말까지 나오는 추세다. AV/EDR과 싸우며 실수 한번에 발각되기 보다는, 거의 모든 엔드포인트에서 거의 모든 임직원이 사용하는 브라우저를 악용하겠다는 것이다.
하지만 크로미엄을 개발/관리하는 구글 및 오픈소스 기여자들 또한 공격자들이 브라우저를 악용한다는 사실을 잘 알고 있다. 브라우저의 보안은 날이 갈수록 좋아지고 있으며, 그 때문에 공격자의 입장에서 아래와 같은 문제들이 발생했다.
문제
브라우저 보안은 날이 갈수록 좋아지고 있다. 더 이상 옛날처럼 간단히 --load-extension
으로 확장 프로그램을 설치할 수도 없고, DPAPI dump를 통해 모든 쿠키와 비밀번호를 덤프할 수도 없으며, ManifestV3 때문에 손 쉽게 웹 요청을 가로채거나 키로깅 등의 행위를 할 수도 없다. 최근 많은 보안 분야(AD, 운영체제, 클라우드, IoT, 등)가 그렇듯, 소위 "낭만의 시대"는 지나갔다.
--load-extension
CLI 인자 삭제
크로미엄 기반 브라우저들은 원래 특정 파일 경로의 확장 프로그램을 로드해주는 --load-extension
커맨드라인 인자가 있었다. 워낙 악성 확장 프로그램을 불러오는 용도로 많이 사용되다 보니, 2025년 5월경 크롬 버전 137이 나오면서 이 기능은 더 이상 사용 불가능하게 되었다.
- 크롬 쿠키, 비밀번호 관련 보안
크롬 버전 127로 오면서 App Bound Encryption(ABE)이 전개되어 도메인 백업키나 특정 유저의 DPAPI 마스터키만을 가지고 크로미엄 기반의 브라우저내의 모든 쿠키와 비밀번호를 덤프하는 것은 어렵게 되었다. ABE를 우회하는 프로젝트들도 몇몇 나왔지만, SYSTEM 유저 맥락이 필요하거나, 브라우저 프로세스에 DLL을 inject 해야하는 등의 불편함이 있다.
ABE 복호화도 가능하지만, 브라우저를 꺼야하는 등의 불편함 또한 존재한다.
- 그 외
이외에도 프로그래매틱하게 크롬 확장 프로그램을 설치하기가 어려워졌고, 설령 방법이 있다고 하더라도 커맨드라인 파라미터들을 사용한다거나, 지속성 유지가 안된다거나, 레지스트리등을 바꿔야하는 등의 작전보안적 문제가 있는 방법들이 존재했다.
해결
크레딧 섹션에서의 저자들은 이 문제를 해결할 방법으로 크로미엄 브라우저들의 Preferences
와 Secure Preferences
JSON 파일들에 확장 프로그램을 인젝트 (inject) 하는 법을 알아냈다. 자세한 내용은 크레딧 섹션의 원문을 참고한다. 이 글에서는 간단하게 설명한다.
Preferences와 Secure Preferences 파일은 크로미엄 기반의 브라우저들이 북마크, 히스토리, 홈페이지, 확장 프로그램등의 정보를 담고 있는 설정파일이다. 기본적으로 유저의 LOCALAPPDATA
내의 브라우저 디렉토리에 존재하며, JSON 형태를 띄고 있다.
당연히 함부로 설정 파일을 바꾸는 것을 막기 위해 해당 파일들에는 일종의 checksum 개념의 SHA-256 기반 HMAC이 존재하는데, 크레딧 섹션의 논문은 바로 이 HMAC 생성에 필요한 SEED가 브라우저 바이너리에 하드코딩 되어 있으며, 이를 바탕으로 HMAC을 원하는 대로 생성 가능하다는 것을 발견했다.

즉, 공격자는 이제 (Secure) Preferences 파일에 원하는 확장 프로그램을 추가한 뒤, HMAC을 생성하고, 파일 안의 HMAC 및 Super_MAC을 하드코딩된 시드와 브라우저가 생성하는 정상적인 방법으로 생성한 뒤, 공격자가 생성한 HMAC을 덮어씌우는 방식으로 정상적인 (Secure) Preferences 파일들을 조작할 수 있게 되었다.
SharpSilentChrome (SSC)
이미 HMAC과 Super_MAC을 생성하고, 확장 프로그램을 설치하는 등의 PoC는 크레딧 섹션의 저자들이 만들어놨었다. 아쉽게도 저자들은 모두 파이썬 코드밖에 공유를 안했기에, C2 기반의 공격을 진행하는 레드팀 업무 특성상 무기화에 어려움이 있었다. 따라서 개인적으로 시간을 조금 내어 C#기반의 [SharpSilentChrome](https://github.com/ChoiSG/SharpSilentChrome) 툴을 만들어봤다.
이상적으로는 BOF(Beacon Object File)로 포트 해야 했겠지만 너무 시간이 오래걸릴 것 같았고, 나보다 뛰어난 분들이 BOF를 만드시라고 일단 C# 레퍼런스 코드를 만들고 공유하는 것으로 만족한다.
SSC 테스트 환경으로는 C2 서버는 Sliver, 악성 확장 프로그램은 CursedChrome을 사용했다. 실제 환경처럼 C2와 CC 서버 앞에는 모두 클라우드 기반의 Redirector, VPS 기반의 Nginx Redirector 서버들을 둔 채 테스트를 진행했다. 설치하는 CursedChrome의 작전보안을 생각해 아이콘과 manifest도 진짜 확장 프로그램처럼 수정할까 하다가, SSC 말고도 다른 프로젝트들을 해야하기 때문에 (RTL...) 더 이상 시간 투자를 하지 못하고 그냥 진행했다.
SSC 시나리오
유저의 브라우저에 확장 프로그램을 설치하는 시나리오는 간단한 것 같으면서도, 다양한 변수들이 있다.
- 같은 유저 맥락에서 크롬 확장 프로그램을 설치하는가? 아니면 다른 유저의 크롬에 확장 프로그램을 몰래 설치하는가?
- 현재 크롬이 실행중인가? 아닌가?
같은 유저 맥락에서 설치/제거 하는 경우, 브라우저는 잠깐 꺼졌다 켜지고, 사용자는 거의 알 수 없게 확장 프로그램이 설치/제거된다. 사용자가 사용하던 Tab도 자동으로 복원된다.

가장 현실적인 시나리오다. 사내망에서 횡적 이동을 하며 해당 유저의 PC에 접근하고, 그 안에서 Token Impersonation이나 계정 정보를 이용해 Make-Token 등을 이용해 해당 유저의 맥락을 얻고, 크롬을 공격하는 방식이다.
다른 유저 맥락에서 설치/제거 하는 경우, 타겟 유저의 브라우저는 꺼진다. 유저는 스스로 브라우저를 다시 켜야하며, Tab 또한 복원되지 않는다. 현실적이기도 하지만, 위험하기도 하다. 실무에서는 감히 실행 못 할 수준이다. 다른 유저의 GUI 세션에서 프로세스를 다시 실행하면서 탭을 복원하는 방법을 찾지 못해 아쉽지만 일단은 이렇게 코드를 짰다.
크롬 프로세스가 꺼져있을 경우 확장 프로그램은 설치되며, 다음에 해당 유저가 브라우저를 켤 때 자동으로 확장 프로그램이 실행된다. 확장 프로그램의 설치와 실행이 나뉘어지기 때문에 작전보안적으로 가장 안전하지만, 솔직히 기업 IT 환경에서 일하면서 브라우저를 끄고 있는 임직원은 보지 못했다. 안전하지만 비현실적인 시나리오라고도 볼 수 있겠다. 아마 출퇴근 직후/직전에는 공격이 가능하겠지만, 쉽지 않은 공격이기도 하다.
물론, 점심 시간에 모든 프로세스를 끄되 로그아웃 하는 유저 정도라면, 가능할 수도 있겠다. 하지만 그런 직장인이 몇이나 될련지는 모르겠다.
그 외 조직에서 관리하는 브라우저의 경우, 조직의 설정에 따라 브라우저가 닫힐 때 모든 세션이 초기화 된다거나, Developer Mode가 활성화될 때 작은 알림창을 띄워 유저에게 알릴 수도 있다. 따라서 실무를 뛰는 레드티머라면 SSC를 사용하기 전, 대상 조직의 브라우저 정책이나 설정 등에 대해서 충분히 정보 수집을 한 뒤 SSC를 이용해 확장 프로그램을 설치하는 것이 권장된다. 이는 실무를 뛰는 레드티머들이 스스로 풀어나가야 할 문제다.
마치며
지난 며칠 간 논문을 읽으며 브라우저 보안에 대해 배우고, 다른 레드티머들의 블로그와 코드를 통해 공격 기법을 분석하며, 이해한 것을 바탕으로 오랜만에 C#으로 코딩하고, 마지막으로 사용하는 C2에 무기화 해보는 것까지, 굉장히 재밌는 경험을 했다. 문제를 직면했을 때 이를 분석하고, 코드를 짜고, 무기화를 해 공격하는 것이야 말로 기술적 레드팀의 묘미이지 않을까 생각해본다.
앞으로도 더 많은 비컨, 쉘, 그리고 CursedChrome 콜백이 오길 기원하며,
Happy Hacking!
Credits
- Original Research Paper: https://www.cse.chalmers.se/~andrei/cans20.pdf
- Nicholas Murray(Syntax-err0r)'s original blog post: https://syntax-err0r.github.io/Silently_Install_Chrome_Extension.html and https://syntax-err0r.github.io/Return_Of_The_Extension.html
- AsaurusRex's blog post: https://medium.com/@marcusthebrody/silently-install-chrome-extensions-macos-version-becf164679c2 and https://medium.com/@marcusthebrody/silently-install-macos-chrome-extensions-part-2-c9deab4216cd
- AsaurusRex's python code: https://github.com/asaurusrex/Silent_Chrome
Reference


