Skip to content

Commit b456e95

Browse files
committed
init
1 parent 88e7faa commit b456e95

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2633
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.idea
2+
node_modules

Dockerfile

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# 使用官方 Node.js 镜像作为基础镜像
2+
# 可以根据需要选择版本,例如 node:16、node:18 等
3+
FROM node:18-alpine
4+
5+
# 设置工作目录
6+
WORKDIR /app
7+
8+
# 复制 package.json 和 package-lock.json 到工作目录
9+
COPY * ./
10+
11+
# 安装项目依赖
12+
RUN npm install
13+
14+
# 复制项目文件到工作目录
15+
COPY . .
16+
17+
# 暴露端口(假设你的应用运行在 3000 端口)
18+
EXPOSE 10086
19+
20+
# 启动应用
21+
CMD ["node", "server.js"]
1.03 MB
Loading

README.md

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Script Hook Goat
2+
3+
# 一、这是什么
4+
5+
[https://github.com/JSREI/js-script-hook](https://github.com/JSREI/js-script-hook)配备的靶场列表,用于对script类型的加密请求进行逆向练习。
6+
7+
# 二、如何启动
8+
9+
# 2.1 从Docker启动
10+
11+
TODO
12+
13+
# 2.2 从源码启动
14+
15+
克隆仓库到本地:
16+
17+
```bash
18+
git clone [email protected]:JSREI/js-script-hook-goat.git
19+
```
20+
21+
安装依赖:
22+
23+
```bash
24+
node install
25+
```
26+
27+
启动:
28+
29+
```bash
30+
node server.js
31+
```
32+
33+
访问`http://localhost:10086/`,能够正常打开说明启动成功。
34+
35+
# 三、靶场列表
36+
37+
访问[http://localhost:10086/](http://localhost:10086/)即可看到靶场列表:
38+
39+
- [Script Hook辅助逆向jsonp参数加密](docs/jsonp-request-encrypt/README.md)
40+
- [Script Hook辅助逆向jsonp响应加密](docs/jsonp-response-encrypt/README.md)
41+
- [Script Hook辅助逆向jsonp请求参数/响应字段加密](docs/jsonp-request-encrypt-and-response-encrypt/README.md)
42+
43+
![image-20250113023934761](./README.assets/image-20250113023934761.png)
44+
45+
46+
# 四、Contributors
47+
48+
欢迎提交pr,提了就merge,点击就送!
49+
50+
<img src="https://contrib.nn.ci/api?repo=JSREI/js-script-hook-goat" />
51+
52+
# 五、Star History
53+
54+
<img src="https://starchart.cc/JSREI/js-script-hook-goat.svg" />
55+
56+
# 六、逆向技术交流群
57+
58+
扫码加入逆向技术交流群:
59+
60+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20241016230653669.png" style="width: 200px">
61+
62+
如群二维码过期,可以加我个人微信,发送【逆向群】拉你进群:
63+
64+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20231030132026541-7614065.png" style="width: 200px">
65+
66+
[点此](https://t.me/jsreijsrei)或扫码加入TG交流群:
67+
68+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20241016231143315.png" style="width: 200px">
69+
70+
71+
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# Script Hook辅助逆向jsonp请求参数/响应字段加密
2+
3+
# 一、逆向目标
4+
5+
在这个网页上单击“发送请求”按钮,会向后端发送一个请求,这个请求携带加密数据,同时后端的响应也是加密的,而我们的目标就是分析清楚请求参数的加密逻辑和响应内容的解密逻辑。
6+
7+
![image-20250113001419834](./README.assets/image-20250113001419834.png)
8+
9+
请求参数是加密的:
10+
11+
![image-20250113001835772](./README.assets/image-20250113001835772.png)
12+
13+
响应也是加密的:
14+
15+
![image-20250113001901227](./README.assets/image-20250113001901227.png)
16+
17+
# 二、下载 & 启动靶场
18+
19+
克隆仓库到本地:
20+
21+
```bash
22+
git clone [email protected]:JSREI/js-script-hook.git
23+
```
24+
25+
进入靶场目录:
26+
27+
```bash
28+
cd js-script-hook/goat/jsonp-request-encrypt-and-response-encrypt
29+
```
30+
31+
启动Server:
32+
33+
```bash
34+
node server.js
35+
```
36+
37+
打开客户端页面:
38+
39+
```
40+
client.html
41+
```
42+
43+
然后要破解的内容就在这个页面上。
44+
45+
# 三、安装脚本
46+
47+
安装请参考项目主页的安装教程,此处不再赘述:
48+
49+
```
50+
https://github.com/JSREI/js-script-hook?tab=readme-ov-file#%E4%BA%8C%E5%AE%89%E8%A3%85
51+
```
52+
53+
# 四、分析
54+
55+
因为是请求和响应都加密的,所以我们确保请求断点和响应断点都是开启的:
56+
57+
![image-20250113025310015](./README.assets/image-20250113025310015.png)
58+
59+
然后我们再触发一次请求,自动进入了请求断点:
60+
61+
![image-20250113025342592](./README.assets/image-20250113025342592.png)
62+
63+
我们根据调用栈往前追,找到了往服务器发送加密数据的地方:
64+
65+
![image-20250113025429451](./README.assets/image-20250113025429451.png)
66+
67+
然后发现encryptedData这个变量是调用了一个encryptData函数,把明文的内容传进来,返回的就是加密后的数据:
68+
69+
![image-20250113025539397](./README.assets/image-20250113025539397.png)
70+
71+
把鼠标放到encryptData上悬浮一会儿,会展示函数的相关信息,跟进去函数的代码位置:
72+
73+
![image-20250113025639543](./README.assets/image-20250113025639543.png)
74+
75+
然后就定位到了请求参数的加密位置:
76+
77+
![image-20250113025725320](./README.assets/image-20250113025725320.png)
78+
79+
可以看到请求参数是使用RC4加密:
80+
81+
```js
82+
// 加密函数(使用 RC4)
83+
function encryptData(data) {
84+
return CryptoJS.RC4.encrypt(JSON.stringify(data), SECRET_KEY).toString();
85+
}
86+
```
87+
88+
搞清楚请求参数了之后,接下来就是看服务器返回的加密数据是如何被解密的,然后我们放过断点,发现又自动命中了一个断点:
89+
90+
![image-20250113025836211](./README.assets/image-20250113025836211.png)
91+
92+
看到服务器返回的encryptedResponse被传入到了decryptData参数进行解密:
93+
94+
![image-20250113025946013](./README.assets/image-20250113025946013.png)
95+
96+
让我们跟着断点进去到这个函数的实现,发现就是一个Rabbit类型的加密:
97+
98+
![image-20250113030036513](./README.assets/image-20250113030036513.png)
99+
100+
代码如下:
101+
102+
```js
103+
// 解密函数(使用 Rabbit)
104+
function decryptData(encryptedData) {
105+
try {
106+
const bytes = CryptoJS.Rabbit.decrypt(encryptedData, SECRET_KEY);
107+
const decryptedText = bytes.toString(CryptoJS.enc.Utf8);
108+
109+
if (!decryptedText) {
110+
throw new Error('解密失败:无效的密钥或数据');
111+
}
112+
113+
return decryptedText;
114+
} catch (error) {
115+
console.error('解密失败:', error.message);
116+
return null;
117+
}
118+
}
119+
```
120+
121+
至此,我们把请求参数加密的逻辑和响应内容解密的逻辑都分析清楚了。
122+
123+
# 五、逆向技术交流群
124+
125+
扫码加入逆向技术交流群:
126+
127+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20241016230653669.png" style="width: 200px">
128+
129+
如群二维码过期,可以加我个人微信,发送【逆向群】拉你进群:
130+
131+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20231030132026541-7614065.png" style="width: 200px">
132+
133+
[点此](https://t.me/jsreijsrei)或扫码加入TG交流群:
134+
135+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20241016231143315.png" style="width: 200px">
136+
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

docs/jsonp-request-encrypt/README.md

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# Script Hook辅助逆向jsonp参数加密
2+
3+
# 一、逆向目标
4+
5+
这个页面上点击"发送JSONP请求"按钮的时候,会向后端发送一个jsop的请求上报数据:
6+
7+
![image-20250112002041376](README.assets/image-20250112002041376.png)
8+
9+
但是上报的数据参数是加密的:
10+
11+
![image-20250112003254255](README.assets/image-20250112003254255.png)
12+
13+
我们的目标就是搞清楚这个data的加密逻辑。
14+
15+
# 二、下载 & 启动靶场
16+
17+
18+
克隆仓库到本地:
19+
20+
```bash
21+
git clone [email protected]:JSREI/js-script-hook-goat.git
22+
```
23+
24+
安装依赖:
25+
26+
```bash
27+
node install
28+
```
29+
30+
启动:
31+
32+
```bash
33+
node server.js
34+
```
35+
36+
访问`http://localhost:10086/`,能够正常打开说明启动成功。
37+
38+
39+
# 三、安装脚本
40+
41+
安装请参考项目主页的安装教程,此处不再赘述:
42+
43+
```
44+
https://github.com/JSREI/js-script-hook?tab=readme-ov-file#%E4%BA%8C%E5%AE%89%E8%A3%85
45+
```
46+
47+
# 四、分析
48+
49+
先配置一下脚本:
50+
51+
![image-20250112020656925](README.assets/image-20250112020656925.png)
52+
53+
增加一个匹配所有URL的断点:
54+
55+
![image-20250112020725546](README.assets/image-20250112020725546.png)
56+
57+
然后回到页面上点击“发送JSONP请求”按钮,发现进入了断点,从右侧的调用栈往前追溯:
58+
59+
![image-20250112022346028](README.assets/image-20250112022346028.png)
60+
61+
发现这里是发起请求的地方,加密参数是外面传进来的参数:
62+
63+
![image-20250112021518863](README.assets/image-20250112021518863.png)
64+
65+
然后继续往前追溯调用栈,看到了传递参数的地方:
66+
67+
![image-20250112021345091](README.assets/image-20250112021345091.png)
68+
69+
然后这个`_0x1a2bData`是前面调用一个方法`_0x1a2b`生成的:
70+
71+
![image-20250112021632098](README.assets/image-20250112021632098.png)
72+
73+
看起来`_0x1a2b(data, _0x3c9d)`像是在调用一个加密函数,我们先看一下传递的参数,传递了两个参数,第一个参数就是页面上要往后端上报的数据:
74+
75+
![image-20250112021729990](README.assets/image-20250112021729990.png)
76+
77+
第二个参数是一个神秘的字符串,看起来像是一个秘钥,这个是在页面上写死的值:
78+
79+
![image-20250112021832766](README.assets/image-20250112021832766.png)
80+
81+
搞明白了两个参数是怎么来的之后,我们继续跟进去`_0x1a2b(_0x2a3f, _0x3c9d);`看看加密逻辑是什么,鼠标移动到`_0x1a2b`上等一会儿,会展示对应的函数的信息,跟进去函数地址:
82+
83+
![image-20250112021957446](README.assets/image-20250112021957446.png)
84+
85+
然后我们就跟到了这个函数的定义的地方,看起来是一个AES加密:
86+
87+
![image-20250112022058840](README.assets/image-20250112022058840.png)
88+
89+
加密函数的逻辑:
90+
91+
```js
92+
// 加密函数
93+
function _0x1a2b(data, _0x3c9d) {
94+
return CryptoJS.AES.encrypt(JSON.stringify(data), _0x3c9d).toString();
95+
}
96+
```
97+
98+
至此逻辑分析完毕,我们能够很方便的去追溯主要就是因为能够打了script类型的断点,让我们能够从底下往上追溯,同时又能够结合运行时的变量的值来更快的理解逻辑,这就是这个[Script Hook](https://github.com/JSREI/js-script-hook)工具给我们带来的优势。
99+
100+
101+
102+
# 五、逆向技术交流群
103+
104+
扫码加入逆向技术交流群:
105+
106+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20241016230653669.png" style="width: 200px">
107+
108+
如群二维码过期,可以加我个人微信,发送【逆向群】拉你进群:
109+
110+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20231030132026541-7614065.png" style="width: 200px">
111+
112+
[点此](https://t.me/jsreijsrei)或扫码加入TG交流群:
113+
114+
<img src="https://github.com/JSREI/.github/raw/main/profile/README.assets/image-20241016231143315.png" style="width: 200px">
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

0 commit comments

Comments
 (0)