웹쉘 스캔 (WebShell Scan)

 | C, C++
2007/10/16 19:33

웹쉘 스캔 (WebShell Scan)




서버를 가지고 서비스 하는 입장에서는 어디서나 웹쉘에 대한 골치거리를 생각해 본 적이
있을 것이다. 웹쉘이 재수없게 서버에 하나 올라오고 그 페이지에 접근이 된다면 게임은
끝난 것이다. 따라서 서버에 웹쉘이 함부로 올라오지 않도록 업데이트 되는 파일에 대한
검증은 필수 불가결의 요소이며, 이미 보안이 허술한 공공기관 사이트나 학생 웹 개발자도
그런 코딩은 다 알고있다. 하지만 중국 해커들은 여전히 무슨 개구멍을 타고 드나드는지
모르겠지만 웹쉘을 심심하게 올려대고 있고, 그런 출처를 알 수 없는 웹쉘 때문에
서버에서는 아주 골칫거리다.

서버 백신의 경우 서버에서 돌아가는 만큼 퍼포먼스가 머 일단은 가장 중요한
사항이라고 생각되긴 하지만 내 개인적인 생각으로는 웹쉘 스캐닝 능력도 반드시 필요한
요소라고 본다. 웹쉘은 서버에 올려지는 것이다. 따라서 클라이언트 백신 보다는 서버
백신에서 그만한 차별성을 갖고 있어야 한다고 생각되며 더욱 효과를 발휘해야 한다.

하지만 생각 외로 서버백신들이 웹쉘에 대한 대응책이 미비하다는 것을 알 수 있다. 이번에
서버 백신에 대한 BMT가 이루어지면서 여러 서버 백신을 맛보았는데, 일부러 BMT항목에
웹쉘 체크 항목도 넣었었다. 여러 종의 웹쉘을 테스트 해보면서 간단하게나마 진단율을
확인해 보는 것이 일차적인 평가 대상이었다.

이때 웹쉘 샘플을 인터넷 어디서나 구할 수 있는 흔한 것들과 우리 쪽에만 유입된 특수한
웹쉘 샘플 이런식으로 분류해서 테스트를 하였는데, 어이없게도 백신들은 인터넷에 마구
굴러다니는 샘플도 캐취하지 못하였다. 물론 이 기능 하나만으로 백신을 평가한다는 얘기는
아니지만, 난 꽤 큰 실망을 한 편이었다. 왜냐하면 인터넷에서 어디나 구할 수 있는 샘플은
사실 맘만 먹으면 오늘이라도 채취할 수 있는 것이고, 그 패턴을 삽입하는 것은 어려운
작업이 아니기 때문이다. 즉 내가 생각하기로는 샘플을 최대한 긁어올 그런 시도조차 혹은
개념조차 미비했다고 볼 수밖에 없었다.

어쨌든 웹쉘에 대한 평가 부분은 5개 백신 모두 좋은 편이 아니었다. 이것으로 보아 현재 백신의
풍토가 웹쉘에 대한 대책은 앞서나가는 쪽은 아니라고 생각할 수 있다. 웹쉘 해킹의 역사는 오래된
편인데 백신에서 아직도 지지부진한 모습은 결코 기분 좋은 모습은 아니었다.

물론 웹쉘을 백신에서만 처리하겠다는 얘기가 아니다.

단지 분야가 다르다고 생각만 하지 말구 새로운 아이디어를 창출해 냈으면 좋겠다는 얘기이다.
하지만 기존에 할 수 있는 것조차 제대로 해 놓지 않고 새로운 아이디어를 바란다는 것은
당연히 무리한 바램인 것인데, 그런 인식이 커지며 무리한 바램을 하지 말자 라는 풍토가
확산되지 않기를 바라는 마음이다.

어쨌든 아쉬운 대로 우리 나름대로 웹쉘은 찾아야 하고 백신사에서 해주기까지는 시간이 걸리니
웹쉘 체크를 위한 간단한 스캐너를 하나 만들었다.
웹 소스 파일에 대한 스캔 기능을 갖춘 웹쉘 스캔 엔진이다. 사실 막무가내로 스캐닝을
구현하기에는 일단 패턴 적출이 가장 기본적인 테마다. 따라서 접근방식에 대한 힌트를 얻기 위해
그나마 웹쉘을 많이 캐취해내는 카스퍼스키로 테스트 해 보았다.


사용자 삽입 이미지

일단 내가 가지고 있는 win31_Shell.asp로 테스트 해본 결과,
바로 진단이 되는 모습을 볼 수 있었다.


그렇다면 카스퍼스키는 어떤 부분을 감안하여 이넘을 웹쉘이라고 간주한 것일까,
소스 파일을 계속 지워가며 테스트 해 보았다. 그 결과 XpCmdShell() 이라는 함수를 거덜내 보니
더이상 진단되지 않는 것을 알 수 있었다. 이곳이 카스퍼스키가 보유하고 있는 패턴이다.

사용자 삽입 이미지

사용자 삽입 이미지

(진단이 되지 않음)



WinHex를 이용하여 그 부분을 패턴으로 뽑아왔다.




그리고 BinaryMatching 함수를 만든후 그 패턴을 검사하도록 구현했다.
스캐닝 후 진단 결과,

사용자 삽입 이미지


이런식으로 두어개를 더 테스트 해 보니, 웹쉘의 패턴이 될만한 것들이 눈에 들어왔다.
아 이런 패턴을 찾아서 웹쉘로 진단하는 것이구나. 하는 감을 충분히 느낀 후
내가 갖고 있는 모든 웹쉘의 패턴을 공통이 될만한 것으로 추출하여 모조리 삽입했다.

사용자 삽입 이미지


이제 웬만한 백신들이 잡지 못하는 웹쉘도 내가 만든 스캐너에는 다 포착이 된다.
패턴을 다 적출하고 나서 한국정보보호진흥원에서 다음과 같은 자료를 발견했다. 이런
미리 찾아볼걸 ㅠㅠ (참고로 난 절대 저거 보고 패턴 뽑은게 아니다 !)


사용자 삽입 이미지


백신들도 웹쉘에 대한 좀더 적극적인 대처를 바라며 한번 글을 써봤다. 백신사에서
근무하시는 분들 중에 이 글을 보실 분이 계실지 모르겠지만, 보신다면 혹시 참고가 되었으면
하는 바램이 있다.


window31. 2007년 10월.


ps  참고로 백신의 패턴을 확인하는 방법은, 저런 무식한 방법보다 더 고급스런 기법이 있지만
     그 방법은 법률에 위반될 소지가 있는 부분이라 따로 기재하지는 않습니다(백신 개발해보신
     분들은 이미 다 알고 계시죠? ㅋㅋ)

Posted by window31


트랙백 보낼 주소 : http://window31.com/trackback/67 관련글 쓰기

댓글을 달아주세요

  1. 2007/10/20 23:44
    댓글 주소 수정/삭제 댓글
    흠.. 가장 간단한 방법중의 하나라고도 볼 수 있겠지만..^^;;
    효율성을 감안한다면.. 텍스트 기반의 타겟에 대한 스트링 매칭은..
    그다지 좋은 방법은 아니죠..^^;;;;
    위에서 "XpCmdShell"로 잡았는데~
    "XPCmdShell" 이나.. "xpCMDShell"로 바뀌면 못잡을 뿐더러..
    극단적인 가정으로 위해가 없는 쉘이 우연찮게 "XpCmdShell"을 갖고있다;;
    이러면 또 문제가 될 수 있죠..^^;;;
    스크립트 형식(텍스트기반)의 경우에는.. 특정 문자열보다는
    구문 형식(?)을 잡는게 좀 더 어렵지만.. 더 효과적인듯..;;
    위의 소스중에서 예를 들자면..
    "todo = Trim(Request.Form("todo" ));" 이걸 패턴에 추가한다 쳤을때;;
    todo 란거는 얼마든지 변경이 가능한 이름이죠~
    이런 경우를 감안해서~~
    "이름 = Trim(Request.Form("이름" ));" 이런 식으로..;
    구문자체를..ㅋ;
    =0=;;; 사실 이것도 말처럼 만만한 구현은 아닌..;;;
    텍스트라는 것의 특성상... 코드의 위치등.. 유동성도 감안해야하기에;;
    .
    .
    ㅋㅋ.. 저런 웹셸을 전문적으로 찾아내는 엔진을 만드는게 아닌 이상..;;
    스트링 매칭도 뭐;;..
    • 2007/10/22 10:09
      댓글 주소 수정/삭제
      답변이 너무 길어져서 새 글로 써야겟다 -.-
      3칸 뒤 글을 보3
  2. 2008/08/18 17:25
    댓글 주소 수정/삭제 댓글
    High-Level language라면, 정규식을 이용해서 비교해도 되겠군요 :)

    근데 제 생각엔 서버단의 파일 목록들과 파일 crc를 체크하는 Worker Program을 만들면

    어느정도 웹쉘이 막아지지 않을까 생각해봅니다.

    (기존 서버 파일을 수정해서 쉘을 만들지 않는다는 보장이 없으므로)
    • 2008/08/20 00:58
      댓글 주소 수정/삭제
      네. 그 방법도 좋은 방법입니다!
      그런데 윈도가 쓰고지우고 난리부르쓰 떠는 파일의 흐름이 꽤나 복잡하더군요 ㅠ ㅠ
      확실하다 싶을 정도의 규칙성을 찾을 수 있다면 상당히
      효과적일 수 있을 것 같아요.
      그리고 패턴 검사 같은것도 사실 저렇게 무식하게 비교하는 것 보다
      정규 표현식이 훨씬 좋죠 ^^;
      좋은 말씀 감사합니다 !

BLOG main image
by window31

카테고리

분류 전체보기 (187)
Reverse Engineering (19)
C, C++ (15)
Kernel (8)
Guitar (16)
잡담 (58)
etc (5)
who am i (5)
보안 이야기 (39)
Tools (2)
월간 마이크로소프트웨어/.. (19)

글 보관함