리버싱 #23 고급 글로벌 후킹

이립·2024년 12월 3일

리버싱

목록 보기
23/32

Advanced Global Hooking

목표

텍스트타깃 : Internet Explorer 후킹
목표: 특정 사이트에 접속할 시 공격자가 원하는 사이트(my velog)로 우회시키기

약간 유해사이트 차단이랑 비슷하다. 특정 사이트의 접속을 막아두는 것

타깃 API 찾기

후킹할 API를 찾는게 중요하다고 전에 말했지.

미리 말하자면 이런 것들이 있대

라이브러리종류
ws2_32.dll소켓 라이브러리
wininet.dllMS제공
winhttp.dllMS 제공

후킹할 API를 찾기 위해서 process explorer를 실행하고 인터넷 브라우저를 열어보자. 나는 웨일브라우저를 쓰니까 웨일을 보자.
wininet.dll을 로딩한다. 나이스

wininet.dll은 InternetConnect( )라는 함수가 있다고 한다.

HINTERNET  InternetConnect(
__in   HINTERNET  hlnternet,
__in   LPCTSTR  IpszServerName,
__in   INTERNETPORT  nServerPort, 
__in   LPCTSTR  IpszUsername,
__in   LPCTSTR  IpszPassword, 
__in   DWORD   dwService,
__in   DWORD   dwFlags,
__in   DWORDPTR  dwContext
);

즉, 여기에 lpszServerName 파라미터를 내가 우회시키고 싶은 사이트 주소로 바꿔치면 되겠네.

왜 IE는 글로벌 후킹?

인터넷 익스플로러 같은 브라우저는 여러개의 창이나 탭을 띄우면 하나의 메인 프로세스가 자식 프로세스들을 관리하게 된다.

후킹을 하고 난 상태에서 새로 인터넷 창을 추가하면 그거는 자식 프로세스가 될 텐데 그 자식은 후킹이 되어있지 않으면 결국 무의미한 것이다.

그래서 자동적으로 새로 생성되는 자식 프로세스에도 모두 dll인젝션이 되어야 한다.

다시 한번 글로벌 후킹을 정리해본다면

Injector가 글로버후킹 dll을 부모 프로세스에 심어넣음

글로벌후킹은 두개의 API를 후킹함

하나는 자기 프로세스에 hook.dll을 인젝션 함(사이트 우회)

그리고 자식 프로세스가 생성될 때마다 자가 자신(글로벌 후킹 dll)을 인젝션하게 함. (글로벌 후킹 역할)

그럼 자식 프로세스도 hook.dll이 인젝션됨

글로벌 후킹을 위한 API

프로세스 생성에 관여하는 API는 kernel32!CreateProcess( ) API가 대표적이다.

프로세스가 생성되느 과정에서 API의 호출 관계는 이렇다.

결국 CreteProcessW, CreateProcessInternalW, ZwCreateUserProcess, ZwResumeThread 어떤 걸 후킹해도 괜찮지만 이왕이면 최대한 low level을 후킹할 수록 유용하겠지. 상위를 후킹하면 low api를 직접 호출하는 건 못 잡아내니까.

*여기서 저 메인 스레드는 suspend 상태라는 걸 이해해야 한다. 자식 프로세스가 생성되었을 뿐이지, 아직 자식 프로세스의 메인 스레드(=EP 코드)가 실행되진 않았다느 것.

실습

이제 naver와 google에 접속할 때마다 내 velog에 접속하게 하자.

redirect.dll을 인젝션하는데 아까 말했듯이 두개의 api를 후킹한다.

wininet!InternetConnectW( ) : IE프로세스의 접속 주소를 제어함

ntdll!ZwResumeThread( ) : 글로벌 후킹을 위해서 후킹해야함


옴마야 왜 실패했담.
보안 때문인가...

원래는 저렇게 redirect.dll을 들어가고 naver에 들어가면 내가 사전에 설정해둔 사이트로 이동하게 된다. url 주소창엔 그대로 naver지만 보여지는 사이트는 내 velog인 것이다.

코드분석

redirect.dll의 코드를 보자. 뭐 많지만 늘 봐야하는건 DllMain이지

DllMain( )


특징이 있다. if문을 보면 실행되는 프로세스 이름이 iexplore.exe면 wininet.dll을 로드한다는 것이다.
어차피 iexlorer 실행되면 wininet.dll로드할텐데 굳이 우리가 직접 이 dll을 로드하는 이유는 아까 내가 자식프로세스의 메인 스레드가 suspend되어있다고 했지. 자식이 제대로 실행되기 전에 자식 프로세스의 API를 후킹하려고 하면 실패할 수 있기 때문이다.

여기서 알아둬야 할 함수들을 내가 체크해둔 게 있다.

하나씩 보자.

NewInternetConnectW( )

원래 접속해야 하는 사이트에서 새 우회 사이트로 접속시키게 하는 것이다ㅏ. 처음에 얘기한 것처럼 두번째 파라미터인 lpServerName을 가로채야한다.
그냥 접속하려는 사이트가 naver, daum, nate, yahoo면 접속주소를 바꿔치는 것이다.

NewZwResumeThread( )

자식프로세스에게 redirect.dll을 심어주기 전에 먼저 자식 프로세스의 스레드 핸들을 받아와야할거니까. ZwQueryInformationThread( )를 실행해서 자식 프로세스의 PID를 얻어온다.![]

그 다음 이제 redirect.dll을 심는거지.

밑에 보면 오리지널 ZwResumeThread( ) 실행하는 것도 잊어선 안된다. 그래야 정상적으로 자식 프로세스의 메인 스레드를 resume한다.

나머지 hook_by_code 이런 것들은 여태 봤던 것들과 비슷하다.

profile
Cybersecurity Consultant

0개의 댓글