달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

http://suite.tistory.com 2012.03

1. clamav 연동  


simscan 설치할때 인터넷  http://www.qmailwiki.org/Simscan/README 보고 설치시

configure 를 나는

$ ./configure --enable-user=simscan --enable-received=y --enable-attach=y --enable-clamav=y --enable-custom-smtp-reject=y 이렇게 주고 컴파일해서 설치 하고 나서 

clamav 잘되는지 해보니 에러 발생!~~  에러내용은


"simscan: clamdscan: /var/qmail/simscan/1332399138.49738.5987: lstat() failed: Permission denied. ERROR"


이런 디렉토리 접근 퍼미션 문제였는데 clamav 설치방법도 여러가지이고 암튼 구글링해보면

chown 등으로  simscan 폴더를 줘야한다 글이 많은데

내경우는 clamav 설정 파일 기존에 qmail-scanner와 연동 되었던 clamav의 설정파일 

/usr/local/etc/clamd.conf  파일에서 User , LocalSocketGroup 값을

simscan 설치 계정의 소유자와 그룹권한으로 변경후 lstat 오류 사라짐 (/etc/password)

ex) LocalSocketGroup qmail  .... User simscan 


2. 첨부파일만 추출해서 별도의 바이러스 체크시 simscan 에서 체크시 추가/수정해본거


2-1 . 첨부파일이 zip 압축경우 한번 풀기 (clamav 의 clamdscan 은 자동으로 해줌 ~.~)

    int run_unzip()
{
    DIR *mydir_unzip;
    struct dirent *mydirent;
    char fileNameBuf[256]={'\0',};
    int i=0;

    mydir_unzip = opendir( ATTACH_DIR );
    if ( mydir_unzip==NULL) {
        return -1;
    }
    for(i=0; (mydirent=readdir(mydir_unzip))!=NULL; i++) {
        strcpy(fileNameBuf,mydirent->d_name);
        lowerit(fileNameBuf);
        if ( str_rstr(fileNameBuf,".zip") == 0 ) {
            if ( DebugFlag > 3 ) {
                 fprintf(stderr, "Exist zip file [%s]\n",mydirent->d_name);
            }
            unzipFile(mydirent->d_name, ".");
        }
    }
    closedir(mydir_unzip);

    return 0;

}

unzipFile() 함수는 http://www.zlib.net/ 여기서받은 소스 코드에서 압축을 푸는 바이러리

/zlib-1.2.5/contrib/minizip/miniunz.c 함수에서 main() 을 unzipfile() 변경해서 호출 사용


2-2 int check_attach() 기존 함수 수정 


첨부파일은 int run_ripmime() 에서 이미 ripmime 으로  /var/qmail/simscan 디렉토리에 만들어줌

int detect_attach(char *directory)
{
    struct stat stbuf;
    DIR *mydir;
    struct dirent *mydirent;
    char paramDir[256]={'\0'};
    char bufMD5[33]={'\0',};
    char tmpFileName[256]={'\0',};
    int len=0;
    const int TEMP_FILE_LEN = strlen(OUTLOOK_TEMP_NAME) + 1; // ex) textfile0 , textfile1 ...
    char scan_sql[256]={'\0'};

    mydir = opendir(directory);
    if ( mydir==NULL){
        return -1;
    }

    while((mydirent=readdir(mydir))!=NULL) {
        /* skip . and .. */
        if (  mydirent->d_name[0] == '.' &&
            (mydirent->d_name[1] == '.' || mydirent->d_name[1] == 0) ) {
            continue;
        }
        // get subdirectory
        lstat(mydirent->d_name, &stbuf);
        if( S_ISDIR(stbuf.st_mode)) {
            sprintf(paramDir, "%s/%s", directory, mydirent->d_name);
            detect_attach(paramDir); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로 
            continue;
        }

        // skip.. simscan temp file
        if( strstr(mydirent->d_name,PREFIX_MSG) || strstr(mydirent->d_name,PREFIX_ADDR)){
            if ( DebugFlag > 5 ) {
                fprintf(stderr, "simscan: skip [%s] or [%s] file [%s]\n",PREFIX_MSG, PREFIX_ADDR, mydirent->d_name);
            }
            continue;

        }
        if ( DebugFlag > 5 ) fprintf(stderr, "simscan: checking attachment [%s/%s] \n", directory, mydirent->d_name);

 
         getMD5(mydirent->d_name, bufMD5); // 첨부파일에서 MD5 추출 

         sprintf(scan_sql,"SELECT hash FROM VIRUS_TABLE  WHERE hash='%s'",bufMD5);

          ... .... ... ... 
                if( isMalwareByDB(scan_sql) > 0 ){
                    if ( DebugFlag > 1 ){
                       fprintf(stderr, "[Malware] MailFrom:<%s>, RcptTo:<%s>, FileName %s , MD5:%s\n", MailFrom, RcptTo[0], mydirent->d_name, bufMD5);
                    }
                    strncpy(AttachName, mydirent->d_name, sizeof(AttachName)-1);
                    closedir(mydir);
                    return -1;
                }
    }
    closedir(mydir);
    return 0;
}

~~~~~~~~~~~~~~~ simscan.c ~~~~~~~~~~~~~~~~~~~~~~~~

 // extract zip (one time);
  run_unzip();
  detect_attach( ATTACH_DIR ); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

뭐 이런식으로 하면 메일내에 첨부파일을 clamav 외 다른 안티바이러스 등과 연동하기 쉽다 MD5 추출 또는 SHA1 으로 추출등 인터넷에서 구글링해서 붙이면됨!~
 

 

:
Posted by mastar