2008년 11월 11일

Perl Win32::OLE Excel Cheat Sheet

VBA로 excel관련된 일을 automation하려다가 project를 잠궈논데 짜증나서 perl을 찾아봤는데. 훨씬 훌륭합니다. 아래 cheat sheet은 필요할때마다 참고하면 되겠네요..

use OLE;
use Win32::OLE::Const "Microsoft Excel";

###################################################################################################################################

#___ DEFINE EXCEL

$excel = CreateObject OLE "Excel.Application";

#___ MAKE EXCEL VISIBLE

$excel -> {Visible} = 1;

#___ ADD NEW WORKBOOK

$workbook = $excel -> Workbooks -> Add;
$sheet = $workbook -> Worksheets("Sheet1");
$sheet -> Activate;

#___ OPEN EXISTING WORKBOOK

$workbook = $excel -> Workbooks -> Open("$file_name");
$sheet = $workbook -> Worksheets(1) -> {Name};
$sheet = $workbook -> Worksheets($sheet);
$sheet -> Activate;

#___ ACTIVATE EXISTING WORKBOOK

$excel -> Windows("Book1") -> Activate;
$workbook = $excel -> Activewindow;
$sheet = $workbook -> Activesheet;

#___ CLOSE WORKBOOK

$workbook -> Close;

#___ ADD NEW WORKSHEET

$workbook -> Worksheets -> Add({After => $workbook -> Worksheets($workbook -> Worksheets -> {Count})});

#___ CHANGE WORKSHEET NAME

$sheet -> {Name} = "Name of Worksheet";

#___ PRINT VALUE TO CELL

$sheet -> Range("A1") -> {Value} = 1234;

#___ SUM FORMULAS

$sheet -> Range("A3") -> {FormulaR1C1} = "=SUM(R[-2]C:R[-1]C)"; # Sum rows
$sheet -> Range("C1") -> {FormulaR1C1} = "=SUM(RC[-2]:RC[-1])"; # Sum columns

#___ RETRIEVE VALUE FROM CELL

$data = $sheet -> Range("G7") -> {Value};

#___ FORMAT TEXT

$sheet -> Range("G7:H7") -> Font -> {Bold} = "True";
$sheet -> Range("G7:H7") -> Font -> {Italic} = "True";
$sheet -> Range("G7:H7") -> Font -> {Underline} = xlUnderlineStyleSingle;
$sheet -> Range("G7:H7") -> Font -> {Size} = 8;
$sheet -> Range("G7:H7") -> Font -> {Name} = "Arial";
$sheet -> Range("G7:H7") -> Font -> {ColorIndex} = 4;

$sheet -> Range("G7:H7") -> {NumberFormat} = "\@"; # Text
$sheet -> Range("A1:H7") -> {NumberFormat} = "\$#,##0.00"; # Currency
$sheet -> Range("G7:H7") -> {NumberFormat} = "\$#,##0.00_);[Red](\$#,##0.00)"; # Currency - red negatives
$sheet -> Range("G7:H7") -> {NumberFormat} = "0.00_);[Red](0.00)"; # Numbers with decimals
$sheet -> Range("G7:H7") -> {NumberFormat} = "#,##0"; # Numbers with commas
$sheet -> Range("G7:H7") -> {NumberFormat} = "#,##0_);[Red](#,##0)"; # Numbers with commas - red negatives
$sheet -> Range("G7:H7") -> {NumberFormat} = "0.00%"; # Percents
$sheet -> Range("G7:H7") -> {NumberFormat} = "m/d/yyyy" # Dates

#___ ALIGN TEXT

$sheet -> Range("G7:H7") -> {HorizontalAlignment} = xlHAlignCenter; # Center text;
$sheet -> Range("A1:A2") -> {Orientation} = 90; # Rotate text

#___ SET COLUMN WIDTH/ROW HEIGHT

$sheet -> Range('A:A') -> {ColumnWidth} = 9.14;
$sheet -> Range("8:8") -> {RowHeight} = 30;
$sheet -> Range("G:H") -> {Columns} -> Autofit;

#___ FIND LAST ROW/COLUMN WITH DATA

$last_row = $sheet -> UsedRange -> Find({What => "*", SearchDirection => xlPrevious, SearchOrder => xlByRows}) -> {Row};
$last_col = $sheet -> UsedRange -> Find({What => "*", SearchDirection => xlPrevious, SearchOrder => xlByColumns}) -> {Column};

#___ ADD BORDERS

$sheet -> Range("A3:I3") -> Borders(xlEdgeBottom) -> {LineStyle} = xlDouble;
$sheet -> Range("A3:I3") -> Borders(xlEdgeBottom) -> {Weight} = xlThick;
$sheet -> Range("A3:I3") -> Borders(xlEdgeBottom) -> {ColorIndex} = 1;
$sheet -> Range("A3:I3") -> Borders(xlEdgeLeft) -> {LineStyle} = xlContinuous;
$sheet -> Range("A3:I3") -> Borders(xlEdgeLeft) -> {Weight} = xlThin;
$sheet -> Range("A3:I3") -> Borders(xlEdgeTop) -> {LineStyle} = xlContinuous;
$sheet -> Range("A3:I3") -> Borders(xlEdgeTop) -> {Weight} = xlThin;
$sheet -> Range("A3:I3") -> Borders(xlEdgeBottom) -> {LineStyle} = xlContinuous;
$sheet -> Range("A3:I3") -> Borders(xlEdgeBottom) -> {Weight} = xlThin;
$sheet -> Range("A3:I3") -> Borders(xlEdgeRight) -> {LineStyle} = xlContinuous;
$sheet -> Range("A3:I3") -> Borders(xlEdgeRight) -> {Weight} = xlThin;
$sheet -> Range("A3:I3") -> Borders(xlInsideVertical) -> {LineStyle} = xlContinuous;
$sheet -> Range("A3:I3") -> Borders(xlInsideVertical) -> {Weight} = xlThin;
$sheet -> Range("A3:I3") -> Borders(xlInsideHorizontal) -> {LineStyle} = xlContinuous;
$sheet -> Range("A3:I3") -> Borders(xlInsideHorizontal) -> {Weight} = xlThin;

#___ PRINT SETUP

$sheet -> PageSetup -> {Orientation} = xlLandscape;
$sheet -> PageSetup -> {Order} = xlOverThenDown;
$sheet -> PageSetup -> {LeftMargin} = .25;
$sheet -> PageSetup -> {RightMargin} = .25;
$sheet -> PageSetup -> {BottomMargin} = .5;
$sheet -> PageSetup -> {CenterFooter} = "Page &P of &N";
$sheet -> PageSetup -> {RightFooter} = "Page &P of &N";
$sheet -> PageSetup -> {LeftFooter} = "Left\nFooter";
$sheet -> PageSetup -> {Zoom} = 75;
$sheet -> PageSetup -> FitToPagesWide = 1;
$sheet -> PageSetup -> FitToPagesTall = 1;

#___ ADD PAGE BREAK

$excel -> ActiveWindow -> SelectedSheets -> HPageBreaks -> Add({Before => $sheet -> Range("3:3")});

#___ HIDE COLUMNS

$sheet -> Range("G:H") -> EntireColumn -> {Hidden} = "True";

#___ MERGE CELLS

$sheet -> Range("H10:J10") -> Merge;

#___ INSERT PICTURE

$sheet -> Pictures -> Insert("picture_name"); # Insert in upper-left corner
$excel -> ActiveSheet -> Pictures -> Insert("picture_name"); # Insert in active cell

#___ GROUP ROWS

$sheet -> Range("7:8") -> Group;

#___ ACTIVATE CELL

$sheet -> Range("A2") -> Activate;

#___ FREEZE PANES

$excel -> ActiveWindow -> {FreezePanes} = "True";

#___ DELETE SHEET

$sheet -> Delete;

#___ SAVE AND QUIT

$excel -> {DisplayAlerts} = 0; # This turns off the "This file already exists" message.
$workbook -> SaveAs ("C:\\file_name.xls");
$excel -> Quit;

---------------------------------------------------------------------------------

use Win32::OLE;
use Win32::OLE qw(in with);
use Win32::OLE::Variant;
use Win32::OLE::Const 'Microsoft Excel';

$Excel = Win32::OLE->GetActiveObject('Excel.Application') ||
Win32::OLE->new('Excel.Application');
$Excel->{'Visible'} = 0; #0 is hidden, 1 is visible
$Excel->{DisplayAlerts}=0; #0 is hide alerts

# Open File and Worksheet
my $Book = $Excel->Workbooks->Open
('C:\report\results\check_all.csv'); # open Excel file
$Sheet = $Book->Worksheets(1);

# Create New Workbook
$Excel->{SheetsInNewWorkBook} = 1;
$Book2 = $Excel->Workbooks->Add();
$Sheet2 = $Book2->Worksheets(1);
$Sheet2->{Name} = 'My test worksheet';

# Find Last Column and Row
my $LastRow = $Sheet->UsedRange->Find({What=>"*",
SearchDirection=>xlPrevious,
SearchOrder=>xlByRows})->{Row};

my $LastCol = $Sheet->UsedRange->Find({What=>"*",
SearchDirection=>xlPrevious,
SearchOrder=>xlByColumns})->{Column};
$mylastcol = a;
for (my $m=1;$m<$LastCol;$m++){$mylastcol++;}
$mylastcol2 = a;
for (my $m=1;$m<($LastCol - 1);$m++){$mylastcol2++;}

# Draw Borders
my @edges = qw (xlInsideHorizontal xlInsideVertical);
$range = "a1:$mylastcol$LastRow";
foreach my $edge (@edges)
{
with (my $Borders = $Sheet->Range($range)->Borders(eval($edge)),
LineStyle =>xlContinuous,
Weight => xlThin ,
ColorIndex => 1);
}

# Cell Values
$Sheet->Range('a1')->{Value} = $Sheet->Range('b2')->{Value};

# Resize Columns
my @columnheaders = qw(A:B);
foreach my $range(@columnheaders){
$Sheet->Columns($range)->AutoFit();
}
# Order Rows
$tmp = "$mylastcol2".'3';
$Rangea = $Sheet->Range("$tmp");
$Rangeb = $Sheet->Range("a3");
$Excel->Selection->Sort({Key1 => $Rangea,
Order1 => xlDescending,
Key2 => $Rangeb});

# Merge Cells
$mynextcol = 'b';
for (my $n=1;$n<$LastCol;$n+=2)
{
my $range = $mynextcol++ . '1:' . $mynextcol++ . '1';
$Sheet->Range($range)->Merge();
$Sheet->Range($range)->{HorizontalAlignment} = xlHAlignCenter;
}

# Pie Chart
my $Range = $Sheet->Range('a1:d2');
my $Chart = $Book->Charts->Add;
$Chart->ChartWizard($Range,xl3DPie,7,xlRows,1,0,2,"Sales Percentages");

# Bar Graph and Rotate
my $Range = $Sheet->Range('a1:a3');
my $Chart = $Excel->Charts->Add;
$Chart->{Type} = xl3DColumn;
for (my $i = 30; $i <=180; $i+=10)
{
$Chart->{Rotation} = $i;
sleep(1);
}

# Line Chart and Save
my $Range = $Sheet->Range('a1:d2');
my $Chart = $Excel->Charts->Add;
$Chart->{ChartType} = xlLine;
$Chart->SetSourceData({Source => $Range, PlotBy => xlColumns});
$Chart->{HasTitle} = 1;
$Chart->ChartTitle->{Text} = "Some Title";

my $ChartObj = $Sheet->ChartObjects;

$Chart->Export({
FileName => $filegraphname,
FilterName => 'GIF',
Interactive => 0});

# Save as PDF
$Excel->ActiveWindow->SelectedSheets->PrintOut({
Copy => 1,
ActivePrinter => 'Acrobat PDFWriter'});

# Save as Excel
$Book->SaveAs({Filename =>'C:\report\results\check_all.xls',
FileFormat => xlWorkbookNormal});
$Book->Close();
$Excel->Quit();

2008년 11월 9일

Perl/Tk에서 한글사용하기.

Perl/Tk 모듈(그래픽 사용자 인터페이스 툴킷)은 인코딩을 정의해 주지 않으면 한글이 아예 나오지 않고 에러가 납니다..다음과 같이 인코딩을 한글로 지정하면 됩니다. 아래코드는 펄사용자 모임의 Tk tutorial 코드입니다.

#!/usr/bin/perl
use strict;
use encoding "cp949";
use Tk;
my $mw = MainWindow->new(-title=>"자! 시작입니다");
$mw->geometry("=600x400");

#$mw->Label(-text=>"Hello world 1!!")->pack(-side=>'bottom');
$mw->Label(-text=>"Hello world 2!!")->pack();
$mw->Label(-text=>"Hello world 3!!")->pack();
my $l_hello = $mw->Label(-text=>"Hello world!!")->pack();

$mw->Button(
-text=>"configure",
-command=>\&get_env
)->pack(-side=>'bottom');

$mw->Button( -text=>"close", -command=>sub { exit; } )->pack(-side=>'bottom');

MainLoop();

###
sub get_env {
my($k,$v, $txt);
while(($k,$v) = each(%ENV)) {
$txt .= "$k=$v\n";
}
$l_hello->configure(-text=>$txt);
}

# 단, 유니코드(UTF-8)일 경우에는
# use encoding 'utf8';# 을 사용
use encoding 'cp949'; 라고 해주면 됩니다.
확장완성형입니다.use encoding 'euc-kr'; 도 되긴 되는데 이러면 "똠방각하"의 "똠" 같은 글자가 나오지 않습니다.
그냥 완성형입니다.use encoding 'utf8'; 로 하면 물론 똠방각하도 되지만, 이때는 소스 자체의 인코딩이 유니코드(UTF-8)이어야 합니다.

위글은 mwultong Blog ― 디카 / IT에서 발췌한 글을 수정하였습니다.

2008년 9월 1일

dd-wrt에서 startup스크립트 작성

dd-wrt펌웨어 위에 openvpn등 각종 서비스를 올리고 그 서비스를 시작시 실행시키려 할때는 다음과 같은 디렉토리에 startup스크립트를 만들고 위치시키면 된다..

1. 위치
- DD-WRT는 아래의 디렉토리에서 순차적으로 startup 스크립트를 찾는다.
/etc/config/
/jffs/etc/config/
/mmc/etc/config/
/tmp/etc/config/

2. 확장자별 시작시점

.startup - will be executed on system startup, normally boot-time and: _before_ the firewall is configured

.wanup - will be executed whenever an interface goes up (ex: ppp connection is reestablished after a disconnect, goes up first time) and: _after_ firewall stuff, so good ending for custom QoS and stuf.

.if - will be executed whenever an interface goes up (ex: ppp connection is reestablished after a disconnect, goes up first time) and: _after_ firewall stuff, so good ending for custom QoS and stuff - .wanup - should be a better place for disconnect/reconnect events than the ones above

.ipup - is run when ppp connection is reestablished after a disconnect, _after_ firewall stuff.

.ipdown - is run when a ppp connection has been shut down

.sesbutton - is executed when the SES/AOSS/EZ-SETUP button is pressed

2008년 7월 22일

javascript window.onload function 사용하기

window.onload() *js 파일을 삽입하고 특정 함수들이 페이지가 로딩되고 난 후 실행되도록 할때 쓰이는 함수이다.

사실 함수는 간단하지만 잘못쓰는경우 동작을 안하는 경우가 많다.

아래처럼 쓰도록 하자...

window.onload=function()
{
실행함수();
}

2008년 7월 17일

arp spoofing 확인 및 방어(static type)

arp table을 확인 현재 gateway의 mac address를 확인한다


arp spoofing공격이 시도되면 mac address가 변경된것을 확인 할 수 있다.


arp table에서 gateway entry 속성을 변경 dynamic에서 static로 변경한다.
- 이렇게 하면 단순한 arp spoofing은 막을수 있다.


dynamic Type으로 원상복구한 화면이다.

2008년 7월 16일

WPA crack backtrack3

Backtrack3가 정식 release된뒤로 계속 post하고 있습니다.

airodump로 wpa를 사용하는 대상 ap를 검색합니다.

airodump-ng rausb0


찾은 ap와 client의 4way handshake를 dump합니다.
Client의 접속을 기다려야 됩니다.

airodump-ng --channel 2 --bssid target_ap_mac --write weak-net rausb0


WPA handshake가 포착되었다면.. 좋은 사전파일을 준비하여 aircrack-ng로 ditionary attack을 실시합니다.
aricrack-ng -w D8.DIC weak-net-01.cap


최종적으로 WPA-key를 찾았습니다.



2008년 7월 15일

backtrack3에 openoffice설치

Openoffice를 다운받는다.


압축을 푼다.

bt tmp # tar -xzvf OOo_2.4.0_LinuxIntel_install_ko.tar.gz

압축푼 폴더로 이동
cd OOH680_m12_native_packed-1_ko.9286/

rpm디렉토리로 이동
cd RPMS/

rpm을 패키지파일로 변경
rpm2tgz *.rpm

tgz파일을 인스톨
installpkg *.tgz

cd /opt/openoffice.org2.4/program/

실행
soffice

kde의 메뉴편집기에 등록

kde아이콘 오른쪽 버튼에 메뉴편집기 선택
이름 : office
명령 : /opt/openoffice.org2.4/program/soffice
work path : /opt/openoffice.org2.4/program



실행화면

2008년 7월 13일

Webkey hacking

Webkey hacking하기

webkey를 해킹하는 방법은 생각보다 간단하다.
테스트는 반드시 본인의 AP로만 하도록 하고, 아래 기술된 내용은 반드시 학습목적으로만 사용하도록 하자.

준비 : Backtrack3

1단계
Scan AP






-무선랜카드를 확인한다. 여기서는 rausb0이다. 모드를 monitor로 변경해서 scan하자
※ KISMET을 실행시켜서 모드를 변경할 수 있다.(필자의 lan카드는 wusb54g이다. usb랜카드이며 vmware에서도 지원하고 backtrack에서도 HCL리스트에 좋은 랜카드로 소개되어 있다.)

kismet –c rt2500,rausb0,rt
※ 일반적으로 kismet 실행시킬때는 위와 같이 source를 잘 지정해주어야 한다.



관련파일들은 현재 디렉토리 밑에 저장된다. Kismet~.csv라는 파일을 본다.




알아보기 쉽게 Kwrite로 열었다.


kismet dump는 아래처럼 ESSID;BSSID;Info;Channel;Cloaked;Encryption 순서대로 나와있다.
여기서 WEP키를 사용하는 jihyun이라는 AP를 대상으로 삼겠다(필자의 테스트용 AP이다)


이제 패킷을 모을 준비를 하자

airodump-ng -c 채널명 --bssid AP의 MAC -w 캡쳐파일위치 rausb0

airodump-ng -c 2 --bssid 00:18:84:19:4B:7D -w /root/0712 rausb0





*open시스템인지 확인한다.
aireplay-ng -1 0 -e jihyun -a 00:18:84:19:4B:7D -h 00:1E:E5:A3:BC:BB rausb0


*replay패킷을 보낸다.

aireplay-ng -3 -b 00:18:84:19:4B:7D -h 00:1E:E5:A3:BC:BB rausb0


*Packet을 gathering한다 128bit는 최소 60000 IV정도를 수집해야 한다.

패킷수집이 다 되었다.
*capture된 패킷을 가지고 aircrack-ng를 이용해 key를 찾는다.

aircrack-ng /root/0712-01.cap
실재 webkey와 일치한다.
Successful!




Backtrack3에서의 한글사용

backtrack3가 정식으로 출시되었다. 아래 링크에서 받을수 있다.

http://www.remote-exploit.org/backtrack_download.html

slackware기반의 깔끔한 livecd이며 각종 pen testing tool들이 가득하며, 이번버전에는 vmware 이미지 까지 같이 출시해서 따로 guest os로 인스톨하는 수고를 덜어 주었다. 그런데, 이 backtrack이 나온 지 얼마 안된livecd이기 때문에.. 한글화 되어있지 않고 관련 정보도 없다. backtrack은livecd로 주로 사용하고.. 작업도중 web검색등은 필요한 경우도 있을텐데 한글이 되지 않으므로 작업 시 불편함이 많다. 그래서. slackware와 slax한글 패키지를 이용해서 한글 입출력을 가능하게 해봤다. 이제 backtrack도 한글화 해서 불편 없이 쓰도록 하자.
Livecd로 사용할때는 첨부의 파일을 /Bt/modules로 카피하여 boot module로 등록하면 되고 나 같은 경우는 vmware image로 사용하고 있기 때문에 실제로 install해야 한다. 앞으로는 backtrack3를 계속 vmware상에서 사용할 것이기 때문에 vmware와 관련된 내용도 많이 올릴 것이다. 여기서 잠깐 vmware에 대해서 집고 넘어가보겠다.. vmware를 조금만 잘 이용해 보면 정말 유용한 도구로 바꾸어서 사용할 수 있다. VMWARE의 강력함은 단순히 가상화를 통한 타 OS를 쓸수 있는 것 뿐이 아니다. 여러가지 OS를 real과 virtual Network를 통해 구성할 수 있다는 점이다. 이 장점을 이용하면. 실재로 방화벽 및 프락시등을 포함한 간단한 중소기업 인프라 정도는 구축할 수 있다. 필자는 vmware-server버전으로 20대정도로 구성된 인프라 를 구축해 본적이 있다. 조금 버벅 거리긴 하지만. 잘 customizing한다면 훌륭한 test bed로 사용할 수 있다.

각설하고 backtrack에서 한글 입출력을 가능하도록 관련 패키지를 설치하겠다. 여기서는 lzm(slax boot모듈)과 iinstall패키지를 사용하고 slackware의 iinstall패키지는 installinstall, removeinstall 명령으로 바로 backtrack에서 사용할 수 있다.
한글입력에는 scim을 사용하는데 backtrack3에는 기본적으로 locale이 C와 POSIX밖에 없다. 이부분 때문에 조금 삽질했는데. 기존의 lzm모듈을 설치하는 명령어 하나로 끝냈다.

Part1패키지준비
우선 시작하기 전에 아래의 패키지가 필요하다.

윈도우상으로 받아놓고 mount해서 윈도우 공유폴더로 접근해도 될것이다. 물론 backtrack에서 바로 다운로드 해도 된다.

mount명령
mount.cifs //192.168.0.***/share /mnt/share –o username=userid

폰트
arita-ttf-1.0-noarch-2han.lzm
alee-fonts-ttf-11[1].5-noarch-1han.tgz
unfonts-ttf-1[1].0.1-noarch-4han.tgz

scim관련
scim-1.4.7-i486-13han.lzm
scim-hangul-0.3.1-i486-1han.lzm
libhangul-0.0.5-i686-1.lzm

KDE한글화
kde-i18n-ko-3.5.7-noarch-1.lzm

한글 로케일
locale_ko.lzm

part2 – 패키지 설치

2-1.
lzm2dirarita-ttf-1.0-noarch-2han.lzm /
installpkgalee-fonts-ttf-11[1].5-noarch-1han.tgz
installpkgunfonts-ttf-1[1].0.1-noarch-4han.tgz

2-2.
lzm2dir scim-1.4.7-i486-13han.lzm /
lzm2dir scim-hangul-0.3.1-i486-1han.lzm /
lzm2dir libhangul-0.0.5-i686-1.lzm /

2-3.
lzm2dir kde-i18n-ko-3.5.7-noarch-1.lzm /

2-4.
lzm2dir locale_ko.lzm /

Part3 Verification

우선 /etc/profile.d/lang.sh를 확인해보자 ’export LANG=ko_KR’과LC=’ko_KR’ 로 되어있는지 보자.
나중에 글자가 올바르게 표시되지 않는다면 이부분을 ko_KR.utf8 또는 ko_KR.euckr로 바꾸어 보자.

locale명령을 통해 locale에 한글 로케일이 추가 되었는지 확인해 보자
locale -a 를 통해 현재 사용가능한 locale가 무엇인지도 확인할 수 있다.


firefox의 글자체를 조정해 보자.

backtrack3

2008년 6월 29일

DD-WRT에 openvpn 서비스 설치하기 - PKI방식

Prepared by ChangHunLee KPMG IT Advisory Service.
Date : 2008-06-28

Part1 openvpn with PKI
DD-Wrt로 핵펌된 라포네라에 openvpn서비스를 실행하여 외부에서 내부망을 접속하거나 내부망의 Gateway를 이용해서 다양한(?) 응용을 할 수 있다.
물론 openvpn을 용량이 4mega인 linksys wrt54g에도 서비스 할수 있다. 하지만 이경우는 PKI방식을 사용할 경우 startup script에 대해 용량문제가 발생할수 있다.

**주의: 반드시 작업을 하기 전에 공유기의 NTP 서버와 PC의 NTP 서버를 맞추여야 한다. 그렇지 않으면 인증오류가 난다.

Part1-1. Jffs2 Enable
Openvpn 패키지 설치 전에는 반드시 jffs2 파티션을 활성화해서 공간을 확보한다.
dd-wrt의 웹 관리 화면의 administration에 보면 아래와 같이 jffs2 support를 enable하도록 하자. 그러면 현재 Total/Free Size가 표시된다. (Router를 reboot해야 한다.)공간이 준비가 되었으면 Openvpn관련 패키지를 설치한다.


Part1-2. openvpn 패키지 설치
우선 putty를 이용해 dd-wrt에 ssh로 접속한다.
필자는 Lafonera를 여러대 가지고 있으므로 192.168.0.102로 설정해 놓았지만 일반적으로 192.168.1.1로 접속한다. ID/패스워드는 변경하지 않았다면 root/admin 이다.
(!보안을 위해 반드시 패스워드는 변경하도록 하자.)

접속후에는 openvpn서비스에 필요한 패키지들을 설치한다.
그림에서 보면 /jffs 파티션이 생겼음을 알수 있다.

아래 명령어를 순서대로 수행해 openvpn관련 패키지를 jffs파티션에 설치한다.

cd /tmp
wget http://ipkg.k1k2.de/packages/libopenssl_0.9.8e-3_mips.ipk
ipkg -d /jffs/ install libopenssl_0.9.8e-3_mips.ipk
rm libopenssl_0.9.8e-3_mips.ipk
wget http://ipkg.k1k2.de/packages/openssl-util_0.9.8e-3_mips.ipk
ipkg -d /jffs/ install openssl-util_0.9.8e-3_mips.ipk
rm openssl-util_0.9.8e-3_mips.ipk
wget http://ipkg.k1k2.de/packages/liblzo_2.02-1_mips.ipk
ipkg -d /jffs/ install liblzo_2.02-1_mips.ipk
rm liblzo_2.02-1_mips.ipk
wget http://ipkg.k1k2.de/packages/openvpn_2.0.9-2_mips.ipk
ipkg -d /jffs/ install openvpn_2.0.9-2_mips.ipk
rm openvpn_2.0.9-2_mips.ipk
wget http://ipkg.k1k2.de/packages/openvpn-easy-rsa_2.0.9-2_mips.ipk
ipkg -d /jffs/ install openvpn-easy-rsa_2.0.9-2_mips.ipk
rm openvpn-easy-rsa_2.0.9-2_mips.ipk


Jffs를 확인해보면 용량이 줄었음을 알수 있다.


Part1-3 Openvpn Startup script만들기

vi /jffs/usr/sbin/openvpn-stop

#!/bin/sh
/usr/bin/killall -q openvpn
/usr/sbin/brctl delif br0 tap0
/jffs/usr/sbin/openvpn --rmtun --dev tap0

vi /jffs/usr/sbin/openvpn-start

#!/bin/sh
/jffs/usr/sbin/openvpn --mktun --dev tap0
/usr/sbin/brctl addif br0 tap0
/sbin/ifconfig tap0 0.0.0.0 promisc up
/jffs/usr/sbin/openvpn --config /jffs/etc/openvpn/config.conf

mkdir /jffs/etc/config/
vi /jffs/etc/config/openvpn.startup

#!/bin/sh
/jffs/usr/sbin/openvpn-stop
/jffs/usr/sbin/openvpn-start

chmod 755 /jffs/usr/sbin/openvpn-stop
chmod 755 /jffs/usr/sbin/openvpn-start
chmod 700 /jffs/etc/config/openvpn.startup


Part1-4 PKI설정하기(Key,Crt파일생성)

아래 명령어들을 실행하여 각 파일들내의 부분을 아래와 같이 변경한다.
mkdir /jffs/etc/easy-rsa/keys
vi /jffs/etc/easy-rsa/vars

주: KEY_SIZE를 2048로 하면 상당한 시간이 소요된다.

# easy-rsa parameter settings
export EASY_RSA="/jffs/etc/easy-rsa"
export KEY_CONFIG=`/jffs/usr/sbin/whichopensslcnf $EASY_RSA`export KEY_SIZE=1024



vi /jffs/usr/sbin/build-dh
. /jffs/etc/easy-rsa/vars

vi /jffs/usr/sbin/build-ca
"/jffs/usr/sbin/pkitool" --interact --initca $*



vi /jffs/usr/sbin/pkitool
. /jffs/etc/easy-rsa/vars


/jffs/usr/sbin/build-dh


/jffs/usr/sbin/build-ca


vi /jffs/usr/sbin/build-key-server
"/jffs/usr/sbin/pkitool" --interact --server $*


touch /jffs/etc/easy-rsa/keys/index.txt
echo "01" > /jffs/etc/easy-rsa/keys/serial
/jffs/usr/sbin/build-key-server VPN-Server



vi /jffs/usr/sbin/build-key
"/jffs/usr/sbin/pkitool" --interact $*


/jffs/usr/sbin/build-key VPN-Client1
/jffs/usr/sbin/build-key VPN-Client2



mkdir /jffs/etc/
mkdir /jffs/etc/openvpn/
vi /jffs/etc/openvpn/certificados.conf

*TCP로 서비스하는경우
daemon
port 443
proto tcp-server
tls-server
dh /jffs/etc/easy-rsa/keys/dh1024.pem
ca /jffs/etc/easy-rsa/keys/ca.crt
cert /jffs/etc/easy-rsa/keys/VPN-Server.crt
key /jffs/etc/easy-rsa/keys/VPN-Server.key
dev tap0
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
verb 3



rm /jffs/etc/openvpn/config.conf
ln -s /jffs/etc/openvpn/certificados.conf /jffs/etc/openvpn/config.conf

Part1-5 실행 및 접속하기

* 서버에서 openvpn실행
/jffs/etc/config/openvpn.startup

*참고
/jffs/usr/sbin/openvpn-stop
/jffs/usr/sbin/openvpn-start


“ps grep openvpn” 명령으로 openvpn 서비스 실행을 확인


아래의 파일을 Client로 복사합니다.(안전한 방법으로전송해야겠죠?)
"ca.crt" "VPN-Client1.crt" and "VPN-Client1.key"

아래는 Client접속 스크립트입니다.

remote IP_address_for_vpn
port 443
proto tcp-client
tls-client
ca ca.crt
cert VPN-Client1.crt
key VPN-Client1.key
dev tap0
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
verb 3
Openvpn-Gui로 연결하면 아래와 같이 연결됩니다.


이제 openvpn으로 외부에서 집컴퓨터의 사설망으로 접속이 가능하다.

** 만일 회사의 방화벽등을 우회하기 위해서 모든 트래픽을 openvpn을 통해서 전송하고 싶다면. 아래와 같은 client script를 사용한다. (맨아래 두줄이 다르다)

remote IP_address_for_vpn
port 443
proto tcp-client
tls-client
ca ca.crt
cert VPN-Client1.crt
key VPN-Client1.key
dev tap0
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
verb 3
route-gateway 192.168.0.1
redirect-gateway

감사합니다.

2008년 6월 28일

폰공유기 핵펌 Part 2-2 Flashing Legend Firmware

이번에는 Legend firmware로 핵펌해보자

pc의 아이피를 아래와 같이 바꾼다.

tftpd32.exe를 실행한다. 다운로드 받을 파일이 같은 디렉토리에 있으면 된다. 실행후 ip는 192.168.1.166을 선택한다.


putty를 이용해 telnet 접속을 port9000으로 한다. 접속대상 ip는 192.168.1.254

아래의 명령어를 순서대로 입력한다. Continue(y/n)이 나오면 ‘y’를 입력한다.
주 : fis command는 시간이 조금 소요된다.(1-10분정도)

ip_address -l 192.168.1.254/24 -h 192.168.1.166
fis init



load -r -v -b %{FREEMEMLO} openwrt-atheros-2.6-root.jffs2-64k


fis create -f 0xA8030000 -l 0x006F0000 rootfs
이명령어는 10-20분정도 시간이 소요된다. 작업이 완료되고 나서도 output이 없을수도 있으니, 파워를 끄거나 세션을 종료하지 말자.


load -r -v -b %{FREEMEMLO} openwrt-atheros-2.6-vmlinux.lzma






fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7



reset command로 reset한다.

legend ssid로 연결하고, 브라우저에서 192.168.1.1로 web management화면으로 접속한다.



아래와 같은 에러 메시지가 나타날 경우는 telnet으로 접속해서 (ssh는 default root 패스워드가 없으므로접속이 불가능하다)

webif를 재설치 해야 한다.



webif 패키지를 설치하기 위해 순서대로 아래 명령어를 입력한다.
기존의 webif를 삭제한다.

ipkg remove webif


ipkg install http://downloads.x-wrt.org/xwrt/kamikaze/7.09/atheros-2.6/packages/webif_0.3-8_mips.ipk

webif를 재설치 하면 아래와 같은 legend 초기 화면을 볼 수 있다

다음에는 DD-WRT에 openvpn서비스를 올려 실제로 응용(?)하는 방법에 대해 알아보자