악성코드를 이용한 해킹의 종류 및 대처법

Posted by ironmask84
2016. 2. 15. 00:49 컴퓨터공학/Security




1. Stack Buffer overflow 공격

1) strncpy() 사용해서 버퍼만큼만 복사하거나, if문으로 문자열 크기 비교체크해서 복사하면 해결


    process가 메모리에 로딩되었을 때의 메모리 구조에는 몇몇의 영역으로 구분되어있다.

       이는 low address부터 나열하면 다음과 같은 순서이다.


       Code Area (실행코드 위치, 기계어)

       Data Area (초기화 된 정적변수 및 전역변수)

       BSS Area (초기화 되지 않은 정적변수 및 전역변수)

       Heap (동적메모리 할당)

       Stack (함수를 처리하기 위한 영역, 함수 내 로컬변수, 함수의 매개변수)

 

위 영역 중에 Stack 영역에서 Buffer overflow 를 이용한 공격방법은 아래와 같다.

 

예를들어 어떤 프로세스의 main함수에서 func() 함수를 호출될 때,

func() 함수 처리 후 돌아왔을 때 수행되어야할 주소 RET를 저장하고,

func() 함수를 기준으로 하기위해 기존의 main함수의 EBP 레지스터를 저장하고,

func() 함수의 로컬변수 등 처리를 위한 데이터들이 stack에 push/pop 되어가며 수행되다가

func() 처리가 끝나면, 위에서 저장했던 RET, EBP를 불러와서 기존 main함수로 되돌아 오게 된다.

 

위 과정에서 RET를 임의의 주소로 덮어쓸 수 있다면,

해커는 이를 악용해서 공격용 process를 미리 메모리에 로딩해놓고, 이 process의 주소로 덮어쓰게 하여,

새로운 shell을 root권한으로 실행하는 등의 행위로 root권한을 획득할 수 있게 된다.

 

위 공격을 하려면 2가지 조건이 전제되어야 한다.

1) 공격에 이용하려는 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.

2) 악용하기 위한 공격용 process를 미리 메모리에 로딩해놓아야 한다.

 

*  CPU에는 여러 레지스터가 있지만, 아래 3가지를 참고하자.

1) ESP : 스택 연산이 발생하는 스택 프레임의 최상위 포인터 (EBP를 기준으로 상대위치 의미)

2) EBP : 해당 스택 프레임의 베이스 포인터

3) EIP : 다음에 실행할 명령어의 주소값을 가지고 있다. (= Program Count)

 

 

2. Race Condition 공격

   1) A 프로세스가 /tmp 디렉토리에 tmp.dat 라는 파일을 생성하고 오픈해서 write를 한다고 하고,
      A프로세스가 root소유의 프로세스이고, tmp.dat 라는 파일에 root권한을 가지도록 setuid를 한다고 가정.

      이 시점을 캐치하여, 공격용 프로세스를 통해 tmp.dat라는 동일한 이름의 파일을 심볼릭 링크파일로 해서 
      /etc/shadow와 같이 중요한 파일에 링크를 건 파일을 생성시킨다.


   2) 위 과정에서 A 프로세스와 공격용 프로세스가 tmp.dat라는 파일을 누가 먼저 생성 시키는지의 race가 발생하게 된다.
      정상적인 경로를 통해 A 프로세스가 먼저 tmp.dat 파일을 생성시키면,
      공격용 프로세스는 이 파일을 지우고, 자신이 생성시킨 파일을 수행하도록 유도할 것이다.


  ** 여기서도 마찬가지로 공격에 이용하려는 A 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.

 

 

3. Format String 공격

   1) process가 메모리에 로딩되었을 때의 메모리 주소에 잘못된 데이터를 덮어씀으로 인한 공격
   2) printf 계열의 함수 사용 시 틀리지 않고 쓰면 해결, %n은 변수의 주소값 이다.




 

Key Derivation Functions (PBKDF2)

Posted by ironmask84
2015. 6. 24. 13:34 컴퓨터공학/Security


2년 전 부터 정보 보안에 대한 관심이 많아 지면서,

최근에 또 회사 업무로 인해 아래 암호화 알고리즘에 대해 알아보았다.

PBKDF2 라는 해쉬 컨테이너 알고리즘 이다. (Password-Based Key Derivation Function)

PBKDF2의 기본 파라미터는 다음과 같은 5개 파라미터다.

DIGEST = PBKDF2(PRF, Password, Salt, c, DLen)
  • PRF: 난수(예: HMAC)
  • Password: 패스워드
  • Salt: 암호학 솔트 (32bit 이상 추천.. 어떤 기준??)
  • c: 원하는 iteration 반복 수 (1000번 이상 추천 어떤 기준??)
  • DLen: 원하는 다이제스트 길이

PBKDF2는 NIST(National Institute of Standards and Technology, 미국표준기술연구소)에 의해서 승인된 알고리즘이고, 미국 정부 시스템에서도 사용자 패스워드의 암호화된 다이제스트를 생성할 때 사용한다.

위에서 PRF라는 것이 약간 헷갈리는데, 해쉬 함수를 의미하는 것으로 보인다.

기존 많은 웹서비스들은  패스워드 저장 시, SHA-1 이나 MD5와 같은 hash 알고리즘을 이용해 DB에 저장하여, 개인 정보를 보호하였으나, 이 방법도 HW의 눈부신 발전에 의해 무차별 공격 (brute-force-attack) 에 취약해지므로, 이를 대체 하기 위한 대표적인 알고리즘이다.

오픈소스이며, 최근에 여러 웹서비스나 프로그램에서 인기있는 알고리즘으로 보임.

내가 생각한 기본적인 사용법의 이해는 아래와 같다.

디바이스 내에는 DIGEST와 Salt 가 저장될 것이며,
Password는 저장되어서는 안된다.

유저가 Password를 입력할 때마다,
저장된 salt를 이용해서 PBKDF2를 통해, Digest가 출력될 것이고,
그 놈이 저장되어 있는 Digeest와 일치하는지의 여부를 볼 것이다.

마지막으로 참고할 만한 사이트 2개를 소개합니다.

1. 위키 : http://en.wikipedia.org/wiki/PBKDF2

2. NHN개발자 사이트 : http://helloworld.naver.com/helloworld/318732

 

Time Stamp와 MD5

Posted by ironmask84
2013. 2. 4. 09:07 컴퓨터공학/Security


3번 문제를 풀기 위해 http://webgame.wowhacker.com/weblevel3/list.php로 접속합니다.


또 아까와 같은 게시판이 보이시죠? 이번에도 게시글을 하나씩 클릭해가며 살펴보도록 합시다.


1번 게시글을 클릭하자 오픈기념사진이란 파일이, 2번 게시글은 몸매짱, 3번 게시글은 Hint, 4번 게시글은 내사진, 5번 게시글은 비밀글 처리되어 내용을 볼 수 없습니다. 1~4번에 업로드된 파일들을 모두 다운로드 받아봅시다. 그러면 아래의 링크로 접속되어 다운로드 되는것을 확인하실 수 있습니다.



다시 게시글을 들어가봅시다. 게시글을 올린 날짜 옆에 숫자가 보이시죠? 게시글마다 각각 숫자가 서로 다릅니다.


1: 2006.10.18 09:05:25 0.25616200

2: 2006.10.19 10:01:05 0.57833500

3: 2006.10.20 12:05.19 0.78252100

4: 2006.10.20 18.24.43 0.65272100

5: 2006.10.22 15:49.52 0.85428900


. 뒤에 있는 숫자와 파일 뒤에 붙는 숫자가 일치하죠? 그리고 5번은 85428900이고 말이에요. 그럼 아래와 같이 유추할 수 있습니다.


http://webgame.wowhacker.com/weblevel3/down/############.85428900


그렇다면 앞에 있는 암호화된 값은 무엇을 의미할까요? 모두다 소문자와 숫자로 조합된 32자리의 값으로 MD5로 인코딩 됬다는걸 쉽게 알 수 있습니다. 한번 MD5로 디코딩을 해봅시다. 아래의 링크로 접속합시다.


링크: http://md5.web-max.ca/

[위 사이트에서 MD5 Encrypt시 입력한 값이 MD5 해쉬사전(데이터베이스, DB)로 넘어갑니다. Decrypt는 이 해쉬사전을 탐색하여 원본값을 가져오는 것입니다. 주민등록번호, 비밀번호 등 역시 이 데이터베이스 내에 남습니다.]


그런뒤에 하나하나 디코딩을 해봅시다.


1: b72776c5eb0c5a05a7188959a49e1f1b -> 1161129925

2: 28d805e190f11ba1da5283d494ee8492 -> 1161219665

3: b08e7acd151d17cbc5f205edf151d7e7 -> 1161313519

4: 779bbf24b15bb7cb0f6b51507f0615f4 -> 1161336283


이 값들은 바로 타임스탬프(Timestamp)값임을 알 수 있습니다. 타임스탬프란 1970.1.1 00:00:00 이후의 시간을 초로 환산하여 문자열로 나타낸 값으로, 아래의 링크로 접속하면 쉽게 시각->타임스탬프, 타임스탬프->시각 변환이 가능합니다.


링크: http://www.4webhelp.net/us/timestamp.php


Timezone는 GMT +9 Hours를 선택하고(우리나라의 표준시는 그리니치 표준시(GMT)보다 9시간 앞서므로 그렇습니다.), Timestamp에 아까 디코딩 된 값 4개를 넣어서 Convert to date를 누릅시다.


1: 1161129925 translates to Wednesday, October 18th 2006, 09:05:25 (GMT +9)

2: 1161219665 translates to Thursday, October 19th 2006, 10:01:05 (GMT +9)

3: 1161313519 translates to Friday, October 20th 2006, 12:05:19 (GMT +9)

4: 1161336283 translates to Friday, October 20th 2006, 18:24:43 (GMT +9)


게시글을 올린 시각이랑 일치하죠? 그렇다면, 여기서 한번더 유추할 수 있습니다. 게시글을 올린 시각을 타임스탬프값으로 변환하여 이를 MD5로 인코딩하면 .앞의 암호화 된 값이 나오므로, 비밀글을 올린 시각인 2006.10.22 15:49.52를 타임스탬프 값으로 변환해봅시다. Day엔 22, Month엔 10, Year엔 2006, Hour에는 15, Minute에는 49, Second에는 52, Timezone은 GMT +9 Hours를 택하고 Convert to a timestamp를 누릅니다. 그러면 아래와 같이 결과물이 출력됩니다.


Sunday, October 22nd 2006, 15:49:52 (GMT +9) translates to 1161499792


1161499792을 가지고, 아래의 사이트로 들어가서 MD5로 암호화 해줍시다.

링크: http://tools.web-max.ca/encode_decode.php


그럼 아래와 같은 값을 얻을 수 있습니다.

fb6e412cf733d6b9cdf777cbcafa35c3


이제 한번 조합해봅시다.

http://webgame.wowhacker.com/weblevel3/down/fb6e412cf733d6b9cdf777cbcafa35c3.85428900


위의 사이트로 들어가면 답이 나와있습니다.


Level3 key: iwantknowmoreMrjones!


즉 답은 'iwantknowmoreMrjones!' 입니다. 수고하셨습니다.

출처 : http://exynoa.tistory.com/108

 

자바 AES 128비트 암호화

Posted by ironmask84
2013. 2. 4. 09:05 컴퓨터공학/Security


String sKeyString = "";
String message = "this is just an example";

 

// 1. 128 비트 비밀키 생성    
KeyGenerator kgen = KeyGenerator.getInstance("AES");    
kgen.init(128);    
SecretKey skey = kgen.generateKey();

 

// 2. 비밀 키를 이렇게 저장하여 사용하면 암호화/복호화가 편해진다.    
sKeyString = Hex.encodeHexString(skey.getEncoded());

 

// 3. 암호화 수행 
SecretKeySpec skeySpec = new SecretKeySpec(skey.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(message.getBytes());
System.out.println("encrypted string: " + Hex.encodeHexString(encrypted));

 

// 4. 복호화 수행
cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
byte[] original = cipher.doFinal(encrypted);    
String originalString = new String(original);    
System.out.println("Original string: " + originalString + " " + Hex.encodeHexString(original));

 

 

jar : commons-codec-1.6.jar

출처 : http://blog.naver.com/PostView.nhn?blogId=yunta8&logNo=100162235590&redirect=Dlog&widgetTypeCall=true

 

문자열을 SHA-512 방식으로 암호화(단방향 암호화 방식 : 예 로그인)

Posted by ironmask84
2013. 2. 4. 09:03 컴퓨터공학/Security


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

import java.security.*;
 
// 문자열을 SHA-512 방식으로 암호화
 
public String encrypt(String input) throws NoSuchAlgorithmException {
 
    String output = "";
 
   
 
    StringBuffer sb = new StringBuffer();
 
    MessageDigest md = MessageDigest.getInstance("SHA-512");
 
 
 
    md.update(input.getBytes());
 
    byte[] msgb = md.digest();
 
 
 
    for (int i = 0; i < msgb.length; i++) {
 
        byte temp = msgb[i];
 
        String str = Integer.toHexString(temp & 0xFF);
 
        while (str.length() < 2) {
 
            str = "0" + str;
 
        }
 
        str = str.substring(str.length() - 2);
 
        sb.append(str);
 
    }
 
   
 
    output = sb.toString();
 
   
 
    return output;

}
 


 

자바 데이터 암호화: DES, 3DES, AES, RSA, MD5, SHA1

Posted by ironmask84
2013. 2. 4. 09:02 컴퓨터공학/Security


* 스트림 암호화 방식

: Clear text를 encode한 것을 1문자씩 변환


* 블럭 암호화 방식

: Clear text를 정해진 블럭으로 나눈후 해당 블럭을 암호화


* 대칭키 암호화 방식(old)

: 암호화 키와 복호화 키가 동일


* 비대칭키 암호화 방식(new)

: 암호화키는 공개키, 복호화키는 비밀키, 대칭 암호화에 비해 속도가 느림

  주로 개인키를 교환하는 목적으로 많이 사용

  A와 B가 Data를 주고 받는다고 할때 :

  개인키로 암호화하면 공개키로만 풀 수 있다. 공개키로 암호화하면 개인키로만 풀 수 있다.

  A와 B 각각이 공개키/개인키 한쌍씩을 가지고 있으면서

  서로에게 공개키만 알려줌

  A -> B Data 전송시 :

  A는 B의 공개키로 Data를 암호화시켜서 B에게 전송

  Data를 받은 B는 자신의 개인키로 Data를 복호화.

  B는 A의 공개키로 return값을 암호화시켜서 A에게 전송

  return값을 받은 A는 자신의 개인키로 return값을 복호화.


* 메시지 다이제스트

: 원문에 일방향 해쉬 함수를 적용, 일정 길이의 유일한 문자열로 변환하는 방식

  복호화 불가능, 전자서명시 사용



- DES

블럭 암호화 방식, 대칭키 암호화 방식

텍스트를 64bit 단위로 나눠 56bit 키로 암호화하는 알고리즘


- 3DES

DES의 짧은 키를 보완한 방식(DES를 세번 적용)


- AES

블럭 암호화 방식, 대칭키 암호화 방식

텍스트를 128bit 단위로 블럭화

128bit, 182bit, 256bit의 키로 암호화


- RSA

블럭 암호화 방식, 비대칭키 암호화 방식

두 개의 큰 소수들의 곱과, 추가 연산을 통해 키 생성

가장 보편적으로 사용


- MD5

블럭 암호화 방식, 메시지 다이제스트

임의의 길이의 입력데이터를 128bit의 출력데이터로 변환

512비트 단위로 알고리즘 수행, 메시지 길이를 512bit 배수로 패딩 

단, 원래의 메시지 길이 입력을 위한 64bit는 남겨둬야함


- SHA1

블럭 암호화 방식, 메시지 다이제스트

임의의 길이의 입력데이터를 160bit의 출력데이터로 변환


(참조 http://minix.tistory.com/397)