libctf, 创建CTF服务的库

分享于 

9分钟阅读

GitHub

  繁體 雙語
Library for creating CTF services.
  • 源代码名称:libctf
  • 源代码网址:http://www.github.com/fuzyll/libctf
  • libctf源代码文档
  • libctf源代码下载
  • Git URL:
    git://www.github.com/fuzyll/libctf.git
    Git Clone代码到本地:
    git clone http://www.github.com/fuzyll/libctf
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/fuzyll/libctf
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    CTF服务库

    这个库旨在提供一组通用的功能来编写CTF服务。 这定义为设置一个简单的分叉服务器,监听生成子级的端口,从 root 执行连接处理程序。

    主要目标是尽可能接近 Kenshoto。DDTEK和lbs的实现,从DEFCON的CTF Finals,同时保留与shellcode中的Ghost类似的featureset的。 为这里,大多数代码都是编写的,而这些代码是在这些比赛中反向工程。

    这里库当前显式支持用C。C++ 和D 编写的服务。 其他能够直接与C 接口的语言也应该工作,但是还没有进行测试。

    用法

    这里库提供以下标准函数作为它的API:

    
    int ctf_listen(const unsigned short port, const int proto, const char *iface)
    
    
     Binds a socket to a port and begins listening.
    
    
    
    void ctf_server(int sd, const char *user, int (*handler)(int))
    
    
     Accepts connections and forks off child processes to handle them.
    
    
    
    void ctf_privdrop(const char *user)
    
    
     Drops privileges to chosen user.
    
    
    
    int ctf_randfd(int old)
    
    
     Randomizes a given file descriptor.
    
    
    
    int ctf_readn(const int fd, char *msg, const unsigned int len)
    
    
     Reads until given length is reached and returns number of bytes read.
    
    
    
    int ctf_readsn(const int fd, char *msg, const unsigned int len)
    
    
     Reads in a string and returns number of bytes read (including NULL).
    
    
    
    int ctf_writen(const int fd, const char *msg, const unsigned int len)
    
    
     Writes a message of given length and returns number of bytes written.
    
    
    
    int ctf_writes(const int fd, const char *msg)
    
    
     Wrapper for ctf_writen() for NULL-terminated strings.
    
    
    
    int ctf_writef(const int fd, const char *msg,.. .)
    
    
     Wrapper for ctf_writen() to allow formatted messages.
    
    
    
    

    有关其他注释和文档,请参见 ctf.c

    配置

    这个库以定义的形式支持一些编译时间选项。 支持的定义为:

    
    -D_DEBUG
    
    
     Removes alarm and dropping privileges in ctf_server().
    
    
     Adds a few helpful warnings to read/write functions.
    
    
    
    -D_IPV6
    
    
     Switches socket from IPV4 to IPV6 in ctf_listen().
    
    
    
    -D_SCTP
    
    
     Adds support for SCTP sockets in the header file.
    
    
    
    -D_CHROOT
    
    
     Modifies ctf_privdrop()'s behavior to chroot to the service user's directory when changing to it.
    
    
    
    -D_RANDFD
    
    
     Enables randomizing the socket descriptor in ctf_server().
    
    
    
    

    编译

    编译libctf应该与执行以下操作一样简单:

    
    $(CC) --std=c11 -D_GNU_SOURCE -c ctf.c -o ctf.o
    
    
    
    

    链接libctf应该与( 假定一个名为"示例") 一样简单:

    
    $(CC) sample.c ctf.o -o sample
    
    
    
    

    这里库的典型用法是根据每个服务基础上的自定义编译libctf对象链接。 这允许每个服务指定定制选项( 侦听 IPv4 vs IPv6,例如)。 因此,没有提供( 上的内容应该足以让你创建自己的)。

    示例

    使用此库实现基本CTF服务的示例 sample.c 看起来类似于以下内容:

    
    #include"ctf.h"
    
    
    
    const char *USER ="sample";//user to drop privileges to
    
    
    const unsigned short PORT = 65535;//port to bind and listen on
    
    
    
    int child_main(int sd)//handler for incoming connections
    
    
    {
    
    
     char buf[32];
    
    
     int len;
    
    
     if ((len = ctf_readsn(sd, buf, 256))> 0) {
    
    
     ctf_writes(sd, buf);
    
    
     }
    
    
     return 0;
    
    
    }
    
    
    
    int main(int argc, char **argv)//main function
    
    
    {
    
    
     (void)argc;
    
    
     (void)argv;
    
    
     int sd;//socket descriptor
    
    
     sd = ctf_listen(PORT, IPPROTO_TCP, NULL);
    
    
     ctf_server(sd, USER, child_main);
    
    
     return 0;
    
    
    }
    
    
    
    

    如果你使用xinetd或者socat代替绑定和侦听端口,本示例将改为:

    
    #include"ctf.h"
    
    
    
    int main(int argc, char **argv)
    
    
    {
    
    
     (void)argc;
    
    
     (void)argv;
    
    
     char buf[32];
    
    
     int len;
    
    
     setvbuf(stdout, NULL, _IONBF, 0);
    
    
     if ((len = ctf_readsn(fileno(stdin), buf, 256))> 0) {
    
    
     ctf_writes(fileno(stdout), buf);
    
    
     }
    
    
     return 0;
    
    
    }
    
    
    
    

    然而,使用 xinetd,你需要在/etc/xinetd. d/that中添加一个配置文件,看起来像这样:

    
    service sample
    
    
    {
    
    
     id = sample
    
    
     user = sample
    
    
     server =/home/sample/sample
    
    
     disable = no
    
    
     port = 65535
    
    
     socket_type = stream
    
    
     protocol = tcp
    
    
     wait = no
    
    
     type = UNLISTED
    
    
    }
    
    
    
    

    问题

    一些常见问题的答案包括:

    问题 1: 如何在使用xinetd运行时获得一个服务

    最初,我添加了一个单独的函数来处理这个"特殊案例"。 在使用它之后,我意识到它永远不会那样工作,因为vmm如何降低特权。 正确答案是简单地修改你的配置行的xinetd server,使之成为以下两行:

    
     server =/usr/sbin/chroot
    
    
     server_args =/home/sample/home/sample/sample
    
    
    
    

    第一个参数是你想要 chroot的目录。 第二个参数是你要运行的服务。

    问题:如何以共享库的方式构建 libctf

    构建libctf作为共享库应该类似于下面这样:

    
    $(CC) --std=c11 -D_GNU_SOURCE -fpic -c ctf.c -o ctf.o
    
    
    $(CC) ctf.o -shared -o libctf.so
    
    
    
    

    链接到它应该类似于:

    
    $(CC) sample.c -o sample -L/path/to/libctf.so -lctf
    
    
    
    

    请记住,你的LD_LIBRARY_PATH中需要 /path/to/libctf.so。 否则,将出现如下错误:

    
    ./sample: error while loading shared libraries: libctf.so: cannot open shared object file: No such file or directory
    
    
    
    

    如上所述,这不是典型的用法场景,因为编译时定义了很多有用的特性。 不过,你可以随心所欲地做。

    :你计划支持像 C#。python 和 ruby 这样的语言

    我目前没有支持额外语言的计划。 有可能在支持字节码y 语言方面有一些优点。 事实是,他们可能已经很好地工作了。 我从未测试过他们。

    • 对于 C#,尝试将libctf编译为共享对象( 请参见上方) 并使用 DllImport
    • 对于 python,请尝试 ctypes
    • 对于 ruby,尝试 FFI

    请让我知道,如果你确实尝试了这个 !

    路线图

    以下是还没有添加和/或者测试的功能的List:

    • 还没有在FreeBSD上建立
    • 除了 x86/x86-64之外,还没有编译到任何架构
    • 还没有完全测试SCTP和原始 codepaths
    • 还没有完全测试D 绑定( 无法正确连接 gdc )
    • 对其他语言( C#。Java。python。ruby。Lua ) 进行测试和/或者创建绑定
    • 当前不支持 Windows 服务( 在 wine 或者其他方面)
    • 还没有从DEFCON的终端 19和 20实现ddtek的后门

    相关文章