블로그 이미지
훅크선장

카테고리

분류 전체보기 (363)
사진이야기 (23)
펭귄컴퓨팅 (122)
컴퓨터보안 (84)
절름발이 프로그래머 (59)
하드웨어개조 (23)
멀알려줄까 (35)
잡다한것들 (15)
홈베이킹&홈쿠킹 (2)
Total
Today
Yesterday

달력

« » 2025.9
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

공지사항

태그목록

최근에 올라온 글

국내 무선랜 환경이 11n 방식으로 급속히 전환되면서, 무선랜 해킹 기술 적용을 해보고자 하는 사람이 많다는 것을 느끼게 되었다.

자주 들어오는 질문이 11n 방식에서 Aircrack Suite(BT4 R2)를 사용하여, 무선랜 해킹이 가능한 무선랜 카드가 어떤 것이 있는가? 였다.

국내 무선랜 산업의 특성상, 외국 제품이 들어오는 것이 매우 한정되어 있는데,
다행히 요즘 국내에서도 Ralink 사의 칩셋을 이용하여 저가형 무선랜 카드를 만들고 있다.

최근 11n 방식의 국내 무선랜 카드들은 주로 Ralink사의 rt3070 칩셋을 탑재한다. 안타깝지만, 이 rt3070 칩셋은 아직 Aircrack Suite 에서는 지원하지 못하고 있다.(BEINI 라는 라이브 리눅스 씨디가 rt3070 칩셋에 대한 패치 드라이버를 제공하고 있다. http://www.ibeini.com/index.htm 참고)

언제가는 rt3070 칩셋을 Aircrack Suite가 지원할 것이라는 막연한 기대감은 있지만은, 마냥 기다릴 수가 없어서, 결국 다른 대안을 찾아보았다.

다행히도, 아직도 rt2870 칩셋으로 USB 무선랜카드를 만들고 있다.
기존에 단종된 제품중의 하나인 유니콘 정보통신의 TW-300N USB 무선랜 카드 뿐만 아니라,
http://www.eunicorn.co.kr/kimsboard7/_product.php?inc=tw-300n
가격은 좀 비싸지만, 여전히 좋은 제품은 존재한다.
바로, ipTIME의 N303UA 이다.
http://www.iptime.co.kr/~iptime/prd.php?pf=4&page=&pt=110&pd=1

단종된 유니콘 정보통신의 TW-300N USB 무선랜 카드는 802.11b/g/n을 지원하고, (11a는 지원하지 않는다. 어차피 국내에서는 잘 쓰는 방식이 아니기 때문에...)
칩셋은 Ralink사의 rt2770f (2870의 이전 칩셋으로 생각된다.)을 사용한다.

이 칩셋은 Aircrack Suite에서 공식적으로 지원한다고 알려진 칩셋이다.

다만, 문제는 유니콘 정보통신이 TW-300N USB 무선랜 카드를 단종시켰다는 점이다.
어제 인터넷 쇼핑사이트를 뒤져서, 결국 옥션에서 4개 남은 제품중에 2개를 구입하였다.
개당 가격은 21,000원으로 아주 저렴한데, 외장 안테나 연결이 불가능한 점이 크나큰 단점이다.
굳이 2개를 구입한 이유는 호환성 테스트 이후에, 분해를 통해서 외장 안테나 연결의 가능성을 확인하려고 했다.
그래서, 성공했다. 성공 이야기는 나중에 쓰기로 하고,
돈 좀 더주고, N303UA를 사면 되는데, 괜히 뻘짓 했다는 생각이 들었다.

11n 무선랜 환경에서 무선랜 해킹 기능을 테스트해 본 결과는 나중에 올릴 예정이다.
(만약에 11n을 지원하고, 외장안테나까지 달 수 있도록 개조가 가능하다면, 고가의 Airpcap을 완전히 대체할 수 있게된다.
막연한 기대감이다~~ ^ ^)
N303UA는 너무나 친절하게도 2개의 외장 안테나를 달고 있다. 그래서 덩치가 좀 있다.


일단 도착한 제품을 시험해보니,  TW-300N USB 무선랜 카드는 BT4 R2에서 아주 잘 동작한다.
11n, 11b, 11g 환경에서 해킹 하드웨어로는 호환성 문제는 없다.

Posted by 훅크선장
, |
생업에 바쁜? 와중에도, DVD ISO 파일과 VMware 이미지를 한글화 하였습니다.
이전 Backtrack 4 Final 버전과 달라진 점은 없습니다.
한글 입출력과 네이트온 메신저, 중국어/일본어 폰트를 집어넣은 것이 전부입니다.

DVD ISO와 VMware 이미지를 가져가시는 방법은 다음과 같습니다.

배포방식을 FTP 다운로드 방식, 완전히 한 가지 방법으로 수정합니다.
(집에 있는 공유기의 OpenWRT가 ftp 서비스를 안정적으로 제공하기 때문입니다.)

FTP 서버: hook7346.ignorelist.com
FTP 포트: 21번
FTP 계정:
kali2ko
FTP 패스워드는 퀴즈입니다. => 영문자판상태에서 한글로 치시면 됩니다.
1) 패스워드는 한글 4글자와 특수문자 1개로 구성되어 있습니다.
2) 패스워드의 첫 두 글자는 우리나라 문자 이름입니다. 이미 1) 문장에서 나온 단어입니다.
3) 패스워드의 세번째와 네번째 두 글자는 3.1절에 외치던 문장에 있는 두 글자입니다.
“대한 독립 OO”에서 OO에 들어가는 단어입니다.
4) 마지막에 들어가는 특수문자는 3)의 단어뒤에 자주 붙는 특수문자입니다. 느낌이 오시나요?

다시한번 말씀드리지만, 영문자판상태에서 한글로 치시면 됩니다.
한글 4글자와 특수문자 1개로 구성되어 있습니다.(영문자로는 총 12글자입니다.)


퀴즈가 안풀리시는 분은 이전과 동일하게, 밑에 답글로 이메일주소 적어주시면, 이메일로 접속 정보와 패스워드 알려드립니다.

## FTP 안에 있는 파일 설명드립니다. ##
2218844160 Dec 26 20:40 bt4-r2-kr-cn.iso : 백트랙 4 R2 버전 한글판 ISO 파일(중국어/일본어 입력기 포함)
2122674176 Dec  5 02:17 bt4-r2-kr.iso
: 백트랙 4 R2 버전 한글판 ISO 파일

2034880512 Dec  5 02:21 bt4-r2.iso : 백트랙 4 R2 버전 ISO 파일(영문 원본)
2125343182 Dec  5 02:17 BT4R2-VM.RAR : 백트랙 4 R2 버전 한글판 VMware 이미지
2390769589 Dec  5 02:22 bt4-r2-vm.tar.bz2 : 백트랙 4 R2 버전 VMware 이미지(영문 원본)

1657413632 Dec  5 02:34 bt4-final-han.iso
: 백트랙 4 Final 버전 한글판 ISO 파일
1569816576 Dec  5 02:38 bt4-final.iso : 백트랙 4 Final 버전 ISO 파일(영문 원본)
1810886979 Dec  5 02:35 BackTrack 4 Final.rar : 백트랙 4 Final 버전 한글판 VMware 이미지
2133652877 Dec  5 02:52 bt4-final-vm.zip : 백트랙 4 Final 버전 VMware 이미지(영문 원본)

919789568 Dec  5 02:55 bt4-beta-han.iso
: 백트랙 4 Beta 버전 한글판 ISO 파일
895787008 Dec  5 02:56 bt4-beta.iso
: 백트랙 4 Beta 버전 ISO 파일(영문 원본)

1422544896 Dec  5 02:51 bt4-pre-final-han.iso : 백트랙 4 Pre Final 버전 한글판 ISO 파일
1393631232 Dec  5 02:55 bt4-pre-final.iso : 백트랙 4 Pre Final 버전 ISO 파일(영문원본)

722046688 Dec  5 02:58 BACKTRACK3_VMWare.rar
: 백트랙 3 버전 한글판 VMware 이미지

728705024 Dec  5 02:58 bt3-final.iso : 백트랙 3 Final 버전 ISO 파일(영문 원본)
821483520 Dec  5 02:56 bt3final_usb.iso
: 백트랙 3 Final 버전 USB용 (영문 원본)
 28228998 Dec  5 02:58 bt3teaser.swf
: 백트랙 3 티저 광고 플래시


224528384 Dec  5 02:52 slax-6.1.1-ko.iso
: SLAX v6.1.1 한글판 ISO 파일
199972864 Dec  5 02:53 slax-6.1.1.iso
: SLAX v6.1.1 ISO 파일(영문 원본)
237875200 Dec  5 02:51 slax-6.1.2-han.iso
: SLAX v6.1.2 한글판 ISO 파일
237694010 Dec  5 02:38 slax-6.1.2-han.zip
: SLAX v6.1.2 한글판 USB용


1. FTP로 받아가는 방법
FTP 서버를 운용하는 장비가 집에 있는 공유기(NAS 기능)를 이용하여 FTP서버를 운영하고 있습니다. 가끔 접속이 불안할 수도 있지만, 가장 빨리 받아갈 수 있는 방법입니다.
서버와 아이디/패스워드를 공개해두었더니, 세계 도처에서 FTP로 접근하는군요. ^ ^;
멀 가져갈 것이 있다고, 미국/스위스/불가리아 등지에서 대역폭을 잡고 있네요~.
그래서, 방식 바꾸었습니다.

답글로 이메일 주소 남기시면, FTP 서버명과 아이디/패스워드 드립니다.

Backtrack 관련 파일들이 다 있습니다. 잘 골라서 가져가시기 바랍니다.
동시 접속자수는 10명 제한이 있으나, 큰 지장은 없을 것입니다.
용량이 상당하므로, 무작정 받지 마시기 바랍니다. 그러면 다른 사람들이 받아가기도 힘들고, 공유기가 부하를 못 견디고, 다운될 확률이 높습니다.


2. 이전 버전 배포방식의 구식 방법으로, 현재 블로그에 답글로 이메일 주소 남겨서,  그 이메일로 다운로드 링크를 받은 다음, 다운로드하는 방법

서버의 대역폭 제한으로 하루에 5명 정도는 다운 받을 수 있습니다.


%% 공용서버 또는 개인서버와 같이, 배포공간을 제공해 주실 분이 계시면, 지원해 주시기 바랍니다.





Posted by 훅크선장
, |
http://www.backtrack-linux.org/downloads/

생업에 종사하느라, 바쁜 시간을 보내고 있었더니,
Backtrack 4 Final 버전이 나오고 나서, 두번의 업데이트 버전이 등장했었던 사실을 모르고 있었다.

2010년 5월 8일에 Backtrack 4 R1 이 나왔고,
며칠전 2010년 11월 22일에 Backtrack 4 R2 버전이 나왔다.

위 링크에 가면, 다운받을 수 있다.  가능하면 torrent 를 이용해서 받는 것이 좋다.

서버에 저장해 두었으니, 필요하신 분은 링크 요청 답글로 이메일 주소를 남기면, 다운로드 링크를 제공해 드립니다.

그리고, 중요한 사실은 한글 버전은 이번 주 내에 나와야 된다는 것이다. 개봉박두! 기대하시라~.
Posted by 훅크선장
, |
요즘 관심을 가지고 하고 있는 일은,
유무선 공유기에 펌웨어를 교체하여, OpenVPN 서버를 만드는 일.

그래서 찾은 궁극의 유무선 공유기 D-Link DIR-825 rev B1 

그리고, 이 하드웨어를 기반으로 OpenVPN 까지 모두 갖추어진 펌웨어는 DD-WRT

OpenWRT가 더 유명하지만, 테스트해본 결과, OpenWRT는 참 펌웨어가 올리기 어렵다는...(정말 잘 안 올려져서, 때로는 긴급 복구를 해야 한다는...)

아무튼 USB 프린터를 연결하여, 프린터 서버로 사용할 수도 있고, SSH 터널링 프락시로도 쓸 수도 있고, OpenVPN을 사용하면, 원격 업무 서비스?도 가능한 만능의 공유기, 만세~

곧 있으면, OpenVPN 설치 매뉴얼을 만들겁니다. 개봉박두 ~~~~
Posted by 훅크선장
, |
이전에 Delphi에서 inline assembly를 사용하는 방법에 대해서 글을 하나 썼는데,
C++ Builder에서도 거의 비슷하게 사용할 수 있다는 점을 알아서 그 내용을 정리했다.
Delphi 와는 다른 점이 꽤 있다.

1. 함수 인자값들은 반드시 레지스터에 저장해서 연산하여야 한다. 함수 인자는 바로 연산문에 사용할 수 없다. (지역변수는 변수명으로 바로 사용할 수 있다.)
* 참고: 함수 인자들은 EBP를 기준으로도 접근할 수 있습니다. 함수인자는 앞에서부터 차례로 DWORD PTR [EBP+0Ch], DWORD PTR [EBP+10h], DWORD PTR [EBP+14h] 로 접근 가능합니다.
2. 함수 인자로 주어지는 포인터 변수는 반드시 로컬변수로 재지정해서만 접근하여야 합니다.
3. 함수가 리턴값을 가져야 된다면, 별도로 리턴값을 위한 변수를 지정해서 사용하여야 합니다.
4. 올리디버거에서 추출된 어셈블리 코드안의 숫자값은 모두 16진수 이므로, 인라인 어셈블리 코드로 사용하려면, 모든 숫자값에는 16진수 임을 알리는 “h” 문자를 추가하여야 한다. (MOV EAX, 20 이렇게 되어 있다면, 반드시 MOV EAX, 20h 로 바꾸어야 한다.)
5. 문자열은 주소값으로 연산되므로, 포인터 연산에 주의를 해야한다.(너무나도 당연한 말이다.)

unsigned int TMainForm::keygen1(AnsiString aStr, int aStr_len, int *ret)
{
  int ret2; 
  int *ptr_ret = ret;
  asm
  { 
XOR EDI, EDI // init value := 0
XOR ESI, ESI
XOR EDX, EDX
XOR ECX, ECX  // ecx := 0, init value
XOR EBX, EBX  // ebx := 0, init value
XOR EAX, EAX
MOV EDX, aStr_len // copy string length
MOV ESI, [aStr] // load string address 
MOV EDI, ptr_ret // load integer value address

  @@LOOP: // Label
MOVSX EAX, BYTE PTR [ESI+ECX]
INC ECX
XOR EAX, ECX
ADD EBX, EAX
CMP ECX, EDX
JNZ @@LOOP  // conditional jump to Label
IMUL EAX, EAX, 6h
MOV DWORD PTR [EDI], EBX // pointer variable value copy
SHL EBX, 7h
MOV ret2, EBX  // local variable value copy
ADD EAX, EBX

MOV ret2, EAX // return value
  }

  return ret2;
}
Posted by 훅크선장
, |
Linux 에서는 /proc 구조를 뒤져서 알아낼 수 있고,
Windows에서도 비슷하게 프로세스들을 일일히 뒤져서 알아낸다.


#include <stdio.h>
#include <dirent.h>
#include <string.h>

unsigned int getProcessID(char *p_processname) {
DIR *dir_p;
struct dirent *dir_entry_p;
char dir_name[40]; // ??? buffer overrun potential
char target_name[252];  // ??? buffer overrun potential
int target_result;
char exe_link[252];
int errorcount;
int result;

errorcount=0;
result=0;
dir_p = opendir("/proc/"); // Open /proc/ directory
while(NULL != (dir_entry_p = readdir(dir_p))) { // Reading /proc/ entries
if (strspn(dir_entry_p->d_name, "0123456789") == strlen(dir_entry_p->d_name)) { // Checking for numbered directories 
strcpy(dir_name, "/proc/");
strcat(dir_name, dir_entry_p->d_name);
strcat(dir_name, "/"); // Obtaining the full-path eg: /proc/24657/ 
exe_link[0] = 0;
strcat(exe_link, dir_name);
strcat(exe_link, "exe"); // Getting the full-path of that exe link
target_result = readlink(exe_link, target_name, sizeof(target_name)-1); // Getting the target of the exe ie to which binary it points to
if (target_result > 0) {
target_name[target_result] = 0;
if (strstr(target_name, p_processname) != NULL) { // Searching for process name in the target name -- ??? could be a better search !!!
result = atoi(dir_entry_p->d_name);
printf("getProcessID(%s) :Found. id = %d\n", p_processname, result);
closedir(dir_p);
return result;
}
}
}
}
closedir(dir_p);
printf("getProcessID(%s) : id = 0 (could not find process)\n", p_processname);
return result;
}


#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <string>
#include "psapi.h"

DWORD GetProcessByFileName(char* name){
    DWORD process_id_array[1024];
    DWORD bytes_returned;
    DWORD num_processes;
    HANDLE hProcess;
    char image_name[256];
    char buffer[256];
int i;
    DWORD exitcode;
    EnumProcesses(process_id_array, 256*sizeof(DWORD), &bytes_returned);
    num_processes = (bytes_returned/sizeof(DWORD));
    for (i = 0; i < num_processes; i++) {
        hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,process_id_array[i]);
        if(GetModuleBaseName(hProcess,0,image_name,256)){
            if(!stricmp(image_name,name)){
                CloseHandle(hProcess);
                return process_id_array[i];
            }
        }
        CloseHandle(hProcess);
    }
    return 0;
}
void __cdecl main(int argc, char *argv[])
{
DWORD dwPID;
dwPID = GetProcessByFileName("calc.exe");
printf("%lu", (unsigned long)dwPID);
return;
}

Posted by 훅크선장
, |
얼마전 받은 교육이 “악성코드 분석” 이었는데, 교육중에 주로 악성코드보다는 초급자를 위한 Crackme 나 KeygenMe 프로그램을 주로 분석하있다.
간단하게 Keygen을 만들려고 하니, 일일히 어셈블리 코드를 분석해서, C 언어나 Python 으로 변환하기가 너무 귀찮은 경우가 생겨서, 델파이에 인라인 어셈블리를 적용하는 방법을 찾아내었다.
알고보니 너무 간단하고, 참 쉽다.
asm
...
end;
지시어 안에, 어셈코드를 넣기만 하면 된다.

그러나, 올리디버거(OllyDbg v1.10)에서 가져온 어셈블리 코드를 델파이에 적용하는 경우에 반드시 주의하여야 하는 사항은 다음과 같다.
1. 함수 인자값들은 반드시 레지스터에 저장해서 연산하여야 한다. 함수 인자는 바로 연산문에 사용할 수 없다. (지역변수는 변수명으로 바로 사용할 수 있다.)
* 참고: var 지정(내부에서 변하는 변수)이 아닌 일반 함수 인자들은 EBP를 기준으로 접근할 수 있습니다. 인자값이 변하지 않는 상수라면, 레지스터에 복사하지 않고 바로 사용할 수 있습니다. 문자열을 인자로 주었다면, 꼭 레지스터에 복사해야 합니다.
함수인자는 뒤에서 부터 차례로 DWORD PTR [EBP-04h], DWORD PTR [EBP-08h, DWORD PTR [EBP-0Ch] 로 접근 가능합니다.
2. 어셈블리 코드안에서 사용하는 모든 레지스터는 반드시 사용전에 PUSH 하고, 사용후에 POP 해야한다. (레지스터를 초기화하는 것도 오류를 없애기 위해서는 당연히 사용해야 한다.)
3. 올리디버거에서 추출된 어셈블리 코드안의 숫자값은 모두 16진수 이므로, 인라인 어셈블리 코드로 사용하려면, 모든 숫자값에는 16진수 임을 알리는 “h” 문자를 추가하여야 한다. (MOV EAX, 20 이렇게 되어 있다면, 반드시 MOV EAX, 20h 로 바꾸어야 한다.)
4. 문자열은 주소값으로 연산되므로, 포인터 연산에 주의를 해야한다.(너무나도 당연한 말이다.)


예제 코드를 보여본다. (함수내에서 인자값을 바꾸는, 포인터 연산도 포함되어 있다.)
-------------------------------------------------------------------------
function TMainForm.keygen1(aStr: AnsiString; aStr_len: Integer; var ret:Integer):Cardinal;
var
  ret2 : Integer;
begin
  asm
    PUSH EDX // Safe Store before use
    PUSH ECX
    PUSH EBX
    PUSH EAX
    PUSH ESI
    PUSH EDI

    XOR EDI, EDI // init value := 0
    XOR ESI, ESI
    XOR EDX, EDX
    XOR ECX, ECX  // ecx := 0, init value
    XOR EBX, EBX  // ebx := 0, init value
    XOR EAX, EAX
    MOV EDX, aStr_len // copy string length
    MOV ESI, [aStr] // load string address
    MOV EDI, [ret] // load integer value address

  @@LOOP: // Label
    MOV AL, BYTE PTR [ESI+ECX]
    INC ECX
    XOR EAX, ECX
    ADD EBX, EAX
    CMP ECX, EDX
    JNZ @@LOOP  // conditional jump to Label
    IMUL EAX, EAX, 6h
    MOV DWORD PTR [EDI], EBX // pointer variable value copy
    SHL EBX, 7h
    MOV ret2, EBX  // local variable value copy
    ADD EAX, EBX

    MOV @Result, EAX // return value : Result

    POP EDI // restore value
    POP ESI
    POP EAX
    POP EBX
    POP ECX
    POP EDX
  end;
end;
Posted by 훅크선장
, |
http://www.delphipraxis.net/147190-how-work-wic.html 를 참고하였습니다.

WIC 라는 개념이 Delphi 2010부터 지원됩니다. 여러 종류의 그래픽 파일들의 자유로운 읽기, 쓰기, 변환이 지원된다고 합니다. RAW 파일까지도 자유롭게 다룰 수 있다고 합니다.

아래와 같은 소스를 만들어서 테스트해보시면 알 수 있습니다. 중요한 점은 Wincodec 을 uses 구문에 추가하는 것입니다.
-------------------------------------------------------------------------------------------------------------
unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Wincodec;

type
  TForm1 = class(TForm)
    OpenPictureDialog: TOpenDialog;
    btnOpen: TButton;
    edtIamgeFilePath: TEdit;
    Image: TImage;
    procedure btnOpenClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Function() to test if this engine working correctly
function WICImageFormatDescription(const WIC: TWICImage): string;
begin
  Result := '';

  case WIC.ImageFormat of
    wifBmp: Result := 'Bitmap';
    wifPng: Result := 'PNG';
    wifJpeg: Result := 'JPEG';
    wifGif: Result := 'GIF';
    wifTiff: Result := 'TIFF';
    wifWMPhoto: Result := 'JPEG XR';
    wifOther:
    begin
      if GUIDToString(WIC.EncoderContainerFormat) = GUIDToString(GUID_ContainerFormatIco) then
        Result := 'Icon'
      else
        Result := 'other'
      ;
    end;
  end;
end;


procedure TForm1.btnOpenClick(Sender: TObject);
var
  WIC: TWICImage;
begin
  WIC := TWICImage.Create;
  try
    if OpenPictureDialog.Execute then
    begin
      edtIamgeFilePath.Text := OpenPictureDialog.FileName;
      WIC.LoadFromFile(OpenPictureDialog.FileName);
      Image.Picture.Assign(WIC);
      ShowMessage(WICImageFormatDescription(WIC));
      WIC.ImageFormat := wifWMPhoto;
      WIC.SaveToFile('output.wdp');
    end;
  finally
    WIC.Free;
  end;
end;

end.
Posted by 훅크선장
, |
이틀간 많은 문서를 뒤졌지만, 도저히 쉽게 설명한 문서가 없어서 애를 먹었습니다.
다행히 삽질을 통해서, 성공하였습니다.  
가장 많이 참고한 문서는 
디렉토리 위치 설명이 잘 안되어 있었습니다.

CentOS 에서는 시작 위치가 /usr/share/ssl/  입니다. 이곳에 openssl.cnf 가 존재합니다.
RHEL 에서는 시작 위치가 /etc/pki/tls/ 입니다. 이곳에 openssl.cnf가 존재합니다.
모든 인증서 작업은 이 디렉토리에서 이루어져야만 합니다.

CentOS에서는 openssl.cnf를 수정할 필요가 없지만, RHEL은 약간 수정이 필요합니다.
기존 파일을 백업하고, 다음과 같이 수정하면 됩니다. (꼭 디렉토리 명을 demoCA로 할 필요는 없습니다. openssl.cnf를 잘 이해한다면, 디렉토리 위치나 디렉토리명은 알아서 설정하면 됩니다.)
[root@localhost tls]# cp openssl.cnf openssl.cnf.org
[root@localhost tls]# vi openssl.cnf
modify :
dir             = ../../CA              # Where everything is kept
->
dir             = ./demoCA
[root@localhost tls]# sync
[root@localhost tls]# ls
cert.pem  certs  misc  openssl.cnf  openssl.cnf.org  private

이제부터 필요한 디렉토리와 파일들을 생성합니다. CA로써 가져야되는 디렉토리와 파일들입니다.
디렉토리들과 파일들은 demoCA라는 디렉토리 밑에 생성되어야 합니다.
[root@localhost tls]# mkdir demoCA
[root@localhost tls]# cd demoCA
[root@localhost demoCA]# mkdir certs
[root@localhost demoCA]# mkdir crl
[root@localhost demoCA]# mkdir newcerts
[root@localhost demoCA]# mkdir private
[root@localhost demoCA]# touch index.txt
[root@localhost demoCA]# echo "0001" > serial
[root@localhost demoCA]# echo "0001" > crlnumber
[root@localhost demoCA]# ls
certs  crl  crlnumber  index.txt  newcerts  private  serial

환경이 완료되었으면, 원래 작업 디렉토리로 돌아옵니다.
그리고, CA용 비밀키와 인증서를 생성합니다.

[root@localhost demoCA]# cd ..
[root@localhost tls]# ls
cert.pem  certs  demoCA  misc  openssl.cnf  openssl.cnf.org  private

비밀키를 생성할 때는 반드시 패스워드가 필요합니다.(확인을 위해서, 두 번 넣습니다.)
[root@localhost tls]# openssl genrsa -des3 -out ca.key 1024
Generating RSA private key, 1024 bit long modulus
.............++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:

비밀키를 기반으로 인증서를 만듭니다. 앞에서 넣었던 비밀키 패스워드를 입력해야 합니다.
인증서에는 국가, 지역, 도시, 기관, 부서, 시스템 명과 이메일 주소를 넣어줘야 합니다.
어떤 값을 넣어줘도 상관은 없습니다만,  국가, 지역, 도시, 기관명은 반드시 CA가 인증해주는 다른 인증서를 만들 때도 동일하게 하여야합니다. 잘 기억해야 됩니다. 밑에 보이는 것을 참고해서 넣으면 됩니다.
[root@localhost tls]# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:KR
State or Province Name (full name) [Berkshire]:Seoul
Locality Name (eg, city) [Newbury]:Seoul
Organization Name (eg, company) [My Company Ltd]:MyCompany
Organizational Unit Name (eg, section) []:Research
Common Name (eg, your name or your server's hostname) []:RHEL
Email Address []:hook@mail.com

이것으로 CA용 비밀키와 인증서가 생성되었습니다.
[root@localhost tls]# ls
ca.crt  ca.key  cert.pem  certs  demoCA  misc  openssl.cnf  openssl.cnf.org  private

이제 서버용으로 사용할 비밀키와 인증서를 만듭니다.
비밀키는 패스워드를 꼭 두 번 넣습니다.
[root@localhost tls]# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.........++++++
........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

서버용 인증서 요청파일을 만듭니다. 바로 인증서가 만들어지지 않는 것은 CA의 서명을 받아야 하기 때문입니다.
먼저 비밀키의 패스워드를 입력합니다.
CA 인증서를 만들 때와 비슷하게, 국가, 지역, 도시, 기관, 부서, 시스템 명과 이메일 주소를 넣어야 합니다.
국가, 지역, 도시, 기관명은 반드시 CA 인증서와 동일하게 넣어야 합니다. 그렇지 않으면, CA의 서명을 받을 수 없습니다.
부서, 시스템 명과 이메일 주소를 알아서 넣습니다. (CA 랑 동일해도 상관없습니다.)
요청을 하기 위한 추가속성을 입력하라고 합니다. 아무 값이나 넣어도 상관없습니다.
[root@localhost tls]# openssl req -new -days 365 -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:KR
State or Province Name (full name) [Berkshire]:Seoul
Locality Name (eg, city) [Newbury]:Seoul
Organization Name (eg, company) [My Company Ltd]:MyCompany
Organizational Unit Name (eg, section) []:Research
Common Name (eg, your name or your server's hostname) []:MyServer
Email Address []:hook@mail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:None

인증서 요청파일이 완성되었으면, CA의 서명과정을 거칩니다.
CA 비밀키의 패스워드를 입력합니다.
그러면, CA 서명을 할 것인지를 물어보고, 또 한번 발급할 것인가를 물어봅니다. 모두 y 로 응답합니다.
[root@localhost tls]# openssl ca -in server.csr -out server.crt -keyfile ca.key -cert ca.crt
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Aug 24 05:48:50 2010 GMT
            Not After : Aug 24 05:48:50 2011 GMT
        Subject:
            countryName               = KR
            stateOrProvinceName       = Seoul
            organizationName          = MyCompany
            organizationalUnitName    = Research
            commonName                = MyServer
            emailAddress              = hook@mail.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                CB:4E:81:5A:58:79:98:76:89:B3:B1:5C:6F:B5:77:CD:8C:9D:3B:01
            X509v3 Authority Key Identifier: 
                keyid:35:82:E4:7B:71:D1:F5:10:72:C2:0F:A5:0E:54:34:E3:C9:39:63:60

Certificate is to be certified until Aug 24 05:48:50 2011 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

이것으로 CA 인증을 받은 서버의 인증서가 생성되었습니다.

아래의 과정은 클라이언트용 비밀키와 인증서의 생성과정으로 서버용 만들기와 동일합니다.
동일한 과정으로 여러 개의 비밀키와 인증서를 만들 수 있습니다.

[root@localhost tls]# openssl genrsa -des3 -out client.key 1024
Generating RSA private key, 1024 bit long modulus
...++++++
..............++++++
e is 65537 (0x10001)
Enter pass phrase for client.key:
Verifying - Enter pass phrase for client.key:
[root@localhost tls]# openssl req -new -days 365 -key client.key -out client.csr
Enter pass phrase for client.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:KR
State or Province Name (full name) [Berkshire]:Seoul
Locality Name (eg, city) [Newbury]:Seoul
Organization Name (eg, company) [My Company Ltd]:MyCompany
Organizational Unit Name (eg, section) []:Research
Common Name (eg, your name or your server's hostname) []:MyClient
Email Address []:hook@mail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:None
[root@localhost tls]# openssl ca -in client.csr -out client.crt -keyfile ca.key -cert ca.crt
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Aug 24 05:50:19 2010 GMT
            Not After : Aug 24 05:50:19 2011 GMT
        Subject:
            countryName               = KR
            stateOrProvinceName       = Seoul
            organizationName          = MyCompany
            organizationalUnitName    = Research
            commonName                = MyClient
            emailAddress              = hook@mail.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                B0:CE:BA:FD:1D:17:4B:DF:4F:9A:36:37:DB:D8:8E:7A:A8:7C:C9:FF
            X509v3 Authority Key Identifier: 
                keyid:35:82:E4:7B:71:D1:F5:10:72:C2:0F:A5:0E:54:34:E3:C9:39:63:60

Certificate is to be certified until Aug 24 05:50:19 2011 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

현재까지 발급된 상황을 보면, CA용 비밀키와 인증서가 생성되었고,
서버용과 클라이언트용 비밀키와 인증서가 생성되었습니다.
CA가 관리하는 내용을 한번 검토해 봅니다.
[root@localhost tls]# ll
total 132
-rw-r--r-- 1 root root 1257 Aug 24 14:47 ca.crt
-rw-r--r-- 1 root root  963 Aug 24 14:46 ca.key
lrwxrwxrwx 1 root root   19 Jun  3 20:14 cert.pem -> certs/ca-bundle.crt
drwxr-xr-x 2 root root 4096 Aug 24 13:43 certs
-rw-r--r-- 1 root root 3209 Aug 24 14:50 client.crt
-rw-r--r-- 1 root root  757 Aug 24 14:50 client.csr
-rw-r--r-- 1 root root  963 Aug 24 14:49 client.key
drwxr-xr-x 6 root root 4096 Aug 24 14:50 demoCA
drwxr-xr-x 2 root root 4096 Jun  3 20:14 misc
-rw-r--r-- 1 root root 9828 Aug 24 14:43 openssl.cnf
-rw-r--r-- 1 root root 9828 Aug 24 14:42 openssl.cnf.org
drwxr-xr-x 2 root root 4096 Jul 23 10:06 private
-rw-r--r-- 1 root root 3209 Aug 24 14:48 server.crt
-rw-r--r-- 1 root root  757 Aug 24 14:48 server.csr
-rw-r--r-- 1 root root  963 Aug 24 14:47 server.key
[root@localhost tls]# cd demoCA
[root@localhost demoCA]# ll
total 88
drwxr-xr-x 2 root root 4096 Aug 24 14:44 certs
drwxr-xr-x 2 root root 4096 Aug 24 14:44 crl
-rw-r--r-- 1 root root    5 Aug 24 14:45 crlnumber
-rw-r--r-- 1 root root  212 Aug 24 14:50 index.txt
-rw-r--r-- 1 root root   20 Aug 24 14:50 index.txt.attr
-rw-r--r-- 1 root root   21 Aug 24 14:48 index.txt.attr.old
-rw-r--r-- 1 root root  106 Aug 24 14:48 index.txt.old
drwxr-xr-x 2 root root 4096 Aug 24 14:50 newcerts
drwxr-xr-x 2 root root 4096 Aug 24 14:45 private
-rw-r--r-- 1 root root    3 Aug 24 14:50 serial
-rw-r--r-- 1 root root    3 Aug 24 14:48 serial.old
[root@localhost demoCA]# ls certs/
[root@localhost demoCA]# ls crl
[root@localhost demoCA]# ls newcerts/
01.pem  02.pem
[root@localhost demoCA]# ll newcerts
total 16
-rw-r--r-- 1 root root 3209 Aug 24 14:48 01.pem
-rw-r--r-- 1 root root 3209 Aug 24 14:50 02.pem
[root@localhost demoCA]# ll private/
total 0

index.txt 파일에는 발급된 인증서에 대한 간략 정보가 기록되어 있습니다.
[root@localhost demoCA]# cat index.txt
V       110824054850Z           01      unknown /C=KR/ST=Seoul/O=MyCompany/OU=Research/CN=MyServer/emailAddress=hook@mail.com
V       110824055019Z           02      unknown /C=KR/ST=Seoul/O=MyCompany/OU=Research/CN=MyClient/emailAddress=hook@mail.com
[root@localhost demoCA]# cat index.txt.attr
unique_subject = no

serial 파일에는 발급된 인증서의 개수가 기록되어 있습니다. 총 3개의 인증서가 발급되었음을 알 수 있습니다.
[root@localhost demoCA]# cat serial
03
[root@localhost demoCA]# 

Posted by 훅크선장
, |
이미 이전에 XP 시스템에서 지우는 방법을 소개하였습니다.
비슷하기는 하지만, 조금은 다른 Windows 7 에서 USB 메모리나 USB 하드디스크등의 접속 기록을 지우는 방법을 기술합니다. 참고로 이 글의 바탕이 된 것은 현재 쓰고 있는 운영체제가 Window 7 64bit 이기 때문입니다. (지우느라 엄청 고생했습니다.)

XP 시스템에서 %windir% (대부분 C:\Windows\) 에 있는 setupapi.log 파일이 Windows 7 에는 존재하지 않습니다. 아마도 Vista 부터 로그 파일의 위치와 이름이 조금 바뀐 것 같습니다.

Windows 7 에서는 C:\Windows\inf\ 디렉토리에 보시면,
setupapi.app.log
setupapi.dev.log
setupapi.offline.log
라는 세 개의 파일로 존재합니다. 역쉬 텍스트 로그 파일입니다.
USB 장치에 대한 정보는 당연히 setupapi.dev.log 에 있을 것입니다. 이 파일을 완전 삭제하면 됩니다.  정 찜찜하시면, 세개 파일을 모두 완전삭제하면 됩니다. 이 파일들을 시스템에는 영향이 없는 것으로 알려져 있습니다. 다만, 현재 시스템에 디바이스 드라이버, 응용프로그램 들이 정상적으로 설치되어 있지 않다면, 에러를 추적할 수 있는 정보가 없어지게 됩니다. 참고하십시요~.

다음은 가장 중요한 레지스트리 삭제입니다.
레지스트리 키를 삭제해야 되는 위치는 XP 와 동일합니다.
이곳입니다. : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR
또한 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB 에 있는 내용도 지워주면 좋습니다. 하나씩 설명드리겠습니다.

테스트해본 결과, Windows 7 에서는 XP와 다르게, 키의 “사용권한”을 “Everyone”에 대해서 모든 권한을 부여해도 키가 삭제되지 않았습니다. 인터넷 문서들을 검색하여 참고하고, 차분히 디버깅해 본 결과,
문제는 
삭제하여야 USB 장치 키의 하위 키(2단계 밑에 있는)인 “Properties” 라는 키의 권한에 문제가 있었습니다.
1) 하위 “Properties” 키는 권한 변경 권한은 있지만, 볼 수 있는 권한이 기본적으로 지정되어 있지 않습니다.
2) 하위 “Properties” 키를 포함한 USB 장치 레지스트리 키에 대해서 권한을 부여하고 싶어도, 하위 “Properties” 키의 소유자 및 사용자는 “SYSTEM” 만 지정되어 있습니다.
3) 어떤 경우에는 하위 “Properties” 키에 소유자와 권한을 바꾸게 되면, 하위 “Properties” 키 하위에 또 다른 새로운 키들이 나타나는데, 그 키들도 역시 소유자 및 사용자는 “SYSTEM” 만 지정되어 있는 것입니다.

이상의 문제점으로 인해, Windows 7에서는 쉽게 레지스트리 키가 지워지지 않습니다. 
레지스트리 키를 지우기 위해서는 (현재까지 실험에 의해서, 알아낸 바에 의하면) regedit 외에 별도의  레지스트리 편집기가 필요합니다.  Registry Workshop(v4.2.4 for X64)을 사용했는데 아주 좋습니다.
각 도구의 기능을 설명하면, 
regedit 는 키를 삭제하는데만 사용합니다. ( Registry Workshop 으로는 키가 삭제되지 않습니다. 동일한 환경인데도 말입니다. 매우 이상하죠~)
Registry Workshop 은 레지스트리 키의 권한 변경 및 소유자 변경/추가에 사용됩니다. (regedit 로는 일괄적인 하위 키들에 대한 권한 변경 및 소유자 변경이 잘? 되지 않습니다. 왜 그런지 이유는 잘 모릅니다. 아직까진..) 

레지스트리 키를 삭제하는 순서입니다.
1. Registry Workshop 을 실행시키고, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR 로 이동합니다.
2. 지워야할 USB 장치 키를 선택하고, 오른쪽 버튼을 클릭한 다음, “사용권한(Permissions)”를 선택합니다.
3. “사용권한(Permissions)” 대화상자가 뜨면, “고급(V)” 버튼을 클릭합니다.
4. “소유자” 탭을 선택한 다음, “소유자를 다음으로 변경(O) :” 하단에서 Administrators 가 아닌 현재 로그인한 자신의 계정을 선택합니다. 그리고, 하단의 체크박스 “하위 컨테이너와 개체의 소유자 바꾸기(R)” 를 선택하여 체크상태로 만들고 나서, 확인 버튼을 클릭합니다.
5.  “사용권한(Permissions)” 대화상자에서 “그룹 또는 사용자 이름(G)” 하단에서 “Everyone” 을 선택하고, 바로 밑의 “Everyone의 사용권한(P)”에서 “Full Control(모든 권한)”의 허용 체크박스를 클릭하여 체크상태로 만들고, 확인 버튼을 클릭합니다.
6. 지워야할 USB 장치 키를 완전히 펼치면(키 이름 앞의 + 기호를 클릭해서 - 기호로 만들면), 2단계 하위에 “Properties” 라는 키가 빨간색으로 나타납니다.
7. “Properties” 라는 키를 선택하고, 오른쪽 버튼을 클릭한 다음, “사용권한(Permissions)”를 선택합니다.
8. “사용권한(Permissions)” 대화상자가 뜨면, “추가(D)” 버튼을 클릭합니다.
9. “사용자 또는 그룹 선택” 대화상자가 뜨면, “선택할 개체이름을 입력하시요(예제)” 하단 입력상자에 Everyone 을 입력하고 확인 버튼을 클릭합니다.
10.  “사용권한(Permissions)” 대화상자에서 “그룹 또는 사용자 이름(G)” 하단에서 “Everyone” 을 선택하고, 바로 밑의 “Everyone의 사용권한(P)”에서 “Full Control(모든 권한)”의 허용 체크박스를 클릭하여 체크상태로 만들고, 확인 버튼을 클릭합니다.
11. 이제 regedit를 실행시키고, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR 로 이동합니다. 그리고 지워야할 키를 선택한 다음, Delete 키를 눌러서, 키를 지우면 됩니다.
12. 만약 키가 지워지지 않는다는 에러메시지가 나오면, Registry Workshop 에서 해당 키의 2단계 하위 “Properties” 라는 키 밑에 새롭게 빨간색의 하위 키가 새롭게 보이는 것을 발견할 수 있을 것입니다. 이 키에 대해서는 7번부터 10번 까지의 과정을 반복해주면, 키의 색깔이 검정색으로 바뀌고 키가 지워질 수 있습니다. 모든 하위 키에 대한 변경이 완료되면, regedit로 키를 지우면 됩니다.

이상으로 Window 7에서 키 지우는 방법에 대해서 아주 복잡하게 설명드렸습니다. 혹, 더 좋은 방법을 아시는 분께서는 알려주시기 바랍니다. 위의 과정들 간단하게 Auto Hot Key 같은 매크로 지정 프로그램으로 단축키를 만들어서 하면 더 쉬울 것 같습니다만, 시도하지는 않았습니다. (매크로 만드는 시간이면, 키를 다 지울 수 있기 때문에, 약간 노가다 이기는 하지민...)

추가적으로 위와 동일한 방법으로,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB 에 있는 키도 지워주는 것이 좋습니다.
USB 하위의 키들은 VID_xxxx&PID_xxxx ... 이런 식으로 이름이 지어져 있습니다.
그 키 바로 하단 키들을 클릭해보면, DeviceDesc, Mfg, Service 등의 내용을 읽어보면, “USB 대용량 저장장치” 라는 단어가 보이게 됩니다. 이런 것들이 바로 USB 장치중에서 메모리 스틱이나 USB HDD 입니다. 이 키를 포함한 바로 상단의 키를 선택하고 지워주면 됩니다.

주의: 키 내용에서 “USB 입력장치” 또는 “usb hub*, “usb composite 장치” 이런 내용이 보이면, 그 키는 지우지 않아도 됩니다. 실수로 지웠다고 큰 일이 벌어지지는 않지만, 현재 사용중인 USB 마우스나, USB 키보드에 대한 디바이스 드라이버 정보인 경우에는 갑자기 마우스나 키보드 입력이 안 되어, 시스템을 강제 리부팅해야 될 수도 있습니다. 시스템에 큰 문제를 일으키지는 않습니다. USB 디바이스 정보는 리부팅되거나, 다시 꽂힐 때 정상적으로 재 로딩됩니다. 안심하셔도 됩니다.



Posted by 훅크선장
, |