2012년 10월 30일 화요일

VMware 의 NAT 설정과 패킷캡쳐시 promiscuous 모드 설정

VMware 의 NAT 기능을 이용하면서 네트워크 설정에 문제를 겪는 분들이 있어 내용을 공유하고자 한다. NAT 설정을 있는 그대로 사용하면 크게 문제는 발생하지 않는데, 자체적으로 IP 를 설정하는 경우 네트워크 통신이 안되는 경우가 발생한다. 이런 경우는 가상 머신에 설정된 IP 대역과 호스트쪽 네트워크 인터페이스 내용이 일치 하지 않아 나타나는 경우가 많다. 즉, 가상머신 IP 는 바꾸었지만 호스트쪽은 이전에 설정된 내용 그대로 이용하면서 네트워크가 안되는 경우다.

리눅스 사용자라면 다음의 경로로 들어가 보자. 윈도우 사용자도 리눅스 경우와 크게 다르지 않다. (가상 머신에 설정된 IP 와 호스트에서 이용하는 NAT 어뎁터를 살펴보자)

# cd /etc/vmware

# ls -l
total 24
-rw-r--r-- 1 root root  226 2012-08-23 10:44 bootstrap
-rw-r--r-- 1 root root  526 2012-08-24 09:50 config
lrwxrwxrwx 1 root root   19 2012-08-23 10:44 icu -> /usr/lib/vmware/icu
lrwxrwxrwx 1 root root   56 2012-08-23 10:45 installer.sh -> /usr/lib/vmware-installer/2.0/vmware-uninstall-downgrade
-rw-r--r-- 1 root root   54 2012-08-23 10:45 locations
-rw-r--r-- 1 root root  462 2012-08-23 11:37 networking
drwxr-xr-x 3 root root 4096 2012-08-23 10:44 vmnet1
drwxr-xr-x 4 root root 4096 2012-08-23 10:44 vmnet8

vmnet8 이 보일 것이고 바로 기본 설정되는 이 vmnet8 이 NAT 로 이용되는 인터페이스 이다.
# cd vmnet8 
# ls -l
total 12
drwxr-xr-x 2 root root 4096 2012-08-24 11:00 dhcpd
drwxr-xr-x 2 root root 4096 2012-08-23 11:39 nat
-rw-r--r-- 1 root root   18 2012-08-24 11:10 nat.mac

nat 설정파일을 한번 들여다 보자.


# more nat

# VMware NAT configuration file

[host]

# NAT gateway address
ip = 192.168.70.1
netmask = 255.255.255.0

# VMnet device if not specified on command line
device = /dev/vmnet8

NAT gateway 주소 설정이 보인다. 여기에 설정된 IP 는 다를 것이고, 본인이 원하는 특정 IP 주소를 (여기서는 192.168.70.X 대역 이용) 기록해 주면 된다. 설정파일을 변경한다고 바로 적용되지는 않는다. VMware 네트워크를 재 시작해 주거나 또는  ifconfig 를 통해 vmnet8 의 IP 를 주소를 바꿔주면 된다. 다음은 ifconfig 로 IP 를 변경하고 ifconfig 로 살펴본 내용으로 vmnet8 의 주소가 192.168.70.1 이 되었다. 가상머신에서 192.168.70.X 로 설정하고 게이트웨이 주소를 192.168.70.1 로 잡아주면 네트워크는 잘 될 것이다.

# ifconfig vmnet8
vmnet8    Link encap:Ethernet  HWaddr 00:50:56:c0:xx:xx
          inet addr:192.168.70.1  Bcast:192.168.70.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fexx:x/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:235 errors:0 dropped:0 overruns:0 frame:0
          TX packets:100 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

가상머신에서 와이어샤크를 이용해 패킷 덤프를 하는 경우 아래 그림과 같은 메시지가 나타날 수 있다. 보안상의 이유로 이더넷 인터페이스에 promiscuous 모드를 설정할 수 없다는 것이다.


이에 대한 해결책으로는 해당 디바이스의 퍼미션을 변경해 주면 된다.

# ls -l /dev/vmne*
crw------- 1 root root 119, 0 2012-08-24 10:13 /dev/vmnet0
crw------- 1 root root 119, 1 2012-08-24 10:13 /dev/vmnet1
crw------- 1 root root 119, 8 2012-08-24 10:13 /dev/vmnet8

/dev 밑에 vmnet* 이라는 문자열들을 볼 수 있고, NAT 에서 사용하는 /dev/vmnet8 에 rw 퍼미션을 추가해 주면 된다.

# chmod a+rw /dev/vmnet8
# ls -l /dev/vmne*
crw------- 1 root root 119, 0 2012-08-24 10:13 /dev/vmnet0
crw------- 1 root root 119, 1 2012-08-24 10:13 /dev/vmnet1
crw-rw-rw- 1 root root 119, 8 2012-08-24 10:13 /dev/vmnet8

rw 퍼미션이 추가된 후에는 패킷캡쳐 동작시 위와 같은 메시지는 다시 나타나지 않는다.


[참고]
1. Using Virtual Ethernet Adapters in Promiscuous Mode on a Linux Host
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=287

2012년 10월 26일 금요일

패킷에서 추출해 낸 데이터 역으로 돌리기


패킷파일에서 추출해 낸 바이너리 데이터를 역(Reverse)으로 되돌릴 경우에는 어떤 방법을 사용할 수 있을까? 프로그램을 작성해서 역으로 만들수도 있다. 프로그램을 배우는 초반에 많이 언급되는 내용중에 하나이다. 이런 방법말고 간단히 도구만으로 쉽게 만들 수 없을까? 일단, 추출한 데이터가 1.bin 이라고 가정해 보자. xxd 나 hexdump 와 같은 프로그램을 이용해 HEX 값으로 출력을 할 수가 있다. 출력방법은 '00 00 00 00' 과 같이 한개의 HEX 값을 출력하고 공백 그리고 HEX 값이 이어지는 구조로 얻고 싶다. 이런 경우에는 hexdump 에서 아래와 같은 방법으로 포맷을 맞출수가 있다.

# hexdump -v -e '/1 "%02X "' 1.bin > 1.txt
52 75 6E 6E 69 6E 67 20 58 20 73 65 73 73 69 6F 6E 20 77 72 61 70 70 65 72 0A 4C
 6F 61 64 69 6E 67 20 70 72 6F 66 69 6C 65 20 66 72 6F 6D 20 2F 65 74 63 2F 70 7
2 6F 66 69 6C 65 0A 4C 6F 61 64 69 6E 67 20 70 72 6F 66 69

자, 그럼 이 데이터를 역으로 돌리면 되는데 쉽게 떠오르는 명령어로 rev 가 있다. 그런데 rev 를 사용하면 약간의 문제가 있다. 데이터가 역으로는 되는데 HEX 값 자체도 앞뒤가 뒤바뀌어 버린다.

# hexdump -v -e '/1 "%02X "' 1.bin | rev
 96 66 F6 27 07 02 76 E6 96 46 16 F6 C4 A0 56 C6 96 66 F6 27 07 F2 36 47 56 F2 02 D6 F6 27 66 02 56 C6 96 66 F6 27 07 02 76 E6 96 46 16 F6 C4 A0 27 56 07 07 16 27 77 02 E6 F6 96 37 37 56 37 02 85 02 76 E6 96 E6 E6 57 25

차이점을 알 수 있을 것이다. 끝 데이터인 6F 66 69 가 역으로 앞으로는 갔는데 96 66 F6 과 같이 이 값 자체도 앞뒤가 바뀐것이다. 이렇게 되면 전혀 엉뚱한 값이 된다. 이럴때 쉽게 사용할 수 있는 명령어로 tac 가 있다. *NIX 의 대표적인 명령어 cat 를 거꾸로 뒤짚어 보자. tac 가 된다. 그렇다 cat 과 같은 기능을 역으로 해주는 것이다. (필자도 tac 라는게 있는줄은 몰랐다. 쉽게 역으로 변환할 수 있는 도구가 무엇이 있을까 찾게되었다)

[TAC 도움말]

# tac --help

Usage: tac [OPTION]... [FILE]...
Write each FILE to standard output, last line first.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -b, --before             attach the separator before instead of after
  -r, --regex              interpret the separator as a regular expression
  -s, --separator=STRING   use STRING as the separator instead of newline
      --help     display this help and exit
      --version  output version information and exit

Report tac bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
For complete documentation, run: info coreutils 'tac invocation'

# tac -s ' ' 1.txt > 2.txt


-s 옵션은 구분자를 지정하는 것으로 우리가 만들어낸 데이터가 각 HEX 값 마다 공백을 가지고 있으므로 ' ' 로 구분해 주었다. 그러면 역으로 만들어진 데이터가 2.txt 에 저장되었다.

ASCII 로 만들어진 데이터를 바이너리로 만드는 방법은 여러가지가 있다. 입력 데이터가 무엇이냐에 따라 다르지만 앞서 언급한 경우는 다음과 같이 할 수 있다.

# xxd -r -plain 2.txt

xxd 의 -r 옵션은 hexdump 데이터를 바이너리로 컨버터 해주는 것이다.

패킷에서 추출해 낸 데이터가 어떤 형식이냐에 따라 그것을 어떻게 다뤄야 할지가 나눠진다. 오늘 소개한 것은 여러 경우중 일부에 속한다. 이런 방법도 있구나 하고 알아두면 좋을것 같다.

2012년 10월 22일 월요일

VMware Workstation 설치 컴파일 오류(SPIN_LOCK_UNLOCKED)

VMware 7.1.4 리눅스 버전을 설치하면서 발생하는 에러에 대해 공유하고자 한다. VMware Workstation 최신 버전은 9 이다. 그러나, 정식적으로 사용 가능한 라이센스는 7 버전을 보유하고 있기에 7.1.4 를 설치하였다. (물론, 많은 경우는 무료로 사용 가능한 VirtualBox 를 사용하지만..)

설치하는 도중에 아래 그림과 같이 Error 메시지를 출력한다.


자세한 에러 메시지를 보면

"Unable to build kernel module.
See log file /tmp/vmware-root/setup-29550.log for details"

와 같았다. 로그파일을 살펴보면 특정 파일을 컴파일 하는 과정에서 발생하는 것이고, 이것을 수동으로 컴파일 해보면 다음과 같은 과정이다.

root@:/tmp/vmware-root# /usr/bin/make -C /tmp/vmware-root/modules/vmmon-only auto-build SUPPORT_SMP=1 HEADER_DIR=/lib/modules/3.0.0-22-generic/build/include CC=/usr/bin/gcc GREP=/usr/bin/make IS_GCC_3=no VMCCVER=4.6.1
Using 2.6.x kernel build system.
make: Entering directory `/tmp/vmware-root/modules/vmmon-only'
make -C /lib/modules/3.0.0-22-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
 MODULEBUILDDIR= modules
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-22-generic'
  CC [M]  /tmp/vmware-root/modules/vmmon-only/linux/driver.o
/tmp/vmware-root/modules/vmmon-only/linux/driver.c:783:59: error: ‘SPIN_LOCK_UNLOCKED’ undeclared here (not in a function)
make[2]: *** [/tmp/vmware-root/modules/vmmon-only/linux/driver.o] Error 1
make[1]: *** [_module_/tmp/vmware-root/modules/vmmon-only] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-22-generic'
make: *** [vmmon.ko] Error 2
make: Leaving directory `/tmp/vmware-root/modules/vmmon-only'

SPIN_LOCK_UNLOCKED 가 선언되지 않았다고 계속 나타나는 문제였다. 관련 내용을 구글링 해보고 다음 패치파일을 찾을 수 있었다.

패치파일 다운로드 받기 : http://weltall.heliohost.org/wordpress/wp-content/uploads/2011/08/fullvmwarelinux310patch.tar.gz

패치를 실행해 보았다. 그러나 다음과 같은 메시지만 계속 출력된다.

# ./patch-modules_2.6.39.sh
Sorry, this script is only for VMWare WorkStation 7.1.5 or VMWare Player 3.1.5. Exiting

분명 패치파일에는 7.1.4 버전도 분명 명시되어 있었다. 스크립트 파일을 살펴보니

[ "$vmver" == "workstation$vmreqver2" ] && product="VMWare WorkStation"
[ "$vmver" == "player$plreqver2" ] && product="VMWare Player"

와 같이 vmreqver2 를 참고하는 변수가 있지만 실제 스크립트에는 없다. 아래와 같이 스크립트가 변경이 필요하다.

vmreqver=7.1.4
plreqver=3.1.4
vmreqver=7.1.5
plreqver=3.1.5

를 다음과 같이 변경하였다.

vmreqver=7.1.4
plreqver=3.1.4
vmreqver2=7.1.5
plreqver2=3.1.5

그리고 다시 패치 스크립트를 실행하면 깔끔하게 실행이 된다.

# ./patch-modules_2.6.39.sh
patching file vmblock-only/linux/dentry.c
patching file vmblock-only/linux/filesystem.c
patching file vmci-only/linux/driver.c
patching file vmmon-only/linux/driver.c
patching file vmmon-only/linux/hostif.c
patching file vmmon-only/linux/iommu.c
patching file vmnet-only/compat_netdevice.c
.
.
.
Built vsock module
Starting VMware services:
   VMware USB Arbitrator                                               done
   Virtual machine monitor                                             done
   Virtual machine communication interface                             done
   VM communication interface socket family                            done
   Blocking file system                                                done
   Virtual ethernet                                                    done
   Shared Memory Available                                             done


All done, you can now run VMWare WorkStation.
Modules sources backup can be found in the '/usr/lib/vmware/modules/source-workstation7.1.4-2012-10-09-15:04:41-backup' directory


자, 이제 패치가 완료되었으니 VMware 를 다시 재 설치 진행해 주면 에러 발생없이 깨끗하게 설치가 진행된다. 참고로 VMware 7.1.6.744570 버전도 해당 패치를 반영하여 사용이 가능하다. 패치 적용시 후반에 약간의 오류가 있긴 하지만 VMware 를 실행하면 커널 컴파일 하는 GUI 화면에서 제대로 진행이 계속된다.

참고로, VMWare 를 설치한 파일은 "VMware-Workstation-Full-7.1.4-385536.x86_64.bundle" 이며, 커널은 3.0.0-22 이었다. (64비트)

혹시, 같은 에러를 경험할 사용자를 위해 해결책을 공유한다.

2012년 10월 18일 목요일

크롬 브라우저에서 SSH 접속을 해보자!

SSH 를 통해서 시스템에 급하게 접근을 해야 하는데, SSH 클라이언트 프로그램이 없다면 구글 크롬 브라우저를 이용해 보는 것도 좋은 방법이다. 구글 크롬 웹 스토어에서 SSH 접속이 가능하게끔 해주는 클라이언트가 있기 때문이다.

우선, 아래의 크롬 웹 스토어에 접속을 한 후, SSH 로 검색해 본다.
https://chrome.google.com/webstore/category/home?hl=ko&utm_source=chrome-ntp-launcher

여러가지들이 나오는데 그 중에서는 필자는 다음 Secure Shell 이라는 것을 선택하였다.


크롬에 추가 한후, 실행하면 다음과 같이 접속 화면이 나온다.  세션을 저장할 이름을 기록하는 곳도 보이고 접속할 대상 시스템의 사용자 이름과 호스트명 (or IP) 을 적는 곳이 보인다.
접속 대상 정보를 입력하고 엔터를 눌러주면 SSH 접속이 이뤄진다.

그럼 일반적으로 사용해 오던 SSH 클라이언트 화면과 동일하게 사용할 수 있다. 크롬 브라우저 하나만 있으면 말이다.

2012년 10월 16일 화요일

[추천] '리버싱 핵심원리' 책을 소개합니다.

오늘 한권의 책을 소개하고자 한다. 필자와 친분이 있는 리버스코어 블로그 운영자님이 최근에 리버싱 이야기를 집대성한 책을 출간하였다.

이 책은 단순히 리버싱을 하기위한 것 보다 그 기본을 이해하는데 많은 내용을 할애하고 있다. 동작원리와 내부구조등을 이해하는데 중심을 두고 있다. 책 페이지는 1,029 페이지로 책 두께가 얼마나 노력하면서 써왔는지 말해주고 있다. 그간 옆에서 지켜보아오면서 책을 마무리 짓기 위해 고분분투하는 모습을 보아왔다. 그 노력의 결과가 바로 지금의 ' 리버싱 핵심원리 ' 라는 이야기로 책이 세상에 나온것이다.

패킷인사이드에서도 가끔 리버싱을 소개하는 경우도 있다. 패킷 그 자체를 분석하다 보면 그 안에서 바이너리 데이터를 얻기도 하고 그럼 그 데이터를 분석하기 위해 리버싱이 필요한 경우가 분명 있다.

여러분들이 분석가로서의 범위를 넓히고 싶다면 이 책을 추천하고자 한다. 절대 후회없는 선택이 될것이라 믿는다.


[패킷인사이드의 추천사]

지금 당신의 손에 이 책이 들려있다면, 당신은 리버싱이라는 단어가 주는 매력에 이끌렸을 것이다. 
 리버싱을 처음 접하는 사람들은 공부할 것이 많고 시작하기 전부터의 걱정에 사로잡혀 어려움을 느끼기도 한다. 하지만 모든것을 다 알고 시작할 필요는 없다. 배움의 과정에서 차근히 얻어갈 수 있는 지침을 이 책에서 제시해 줄 것이기 때문이다. 
 이 책은 리버싱 입문자의 마음자세를 중요하게 생각하고 있고, 다른 책들과 달리 단순 기법의 나열이 아닌 그 기법의 의미와 동작원리 그리고 내부구조를 이해하는데 초점을 맞추고 있다. 또한 풍부한 실습예제를 학습하면서 리버싱이 몸에 스며들도록 노력한 필자의 고민이 묻어난다. 
 리버서가 되기를 원하는가? 개발자인 나에게도 필요한가? 라는 질문을 가지고 있다면 이 책은 당신의 확실한 동반자가 될 것이다.

앞으로 패킷인사이드에서도 준비가 되면 한권의 책으로 여러분들을 만나뵙겠습니다. 그때가 언제될지는 모르겠지만요. ^^

2012년 10월 10일 수요일

내 시스템에 설치된 Libpcap 버전 확인하기

과연 내 시스템에는 어떤 버전의 Libpcap 이 설치되어 있는 것인가? 필요에 따라 PCAP 라이브러리 버전 확인이 필요한 경우가 있다. 이럴때 쉽게 확인할 수 있는 방법 몇 가지를 적어본다.

1) ls 명령어로 라이브러리 디렉토리 살펴보기 

$ ls -l /usr/lib/*pcap*
or
$ ls -l /usr/lib/i386*/*pcap*

/usr/lib/i386-linux-gnu/libpcap.so.0.8
/usr/lib/i386-linux-gnu/libpcap.so
/usr/lib/i386-linux-gnu/libpcap.a
/usr/lib/i386-linux-gnu/libpcap.so.1.1.1

이 상황은 시스템에 따라 많이 달라질 수 있으므로, find 를 이용해 검색해 보아도 된다. 여기 예에서는 1.1.1 버전과 0.8 버전이 있는 것으로 추정할 수 있다.

2) 패키지 프로그램을 이용해 확인하기 

rpm 을 사용한다면 다음과 같이 pcap 문자열로 확인해 본다.


$ rpm -qa | grep pcap

데비안 계열이라면

$ apt-cache pkgnames | grep pcap

를 통해 설치되어 있는 패키지를 확인하고 출력되는 패키지 이름을 보고

$ apt-cache showpkg libpcap-dev

와 같이 세부적으로 살펴볼 수 있다.

3) ldconfig 를 통해 라이브러리 링크 연결을 확인해 본다.

$ ldconfig -p | grep pcap

4) libpcap 라이브러리를 이용해 직접 버전을 출력해 본다.

다음과 같이 pcap_lib_version() 을 이용하면 버전이 확인가능하다. 아래와 같이 간단하게 코딩하여 실행해 볼 수 있다.


#include <pcap/pcap.h>

int main() {

        const char *pcap_v;
        pcap_v = pcap_lib_version();

        printf("Libpcap Version: %s \n", pcap_v);

}

# gcc libpcap_ver.c -lpcap
# ./a.out
Libpcap Version: libpcap version 1.1.1

1.1.1 버전을 사용하고 있음을 확인할 수 있다.

2012년 10월 4일 목요일

패킷파일 시간 간단히 조정하는 방법은?

패킷파일의 시간 조정이 필요한 경우가 있다. 의도적으로 패킷 파일을 수동으로 만들었는데,해당 시간이 잘못 되었거나 다른 컴퓨터에서 덤프한 패킷파일이 분석하려는 곳과의 시간이 다른 경우 이를 조절하기 위해서도 필요할 수 있다.

또는 만들어진 패킷파일을 하나의 파일로 합치는 과정에서 시간을 연속적으로 맞춰주어야 하는 경우가 필요해지는 경우도 있다. 그렇다면 패킷파일의 시간은 어떻게 바꿔줄 수 있을까 ? 패킷파일에 시간이 기록되어 있으므로 수동으로 이를 바꿔주는 방법이 있다.

패킷파일 구조에 대해서 설명한 포스팅을 보면 구조는 다음과 같다:

PCAP 파일을 파헤쳐 보자 - 그 첫번째 이야기


typedef struct pcaprec_hdr_s {
        guint32 ts_sec;         /* timestamp seconds */
        guint32 ts_usec;        /* timestamp microseconds */
        guint32 incl_len;       /* number of octets of packet saved in file */
        guint32 orig_len;       /* actual length of packet */
} pcaprec_hdr_t;


패킷헤더의 ts_sec 구조체에 타임스탬프 시간이 기록된다. 하지만 일일이 변경할 수 없는 노릇이다. 와이어샤크를 설치하면 생기는 editcap 을 통해서 쉽게 변경이 가능해진다.

EditCap 의 -t 옵션을 사용하면 된다.

예를 들어 test.pcap 시간보다 180초 뒤로 시간을 조정하고 싶다면 -와 함께 시간(초) 을 기록해 준다.

# editcap -t -180 test.pcap test2.pcap

반대로 test.pcap 파일의 시간보다 1시간 앞으로 조정하고 싶다면 +를 이용해 3600 초를 더해주면 된다.

# editcap -t +3600 test.pcap test2.pcap

간단하게 시간 조절이 가능하다. 막상 어떻게 조절해야 할까 ? 고민이 되었다면 이렇게 쉽게 풀리는 문제에 허탈해지기 까지도 할 것이다. :-)