ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 - ShellCode injection 구현
    카테고리 없음 2020. 3. 17. 17:48

    Code injection이라는 제목으로 글을 썼기 때문에 구독자가 소개할 수 있는 범위가 넓은 주제였다. 웹 해킹/보안에 익숙한 사람들은 SQL Injection을 떠올리거나, 최근 흔히 볼 수 있는 오브젝트의 역직렬화를 통한 코드 삽입 공격을 소견할 수 있다. 필자도 실은 SQL Injection에 가장 익숙한데, 이번에 쓰는 Code injection은 자주 악성코드로 구현되어 실행 중인 어플리케이션(프로세스)에 악의적인 셰일코드를 삽입해 의도되지 않는 행위를 하는 Injection 유형을 다루고 싶다. 정확하게는 "Shell Code Injection"이라고 하는 이미지로 표현하는 것이 맞다고 생각한다.유사한 공격으로는 Dllinjection 기법이 있는데, Codeinjection과 Dllinjection은 엄연히 다를 것으로 보인다. Dllinjection은 프로그램에 Dll 자체를 실어버리는 기법으로 보면 되고 Code injecton은 필요한 코드와 데이터만 삽입한다. (의견을 보면, 작년에 신나게 사용한 NSA 해킹 툴인 Eternalblue에도 Injection 기능(dllinjection)이 장착되어 있었던 것 같다. )


    Code injection은 타깃 프로세스에 코드를 삽입해 원래 프로그램이 의도하지 않는 방향으로 실행되도록 하는 공격이었다. 다만 악성코드에서 정상 프로세스로 삽입해 탐지를 우회하기 위한 비결로 자주 사용되고 있다. 이번 문장에서는 Python을 이용해 Code injection을 구현함으로써 이 기법을 이해하고 분석할 수 있는 능력을 기르려고 한다.각설하고 먼저 Code injection 툴에서 필요하다고 소견되는 부분을 정리하여 개발작전을 짧게 작성해보자. 1. 현재 프로세스의 목록과 ID값을 얻는 옵션이 존재해야 한다.수행할 윈도우 명령어를 인자로 입력 받아서 셸 코드에 적용하여 공격할 수 있어야 한다.3.사용법이 명시되어야 한다.(오류처리)


    Python에서 프로세스 리스트를 얻는 비결부터 보자. 이 과정에서 WMI(Windows Management Instrumentation)를 사용할 수 있지만 Python에서 WMI 요소를 사용하려면 pywin32(win32) 모듈이 설치되어야 한다. 프로세스 리스트를 얻기 위한 코드는 다음과 같다.


    첫 번째 WMI 서비스의 Get Object()를 호출하여 개체를 요청합니다. 이 때 Instances Of() 메서드를 이용하여 Win32+Process 클래스의 모든 Instances를 요청하여 Win32+Process 클래스의 Instances 목록이 반환되도록 합니다.for 문을 이용해 process+에 담긴 값을 PS+로 읽으면서 반복하여 "Name"과 "Process Id"값에 해당하는 값을 반납하고 각 리스트에 올려 형식에 맞게 출력했다.결과는 2강과 같다


    >


    모든 것이 sound로 실현되는 것은 인제에서 프로세스 이름을 쓰셨을 때 어떻게 PID(Process Id) 값을 구하느냐입니다. 이번에는 공격을 행할 때 프로세스명으로는 동일한 이름을 갖는 프로세스를 구분할 수 없기 때문에 각 프로세스마다 주어진 PID의 값이 필요하다. 그러나, 편의상, 프로세스의 이름을 인제에게 인도하면, PID가 스스로 요구해 공격 인제에게 인도되는 함수를 만들고 싶다.이번에는 이미 모든 프로세스 리스트를 조회하는 것보다 단 한 프로세스의 ID만 얻으면 되기 때문에 WMI의 Execquery() 메서드를 이용해 쿼리에서 구하고 싶은 프로세스 이름을 제시하고 PID 값을 구하자.


    실행하여 구한 python.exe의 PID 값은 다음과 같다.


    >


    잠깐 쉬는 의미에서 여기까지 이야기를 정리해 보자. 먼저 WMI를 이용해 Windows 프로그램을 파이슨으로 상호 작용시키면서, 어느 정도 프로세스를 핸들링 하는 방법을 몸에 익혔을 터였다.실제로 프로세스 리스트를 출력하는 것은 툴을 사용하는 사람이 사용하기 쉽도록 하는 옵션으로, 실질적으로 Code Injection을 위해 실현된 것은 프로세스명을 제시하면 PID 값을 요구할 수밖에 없었다.(셰일코드까지 설명하면 너희가 장황해지니 셰일코드는 직접 검색해서 생각을 익히자.) PID 구하는 법을 익히면 4가지만 더 외우면 된다.하나. Open Process - 프로세스에 대한 핸들 획득 2. Virtual Alloc Ex - 목표 프로세스에 셰일 코드를 삽입하기 위해 메모리 할당 3. Write Process Memory - 목표 프로세스 내에 할당된 메모리에 셰일 코드 쓰기 4. Create Remote Thread - 스레드 발발, 목표 프로세스 내에 주입한 셰일 코드 실행처에 하나의 항목을 얻기 위해 필요한 코드는 모두 sound와 같다.


    이 코드는 OpenProcess를 호출하여 프로세스 중 지정한 pid의 프로세스 핸들을 반환합니다. 이때 0X1F0FFF는 가능한 모든 프로세스의 권한을 반환하라는 옵션이었다. 이 강의는 2와 3의 항목에 대한 코드였다.


    memory_allocation_variable 변수를 선언하고 프로세스에서 메모리를 할당하는 Virual Alloc Ex 함수를 호출해 값을 전달한다. 필요한 옵션은 Open Process에서 구한 핸들의 값(메모리), 셰일 코드의 길이, memcommit (0x00001000) 즉, 메모리 할당 타입, 메모리 범위에 대한 rwx_value (0x40) 읽기, 쓰기, 실행에 대한 옵션이었다. 그러면 Virtual AllocEx 함수에 의해 반환된 메모리 기본 주소를 넣게 된다.


    >


    다음 코드는 Write Process Memory를 호출하여 메모리에 셰일 코드를 쓰는 코드였다. 필요한 옵션은 Open Process에서 구한 핸들 값(메모리), 메모리 기본 주소, 셰일 코드와 셰일 코드의 길이이며 마지막 0(none)은 옵션 출력을 무시하도록 한다.마지막 4개 항목에 대한 코드였다.


    이 코드에서 Create Remote Thread를 호출하여 목표 프로세스 내에서 쓰레드를 생성합니다. 필요한 옵션은 프로세스 핸들, None(기본 설정), 0(스택 사이즈를 실행파 하나의 기본 크기로 설정), 할당된 메모리 기본 주소, none, 0(즉시 스레드 실행), none이었다*이해를 돕기 위한 설명 → OS 에서 실행되고 있는 프로그램을 프로세스로 합니다. 복수의 프로그램이 실행되고 있다고 하는 것은, 복수의 프로세스가 동시 작업중이라고 스토리할 수 있다. (멀티 프로세스) 하자 자체의 프로세스는 복수의 스레드로 되어 있다. 복수의 스레드가 모여, 하자신의 프로세스를 구성하게 된다. (멀티 스레드) 요기에서의 공격을 위해 목표 프로세스의 핸들을 얻고, 셰일 코드 크기에 메모리의 크기를 할당하고, 스레드가 생겨 셰일 코드를 실행시켰다는 견해로 좋다.


    >


    본격적으로 공격 코드를 살펴보자. 이미 0x02에서 중요한 코드에 대해 설명했기 때문에 별다른 주석을 달지 않았다.


    이제 공격을 시도해 보자. OS: Win하나0Tool: Python2.7(Codeinjection).py), ProcExpTaget: KakaoTalk.exePC용 KakaoTalk.exe에 메모장(notepad.exe)을 실행시키는 공격 수행.


    >


    실행된 메모장


    >


    여기에서 재미 있는 것은 당연히 목표 프로세스의 자식 프로세스 형태로 실행하려는 프로세스가 실행된다. 그래서 목표 프로세스에 코드와 데이터를 주입하기 때문에 전부 크기도 조금 늘어난다.ProcExp에서 프로세스를 확인해 보자.


    >


    참고:https://www.andreafortuna.org/programming/pycodeinjector-a-simple-python-code-injection-library/http://ezbeat.tistory.com/253https://www.blog.pythonlibrary.org/20://꽃0/꽃0/03/how-to-find-and-list-all-running-processes-with-python/http://blog.pages.kr/tag/%EC%9A%B4%EC%98%8하나%EC%B2%B4%A0%9C?page=하나58htps://www.christophertruncer.com/injecting-shellcode-into-a-remote-process-with-python/



    댓글

Designed by Tistory.