로그인

회원가입 | ID/PW 찾기

연재

[니해알] 니들이 해킹을 알어? - 2부

공격자들은 어떻게 악성코드를 광범위하게 유포하고 있을까?

re4lfl0w 2013-02-21 19:10:45

이 기사를 본 사람들이 선택한 뉴스

※ ‘니들이 해킹을 알어?’ 라는 제목에 민감한 반응을 보이시는 분들이 있을 것 같아 미리 밝혀 둡니다. 독자들을 무시하려고 하는 것이 아니라 현재의 문제점을 정확히 보여드리기 위해 약간 민감한 단어를 사용한 것입니다. 다른 뜻은 없으니 독자들의 넓은 마음으로 이해 부탁 드립니다.






공격자들은 어떻게 악성코드를 광범위하게 유포하고 있을까?



지난 1부에서 현재 국내의 보안이 얼마나 위험한 상황인지 알아 보았습니다. 이번 글부터는 전문적인 부분을 설명 드릴 것입니다. 보안 쪽이 처음이신 분들은 이해하기 힘드실 것입니다. 그래도 큰 흐름만 생각하면서 따라오시면 됩니다. 저도 어렵다는 것을 알고 있으니 최대한 쉽게 설명 드리기 위해 노력하겠습니다.




Figure 1 악성코드 유포의 Paradigm





 

먼저 공격자들은 취약한 웹 서비스를 검색하여 악성링크를 삽입합니다. 두 번째로 방문자들이 웹 서비스를 받기 위해 사이트에 접속을 합니다. 세 번째로 웹에 접속하면 첫번째에 공격자들이 삽입한 악성링크로 인해 악성코드 경유지로 자동 연결합니다. 


마지막 네 번째로 악성코드 경유지에서 사용자가 인지할 수 없게 악성코드를 다운 받아 실행합니다. 그렇게 되면 방문자 PC는 좀비 PC가 되고 공격자가 방문자 PC의 모든 권한을 획득할 수 있습니다.




연예기획사나 국내 유력 언론사, 파일공유, 꽃배달, 부동산, 메타블로그, 호스팅 사이트 등은 어떻게 해서 악성코드를 유포하게 된 것일까요? 아니, 그전에 악성코드가 유포 됐다는 것은 어떤 뜻인지 알아봅시다.





 

<악성코드 유포의 의미>

 




악성코드를 유포한다는 것은 단수한 코드의 삽입이 아니라 소스 코드의 직접적인 수정을 의미합니다. 코드를 수정하기 위해서는 모든 권한을 다 가지고 있어야만 하는데, 지금 공격하는 유형들은 모두 Database의 권한을 직접 공격하는 유형이라서 Database에 저장된 많은 자료들은 이미 유출 되었다고 보는 것이 맞을 것입니다.




현재 한국 인터넷의 상황은 매우 위험한 상황입니다. 연예기획사 뿐만 아니라 주요 언론 매체, 파일공유 사이트, 꽃배달, 부동산 사이트 등 다양한 분야에 걸쳐서 매우 위험한 악성코드가 유포되고 있어 장기적으로 영향을 주고 있습니다.


해당 웹 사이트가 해킹 당해서 악성코드를 유포하고 있는 상황인데 사용자들에게 해가 되는 악성코드를 유포한 책임이 없을까요?




여기 눈 여겨 보려하지 않고 외면 하고자 하는 불편한 진실이 있습니다. 이미 오래전 이야기지만 지금까지도 진행형이고 앞으로도 심각성이 더 높아질 수 밖에 없는 불편한 진실입니다. 아직도 많은 이들의 관심 밖에서 이뤄지는 현실이 여기있습니다.



안전한 웹 서비스로 가는 길은 멀고도 험합니다. 그러나 대부분이 쉽게 생각합니다. 공격자들은 항상 그 빈틈을 노리고 끊임없이 공격합니다. 일반 인터넷 사용자들은 자신의 아이디와 패스워드가 노출되어 금전적인 손실이 발생하거나 피해를 입었을 경우에만 민감하게 반응합니다.



개인 PC에 설치된 악성코드의 문제를 개인 사용자의 부주의로 돌리는 것은 잘못된 것입니다. 이제는 기본적인 보안 대책을 철저하게 실천한다해도 악성코드로부터 안전하지 않습니다. 제로데이 공격은 벤더사(MS, 오라클, 어도비 등)에서 패치를 해주기 전까지 개인 사용자들은 속수무책으로 당할 수 밖에 없습니다.





악성코드 감염 원인으로는 웹으로 유포, Active X 설치, 성인 동영상에 악성코드 은닉, 불법 소프트웨어 설치 등이 있지만 가장 위험한 것은 웹을 통해 대규모로 유포하고 있는 것입니다. 웹으로 인한 유포는 드라이브바이다운로드(Drive by download)로 홈페이지에 접속하기만 해도 악성코드에 감염이 되기 때문이죠.



어떤 접속 도구를 이용하던 웹 서핑을 하면서 자료를 확인하고 정보를 공유하는 지금의 시대에 안전한 상태로 개인 PC를 유지 하려면 인터넷을 하지 말아야 하는 수준입니다. 사용자 PC의 안전한 설정은 가능성을 조금 줄이는 옵션일 뿐입니다.



왜 이런 심각한 상황까지 전개가 된 것일까요? 이런 심각한 상황이 오게 된 근본 문제를 해결해야 되지 않을까요? 혹시 우리는 근본적인 문제에는 관심이 없고 다른 부가적인 것들에 관심을 가지고 있지 않았는지 고민해 봐야 할 시점입니다.








비용대비 효과




인간은 누구든지 적게 노력하고 큰 보상을 기대합니다. 마치 우리가 학교 시험을 보면서 비록 공부는 많이 못했지만 시험 점수는 높이 받고 싶은 것과 마찬가지 입니다. 공격자들도 공격하는 노력에 비해 많은 이익을 취하려 합니다. 그러한 이유로 다른 여러가지 악성코드 감염 방법중에서 좀비 PC를 가장 많이 확보할 수 있는 공격인 웹을 통한 악성코드 유포 방법을 사용하는 것입니다.







Figure 2 게임유저 VS 게임서버



그렇다면 왜 사용자들에게 악성코드를 유포할까요? 한 번에 돈을 관리하는 은행 서버를 해킹한다면 끝날텐데요? 서버를 공격하는 것은 기술적으로 굉장히 높은 레벨을 요구합니다. 그렇기 때문에 상대적으로 취약한 사용자들을 공격합니다.


공격자들은 처음에 웹 서버를 해킹하여 DB에서 얻은 개인정보들을 팔았습니다. 밑의 자료는 세계적 백신기업인 트렌드 마이크로 연구소에서 조사한 언더그라운드 마켓(지하 시장)에서 거래되는 개인정보의 가격입니다.







개인정보 지하시장 거래 금액



세계적 백신기업인 트렌드 마이크로 연구소 조사 결과, 언더 그라운드 마켓(지하 시장)에서 신용카드번호나 이메일과 SNS 계정 정보가 2011년 8월부터 2012년 1월에 걸쳐 각각 다음과 같은 금액으로 거래되고 있는 것으로 밝혀 졌습니다.

(Trendmicro가 2011년 8월 ~ 2012년 1월까지 집계하여 평균적인 가격을 산출하였다.)


신용카드 번호는 카드가 발행된 나라에 의해서 다소 차이가 있고 미국에서 발행된 카드는 다른 나라보다 가격이 싼 편입니다. 신용카드를 많이 사용하는 국민성과 소비 습관 때문에 신용카드가 많이 발행되고 있어 악용이나 유출하는 경우도 많을 것으로 생각됩니다.





Figure 3 신용카드번호/은행계좌 거래금액(1계정/US)




은행계좌정보는 온라인 뱅킹 비밀번호와 함께 판매되는 것이 일반적이지만, 직접적으로 금전의 불법 획득에 용이하고 금전을 주고 받는 데 이용할 수 있기 때문에 25~35달러로 카드번호보다 높은 가격으로 거래되고 있습니다.


이 은행계좌의 암시장 가격은 매년 낮아지고 있습니다. 2007년에는 50달러, 2010년에는 20~70달러로 대폭 가격이 떨어지고 있습니다. 왜냐하면 불법 액세스나 악성코드 감염에 의해 유출건수가 증가한 것이 영향일 것으로 생각합니다. 공급과 수요 곡선에서 공급이 많아지면 당연히 가격은 떨어지지요.






Figure 4 SNS 거래 금액(1계정/US)




Twitter보다 Facebook이 싼 것은 역시 수요와 공급의 문제로 생각하는 것이 좋습니다. 세계적으로 보면 Facebook 사용자수가 압도적으로 많아 결과적으로 계정을 착취 악용될 피해자의 수도 많게 되기 때문일 가능성이 높습니다.






Figure 5 웹메일 거래금액(1계정/US)





 

Gmail이 다른 메일보다 가격이 높은 것은, 메일만이 아니라 Google 서비스의 공통 패스워드로도 사용되고 있기 때문입니다. 스마트폰, 안드로이드, SNS인 Google+, 쇼핑이나 YouTube의 계정에도 이용될 수 있기 때문에 가격이 높을 수 있다고 추정할 수 있습니다.



암시장에서 거래되는 가격이 이렇게 싼 이유는 공격자들끼리의 거래에서 신뢰성이 없기 때문입니다. 이 정보들은 직접 금전 거래보다도 범죄 툴로써 사용되는 경우가 많습니다. 수요와 공급의 법칙으로 불법 프로그램이나 피싱 사이트에 의해 개인정보탈취, 사이트로부터 유출 등에 의해 암시장에 돌아다니는 개인정보의 절대량이 증가하고 있기 때문에 가격이 싸지는 것입니다.




 




Figure 6 수요공급의 법칙





위의 트렌드마이크로 자료에서 나타나는 바와 같이 개인정보의 절대량이 증가하고 있기 때문에 가격은 계속 낮아질 수 밖에 없습니다. 공격자들은 개인정보가 돈이 되지 않자 사용자 컴퓨터에 악성코드를 유포하는 방식으로 우회 공격을 하기 시작합니다. 


사용자 컴퓨터에는 좀 더 돈이 될 수 있는 정보들 즉, 인터넷 뱅킹, 게임 계정 등이 많습니다. 또한 서버를 공격하는 것보다는 사용자를 공격하는게 훨씬 쉽습니다. 사용자들 PC에는 방화벽이나 백신 등이 없거나 애플리케이션 최신 업데이트가 잘 되어 있지 않습니다. 사용자가 보안에 대해서 잘 모르는 것도 있고 애플리케이션을 최신 업데이트 하는게 귀찮기 때문에 잘 하지 않습니다.







웹 서버 해킹 방법



이제부터 공격자들이 대규모 악성코드 유포를 위한 웹 서버를 어떻게 해킹하는지 알아보겠습니다.
많은 공격 기법들이 있지만 웹 애플리케이션의 취약점으로는 OWASP(Open Web Application Security Project) Top 10 통계를 자주 사용합니다. 




Figure 7 웹 서버 해킹 방법(OWASP Top10)




이 글에서 OWASP Top10의 모든 것을 설명할 수는 없습니다만 가장 위험한 것중의 하나인 Injection을 설명 드리겠습니다.

SQL은 Structure Query Language로써 DB(Database, 공유할 목적으로 통합 관리되는 데이터)를 조작할 수 있는 언어입니다. DB를 조작할 수 있기 때문에 SQL 구문에 해박하다면 DB 내용을 유출할 수 있습니다.

간단하게 말씀 드려 DB에 직접 인자를 전달하는 웹 코딩에 있어서 이 인자값에 대해 정확한 값인지 검사를 하지 않는다면 DB에 직접 명령을 내릴 수 있습니다.







Figure 8 Database 공격으로 인한 개인정보 유출







Figure 9 악성코드 유포의 의미중 DB 권한 탈취로 인한 개인정보 유출




DB는 Database로써, 여러 응용 시스템들의 정보들을 저장하여 운영할 수 있는 데이터들의 묶음입니다. 즉, 내 개인정보, 캐릭터 정보들이 저장되어 있는 공간입니다. 이곳이 해킹 당한다면 내 정보들은 해커의 손아귀에 들어가게 됩니다.


악성코드가 바이러스 제품에 탐지되고 탐지되지 않는 것이 중요한 문제가 아닙니다. 이건 차후적인 문제입니다. 어떻게 해서 그 웹소스에 악성링크가 들어갈 수 있는지가 가장 중요한 관점이 되어야 하지 않을까요?






Figure 10 인자값의 종류(짜장면, 짬뽕)





 

인자값이란 음식이란 종류에 들어갈 수 있는 값입니다. 여기에는 짜장면, 짬뽕, 닭도리탕, 청국장 등이 들어갈 수 있겠지요. 여기에 음식이란 종류인지 최종적으로 확인을 해야 되는데 확인을 하지 않아서 문제가 생기는 것입니다. 예를 들어 인자값에 ‘나 너 해킹할 거야’, ‘바보ㅋㅋ 너 해킹 당했다’ 등이 들어온다면 음식의 종류가 아니므로 걸러내야 하는데 그러지 못하기 때문에 해킹을 당하는 것입니다.




 

 

Figure 11 URL 구조

 





예를 들어 이 글을 입력하는 URL(Uniform Resource Locator, 인터넷의 자원을 구별할 수 있는 유일한 주소)을 보면 다음과 같습니다. 

//www.facebook.com/bitscan/notice=page&second=injection






Figure 12 변수의 의미





 

웹소스 상에 SQL 구문에 사용자에게 받은 변수가 그대로 사용이 됩니다. 변수라는 것은 마법사가 주문을 다르게 말할 때마다 모자 속에서 토끼, 비둘기 등이 무작위로 나오는 모자처럼 계속 변하는 것이 들어있는 공간입니다. 



SELECT id, url, page FROM page_table 

where notice=page and second=injection

notice변수의 값에page가 아닌 다른 위험한 것이(DB 유출할 수 있는 명령, ‘넌 해킹 당했어 ㅋ’등) 오게 된다면 어떻게 될까요?



간단한 명령으로 웹서버는 권한을 장악당해 해킹당할 수 있습니다. 그러므로 notice변수의 값을 SQL 구문에 넣기 전에 한 번쯤 갈때기에 넣고 정확한 값만 들어갈 수 있도록 걸러줘야 됩니다. 사용자에게 오는 정보는 변조됐을 수도 있기 때문에 신뢰할 수 없습니다. 꼭 믿을만한 도구로 확인을 해야 합니다.







 


Figure 13 Validation Check(입력값 검증)




notice라는 변수값이 영문자로만 이루어졌는지 검증을 해야 하는데 SQL Injection에 취약한 웹 소스코드는 검증을 하지 않습니다. 그래서 SQL 구문해 해박한 해커들에 의해 Database의 정보들이 유출되는 것입니다.





웹서버 공격 유형 (전문가를 위한 내용이므로 읽지 않으셔도 무방합니다.)
이제 SQL Injection의 원리를 알았으니 SQL Injection에 취약한 서버를 어떻게 찾아내는지(공격 유형) 알아보겠습니다.
많은 공격 방법들이 있지만 많이 그중에서 많이 쓰이는 것중의 하나가 Google을 이용한 방법입니다. 먼저 Google을 이용한 SQL 취약한 서버를 선정합니다.

 


Figure 14 Google 검색을 이용한 공격 방법




 

asp로(inurl) 되어있는 페이지를 찾습니다. 수 많은 검색 결과가 나올 것을 대비해 해당 공격하기 위한 타겟 사이트로 검색 결과를 한정합니다. 이 중에서 MSSQL DB 에러를 검색 합니다. 그렇게 된다면 최종적으로 asp를 사용하는 타겟 사이트 중에서 MSSQL DB 에러가 난 항목들만 검색할 수 있습니다.


• inurl: .asp site:target.com -> asp 사용하는 DB 확인

• site: target.com 80040e14 -> MSSQL DB 에러 검색 등

• 이외에 다양한 방법으로 공격 대상을 찾습니다.

• www.target.com/vuln.asp?idx=1&cd=1234 등과 같은 링크 찾는 용도로도 사용됨


이제 이런 취약한 링크들을 찾았다면 공격 조건에 합당한지 확인을 할 수 있습니다. 


• Ex) www.target.com/vuln.asp?idx=1&cd=1234 여기에서 인자는 두 개를 지니고 있다. idx, cd 두 개의 인자를 가지고 있으며 이 인자 각각에 대한 입력값 검증(Input validation) 검사 수행

• www.target.com/vuln.asp?idx=1’ or www.target.com/vuln.asp?idx=1 and 등의 문자(SQL 조작 명령어, DB의 정보를 유출 위험)를 입력하였을 경우 HTTP 500 에러(서버측에서 오류가 난 것으로 판단)가 발생하면 공격 대상 선정


 


 

 


Figure 15 Application Attack(SQL Injection) 흐름도

 



공격 조건에 합당하다면 하나하나 손으로 할 것이 아니라 자동화된 툴을 이용한 공격을 사용합니다.
HTTP 500 에러 및 Unclosed quotation mark 에러가 보여지게 될 경우 SQL Injection 공격에 매우 취약한 것으로 판정할 수 있으며 자동화된 툴을 이용하여 DB 계정 및 테이블 명 획득이 가능하고 sysadm일 경우 테이블 생성 후 임의의 명령 실행이 가능합니다. 즉, DB를 좌지우지 할 수 있다는 뜻입니다.

공격자들의 판매 사이트에 올려진 자동화된 도구의 테스트 버전 입니다. 입력값 검증이 되지 않는 한 인자(여기서는 sid) 값에 대해 자동화된 query를 보내어 사용자 정보 및 DB 정보를 획득할 수 있습니다.


 


Figure 16 자동화된 도구의 테스트 버전




Database의 권한 획득 이후 DB 테이블 생성을 통한 Web Shell 실행 가능하고 소스코드 변조 및 추가가 가능한 상태입니다.



 

 


Figure 17 Web Shell




 


Figure 18 SQL Injection 공격 코드 Example - 1



 


 

Figure 19 SQL Injection 공격 코드 Example - 2




 


Figure 20 공격 툴을 이용한 공격 Example - 1




 


Figure 21 공격 툴을 이용한 공격 Example - 2


 



이러한 SQL Injection 공격에 대한 대책으로는 크게 2가지가 있습니다. 먼저 DB Query에 변수로 사용되는 모든 인자에 대해 입력값 검증이 수행 되어야 합니다. 밑에서 언급하는 것들은 SQL 구문으로 DB를 조작할 수 있는 것을 사전에 방지하기 위한 것들입니다. 소스코드 단계에서 수정하는 단계가 있으며 웹에서 Validation Check(입력값 검증)하는 스캐너가 있습니다.

• Semi colon(;)과 double dash(—) 제거
• 정수이여야만 하는 입력값에 대해 정수값 여부 체크
• 길이 체크 : DB 컬럼의 크기와 같거나 작은지 체크
• ‘,<,>,;,— 와 같은 Validation Checking Program(입력값 검증 프로그램)의 사용 및 주기적 점검 필요

또 한가지는 DB의 권한 축소 및 불필요한 Stored Procedure(저장 프로시저) 제거를 해야 합니다.

• Db_owner 권한의 제거가 필요하며 일반 user 권한 부여 필요함(데이터의 보기는 가능하나 시스템 명령어 실행은 불가능하도록)
- Xp_cmdshell, xp_dirtree, xp_regdeletekey, xp_regenumvalues, xp_regread, xp_regwrite, sp_makewebtask, sp_adduser, …

지금까지 SQL Injection 공격 기법에 대해서 기초적인 원리부터 공격 도구까지 알아 보았습니다. 이러한 공격 방법으로 웹 서비스에 악성링크를 삽입합니다. 



 


 

Figure 22 연예기획사 웹 사이트에 삽입된 악성링크









결론



Figure 23 국내 보안 현실




 

현재 국내 보안의 현실을 이 만화보다 더욱 잘 표현한 것은 없다고 생각합니다. 공격자들의 목적은 금전적 이득입니다. 이들은 중앙일보 메인 홈페이지를 변조한 해커들과는 다른 양상을 띄고 있습니다. 소리 소문없이 금전적인 이득을 취하는 이들이야말로 우리들이 막아야 할 얼굴없는 침입자들이 아닐까요?




본 기획기사는 3부, Know your Enemy - Use(악성코드를 유포하고 어떻게 정보들을 악용하는지)에 대한 주제로 이어집니다


 






 

  • [니해알] 니들이 해킹을 알어? - 1부

  • [니해알] 니들이 해킹을 알어? - 2부

  • [니해알] 니들이 해킹을 알어? - 3부