오늘 팀 동료를 통해 bash 취약점이 있다는 내용을 들었고, cnet.com 링크를 통해 확인할 수 있다.

bash 보안 취약성 패치하기

제가 배치한 버전은 bash 4.3.25 (이 버전의 패치 코드 25개) 이며, 이 버그는 원격 코드 실행 버그로 매우 위협적인 버그이다.

맥에서는 당시(2014–09–26) MacPort, Homebrew 에서 패치 버전을 제공하지 않는 관계로, 직접 소스 코드를 컴파일 하는 방법으로 해결하였다.

최신 bash 버전으로 패치하고 컴파일 하는 스크립트 코드를 필자의 github 에 커밋하였다.
- https://github.com/powerumc/Patch-Bash-Vulnerability

맥/리눅스 에서 아래의 명령을 실행하면 바로 패치 하도록 했다.

curl https://raw.githubusercontent.com/powerumc/Patch-Bash-Vulnerability/master/patch-bash-4.3.25.sh | sh

참고 (버그 내용)

bash 원격 코드 실행 취약성

쉘에서 아래의 명령을 실행하여 echo 메시지가 확인되면 원격 실행 코드 버그가 있는 버전입니다.

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

코드 실행 결과 (원격 코드 실행 가능한 취약성)

vulnerable
echo this is a test

패치 후 원격 코드 실행 불가능

패치가 완료되면 원격가 실행되지 않는다.

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

코드 실행 결과

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for \`x'
this is a test


Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 이반린 2014.09.29 10:59 Address Modify/Delete Reply

    안녕하세요. 서버관리자 입니다. 제가 관리하는 서버가 BASH 취약점이 있는데요.
    외부적으로 포트를 열수가 없어서 수동으로 bash 쉘을 패치해야 하는데
    어떻게 해야 하는지 알려주시면 감사하겠습니다.
    부탁드립니다.

  2. 123124124 2014.09.29 14:59 Address Modify/Delete Reply

    RedHat, CentOS 일 경우
    rpm -Uvh bash............. 하시면 되요

  3. 최혁선 2014.09.29 15:42 Address Modify/Delete Reply

    안녕하세요. 영문페이지로가서 그대로 설치하였더니.....
    $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" 명령어를 입력하면 결과에
    sh: error importing function definition for `BASH_FUNC_module()'
    위에 오류가 납니다.. 모듈이 Import되어 있지 않다고 나오는것 같은데. 혹시 이런 증상 해결 방법이 있을까요? 쉘스크립트가 정상적으로 실행이 되는지 테스트 해봐야겠네요..

전 세계 인터넷은 OpenSSL의 중대한 버그로 난리다. 이 버그의 주요 요지는 특정 OpenSSL을 사용할 경우 메모리의 64KB를 획득할 수 있고, 이 버그로 서버 인증서의 비밀키(개인키)를 취득하여 서버로 오가는 모든 패킷을 취득할 수 있다. 라는 것인데, 이를 가리켜 Heartbleed(심장출혈) 버그라고 한다.

그 만큼 심각한 버그가 맞는데, 일각의 미디어에서 최악의 시나리오를 너무 일반화시키는 것이 아닌가 싶다.

필자가 보안 전문가는 아닌 만큼 잘못된 부분은 너그러이 지적해 주길 바란다.

- 사용자는 모두 패스워드를 변경해야 하나?

해도 되고 안해도 된다. 어차피 개인정보는 오픈소스. :)

농담이고, 취약성이 있는 OpenSSL을 사용하면 공격자는 클라이언트의 사용자 요청 데이터를 가로챌 수 있다.

공격자가 사용자의 패스워드를 가로채려면, 서버 인증서의 비밀키를 취득한 경우에 해당 된다. 하지만 heartbleed 버그는 인증서의 비밀키가 없이도 서버의 메모리 최대 64KB를 볼 수 있다. 모든 데이터를 가로채는 것은 아니고 64KB에 해당하는 찌꺼기(?) 영역인데, 이 영역에 마지막 클라이언트의 요청 데이터가 저장되어 있다.

그러므로 자주 방문하는 사이트면 비밀번호를 변경하는 것이 좋고, 1년 넘게 방문하지 않은 사이트는 변경하지 않아도 된다.

- 서버 운영자는 인증서를 모두 폐기해야 하나?

취약한 버전의 OpenSSL을 사용하고, 최근 서버를 restart 한 경우가 아니라면 거의 제로(0)에 가깝다.

공격자가 64KB 중에서 인증서의 비밀키를 훔치기 위해서는 대상 서버를 재가동하고 첫 번째 요청인 경우에 이 비밀키를 훔쳐갈 수 있는 가능성이 높아진다고 한다. 이는 Answering the Critical Question: Can You Get Private SSL Keys Using Heartbleed? 에서 실험한 결과이다.

- OpenSSL 업그레이드가 불가능할 경우

소스 코드를 보면 곳곳에 아래와 같이 #ifndef OPENSSL_NO_HEARTBEATS 지시자를 발견 할 수 있다. 그러므로 OpenSSL 을 OPENSSL_NO_HEARTBEATS 옵션과 함께 다시 컴파일 하면 heartbleed 취약성 버그를 해결할 수 있다.

#ifndef OPENSSL_NO_HEARTBEATS  
int  
tls1_process_heartbeat(SSL *s) {  
...  
...  
}  

int  
tls1_heartbeat(SSL *s) {  
...  
...  
}  
#endif  

- OpenSSL 코드 품질

Heartbleed 취약성 버그가 해결된 7e840163 커밋을 살펴보면, 아직도 여전히 코드 리뷰를 통해 이슈가 남아있다.

코드 측면에서 변수의 이름이 'payload 는 payload_length 가 되어야 하지 않느냐' 라는 의견이 있다. 그리고 padding 값이 16으로 초기화가 되었음에도 곳곳에 하드 코딩된 '16' 값을 찾아볼 수 있다.

가장 최신 커밋에는 코드 리뷰가 완료되었는 지 모르겠으나, 당시 취약성 버그로 상당히 급하게 코드를 수정한 것 같다는 느낌을 받을 수 있었다.

OpenSSL 디버깅

Heartbeat 프로토콜 Heartbeat network, Linux-HA에서 알 수 있듯이 클러스터링(clustering) 및 고가용성(high-availability linux)을 위해 서버끼리 주고 받는 메시지라고 한다. active, standby 서버 두 대 중 active 서버가 죽으면 standby 가 가동되어 장애를 최소화 하는데, 이 때 ‘죽었니 살았니’ 빼꼼 찔러보는 걸 heartbeat 라고 한다고 한다.

실제 필자의 클라우드 서버에서 테스트를 진행하려고 했으나 여건이 되지 않아 실제 환경과 유사하게 테스트는 하지 못했다.

먼저, github의 OpenSSL 소스 코드를 받고, 버그가 있는 tag 및 branch를 checkout 한다. 이어 디버그 모드로 컴파일을 하면 테스트 준비는 완료된다. 그리고 heartbeat 패킷을 보내줄 수 있는 github의 pacemaker 클라이언트 코드를 받는다.

호스팅된 openssl, lldb attaching

디버그 모드로 컴파일된 openssl 을 self-hosting으로 실행한다.

$ lldb openssl s_server -www  

그리고 openssl/ssl/t1_lib.c 소스 코드의 tls1_process_heartbeat 함수에 브레이크 포인트를 걸었다.

(lldb) br list  
Current breakpoints:  
1: name = 'tls1_process_heartbeat', locations = 1, resolved = 1, hit count = 3  
  1.1: where = openssl`tls1_process_heartbeat + 21 at t1_lib.c:2484, address = 0x000aff55, resolved, hit count = 3  

이제 pacemarker 를 통해 heartbeat를 보냈다.

$ ./heartbleed.py -p 4433 -t 100000 localhost  

t1_lib.c 로컬 변수

다음의 코드 중 &s->s3->rrec.data[0]는 incoming 데이터가 포함 된다.

int  
tls1_process_heartbeat(SSL *s)  
    {  
    unsigned char *p = &s->s3->rrec.data[0], *pl;  
    unsigned short hbtype;  
    unsigned int payload;  
    unsigned int padding = 16; /* Use minimum padding */  

함수의 매개변수로 SSL *s 구조체의 s3 구조체의 데이터는 다음과 같다. s3->rrec가 클라이언트에서 보낸 데이터가 되겠다. 이 구조체는 다음과 같은 값을 가지고 있다.

(lldb) e *s->s3  
(ssl3_state_st) $58 = {  
  flags = 0  
  delay_buf_pop_ret = 0  
  read_sequence = ""  
  read_mac_secret_size = 0  
  read_mac_secret = ""  
  write_sequence = ""  
  write_mac_secret_size = 0  
  write_mac_secret = ""  
  server_random = "SN\x91ki��E\x82V\x01%E\v[t�7�\x91\x88\x9e[�\x8af\x95\x92iU"  
  client_random = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"  
  need_empty_fragments = 0  
  empty_fragment_done = 0  
  init_extra = 0  
  rbuf = (buf = "\x16\x03\x01\x18\x03\x01", len = 17736, offset = 11, left = 0)  
  wbuf = (buf = "", len = 17584, offset = 12, left = 0)  
  rrec = (type = 24, length = 3, off = 0, data = "\x01��|\x03\x01BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", input = "\x01��|\x03\x01BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", comp = 0x00000000, epoch = 0, seq_num = "")  
  wrec = (type = 22, length = 9, off = 0, data = "\x0e", input = "\x0e", comp = 0x00000000, epoch = 0, seq_num = "")  
  alert_fragment = ""  
  alert_fragment_len = 0  
  handshake_fragment = ""  
  handshake_fragment_len = 0  
  wnum = 0  
  wpend_tot = 4  
  wpend_type = 22  
  wpend_ret = 4  
  wpend_buf = 0x0236c800 "\x0e"  
  handshake_buffer = 0x00000000  
  handshake_dgst = 0x007071e0  
  change_cipher_spec = 0  
  warn_alert = 0  
  fatal_alert = 0  
  alert_dispatch = 0  
  send_alert = ""  
  renegotiate = 0  
  total_renegotiations = 0  
  num_renegotiations = 0  
  in_read_app_data = 0  
  client_opaque_prf_input = 0x00000000  
  client_opaque_prf_input_len = 0  
  server_opaque_prf_input = 0x00000000  
  server_opaque_prf_input_len = 0  
  tmp = {
    cert_verify_md = ""
    finish_md = ""
    finish_md_len = 0
    peer_finish_md = ""
    peer_finish_md_len = 0
    message_size = 124
    message_type = 1
    new_cipher = 0x002ca8d0
    dh = 0x00000000
    ecdh = 0x00706dc0
    next_state = 8576
    reuse_message = 0
    cert_req = 0
    ctype_num = 0
    ctype = ""
    ca_names = 0x00000000
    use_rsa_tmp = 0
    key_block_length = 0
    key_block = 0x00000000
    new_sym_enc = 0x00000000
    new_hash = 0x00000000
    new_mac_pkey_type = 0
    new_mac_secret_size = 0
    new_compression = 0x00000000
    cert_request = 0  
  }  
  previous_client_finished = ""  
  previous_client_finished_len = '\0'  
  previous_server_finished = ""  
  previous_server_finished_len = '\0'  
  send_connection_binding = 0  
  next_proto_neg_seen = 0  
}  

openssl 코드에서 2491: n2s(p, payload);가 클라이언트에서 요청한 payload 인데 이 값은 다음과 같다.

(lldb) fr v payload  
(unsigned int) payload = 65517  

실제 요청된 값과 길이를 체크하지 않은 채 아래와 같이 바로 메모리를 할당하게 되는데

   2505          * message type, plus 2 bytes payload length, plus
   2506          * payload, plus padding
   2507          */  
-> 2508         buffer = OPENSSL_malloc(1 + 2 + payload + padding);
   2509         bp = buffer;
   2510
   2511         /* Enter response type, length and copy payload */  

아래의 코드의 함수가 실행되면서, 위에서 할당된 메모리의 65536 bytes (=1+2+payload+padding) 를 buffer에 쓰면서 클라이언트로 64KB 의 over-read 된 메모리의 데이터까지 클라이언트에 response 된다.

   2516         /* Random padding */
   2517         RAND_pseudo_bytes(bp, padding);
   2518  
-> 2519         r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
   2520
   2521         if (r >= 0 && s->msg_callback)
   2522             s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,  
(lldb) fr v
(SSL *) s = 0x00469c10
(unsigned char *) p = 0x012f8a0b "|\x03\x01BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
(unsigned char *) pl = 0x012f8a0b "|\x03\x01BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
(unsigned short) hbtype = 1
(unsigned int) payload = 65517
(unsigned int) padding = 16
(unsigned char *) buffer = 0x01301600 "\x02��|\x03\x01BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
(unsigned char *) bp = 0x01301603 "|\x03\x01BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
(int) r = -1

메모리가 확보되는 buffer = OPENSSL_malloc(...)는 함수부 선언의 unsigned char *p = &s->s3->rrec.data[0]&p 메모리 위치 근처에(&p 주소보다 더 높은 주소) 확보가 된다. 위에서 &p는 incoming 데이터가 있다고 언급했다.

그러므로 heartbeat의 response의 값은 가장 최근에 남아 있는 incoming 데이터, 즉 클라이언트 요청 데이터의 찌꺼기가 남아있는데, over-read 버그로 인해 이 영역의 사용자 요청 데이터가 전송되게 된다.

이렇게 공격자가 훔친 데이터는 아래와 같이 클라이언트 요청 정보가 포함된다. 일반적으로 클라이언트가 서버로 요청하는 정보는 HTTP 프로토콜에 포함되는 URI, Header, Cookie 등을 가로챌 수 있다.

아래는 64KB 범위 안에서 클라이언트가 보낸 incoming 찌꺼기가 남은 64KB 메모리 값의 일부분이다.

(lldb) m r p --count 250  
0x0237300b: 7c 03 01 42 42 42 42 42 42 42 42 42 42 42 42 42  |..BBBBBBBBBBBBB  
0x0237301b: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42  BBBBBBBBBBBBBBBB  
0x0237302b: 42 42 42 00 00 4e c0 30 c0 28 c0 14 00 9f 00 6b  BBB..N�0�(�....k  
0x0237303b: 00 39 00 88 c0 32 c0 2e c0 2a c0 26 c0 0f c0 05  .9..�2�.�*�&�.�.  
0x0237304b: 00 9d 00 3d 00 35 00 84 c0 12 00 16 c0 0d c0 03  ...=.5..�...�.�.  
0x0237305b: 00 0a c0 2f c0 27 c0 13 00 9e 00 67 00 33 00 45  ..�/�'�....g.3.E  
0x0237306b: c0 31 c0 2d c0 29 c0 25 c0 0e c0 04 00 9c 00 3c  �1�-�)�%�.�....<  
0x0237307b: 00 2f 00 41 01 00 00 05 00 0f 00 01 01 2f 32 30  ./.A........./20  
0x0237308b: 31 30 30 31 30 31 20 46 69 72 65 66 6f 78 2f 32  100101 Firefox/2  
0x0237309b: 38 2e 30 0d 0a 41 63 63 65 70 74 3a 20 74 65 78  8.0..Accept: tex  
0x023730ab: 74 2f 68 74 6d 6c 2c 61 70 70 6c 69 63 61 74 69  t/html,applicati  
0x023730bb: 6f 6e 2f 78 68 74 6d 6c 2b 78 6d 6c 2c 61 70 70  on/xhtml+xml,app  
0x023730cb: 6c 69 63 61 74 69 6f 6e 2f 78 6d 6c 3b 71 3d 30  lication/xml;q=0  
0x023730db: 2e 39 2c 2a 2f 2a 3b 71 3d 30 2e 38 0d 0a 41 63  .9,*/*;q=0.8..Ac  
0x023730eb: 63 65 70 74 2d 4c 61 6e 67 75 61 67 65 3a 20 6b  cept-Language: k  
0x023730fb: 6f 2d 6b 72 2c 6b 6f 3b 71 3d                    o-kr,ko;q=


Posted by 땡초 POWERUMC

댓글을 달아 주세요

[보안] 각종 보안 소프트웨어 우회 방법과 개인 정보 보호

개인의 보안 유출은 누구의 책임?

각종 엑티브 엑스(ActiveX)를 아무리 욕해도 분명 여러분은 은행권 등의 보안 엑티브 엑스(ActiveX)의 덕을 많이 봤으리라 믿는다. 엑티브 엑스를 옹호하는 것은 아니지만, 당장 이 개인 정보 보호 수단을 철회하면 훨씬 쉽게 여러분이 입력하는 키보드 문자를 엿볼 수 있고, 세션 타임 아웃 전에 당신의 쿠키를 취득하여 방문한 웹 사이트에 로그인 할 수도 있다. 그리고 보안에 취약한 옛날 브라우저를 사용한다는 이유로 특정 웹 사이트에 방문하는 순간 당신의 보안 정보를 외부로 보내 취득할 수 있다. (예를 들어, XSS-사이트 간 스크립트[1])

은행은 통상적으로 자신이 비밀번호를 외부에 직/간접적으로 알렸을 때, 여러분의 계좌에서 사고가 발생하면 은행은 책임지지 않아도 되는 면책권이 있다. 만약, 은행권 또는 결제시 필요한 엑티브 엑스를 전부 제거되었을 때, 여러분의 정보를 더 쉽게 뺄 수 있는데 이 때 발생하는 금융 사고는 누구 책임일까? 여러분이 직접 개인 보안 정보를 알리지 않았어도, 어쩔 수 없이 당해야 하는 백도어/악성코드 등으로 여러분의 PC가 외부로 보안 정보를 알린 것과 다름이 없다. 여러분의 PC의 문제는 누구도 아닌 여러분의 책임이 될 수 있을 것이다.

간혹 이런 문제로 외국의 사례와 PayPal 사이트를 언급되기도 하는데, 알라딘의 엑티브 엑스 없는 결제에서도 알 수 있듯이 모든 카드사가 이 서비스에서 이탈했다고 한다. 외국의 좋은 사례도 많지만, 사회적으로 긍정적인 합의가 먼저 이루어져야 대안이 나올 것이고, 실제 현실에 맞는 방안이 마련될 것이라고 믿는다.

아무튼 개인 정보가 중요하다는 것으로 이 글을 시작한다.


[이미지 출처] paypal hacker escaped jail

간단하게 해킹하는 방법을 알려 주겠다.

필자는 오늘 여러 분에게 매우 간단한 해킹 방법을 하나 가르쳐 주겠다. 일반인도 따라할 만큼 매우 쉬운 방법이다. '콜롬버스는 깨뜨리지 않고 달걀을 세우는 것' 처럼 방법만 알면 누구나 할 수 있는 해킹이다. (아마 ‘해킹’ 취급도 받지 못할지도...)

필자가 알고 있는 해킹[2] 방법 중 가장 기술적인 난이도가 낮은 방법이다. 보안에 예민한 곳이라면 이런 우회적인 방법도 있다는 것을 알려주기 위한 목적도 있다. 물론 여러분은 이런 방법을 악의적으로 사용해서는 안된다. 어설픈 해킹은 나를 추적할 수 있는 실마리를 많이 남기기 때문이다. 독자들은 ‘이런 방법도 있네?’ 정도로 봐주시면 좋겠고, 근본적으로 보안 의식을 강화하는 것에 의의를 두길 바란다.

2010년도에 필자가 실전에 사용할 수 있는 ‘해킹’ 동영상 강좌를 오픈 했는데, 사용 용도가 충분히 사회적인 파장을 일으킬 수 있을 거라 판단하여 동영상 연재를 계속 이어가지 못하고 중단한 바 있다. 그 아티클에 대한 자세한 링크는 꼬릿말[3]을 클릭해 보기 바란다.

생뚱맞고 주제넘게 왠 해킹...? 이라 생각할 것 같아서, 대단한 수준은 아니었지만 필자의 해킹(? 1990년대 '해킹’의 통상적인 의미를 일컬음) 이력을 간단히 소개하겠다. 지금의 컴퓨팅 파워와 시대와 기술이 뒤떨어지던 때라는 점도 감안하기 바란다.

  • 각종 사설 BBS[4] 관리자 권한 획득 해킹 (호롱불 보안 취약점 이용)
  • 다수의 쉐어웨어[5] 소프트웨어 크랙[6]
  • 다수의 게임 소프트웨어 크랙
  • 백도어 개발
  • 크랙 및 백도어 배포(응?)
  • 월간 잡지 ‘마이컴’ 에 일부 내용을 몇 차례 기고

필자는 어려서부터 해킹에 관심이 많았다. 초등/중학교 시절에 전화기 선을 연결하여 PC 통신 하던 시절에 집에서 호스팅 할 수 있는 '사설 BBS’의 역어셈블리 코드를 분석하여 취약점을 공격하는 방법으로 해킹을 실행해 보고, 또 백도어를 직접 만들어 심어보기도 했다. 필자가 초딩 때라 가능했던 무 개념한 행동이었을 것이다.

’크래킹’ 이라고 해서 게임이나 쉐어웨어 소프트웨어의 사용 제한을 영구적으로 풀어 이를 크랙 파일로 만들어 배포해왔다. '삼국지 3, 4', '프린세스 메이커' 등 게임을 실행하면 암호표를 보고 매번 바뀌는 비밀번호를 입력하는 방식인데, 이 암호표 자체를 무력화 시켰다. 비밀번호를 아무렇게 입력해도 올바른 입력으로 간주하거나 아예 암호 입력 루틴을 점프해서 바로 게임을 시작하도록 할 수 도 있다. 그 이후 '삼국지 시리즈’는 내부적으로 방어 코드가 상당히 늘어나 난이도가 점점 높아지면서 결국 크랙킹에 손을 땠다.

실전 해킹, USB 보안 소프트웨어 무력화 하기 (우회하기)

'USB 보안 소프트웨어'는 컴퓨터에 달린 USB 포트를 이용해서 사용자가 USB에 데이터를 저장하지 못하게 하여 정보 유출을 막기 위한 소프트웨어이다. 필자가 다니던 곳에서는 USB 읽기만 가능하고 보안 소프트웨어가 쓰기를 제한했다. 필자가 과거에 수행한 모 반도체 프로젝트에서는 반입되는 모든 장비의 USB 포트를 스티커로 막아 놓는다. 혹여 스티커를 한 번 뗐다 붙이면 티가 많이 나는 스티커를 쓰므로 장비를 반출할 때 보안 점검에 반출을 제지 당하게 된다.

요즘은 보안 소프트웨어의 기술력도 높아서 직접 이걸 깨부스고 싶지만 그러기엔 만만치 않다. 그래서 필자는 주로 직접 해킹하는 대신 우회 방법을 찾는다. 이 방법도 USB 보안 소프트웨어를 우회하기 위해 여러 시도 끝에 알게된 방법 중 하나 이다.

1. 제한 사항

최근 USB 보안 소프트웨어는 윈도우 운영 체제를 부팅 할 때, 유저 모드(UserMode), 안전 모드(SafeMode)[7]를 막론하고 작동한다. 그래서 안전 모드로 부팅 해도 보안 소프트웨어가 작동한다. 또, 파일을 강제로 삭제하거나 소프트웨어를 제거 하는 것도 불가능 하다.

  • 안전 모드에서도 보안 소프트웨어가 작동함
  • 정상적인/비정상적인 방법으로 보안 소프트웨어의 파일 삭제가 불가능
  • 필자는 윈도우 7 운영 체제가 설치된 컴퓨터를 사용하였음

필자는 이 글을 쓰는 시점에 윈도우 운영체제를 구동할 수 있는 개인 PC가 없다. 아니 윈도우를 쓰지 않기 때문에 다른 사람이 올린 이미지를 사용하였다. 글에 첨부된 이미지는 Creative Common 허가 조건에 상응하는 범위 내에서 사용한다.

2. 사전 준비물

없다. 전혀...

3. 본격 시작

다음의 순서대로 따라하면 USB 보안 소프트웨어 뿐만 아니라 모든 보안 소프트웨어를 우회하여 어떤 제약도 받지 않는다. 너무 간단하다고 비웃을 수 있으나 악의적으로 이용하려고 마음 먹으면 PC에 설치된 모든 보안 소프트웨어를 우회하므로 상당히 강력한 효과를 볼 수 있다.

  1. 복구 모드로 부팅
    윈도우 7 이하 버전은 부팅 시 F8을 눌러 복구 모드로 진입할 수 있다. 윈도우 8의 경우 SHIFT 키를 누른 채로 ‘다시 시작’ 버튼을 클릭해야 한다. (단, 윈도우 8에서는 테스트하지 않음)


    [이미지 출처] Creative Common 표기에 따라 저작권 표시/상업적 이용 불가/콘텐트 변경 불가

  2. 명령 프롬프트 선택
    명령 프롬프트를 선택하면 어떤 보안 소프트웨어도 로드되지 않는 명령 프롬프트가 시작된다. USB, CD-ROM 장치가 사용 가능한 경우 여기에 접근이 가능하다. 보안 프로그램으로 복사가 제한된 파일이 있다면 이제 원하는 파일을 USB로 복사하면 된다.


    [이미지 출처] Creative Common 표기에 따라 저작권 표시/상업적 이용 불가/콘텐트 변경 불가

이제 명령 프롬프트를 이용해서 원하는 작업을 진행하면 된다. 보통 보안 소프트웨어는 스스로 구동에 필요한 파일을 제거하지 못하게 보호한다. 이 파일들을 의도적으로 지우려고 하면 정책에 따라 보안 관리자에게 알림이 갈 수도 있다. 그래서 이 보안 소프트웨어를 제거할 방법이 없다. 하지만, 이 명령 프롬프트에서 보안 소프트웨어를 지우면 된다. 운영체제를 재부팅하면 보안 소프트웨어가 완전히 제거된 상태이므로 보안 소프트웨어에 전혀 영향을 받지 않는다.

결론

지금까지 보안 소프트웨어를 완전히 우회하는 방법을 소개하였다. 해킹이라고 말하기에 기술적으로 매우 낮은 수준이지만, 이 방법을 악의적으로 이용한다면 아마도 ‘해킹’ 이라고 불러야 할 것이다. 최근의 보안 정보의 유출은 외부에 의한 공격보다 내부에 의해 일어나는 사고가 증가하고 있다. 정보가 DRM에 걸려 있다면 화면을 갈무리(Capture)해서 이미지 파일로 만들어서 유출해도 되겠다. 화면 갈무리를 보안 소프트웨어가 차단한다 해도 역시 우회 할 수 있는 방법은 여전히 많다.

필자가 하고 싶은 말은 "개인 정보는 자신이 지켜야 한다". 

이런 방법으로 내부인이 당신의 PC에 중요한 파일을 유출할 수 있으니, 최대한 운영체제가 권장하는 보안 수준을 준수하기 바란다. 특히 개발자들은 개발 편의를 위해 대부분의 보안 상태를 낮추게 되는데, 대부분의 개발자 PC가 가장 허술한 상태일 가능성이 높다. 혹시나 텍스트 파일이나 안전하지 못한 메모 프로그램을 사용하여 서버/데이터베이스 등에 접근할 수 있는 보안 정보를 절대 저장해 두지 말기 바란다. 여러분의 가족 사진이나 여자/남자 친구와의 낭만적이고 비밀스런 사진들도 여러분이 잘 관리해야 할 것이다.

여러분의 개인 PC를 지키는 것 역시 여러분의 몫이다.

  • 운영체제가 권장하는 보안 수준을 반드시 이행할 것 (방화벽 또는 보안 업데이트 등)
  • PC에 중요한 파일을 절대 저장해 놓지 말 것
  • 검증되지 않거나 회사에서 허가하지 않은 소프트웨어를 절대 사용하지 말 것
  • 로컬에 캐시를 만드는 클라우드 서비스에 중요 정보를 저장하지 말 것 (에버노트, 드롭박스 등)
  • 사용자 로그인 계정에 절대로 관리자 권한을 주지 말 것
  • 문서 등은 운영체제가 권장하는 폴더 하위에 저장할 것
  • 각종 소프트웨어와 웹 브라우저는 최신 버전을 사용할 것
  • 웹 브라우저의 아이디와 비밀번호 자동 저장 기능을 사용하지 말 것

  1. XSS(cross-site scripting, 사이트 간 스크립트)
    http://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8%EA%B0%84%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85  ↩

  2. 해킹 - http://ko.wikipedia.org/wiki/%ED%95%B4%ED%82%B9
    해킹(hacking)은 전자 회로나 컴퓨터의 하드웨어, 소프트웨어, 네트워크, 웹사이트 등 각종 정보 체계가 본래의 설계자관리자, 운영자가 의도하지 않은 동작을 일으키도록 하거나 체계 내에서 주어진 권한 이상으로 정보를 열람, 복제, 변경 가능하게 하는 행위를 광범위하게 이르는 말이다.  ↩

  3. 해킹 동영상 강좌 - UMC 와 함께하는 ASP.NET 해킹하기 #1
    http://blog.powerumc.kr/274  ↩

  4. BBS - http://terms.naver.com/entry.nhn?docId=9120&cid=390&categoryId=390
    PC통신에서 불특정 다수의 사용자들이 컴퓨터를 통해 정보와 편지를 교환하고 대화하거나 비상업적인 프로그램을 서로 공유하기 위한 시스템을 말한다. \[네이버 지식백과] 전자게시판 \[BBS , Bulletin Board System] (매일경제, 매경닷컴)  ↩

  5. 쉐어웨어 http://ko.wikipedia.org/wiki/%EC%89%90%EC%96%B4%EC%9B%A8%EC%96%B4
    셰어웨어(체험판, 보통 평가판, shareware, 문화어: 쉐어웨어, 후불쏘프트웨어, 지불프로그람)는 컴퓨터 소프트웨어마케팅 방식의 하나이다. 데모웨어(demoware), 평가 소프트웨어라고도 부른다. 셰어웨어 소프트웨어는 보통 인터넷에서 내려받거나 잡지에 포함된 디스크를 통해 무료로 제공된다. 사용자는 그 프로그램을 시험삼아 써 볼 수 있다. "구매하기 전에 한 번 써 보라"라는 뜻을 셰어웨어는 내포하고 있다. 셰어웨어 프로그램은 구매 요청 메시지를 보여 주며, 소프트웨어 배포 라이선스는 그러한 지불 방식을 요구하게 된다. 보통 이러한 소프트웨어는 사용 기간과 기능에 제약이 있다.  ↩

  6. 크랙 - http://en.wikipedia.org/wiki/Software_cracking
    Software cracking is the modification of software to remove or disable features which are considered undesirable by the person cracking the software, usually related toprotection methods: (copy protection, protection against the manipulation of software), trial/demo version, serial number, hardware key, date checks, CD check or software annoyances like nag screens and adware.  ↩

  7. 안전모드 - http://krdic.naver.com/search.nhn?query=%EC%95%88%EC%A0%84%20%EB%AA%A8%EB%93%9C&autoConvert=false
    컴퓨터가 정상적으로 부팅되지 않을 때 부팅시키는 방법이다. 안전모드로 부팅시키는 방법을 이용해 컴퓨터의 잘못된 점을 치료할 수 있다.  ↩


Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 나그네 2014.09.16 11:20 Address Modify/Delete Reply

    사내 usb보안프로그램은 주서버에서 관리자가 열어주는 시스템입니다.

    usb보안프로그램을 모두 지웠으나, 초기에 수신된 정책으로 인해. 프로그램이 지워져도
    usb보안이 지속되는 문제가 있는데..

    이런경우는 어떻게 해야 될까요?

    위와 같이 매번 시스템복구로 부팅해야되는건 너무 번거롭습니다;

    • 땡초 POWERUMC 2014.09.16 11:43 신고 Address Modify/Delete

      사내에서 Active Directory 를 사용하고 계시는 것은 아닐까 생각합니다.
      이런 경우 공유 리소스 계정(발급 받은 계정) 외,
      로컬 계정을 이용하시면 될 것 같습니다.

      이 경우가 아니라면, 백그라운드로 이를 감시하는 소프트웨어가 있을 것으로 추정되는데요,
      이것까지 찾아내 지우시면 될 것 같습니다.