膜拜下鸟哥的大作cnbird . mark.

Docker恶意软件分析系列V:ALICTF决赛题目设计

原文链接:http://www.weibo.com/p/1001603835206674039802

2015年4月24日 17:33 阅读 1554

0x00简介

 

ALICTF(http://www.alictf.com/)中我设计了四道题目,一道Nagios插件NRPE的漏洞,一道ActiveMQjmx的漏洞,一道nconf加cacti提权的漏洞,最后一道就是这篇文章写的zookeeper提权的题目,本题目一共设计了四关。

第一关从zookeeper获取压缩文件、第二关解压获取到key、第三关获取admin ssh的key,第四关进行提权操作,最后拿到Flag。

本篇文章讲解两个部分:

A.     题目设计

B.     题目解题思路

0x01配置docker环境

1.     docker安装

参考第一篇Docker恶意软件分析系列之初识

Docker(http://weibo.com/p/230418e8e60bc00102vl37)

2.     选择操作系统

操作系统选择centos 6.5

docker pull centos:6

0x02搭建zookeeper环境

1.     新建docker镜像

为了不破坏基础镜像我们需要新建一个docker镜像

docker run -it centos:centos6 /bin/bash

2.     保存docker镜像

docker commit 7e2efe536336 zk

我们所有的操作在zk上即可。

3.     zookeeper配置

a)    进入zk镜像

docker run -it zk /bin/bash

b)    安装jdk

yum install -y java-1.7.0-openjdk.x86_64

c)     创建zk用户

useradd zk

d)    切换到zk配置相关信息

su – zk

vi .bash_profile

增加

export JAVA_HOME="/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/"

export PATH=$PATH:$JAVA_HOME/bin

e)    安装配置zookeeper

1. wget http://www.eu.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

2. tar xvzf zookeeper-3.4.6.tar.gz

3. cd zookeeper-3.4.6

4. mv conf/zoo_sample.cfg conf/zoo.cfg

5. vi  ~zk/.bash_profile

增加内容:

export ZOOKEEPER_HOME=/home/zk/zookeeper-3.4.6

export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf

6. . ~zk/.bash_profile

f)      启动

zkServer.sh start

0x03题目环境部署

1.     配置ssh-key

注:此操作在自己的笔记本上进行操作,并且私钥不能传到服务器

ssh-keygen -t rsa

2.     zlib库压缩ssh私钥

package com.nuwa;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ConnectException;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.util.List;

import java.util.zip.Deflater;

import java.util.zip.DeflaterOutputStream;

import java.util.zip.InflaterInputStream;

import org.apache.zookeeper.*;

import org.apache.commons.*;

// nuwa zookeeper利用代码   cnbird@alibaba

public class nuwaZookeeper {

public static final int SESSION_TIMEOUT = 30000;

public static ZooKeeper zooKeeper;

/**

* Compresses a file with zlib compression.

*/

public static void compressFile(File raw, File compressed)

throws IOException

{

InputStream in = new FileInputStream(raw);

OutputStream out =

new DeflaterOutputStream(new FileOutputStream(compressed));

shovelInToOut(in, out);

in.close();

out.close();

}

/**

* Decompresses a zlib compressed file.

*/

public static void decompressFile(File compressed, File raw)

throws IOException

{

InputStream in =

new InflaterInputStream(new FileInputStream(compressed));

OutputStream out = new FileOutputStream(raw);

shovelInToOut(in, out);

in.close();

out.close();

}

/**

* Shovels all data from an input stream to an output stream.

*/

private static void shovelInToOut(InputStream in, OutputStream out)

throws IOException

{

byte[] buffer = new byte[1000];

int len;

while((len = in.read(buffer)) > 0) {

out.write(buffer, 0, len);

}

}

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

nuwaZookeeper nz = new nuwaZookeeper();

nz.compressFile(new File("/Users/cnbird/Documents/alibaba/alictf/testkey/testkey"), new File("/Users/cnbird/Documents/alibaba/alictf/testkey/testkey.compress"));

}

}

3.     创建admin账号并且拷贝SSH证书

useradd admin

su - admin

mkdir ~admin/.ssh/

mv testkey.pub ~admin/.ssh/authorized_keys

4.     配置ssh

a). vi /etc/ssh/sshd_config

替换为:

PubkeyAuthentication yes

AuthorizedKeysFile      .ssh/authorized_keys

b). service sshd restart

5.     测试ssh证书登陆

chown admin.admin testkey

chown 600 testkey

ssh -i testkey [email protected]

注:

a) docker必须开启ssh服务

b) docker的ip使用dockerinspect即可获取

6.     上传压缩的ssh证书到zookeeper

a) 设置zookeeper路径

zkCli.sh

create /ALICTF "ALICTF"

注:依次创建目录/ ALICTF/Server/Host/ZookeeperHost/Key/SSHPrivKey。

b) 讲zlib压缩的证书上传到zookeeper

package com.nuwa;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ConnectException;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.util.List;

import java.util.zip.Deflater;

import java.util.zip.DeflaterOutputStream;

import java.util.zip.InflaterInputStream;

import org.apache.zookeeper.*;

import org.apache.commons.*;

// nuwa zookeeper利用代码   cnbird@alibaba

public class nuwaZookeeper {

public static final int SESSION_TIMEOUT = 30000;

public static ZooKeeper zooKeeper;

public static void getFile(byte[] bfile, String filePath,String fileName) {

BufferedOutputStream bos = null;

FileOutputStream fos = null;

File file = null;

try {

File dir = new File(filePath);

if(!dir.exists()&&dir.isDirectory()){//判断文件目录是否存在

dir.mkdirs();

}

file = new File(filePath+"\\"+fileName);

fos = new FileOutputStream(file);

bos = new BufferedOutputStream(fos);

bos.write(bfile);

} catch (Exception e) {

e.printStackTrace();

} finally {

if (bos != null) {

try {

bos.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

if (fos != null) {

try {

fos.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

/**

* 获取节点的信息

@param path

@throws KeeperException

@throws InterruptedException

*/

public void getChild(String path) throws KeeperException, InterruptedException{

try {

List<String> children = this.zooKeeper.getChildren(path, false);

if (children.isEmpty()) {

System.out.printf("没有节点在%s中.", path);

return;

}else{

System.out.printf("节点%s中存在的节点:\n", path);

for(String child: children){

System.out.println(child);

}

}

} catch (KeeperException.NoNodeException e) {

System.out.printf("%s节点不存在.", path);

throw e;

}

}

public byte[] getData(String path) throws KeeperException, InterruptedException {

return  this.zooKeeper.getData(path, false,null);

}

private static Watcher watcher =  new Watcher() {

public void process(WatchedEvent event) {

return;

}

};

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

String path = "/ALICTF/Server/Host/ZookeeperHost/Key/SSHPrivKey";

nuwaZookeeper nz = new nuwaZookeeper();

zooKeeper = new ZooKeeper("192.168.42.9:2181",SESSION_TIMEOUT,watcher);

try {

Path comPath = Paths.get("/alictf/testkey.compress");

byte[] data = Files.readAllBytes(comPath);

zooKeeper.setData(path,data,-1);

} catch (KeeperException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

Throwable e1 = null;

e1.printStackTrace();

}

}

}

编译并且上传到宿主机并且执行,我们可以看到压缩文件已经上传上去了。

7.     安装防提权

1. wget http://forkbomb.org/ninja/src/ninja-0.1.3.tar.bz2

2. tar xjvf ninja-0.1.3.tar.bz2

3. make

4. make install

5. /usr/local/bin/ninja &

测试是否可以防御提权

切换到su – admin然后执行su – root可以看到直接禁止掉了。

8.     配置sudo白名单(只允许用nmap,python,perl,java来进行提权)

Cmnd_Alias ALLOW = /usr/bin/perl,/usr/bin/python,/usr/bin/java,/usr/bin/id,/bin/uname,/usr/bin/nmap

Defaults    requiretty

Defaults   !visiblepw

Defaults    always_set_home

Defaults    env_reset

Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"

Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"

Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"

Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"

Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

root       ALL=(ALL)        ALL

admin   ALL=(ALL)      NOPASSWD:ALLOW

9.     安装supervisord自动运行

yum install epel-release

yum install -y supervisor

配置supervisor

vi /etc/supervisord.conf

[program:openssh]

command=service sshd start

[program:rsyslog]

command=service rsyslog start

[program:zk]

command=/bin/bash -c "/home/zk/zookeeper-3.4.6/bin/zkServer.sh start-foreground"

user=zk

[program:ninja]

command=/usr/local/bin/ninja

10.  自动化运行测试

docker run -it -d=true zk /bin/bash -c "supervisord && /bin/bash"

时间: 2024-08-09 20:43:49

膜拜下鸟哥的大作cnbird . mark.的相关文章

鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理

这一章主要讲述的是如何操作与管理Linux系统中的文件和目录,主要包括目录间的切换,目录的创建与删除,文件的创建与删除,文件的查找,文件内容的查看等等. 前一章中已经讲过相对路径以及绝对路径,绝对路径就是指从根目录("/")开始写起的路径名,而相对路径绝不会由根目录开始写起,相反,相对路径是相对于当前工作目录的路径名.Linux操作系统中有几个特殊的目录: . 代表此层目录: .. 代表上一层目录: - 代表前一个工作目录: ~ 代表当前用户身份所在的主文件夹: ~account 代表

鸟哥的Linux私房菜 基础学习篇读书笔记(9):Linux磁盘与文件系统管理(2)

上一篇文章主要从理论上分析了Linux的Ext2文件系统,这一篇主要讲解如何查看Linux的文件系统的容量以及讲解Linux文件系统中的连接文件. 可以通过df和du命令来查看磁盘与目录的容量,df命令用来列出文件系统的整体磁盘容量,df命令的用法是 df  [-ahikHTm]  目录或文件名,如果df命令不加任何参数,则默认将系统内所有的文件系统的容量以及使用情况都列出来.关于df命令还需要说明的是 df命令是查看文件系统的整体使用情况,因此是从Super block(见前一篇文章)中读取信

鸟哥的Linux私房菜 第十八章、认识系统服务 (daemons)

什么是 daemon 与服务 (service) Linux Daemon (守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些事件.它不需要用户输入就能运行并且提供某种服 务,不是对整个系统就是对某个用户程序提供服务. Linux 系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程 syslogd . web 服务器 httpd .邮件服务器 sendmail 和数据库服务器 mysqld 等. 守护进程一般在系统启动时开始运行,

【Linux】鸟哥的Linux私房菜基础学习篇整理(一)

最近,一直在写PPC的模拟器和汇编器,也在做设计.所以重新看了看<鸟哥的Linux私房菜>,还是有好多命令不太熟悉.就打算写几篇blog记下来. 1. nl [-bnw] filename:添加行号打印参数:-b:指定行号指定的方式,主要有两种: -b a:表示不论是否为空行,也同样列出行号(类似cat -n): -b t:如果有空行,空的那一行不要列出行号(默认值).-n:列出行号表示的方法,主要有三种: -n ln:行号在屏幕的最左方显示: -n rn:行号在自己字段的最右方显示,且不加0

(整理)ubuntu 的 相关知识(来自 鸟哥的私房菜)

1. Linux 文件权限概念 $ ls 察看文件的指令 $ ls -al 出所有的文件详细的权限与属性 (包含隐藏档,就是文件名第一个字符为『 . 』的文件) 在你第一次以root身份登入Linux时, 如果你输入上述指令后,应该有上列的几个东西,先解释一下上面七个字段个别的意思: 图2.1.1.文件属性的示意图 第一栏代表这个文件的类型与权限(permission): 这个地方最需要注意了!仔细看的话,你应该可以发现这一栏其实共有十个字符:(图2.1.1及图2.1.2内的权限并无关系) 图2

鸟哥的Linux私房菜--第一部分-第二章-Linux如何学习

2.1 Linux当前的应用角色 Linux kernel非常精小,可以在很多省电以及较低硬件资源的环境下运行 Linux distribution 集成了很多非常棒的软件,也适合个人计算机使用 2.1.1 企业环境的利用 网络服务器 关键任务的应用(金融数据库.大型企业网管环境) 学术机构的高性能运算任务 2.1.2 个人环境的使用 桌面计算机    X Window System 仅只是Linux 上的一套软件,而不是内核.及时 X Window 挂了 ,对Linux也可能不会有直接的影响

《鸟哥—基础学习》总结(8):Linux磁盘与文件系统管理 之 认识EXT2系统

1 磁盘组成与分区 1.1 磁盘物理组成 (1)圆形盘片-记录数据 (2)机械手臂及磁头-读写盘片数据 (3)主轴马达-使得机械手臂成功读写数据驱动 1.2 盘片物理组成 (1)扇区-最小物理存储单位,512bytes (2)柱面-扇区组成的圆,分区的最小单位 (3)第一扇区-最重要的扇区,包含主引导记录MBR446bytes 以及 分区表PB 64bytes 1.3 磁盘接口在Linux中文件名 (1)/dev/sd[a-p][1-15]  为 SCSI . SATA . USB . Flas

拜师鸟哥之linux学习体会(1)——计算器概论

之前一段时间看了鸟哥的linux私房菜,觉得写得很好,是一本很好的初识linux系统的书籍.接下来的每一天我都会对这本书的每一章的重点知识进行叙述,也算是对学习这本书的一个体会吧.今天讲一下概述部分,鉴于linux是一个操作系统,所以有必要先介绍下计算机方面的知识. 1.    计算机主要由以下几部分组成:输入单元.输出单元.CPU内部的控制单元.算术逻辑单元和主存储器.可以通过下图来描述. 主要介绍下CPU部分,CPU有两种类别:精简指令集RISC和复杂指令集CISC. 2.    本章的一个

鸟哥私房菜上的 xpenguins 安装(ubuntu 12.04)

看了一个暑假的linux,感觉很辛苦啊,想要用好linux真心不容易... 今天装了一下鸟哥课后给的xpenguins软件,就是桌面特性软件,会有很多企鹅下落,本以为可以很轻松的搞定,没想到问题多多啊. 我的环境:ubuntu 12.04 LTS 1. 首先下载个企鹅 download: http://xpenguins.seul.org/xpenguins-2.2.tar.gz 2. 解压 tar -xzf xpenguins-2.2.tar.gz, 进入目录xpenguins-2.2 3.