본문 바로가기

Computer/0x00 정보보안

[모의카지노해킹] 계좌이체 시키는 문제풀이

[모의카지노해킹] 계좌이체 시키는 문제풀이




HACME 라고 워게임 사이트들이 많습니다.

해킹&보안 기술을 연구하는 사람들을 위한 일종의 문제풀기 형식으로 이루어져 있습니다.

이번시간에는 이중에서 '카지노해킹' 에 대한 문제풀이를 통해 보안기술 에 대한 연구 + 재미를 잡아보는

시간을 가지겠습니다. :)


온라인 카지노해킹 문제풀기에 앞서서 우리는 배경지식을 한가지 깔고 가야 합니다.

그것은 바로 CSRF 에 대한 개념을 숙지 하는 것입니다.




CSRF 공격이란?



CSRF(Cross-Site Request Forgery) 라고 하며, XSRF 라고 합니다. 

해커들이 만든 용어인데요, XSRF 라고도 하는 이유는 XSS를 크로스 사이트 스크립팅 공격이라고 하는것

과 비슷한 이유 입니다.

크로스 사이트 스크립팅 공격의 약자는 원래 CSS 라고 표기하는 것이 맞으나, CSS (Cascading Style Sheets) 

라는 웹용어가 이미 있었죠. 그래서 중복을 싫어하는 이들의 특성상 XSS(Cross-Site Script) 라고 정의하게

되었습니다.


CSRF 혹은 XSRF는 '사이트 간 요청 위조' 라고도 합니다. 

웹사이트 취약점 공격의 하나로서, 사용자가 자신의 의지와는 무관하게 해커가 의도한 행위를 트정

웹사이트에 요청하게 하는 공격을 말합니다. 


예전에 '옥션해킹사건' 에 사용된 공격방식 이기도 합니다.

그떄 개인정보유출로 크게 화제가 된 적이 있었지요..





CSRF 공격 메커니즘




 크로스 사이트 스크립팅(XSS) 공격이 사용자가 특정 웹사이트를 신용하는 점을 노렸다면,

CSRF 공격은 특정 웹사이트가 사용자의 웹브라우저를 신용하는 상태를 노린 것이라고 할 수 있습니다.


즉, 일단 사용자가 웹사이트에 로그인한 상태에서 사이트간 요청 위조 공격 코드가 삽입된

페이지를 열면 이후에는 사용자의 행동과 관계없이 사용자의 웹 브라우저와 공격 대상 웹사이트

간의 상호작용이 이루어집니다.





HACME 카지노 사이트 문제풀이



다운받아서 설치해서 실행하면 위와 같은 카지노사이트가 등장 합니다.

문제는 바로 이겁니다. 


[ 문 제 ]

A라는 사용자와 B라는 사용자가 있습니다.이중 한명은 카지노 칩이 10,000개나 보유하고 있으며

나머지 한명은 0개를 보유하고 있습니다. CSRF 공격으로 10,000개를 보유한 사용자의 칩을

0개를 보유한 사용자에게 계좌이체 시키는 문제 입니다.


이렇게 3줄로 정리할 수 있겠습니다.

즉, 해커가 불쌍한 친구를 도와주기 위해 부자의 칩을 친구에게 계좌 이체 시키는 것이죠.



일단 간단한 SQL 인젝션 공격을 통해서 로그인을 시도 합니다.

그러면 DB에 가장 위에 있는 사람으로 로그인 되는데요.

바로 앤디 라는 사용자 입니다. 칩이 10,000개나 보유하고 있는 것을 확인 할 수 있습니다.




▲ 앤디로 로그인후에 왼쪽 메뉴의 Options 을 클릭하면 '계좌이체' 시킬 수 있는 인터페이스 화면을

볼 수 있습니다.



여기서 한가지 더 단서를 알 수 있는 것은 바로 ' Bobby_blackjack' 라는 사용자명 입니다.

bobby_blackjack 는 우리의 친구 입니다. 그는 자신에게 칩을 성공적으로 이체 시키면,

일정량의 커미션을 지급해 주기로 했기 떄문에 우리는 계약적 친구관계가 되었습니다.


그가 알려준 비밀번호는 twenty_one 입니다.

로그인을 해봅니다. 





▲  우리의 동업자 bobby는 역시 카지노 칩이 '0개' 인것을 확인 할 수 있습니다.


자, 그러면 여기서부터 본격적인 설계작업이 필요 합니다.

해킹에 성공해서 앤디의 칩을 10,000개를 바비(bobby)에게 이체 시키려면 어떤 작전이 필요할까요?



가만히 생각해 보면, 온라인카지노 사이트 특성상 웹에서 이루어지기 떄문에

계좌이체를 클릭시 일어나는 요청을 우리가 중간에 가로채거나 변조 할 수 있지 않을까요?


그렇다면, 어떻게 하면 패킷을 가로채거나 변조 할 수 있을까요?

우선 웹패킷을 분석하는 도구가 필요합니다.



Paros , Burp suite 같은것이 있겠지요.

여기서는 Burp Suite(이하 버프)를 가지고 패킷을 잡아서 분석해 보겠습니다.


버프를 설치하고 사용하기 위해서는 브라우져와 버프를 합치는 작업이 필요합니다.

아래와 같이 세팅을 합니다.





▲ 인터넷익스플로러 기준으로 '인터넷옵션' => 연결 => LAN설정 => 127.0.0.1  포트: 8080 기입후

확인버튼을 눌러 주면 설정이 완료 됩니다.



그리고 버프를 실행후에 앤디에게 가상으로 '1'을 계좌이체 시키는 버튼을 눌러주면 아래와

같은 화면이 출력 됩니다.





▲ 클릭시 크게 보실 수 있습니다.  

위에 빨간색 테두리 친 부분을 보면 패킷이 어떠한 형태로 Server로 전송되는지 알 수 있습니다.


transfer=1&login%5B%5D=andy_aces&commit=Transfer+chips


버프에 위와 같은 형태로 패킷이 전송 되는데요. 얼핏 보시기에는 '암호회' 처럼 전송 되는 것으로

보이나 자세히 하나씩 파헤쳐 보면 그렇지 않다는 것을 알 수 있습니다.


해당하는 구문이 어떻게 조합되었는지 보다 자세히 알기 위해서는 해당 페이지의 소스를 보는 것이

좋습니다.


카지노의 계좌이체 시키는 페이지의 소스는 아래와 같습니다.




[ 계좌이체 소스부분]

 


<form action="/account/transfer_chips" method="post">

<h3>Transfer chips to another player: </h3>
<table>
<tr>
<td>
Amount
</td>
<td>
<input id="transfer" name="transfer" type="text" />
</td>
</tr>
<tr>
<td>
Recipient
</td>
<td>
<select id="login_" name="login[]"><option value="andy_aces">Andy Aces</option>
<option value="crystal_cardshark">Crystal Cardshark</option>
<option value="demo">Demo User</option></select>
</td>
</tr>
<tr>
<td colspan = "2" >
<input class="submit" name="commit" type="submit" value="Transfer Chips" />
</td>
</tr>
</table>
</form>



▲ 위의 계좌이체소스 에서 파란색으로 굵게 칠한 부분을 보면 패킷에 인자값으로 사용된다는 것을

알 수 있습니다.






▲ Burpsuit(버프)에서 Params 항목을 보면 위와 같이 좀더 정형화된 데이터로 파악이 가능 합니다.



자, 그러면 앤디의 칩을 바비에게 계좌이체 시키기 위해서 위에 나온 힌트들을 가지고 레고 조립하듯이

조합하여 패턴을 완성 합니다.




[완성된 구문]

http://serverip:3000/account/transfer_chips?transfer=10000&login[]=bobby_blackjack&commit=Transfer+Chips


 ▲ 이것을 사회공학 [social engineering, 社會工學] 을 이용하여 앤디가 해당 링크를 클릭하게 

만듭니다. 그러면 어떠한 결과가 나오는지 확인 해 보겠습니다.




마무리


▲ 만들어진 링크를 앤디가 클릭하게 만들자 카지노 칩이 '0'으로 바뀐것을 확인 할 수 있었습니다.

그렇다면 우리의 친구 바비는 과연 앤디의 칩을 먹고 10,000개로 되어 있을까요?






▲ 계좌이체 공격이 성공적으로 된 것을 확인 할 수 있었습니다. 

불쌍한 바비가 빈털털이 에서 백만장자로 거듭난 순간 입니다. :)



이번 워게임(War game) 실습을 통해서 CSRF(혹은 XSRF) 공격이 어떠한 식으로 이루어지는지 살펴

보았습니다. 


해커 입장에서 살펴보았으니, 이제 사용자와 개발자 입장에서 해당 공격을 방어하기 위한 방법에

대해 알아 보겠습니다. 



[ 방어하기 : 사용자]

사용자는 확인되지 않은 악의적인 링크클릭을 자제 해야 된다는 것을 다시 한번

알 수 있었습니다. 

사이트 접속만으로, 또는 링크 클릭만으로도 해킹 당할 위험이 있으니까 말이죠.



[ 방어하기: 개발자 ]


입력폼에 특정 문자조합의 토큰을 생성한 다음에 생성된 토큰값을 Session 과 Hidden에 넣어

페이지로 넘겨 주고 넘겨받은 Hidden 토큰값과 Session 토큰값을 비교하여 같을 때 명령을 수행하게 만듭니다.

또한 중요한 페이지 에서는 '재인증요청'을 해서 CSRF 공격을 실패하게 만들 수 있습니다. 




이상 지금까지 카지노해킹 워게임을 풀이 해보았으며, 이를 사용자와 개발자 입장에서 
어떻게 대처하는지 까지 알아보았습니다. 행복한 하루 되세요. 감사합니다 ^^