웹쉘 스캔 2 - 현승군
아래 현승군이 긴 댓글을 썼길래, 답글을 쓰다보니 저도 길어져서 ;;
새 글로 씁니다.
원문,
흠.. 가장 간단한 방법중의 하나라고도 볼 수 있겠지만..^^;;
효율성을 감안한다면.. 텍스트 기반의 타겟에 대한 스트링 매칭은..
그다지 좋은 방법은 아니죠..^^;;;;
위에서 "XpCmdShell"로 잡았는데~
"XPCmdShell" 이나.. "xpCMDShell"로 바뀌면 못잡을 뿐더러..
극단적인 가정으로 위해가 없는 쉘이 우연찮게 "XpCmdShell"을 갖고있다;;
이러면 또 문제가 될 수 있죠..^^;;;
스크립트 형식(텍스트기반)의 경우에는.. 특정 문자열보다는
구문 형식(?)을 잡는게 좀 더 어렵지만.. 더 효과적인듯..;;
위의 소스중에서 예를 들자면..
"todo = Trim(Request.Form("todo" ));" 이걸 패턴에 추가한다 쳤을때;;
todo 란거는 얼마든지 변경이 가능한 이름이죠~
이런 경우를 감안해서~~
"이름 = Trim(Request.Form("이름" ));" 이런 식으로..;
구문자체를..ㅋ;
=0=;;; 사실 이것도 말처럼 만만한 구현은 아닌..;;;
텍스트라는 것의 특성상... 코드의 위치등.. 유동성도 감안해야하기에;;
.
.
ㅋㅋ.. 저런 웹셸을 전문적으로 찾아내는 엔진을 만드는게 아닌 이상..;;
스트링 매칭도 뭐;;..
화면에 보이는 캡쳐는 페이지의 한 부분일 뿐이고
물론 구문이나 코드 같은 것도 넣어두었지.
예를 들어 다음과 같은 부분도 패턴으로 들어 있지.
If LCase(cmdPath)="wscriptshell" Then
cmdResult=doWsCmdRun(cmdStr)
하지만 어차피 텍스트기반의 스크립트는 문자열이나 구문이나 똑같이 취급되기 때문에
XpCmdShell을 xpCMDShell로 바꿀 수 있다면
todo = Trim(Request.Form("todo")); 이거를
todo=Trim(...) 으로 공백을 없애서 우회하는것도 가능하겠지 ㅋㅋㅋ
그리고 니 말대로 이름 부분을 don't care 처리하는 것도 어렵지 않지.
그러면 이름 부분에는 어떤 문자열이 들어가도 디텍팅이 될테니까
우리가 잘 아는 솔루션 처럼 ^^
하지만 굳이 그럴 필요도 없고,
왜냐면 돈트케어를 필요로 할 만큼 지능적인 코드를 패턴으로 뽑는 귀찮은 짓도 하기 싫고
또 구문 자체를 넣으면 그만큼 비교하는 바이트 수가 늘어나니 속도도 저하되고
그리고 최종 디텍팅 된 결과물은 사용자가 리스트를 확인후 직접 대조할테니
오탐에 대한 염려도 별루 없지
그리고 웹 소스 파일에 xpcmdshell이라는 문자열을 쓰는 넘이 정상 넘일까 -.-?
난 백신 개발자가 아니거든 ^^
다만 비슷하게는 만들 수 있고, 또 보안 솔루션 개발을 했다면 이정도 구현은
아무나 다 할 수 있다고 봐. 못하면 그사람이 이상한거지 -.-
하지만 그게 백신들에게 좀 덜 되어 있으니까 간단하게나마 구현을 해본거고
백신들이 잘 되어 있다면 당연히 그걸 쓰겠지 ^^
하지만 실제로 웹쉘의 디텍팅을 휴리스틱하게 구현하기는 쉽지 않은 거 같아.
일단 희안한 기능 만들기로 유명한 카스퍼스키가 저렇게 패턴 매칭으로 진단하는 것 자체부터
갸들도 뚜렷한 대책은 없다는 거겟지..
앞으로 어떤식으로 백신 엔진을 개량해줄지는
백신 개발자들이 잘 알겠지 :)
