Stitch_Codes源码阅读和分析

第二篇依然从简单入手,Stitch C2框架(小pupy) 主要使用python2实现,支持Win、Linux、Mac三种平台

0x01 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
│  main.py # 启动Stitch C2服务器

├─Application(该文件夹内文件,按下方排序由上至下存在依赖关系,数字为阅读顺序)
│ │ stitch_utils.py # aes加解密、路径处理、进度条显示、字体颜色、平台判别、命令执行等 1
│ │ stitch_pyld_config.py # 配置读取、设置、保存 2
│ │ stitch_help.py # 帮助信息 3
│ │ stitch_lib.py # 命令处理(主要包含在一个class stitch_commands_library中)4
│ │ stitch_gen.py # payload生成 5 (配合payload_codes.py)
│ │ stitch_lnxshell.py # 三个模块:执行、补全、帮助 6
│ │ stitch_osxshell.py # 四个模块:执行、osx特有、补全、帮助 6
│ │ stitch_winshell.py # 四个模块:执行、win特有、补全、帮助 6
│ │ stitch_cmd.py # 三个模块:执行、补全、帮助(引入所有库)7
│ │
│ └─Stitch_Vars
│ globals.py # 随机密钥生成,枚举值、路径、日志初始化
│ makeself.py # 调用makeself库
│ nsis.py # 脚本安装系统
│ payload_code.py # 很多写好的函数字符串,后期调用组装成payload
│ payload_setup.py # payload list设置icon、name、description

├─Cleaner
│ st_cleaner.py # 清除计划任务和防火墙规则

├─Configuration
│ │ pyxhook.py # 键盘记录
│ │ vidcap.pyd
│ │
│ ├─creddump # 凭据dump库
│ │ addrspace.py
│ │ COPYING
│ │ hashdump.py
│ │ newobj.py
│ │ obj.py
│ │ rawreg.py
│ │ types.py
│ │
│ └─mss # 跨平台python截屏库
│ │ base.py
│ │ darwin.py
│ │ exception.py
│ │ factory.py
│ │ LICENSE
│ │ linux.py
│ │ windows.py
│ │
│ └─linux
│ │ build.sh
│ │ mss.c
│ ├─32
│ │ libmss.so
│ └─64
│ libmss.so

├─Elevation
│ elevate.py # 提权脚本(并不是真正提权,仅仅是将文件夹内下载器加入防火墙白名单,访问时间设定同系统程序一样)
│ elevatepy2exe.py # 提权脚本转成exe
├─Icons # 图标
├─PyLib # python库,作者实现的各种基础操作(如:关闭杀软、文件下载、注册表操作等)
└─Tools
│ osx_dev_setup.sh
│ passwords.txt # 字典
├─ImageSnap-v0.2.5 # 基于命令行的抓屏工具
└─makeself # 打包工具

0x02 主要的class

linux shell

win shell

osx shell

上述的三个类功能基本相同,都是按照以下三个部分来进行编码

  1. do section
    • 调用st_lib中实际功能,如:命令执行、文件传输、关闭杀软等
    • win、osx由于平台原因,存在一些特有函数,比如查询驱动、开启关闭RDP、亮屏息屏等
  2. complete section
    • 命令行 补全模块
  3. help section
    • 函数帮助模块,查看函数的具体作用

0x03 主要函数模块及关系

stitch_framework

  • stitch主模块是cmd,可以通过config模块读取和设置配置,根据不同的平台判断使用其平台的shell模块。
  • shell模块依托于lib和help,lib提供功能函数支持(包括第三方库调用),help提供帮助支持,此二者又会使用到util工具函数,进行aes加解密、路径处理、进度条显示、字体颜色、平台判别、命令执行等处理。(util无处不在)
  • payload_genearate模块,负责生成payload,主要通过写好的函数字符串拼接,形成python函数文本后,继续打包来完成任务

0x04 功能设计要点

下面是作者编写的PyLib,主要就是一个功能函数的集合,对stitch lib提供支持。其中主要的做法有两种,一种是使用系统shell或者python原生的ctypes、os、sys、subprocess、_winreg等库完成系统调用实现功能,另一种是使用powershell进行命令处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
askpass.py
avkiller.py # taskkill反病毒软件,鸡肋
avscan_posix.py # 通过进程名称检测反病毒软件
avscan_win.py # 从注册表中找到对应的反病毒软件
cat.py
cd.py # 切换当前目录
chromedump.py
clearev.py # 使用wevtutil清除系统日志
crackpassword.py # 密码爆破
depscan.py # wmic OS get DataExecutionPrevention_SupportPolicy

displayoff.py # 息屏
displayon.py # 亮屏
download.py
drive_finder.py

#
修改文件访问、创建、修改时间
editAccessed.py
editCreation.py
editModified.py

disableRDP.py
disableUAC.py
disableWinDef.py
enableRDP.py
enableUAC.py
enableWinDef.py

environment.py # 获取环境变量,os.environ
fileinfo.py # 获取文件夹大小,a、c、m三个时间

fwallow.py # 防火墙添加规则,允许程序通过防火墙
fwscan.py # 查看advfirewall状态
fwstatus.py # 显示防火墙状态

get_path.py
hashdump.py

#
使用attrib修改文件属性,隐藏、显示文件
hide.py
unhide.py

hostsremove.py # 删除指定host
hostsupdate.py # 添加host

#
KeyLogger控制 (主要操作在keylogger类中)
kl_dump.py
kl_start.py
kl_status.py
kl_stop.py
freeze_start.py
freeze_status.py
freeze_stop.py

location.py # 获取当前地理位置
lockscreen.py # 锁屏 ctypes.windll.user32.LockWorkStation
popup.py #
scanReg.py
screenshot.py
ssh.py
sudo_cmd.py
sysinfo.py # 获取当前时间、操作系统、架构、用户、权限、IP、网络名
uascan.py
upload.py
vmscan.py
webcamList.py
webcamSnap.py
wifikeys.py # 查看wifi明文密码

0x05 关键语法及技术

  • tab补全功能
  • ase加解密
  • 各种库的使用:键鼠hook
  • 屏幕抓取
  • 使用struct库接收结构体,方式是先接收一个int类型的数据长度,之后按照长度来接受数据

0x06 总结

  • 总体来说stitch这工具很全,而且做到了跨平台,架构是类似于msf的组件模式加上server+client。各种小细节都封装成了对应的模块,所以看起来分工明确,模块之间的交互也多,缺点就是略糙。作者在发现pupy的存在后就不做开发了,更别说持续打磨,但是红队工具的开发就是需要速度,想像cs那样一个专业红队来开发维护还是少数,一个人的力量依旧有限。
  1. 两种方式进行传输数据长度处理,一种是对于文件和命令的接收均有各自的结束符,另一种是先接受长度然后按照长度接收对应大小的数据
  2. 不同功能组件写成单个py文件方便后期扩展,同时也有利于打包,用户可以挑选想要的功能生成exe后发送到client
  3. 第三方库的大量使用提高开发效率

0x07 参考资料

[1] awesome rat

[2] MITRE ATT&CK