时间从来不语,却回答了很多问题


某相安全平台加密,除Main类外,其他class文件均被加密,熵值非常高

1696662684475-29457599-b862-4054-a8fd-1b906f7dfba1.png

除jar外,还有一个.so文件。在启动时,需要指定-agentpath:./.so命令行参数。由于未确定其加固方案(比如xjar),于是手动逆向其流程。

基本启动流程

jvm在指定-agentpath:./.so后,会先加载此so文件,然后运行此入口函数:

1
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm,char *options,void *reserved)

参考:Java Agent机制 · 攻击Java Web应用-[Java Web安全]
容易推测,jvm会先通过此入口函数进行初始化,包括实现一个Loader,其在运行时会对Class文件进行解密。

so脱壳

拖入IDAPro对so文件进行分析,从导出表进入查看其代码,发现被加密,其他函数也是加密状态:

1696601688515-70f3972f-4de1-4261-85a4-a2a9ac06b428.png

阅读全文


从凌晨23:50开始研究这个问题,现在4:00成功

问题起因

朋友玩服务器,发现从6.8日9:00开始1.16.5客户端无法进入多人模式
1.png
搜索发现好像是当天8号才出现这个问题
2.png

摸索

对mc不太熟,觉得是微软搞了什么动作,抓包啥的,没抓到。
在语言资源里找到这串字符串
3.png
简单说就是玩的离dao线ban模式,没权限给你多人模式。那为啥以前离线模式可以玩呢?不懂,研究一下Minecraft源代码

Minecraft逆向

一开始我是直接jadx打开主程序,发现没什么东西。通过上面字符串引用的签名,直接搜索,发现有个引用的地方调用了账号验证方法,然后抛出异常:
1686255043040-1e022800-970b-4e60-802c-1c845d237abd.png
找到jar包:
1686255114746-1a97ed41-ef6c-41f6-bc7c-0e3f4c8ea68f.png
1686255163452-d3b50b0f-e88e-4f60-8e91-c8e7d3ecf159.png
发现有个传统验证方法,但是应该已经弃用了:
1686255203621-b27b5fb8-3c7f-4d1e-a76f-77fb146ed616.png

源码分析

一开始找到了一个项目:yushijinhun/authlib-injector: Build your own Minecraft authentication system.
1686255268868-16690a54-dcae-4285-9bcb-52c5349769c9.png
但是我试了,不行,可能是版本啥的问题。
于是尝试去找反混淆的项目,比如MCP啥的,看MC的源码。
这里用了forge的开发环境,反混淆映射表是mapped_official频道的,可以看authlib包的源代码:
1686255368808-2d604869-1a04-475c-9885-d06f40e36fed.png
找来找去找到了mc主类和主界面类:
1686255511080-3c645232-0cda-4252-83ce-2f31cd2ad2e7.png
感觉不远了,继续找:
1686255539685-56d2e6f3-9fd5-4fea-809c-690f8767cd39.png
检查是否多人模式。跟进去,调用了authlib。
socialInteractionsService是一个接口,通过工厂方法创建一个com.mojang.authlib.yggdrasil.YggdrasilSocialInteractionsService实例。发现这里就是判断是否允许多人登录的地方:
1686255781758-e42fc21f-95f2-4cb8-a334-a31443097f45.png

修改方法逻辑

阅读全文


post @ 2023-05-15

AWD(Attack With Defense,攻防兼备)是一个非常有意思的模式,你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。
这种模式非常激烈,赛前准备要非常充分,手上要有充足的防守方案和 EXP 攻击脚本,而且参赛越多,积累的经验就越多,获胜的希望就越大。

常见形式

常见的形式是这样:
每个队伍拥有四台服务器。其中三台服务器运行了一个Web服务,即网站服务。剩余一台(通常被称为Pwn服务器)运行一个网络服务,通常是一个在后台运行的二进制程序,通过TCP的某个端口对外提供服务。并且,每个队伍拥有的四台服务器都是一样的。
在三台Web服务器中,比赛主办方会在每个主机上预置一个或多个后门/漏洞。同样的,在剩下的一台服务器上的二进制程序里也会被预置二进制漏洞(跟Pwn题一样)。

比赛方法

在开始比赛前,通常会有一段时间(一般是30分钟)的加固时间。选手们要在这段时间内备份网站、安装防火墙、加固服务器,以防后续比赛时间被对手打穿。另外,队伍需要分工明确,在其他队友加固服务器的同时,另外的队友应该将备份的服务器文件下载,然后对其进行代码审计和漏洞挖掘(Web手)、逆向与二进制漏洞分析(Pwn手)。在发现漏洞后,及时对自身网站进行漏洞修补与加固。
比赛开始后分为两种情况,一种是主办方给出所有队伍服务器的IP地址,另一种情况是给一个网段,对手的服务器IP需要通过扫描等方法进行发现。
比赛将分为很多轮(一般可能是10分钟)。每轮开始,在每台服务器的某个地方(一般是根目录)会放置一个flag文件(每个队伍每台主机都不一样)。选手们需要通过挖掘到的漏洞编写漏洞利用代码(Exp),然后对其他队伍的服务器进行攻击并最终获取shell执行权限(getshell)或者通过文件读漏洞来读取对手服务器根目录下的flag文件,并向比赛平台提交flag。当攻击方成功攻击对手服务器并提交flag后,攻击方将获得一定的分数,同时防守方将丢失一定的分数(一般来讲,同一台机器被攻击会被扣除固定分数,而所有对这台服务器攻击成功的队伍将平分这些分数)。
在攻击的同时,也要注意自身服务器的防护。当自己的服务器被对手攻击提交flag后,队伍将被扣分。并且要防止服务器不要被破坏,因为每轮(一般是结束时)比赛时比赛平台会对所有队伍的服务器进行check,即检查服务是否正常运转。若出现服务被对手或自己破坏以至于无法提供正常服务的情况,平台将对其队伍进行扣分,同时其他队伍获得相应的加分。
每轮结束后将开始新一轮,此时所有flag文件将刷新,以开始新一轮的攻击和得分。若队伍发现自己服务器服务被破坏,此时可以刷新服务器回到初始状态。否则在比赛途中手动进行刷新服务器操作将导致扣分。
一般的比赛平台为了让比赛保持激烈的状态,会开放自动提交flag的API。即可以通过脚本更加方便地向比赛平台提交flag。

通用技巧

Web漏洞扫描可以使用例如D盾这样的工具,可以快速发现明显的Web后门。代码审计可以用Seay或者Fortify这样的工具。
一般AWD比赛禁止联网,所以队友间文件共享和通信可以使用FeiQ这样的内网通讯工具来进行。
当网站文件被修改,例如被植入木马的情况下,我们可以使用DiffMerge、Beyond Compare这样的工具来对比源文件进行检查。

防护技巧

防护是最重要的一环。一般来讲只要你保护到位了,不让别人打进来你就赢了一半。因为你不会扣分,还有机会平分其他倒霉蛋丢的分。
首先一定要更改服务器初始ssh密码(数据库密码也是一样的)。有些比赛会将所有服务器的ssh服务设置相同的密码,如果你不第一时间改密码别人可以直接登录获得flag并留下后门。同样的,在比赛开始时第一时间也可以去测试别人的服务器是否更改密码以通过最简单的方式得分。
然后就是对数据库、网站文件进行完全的备份。如果出现服务器被其他队伍破坏或其他情况,可以自己去通过备份的文件进行恢复、修复。不然的话只能被打穿等下一轮或者手动刷新服务器,这样将丢失大量分数。
然后就是安装防火墙。就是WAF,可以对不明请求进行拦截和记录,这样你就可以对恶意攻击请求进行拦截。并且通过监控请求日志来推测攻击方的攻击方法,从而发现前面没有发现的漏洞,并快速进行exp编写和攻击。
部署文件监控脚本。这样可以通过文件创建时间来监控后来生成的文件,并进行删除,防止挂马。
一般上面的都部署好了可以抵挡大部分攻击了。

攻击技巧

阅读全文


项目地址:https://github.com/e-m-b-a/emba
本次分析对象的最后一次提交:https://github.com/e-m-b-a/emba/commit/de9dc53980962c8a62ea1239c9039e87962b32e5
克隆项目

1
git clone https://github.com/e-m-b-a/emba.git

介绍

EMBA 被设计为渗透测试人员的中央固件分析工具。它支持完整的安全分析过程,从固件提取过程开始,通过仿真进行静态分析和动态分析,最后生成 Web 报告。EMBA 自动发现固件中可能存在的弱点和漏洞。例如不安全的二进制文件、旧的和过时的软件组件、可能易受攻击的脚本或硬编码密码。EMBA是一个命令行工具,可以选择生成易于使用的 Web 报告以供进一步分析。

EMBA 结合了多种成熟的分析工具,可以通过一个简单的命令启动。之后,它会测试固件是否存在可能的安全风险和感兴趣的区域以进行进一步调查。无需手动安装所有帮助程序,执行集成安装脚本后,您就可以测试固件了。
EMBA 旨在协助渗透测试人员,而不是作为一个没有人工交互的独立工具。EMBA 应该提供尽可能多的关于固件的信息,测试人员可以决定重点领域,并负责验证和解释结果。

官方视频:
https://youtu.be/_dvdy3klFFY

项目采用纯Shell编写,非常适合这种需要结合许多外部工具并执行大量命令的工具。

项目统计:
Summary
Date : 2023-04-19 10:38:56
Total : 225 files, 28187 codes, 3873 comments, 4716 blanks, all 36776 lines
Languages

language files code comment blank total
Shell Script 173 24,559 3,657 4,361 32,577
Properties 22 1,269 70 20 1,359
XML 2 1,034 1 3 1,038
YAML 17 555 92 86 733
CSS 1 343 14 77 434
Markdown 8 309 14 146 469
HTML 1 106 22 15 143
Docker 1 12 3 8 23

Directories

阅读全文


post @ 2023-03-31

官网angr(不够详细,想要用来做一些事情还是要看angr的代码,至少得看python实现的接口)

开始

Project

angr从加载二进制文件到Project中开始。从此以后的object基本上都围绕它展开。

1
proj = angr.Project('/binary_file')

项目基本属性:

1
2
3
proj.arch
proj.entry
proj.filename

arch

是一个archinfo.Arch对象的实例。它包含大量关于它所运行的CPU的文书数据。

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
69
70
__all__ = [
"RegisterOffset",
"TmpVar",
"RegisterName",
"Endness",
"Register",
"Arch",
"register_arch",
"ArchNotFound",
"arch_from_id",
"reverse_ends",
"get_host_arch",
"all_arches",
"defines",
"ArchAMD64",
"ArchX86",
"ArchARM",
"ArchARMEL",
"ArchARMHF",
"ArchARMCortexM",
"ArchAArch64",
"ArchAVR8",
"ArchPPC32",
"ArchPPC64",
"ArchMIPS32",
"ArchMIPS64",
"ArchSoot",
"ArchError",
"ArchS390X",
"ArchPcode",
]

# ...\site-packages\archinfo\arch_arm.py
bits = 32
vex_arch = "VexArchARM"
name = "ARMEL"
qemu_name = "arm"
ida_processor = "armb"
linux_name = "arm"
triplet = "arm-linux-gnueabihf"
max_inst_bytes = 4
ret_offset = 8
fp_ret_offset = 8
vex_conditional_helpers = True
syscall_num_offset = 36
call_pushes_ret = False
stack_change = -4
# 查看大小端
memory_endness = Endness.LE
register_endness = Endness.LE
sizeof = {"short": 16, "int": 32, "long": 32, "long long": 64}

'''
AMD64
X86
ARM
ARMEL
ARMHF
ARMCortexM
AArch64
AVR8
PPC32
PPC64
MIPS32
MIPS64
Soot
Error
S390X
Pcode
'''
阅读全文


post @ 2023-03-13

一般是在Unix-Like系统上安装pyenv,windows好像用的比较少

为什么放弃pyenv

这本质上是一个python管理软件,如果你想使用类似虚拟空间的东西,不建议使用这个,依然会造成混乱。

另外在windows上pyenv好像会让第三方调用python的工具出现权限问题,例如idapython。暂不确定是否有关。

删除pyenv

把安装过程反过来就行了。删除~/.pyenv路径,删除环境变量,就ok了

阅读全文


本章回顾人们对UNIX标准化做出的努力与影响,并说明标准化工作中对每种实现必须定义的各种限制。

UNIX标准化

ISO C

ANSI即American National Standards Institute,美国国家标准学会,它是International Organization for Standardization即国际标准化组织ISO中代表美国的成员。IEC是国际电子技术委员会International Electrotechnical Commission的缩写。
ISO C标准:由ISO/IEC中的专门工作组维护和开发,该工作组简称WG14。此标准是为了C的可移植性。它定义了C的语法和语义和标准库。如今所有UNIX系统都提供C标准中定义的库函数,所以此标准库非常重要。
restrict关键字:告诉编译器那些指针引用可以优化,添加自ISO/IEC 9899:1999。
1676471478997-ba38269e-4fb0-43a1-85bb-98b9d0853424.png

IEEE POSIX

POSIX(Portable Operating System Interface,可以指操作系统接口)标准族最初由IEEE(Institute of Electrical and Electronics Engineers,电气和电子工程师学会)制订。现在由Austin Group开放工作组维护。
POSIX 1003.1操作系统接口标准,它定义了符合此标准的操作系统必须提供的各种服务。
同时所有标准中的例程都被称为函数而不会区别系统调用和库函数。
POSIX.1:指的是IEEE正式出版的1003.1标准。后面又发了很多1003.1的更新。

Single UNIX Specification

即SUS,单一UNIX规范,是POSIX.1的超集。
1676472242321-45b1ed31-e8d9-40b7-be86-c2b93ec5075a.png

UNIX系统实现

SVR4

阅读全文


本章对一些术语进行简要说明并给出实例。

文件和目录

stat和fstat函数返回包含所有文件属性的一个信息结构。第四章将详细说明文件的各种属性。
目录项的逻辑视图与实际上的磁盘存放方式是不同的。UNIX文件系统大多数实现并不在目录项中存放属性,这是权衡于硬连接带来的一些问题。第四章将讨论。

文件名

只有斜线和空字符不能出现在文件名中。斜线用来分割路径名,空字符终止一个路径名。
opendir函数与readdir函数,包含于dirent.h中,并且包含对dirent结构的定义。
opendir函数返回只想DIR结构的指针。将指针传送给readdir函数,使用循环读取每个目录项,返回指向dirent结构的指针,如果没有了则返回null指针。此目录项顺序非首字母排序。

工作目录

working directory,或current working directory。进程可以使用chdir函数更改工作目录。
登陆时cwd设置为起始目录home directory。该目录从口令文件(通常是/etc/passwd)中相应用户的登录项中取得。

输入输出

文件描述符

file descriptor,通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,都将返回一个文件描述符。读写文件时可以使用这个文件描述符。

阅读全文


post @ 2023-01-09

一套极简的GIT工作流,帮助开发者在项目中快速开始

快速开始

GIT有三部分:

  1. 远端的仓库,可以是github,也可以是自建git服务器,称作remote
  2. 本地的git仓库,称作local
  3. 最后是本地的仓库文件,被称作disk

假设云端有一个git仓库,有一个主分支main,我们可以使用命令:

1
git clone repository-url

将它克隆到本地。此时remotelocaldisk是一样的。

img

main分支一般存储了项目最终的版本,而其他分支可以是正在开发中的有新功能的版本。

创建分支

阅读全文


修改补充自22年4月7日的文章

在实战中,越是小的公司企业越难以渗透成功,为什么呢?因为,公司的业务少,只有那么几个暴露在外网的服务,服务越少越容易管理,越不容易出现漏洞,所以攻击面越大我们的成功率就越大,但是如何扩大攻击面呢?

1.收集尽量全的企业域名(包括各种子域名以及子公司的域名,越全越好)

2.收集尽量全的企业申请的公网 IP

3.对所有收集到的域名以及 IP 地址进行端口扫描(由于时间可能比较久,所以可以选择利用 zoomeye、shodan、censys 等平台)

4.针对不同的服务进行对应的渗透测试(尤其是可能存在漏洞的中间件)

经过这几个步骤,你会收集到很多的资料,你的成功率跟你收集的资料的质量息息相关。这几个步骤看起来并不复杂,但是其中涉及的安全知识方方面面非常多,如何收集的够全,如何测试的更准确都是我们需要关注的。

企业信息收集

  • 企查查
  • 爱企查
  • 天眼查
  • whois查询
  • 获取公司和子公司信息
  • 微信、微博、邮箱、生活号

例如查询百度的资产,通过爱企查高级查询:

阅读全文
⬆︎TOP